• DRBD学习笔记


    1,什么是DRBD

    DRBD(Distributed Replicated Block Device),DRBD 号称是 "网络 RAID",开源软件,由 LINBIT 公司开发。

    2,DRBD的主要功能

    DRBD实际上是一种块设备的实现,主要被用于Linux平台下的高可用(HA)方案之中。他是有内核模块和相关程序而组成,通过网络通信来同步镜像整个设备,有点类似于一个网络RAID的功能。也就是说当你将数据写入本地的DRBD设备上的文件系统时,数据会同时被发送到网络中的另外一台主机之上,并以完全相同的形式记录在一个文件系统中(实际上文件系统的创建也是由DRBD的同步来实现的)。本地节点(主机)与远程节点(主机)的数据可以保证实时的同步,并保证IO的一致性。所以当本地节点的主机出现故障时,远程节点的主机上还会保留有一份完全相同的数据,可以继续使用,以达到高可用的目的。

    3,DRBD的主要应用

    如果主服务器宕机,造成的损失是不可估量的。要保证主服务器不间断服务,就需要对服务器实现冗余。在众多的实现服务器冗余的解决方案中,heartbeat为我们提供了廉价的、可伸缩的高可用集群方案。我们通过heartbeat + drbd在Linux下创建一个高可用(HA)的集群服务器,在高可用(HA)解决方案中使用DRBD的功能,可以代替使用一个共享盘阵存储设备。因为数据同时存在于本地主机和远程主机上,在遇到需要切换的时候,远程主机只需要使用它上面的那份备份数据,就可以继续提供服务了。

    4,DRBD于mysql的关系

    MySQL 与 LINBIT 达成了合作关系,大张旗鼓的搞了这个 "12 天 Scale-Out" 活动,也是这个商业合作驱动的吧。DRBD 助力 MySQL, 号称可以得到四个 9 的可靠性,这不低于任何一款商业数据库软件了。

    DRBD 的出现的确对 MySQL 集群的可用性有很大提高。而且,有独到的特点,非常适合面向互联网的应用。因为是在存储层的数据块同步,很容易的做到应用层的 IO 负载均衡(备机承担一定的读压力),不但支持数据库失败接管,还能做到 IP 失败接管,接管时间小于 30 秒,真是穷人的绝佳集群解决方案。
    ------------------------------------------------------------------------------------------------------------------------------------------------------------
    本文所提到试验环境为:

    操作系统:
    Red Hat Enterprise Linux AS release 4 (Nahant Update 4)

    软件:
    drbd-8.2.6.tar.gz

    heartbeat-2.1.3-3.el4.centos
    heartbeat-pils-2.1.3-3.el4.centos
    heartbeat-stonith-2.1.3-3.el4.centos

    mysql-5.1.26-rc-linux-i686-icc-glibc23.tar.gz

    主机环境:

    drbd 主机列表 IP 地址 主机名
    主机1(primary) 192.168.1.241 drbd-1
    主机2(secondary) 192.168.1.242 drbd-2

    另外,2个主机都预留一个空白的分区:/dev/sdb1,不需要创建任何文件系统。


    1,编译与安装DRBD,heartbeat

    在2台主从机器上都要安装DRBD

    [root@drbd-1 ~] tar -xvzf drbd-8.2.6.tar.gz
    [root@drbd-1 ~] cd drbd-8.2.6 && make && make rpm
    [root@drbd-1 ~] cd dist/RPMS/i386
    [root@drbd-1 ~] ls

    drbd-8.2.6-3.i386.rpm
    drbd-debuginfo-8.2.6-3.i386.rpm
    drbd-km-2.6.9_42.EL-8.2.6-3.i386.rpm

    [root@drbd-1 ~] rpm -ivh drbd-8.2.6-3.i386.rpm
    [root@drbd-1 ~] rpm -ivh drbd-debuginfo-8.2.6-3.i386.rpm
    [root@drbd-1 ~] rpm -ivh drbd-km-2.6.9_42.EL-8.2.6-3.i386.rpm

    [root@drbd-1 ~] yum install heartbeat

    yum升级安装的软件包下载保存在:/var/cache/yum/extras/packages

    安装mysql就太简单了,这里就不废话了!


    2,加载DRBD模块

    [root@drbd-1 ~] modprobe drbd
    [root@drbd-1 ~] lsmod |grep drbd
    drbd 242924 2

    如果有,则表示成功了!!!


    3,配置/etc/drbd.conf

    编辑配置文件,2个主机上的内容一样,内容如下:

    #让linbit公司收集目前drbd的使用情况,yes为参加。

    global {
    usage-count yes;
    }

    #drbd所管理的多个资源之间的common,主要是配置drbd的所有resource可以设置为相同的参数项,比如protocol,syncer等等.

    common {
    syncer { rate 100M; }
    }

    #创建一个资源,名字叫”db”


    resource db {

    #使用协议C.表示收到远程主机的写入确认后,则认为写入完成。

    protocol C;


    startup {
    wfc-timeout 0;
    degr-wfc-timeout 120;
    }

    #由于实验环境下两台服务器硬盘大小可能不同,所以需要设置drbd的大小。

    disk {
    on-io-error detach;
    size 6G;
    }

    net {
    max-buffers 2048;
    ko-count 4;
    }

    syncer {
    rate 100M;
    }

    #设定一个节点,分别以各自的主机名命名

    on drbd-1 {

    #设定资源设备/dev/drbd0 指向实际的物理分区 /dev/sdb1

    device /dev/drbd0;
    disk /dev/sdb1;

    #设定监听地址以及端口

    address 192.168.1.241:8888;

    #设定元数据保存方式:可以用 internal(即保存在同一个物理分区下)
    #也可以保存在其他分区上

    meta-disk internal;
    }


    on drbd-2 {
    device /dev/drbd0;
    disk /dev/sdb1;
    address 192.168.1.242:8888;
    meta-disk internal;
    }
    }


    4,启动drbd

    准备启动之前,需要分别在2个主机上的 /dev/sdb1 分区上创建相应的元数据保存的数据块:

    [root@drbd-1 ~] drbdadm create-md db
    [root@drbd-2 ~] drbdadm create-md db

    2次输入“yes”,如果出现下面的提示信息,表示成功
    [root@drbd-1 /]# drbdadm create-md db
    md_offset 8587153408
    al_offset 8587120640
    bm_offset 8586858496

    Found ext3 filesystem which uses 6291456 kB
    current configuration leaves usable 8385604 kB

    ==> This might destroy existing data! <==

    Do you want to proceed?
    [need to type 'yes' to confirm] yes

    v07 Magic number not found
    v07 Magic number not found
    You want me to create a v08 style flexible-size internal meta data block.
    There apears to be a v08 flexible-size internal meta data block
    already in place on /dev/sdb1 at byte offset 8587153408
    Do you really want to overwrite the existing v08 meta-data?
    [need to type 'yes' to confirm] yes

    Writing meta data...
    initialising activity log
    NOT initialized bitmap
    New drbd meta data block sucessfully created.



    接下来就可以启动drbd进程了:

    [root@drbd-1 ~] /etc/init.d/drbd start
    [root@drbd-2 ~] /etc/init.d/drbd start

    在启动第一个节点上的DRBD服务的时候,他会等待第2个节点的DRBD服务的启动,此时启动第2个节点上的DRBD服务即可。

    [root@drbd-1 /]# /etc/init.d/drbd start
    Starting DRBD resources: [ d(db) s(db) n(db) ].
    ..........
    ***************************************************************
    DRBD's startup script waits for the peer node(s) to appear.
    - In case this node was already a degraded cluster before the
    reboot the timeout is 120 seconds. [degr-wfc-timeout]
    - If the peer was available before the reboot the timeout will
    expire after 0 seconds. [wfc-timeout]
    (These values are for resource 'db'; 0 sec -> wait forever)
    To abort waiting enter 'yes' [ 47]:



    此时,2台机器的DRBD服务都起来了,检查进程是否存在:

    [root@drbd-1 /]# ps aux | grep drbd
    root 3758 14.5 0.0 0 0 ? S 15:56 0:20 [drbd0_worker]
    root 3762 9.6 0.0 0 0 ? S 15:56 0:13 [drbd0_receiver]
    root 3787 2.4 0.0 0 0 ? S 15:56 0:03 [drbd0_asender]
    root 3794 0.0 0.2 644 128 pts/0 R+ 15:58 0:00 grep drbd

    可以看到两个节点的进程都起来了,每个drbd设备会有三个进程:drbd0_worker是drbd0的主要进城,drbd0_asender是primary上drbd0的数据发送进程,drbd0_receiver是secondary上drbd0的数据接收进程。



    看看刚启动后的drbd状态:

    [root@drbd-1 /]# cat /proc/drbd
    version: 8.2.6 (api:88/proto:86-88)
    GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@drbd-1, 2008-09-17 17:46:45
    0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 oos:6291456


    [root@drbd-2 /]# cat /proc/drbd
    version: 8.2.6 (api:88/proto:86-88)
    GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@drbd-2, 2008-09-17 17:51:50
    0: cs:Connected st:Secondary/Secondary ds:Inconsistent/Inconsistent C r---
    ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 oos:6291456

    注意:这个时候,2台服务器都为从节点状态(st:Secondary/Secondary),因为还没有指定哪一台为主节点。



    然后,设置启动的一个节点为主节点,我们设置drbd-1为主节点:

    [root@drbd-1 /]# drbdadm primary db
    State change failed: (-2) Refusing to be Primary without at least one UpToDate disk
    Command 'drbdsetup /dev/drbd0 primary' terminated with exit code 11

    [root@drbd-1 /]# drbdsetup /dev/drbd0 primary -o

    可以看到,第一次设置主节点时用 drbdadm 命令会失败,所以先用drbdsetup 来做,以后就可以用 drbdadm 了。



    再次查看2台服务器的drbd状态:

    [root@drbd-1 /]# cat /proc/drbd
    version: 8.2.6 (api:88/proto:86-88)
    GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@drbd-1, 2008-09-17 17:46:45
    0: cs:SyncSource st:Primary/Secondary ds:UpToDate/Inconsistent C r---
    ns:3483280 nr:0 dw:0 dr:3491456 al:0 bm:212 lo:1 pe:8 ua:256 ap:0 oos:2808416
    [==========>.........] sync'ed: 55.5% (2742/6144)M
    finish: 0:11:24 speed: 4,084 (4,648) K/sec


    [root@drbd-2 /]# cat /proc/drbd
    version: 8.2.6 (api:88/proto:86-88)
    GIT-hash: 3e69822d3bb4920a8c1bfdf7d647169eba7d2eb4 build by root@drbd-2, 2008-09-17 17:51:50
    0: cs:SyncTarget st:Secondary/Primary ds:Inconsistent/UpToDate C r---
    ns:0 nr:3556832 dw:3556832 dr:0 al:0 bm:217 lo:1 pe:2464 ua:0 ap:0 oos:2734624
    [==========>.........] sync'ed: 56.7% (2670/6144)M
    finish: 0:07:35 speed: 5,856 (4,128) K/sec

    此时可以看到,已经开始同步数据了。设置完之后的第一次同步耗时比较长,因为需要把整个分区的数据全部同步一遍。



    第一次同步完成之后,就可以对drbd的设备创建文件系统了:

    [root@drbd-1 /]# mkfs.ext3 /dev/drbd0

    将文件系统mount上:

    [root@drbd-1 /]# mount /dev/drbd0 /drbddata



    在主节点上测试数据写入:

    [root@drbd-1 drbddata]# ll
    total 4
    drwx------ 4 mysql root 4096 Oct 13 16:29 mysql

    然后,我们把primary降级成secondary,把secondary提升成primary:

    [root@drbd-1 /]# umount /drbddata/
    [root@drbd-1 /]# drbdadm secondary db

    把primary降级前,一定要先umount设备才行。然后提升secondary:

    [root@drbd-2 /]# drbdadm primary db
    [root@drbd-2 /]# mount /dev/drbd0 /drbddata/
    [root@drbd-2 drbddata]# ll
    total 4
    drwx------ 4 mysql root 4096 Oct 13 16:29 mysql


    可以看到,数据已经完全同步过去了。




    下面就要开始和heartbeat的整合了,前面heartbeat已经安装过,只需要修改下配置文件就可以了,

    cp /usr/share/doc/heartbeat-2.1.3/ha.cf .
    cp /usr/share/doc/heartbeat-2.1.3/authkeys .
    cp /usr/share/doc/heartbeat-2.1.3/haresources .

    配置ha.cf(ha主要配置文件):

    [root@drbd-1 ha.d]# more ha.cf
    logfile /var/log/ha-log
    logfacility local0
    keepalive 2
    deadtime 30
    warntime 10
    initdead 120
    udpport 694
    bcast eth0
    auto_failback off
    node drbd-1
    node drbd-2
    ping_group group1 192.168.1.1 192.168.1.254
    respawn root /usr/lib/heartbeat/ipfail
    apiauth ipfail gid=root uid=root

    配置authkeys认证:

    [root@drbd-1 ha.d]# more authkeys
    auth 1
    1 crc

    配置haresources资源文件:

    drbd-1 drbddisk Filesystem::/dev/drbd0::/drbddata::ext3 mysql 192.168.1.243


    注意:

    资源组配置文件主要是配置切换过程需要管理的各种资源的,有一个很关键的点,那就是一个资源组中的各个资源的排列顺序是需要注意的,在hearbeat管理资源组的时候,获取资源的过程是从左往右依次处理,释放资源的时候是从右往左依次处理。

    资源组的第一列是我们在ha.cf配置文件中的node之一,而且应该是当前准备作为primary节点的那一个node。
    上面资源组中的各项含义如下:

    drbd-1 当前primary节点名(uname -n)

    drbddisk 告诉heartbeat要管理drbd的资源
    Filesystem 这里是告诉heartbeat需要管理文件系统资源,其实实际上就是执行mount/umount命令,后面的“::”符号之后是跟的Filesystem的参数 设备名和mount点)
    mysql 告诉需要管理mysql

    192.168.1.243 这里是让heartbeat帮你管理一个service ip,会跟着主节点一起漂移





    测试切换:

    1) 手工调用heartbeat的节点切换脚本:
    执行/usr/lib/heartbeat/hb_standby 脚本,让heartbeat通知对方节点自己请求变成standby节点,请求对方成为primary节点,切换工作在10s左右即完成.

    2) 拔掉网线,测试在primary节点的网络断开后的切换情况
    通过测试,在拔掉网线后,当主节点发现无法和standby节点无法通信后,会在log中记录warn信息,如果延续时间达到在ha.cf中设定的时长后,会开始释放资 源,standby节点发现无法和主节点通信一段时间(ha.cf设定)后,开始尝试启动资源并将自己active成primary节点。切换过程除开ha.cf中设定的时长之外 的时间段同样非常短。

    3) shutdown primary主机,测试是否能够正常切换,基本上和上面测试2差不多。

    4) primary node 掉电测试,这里还没有到机房实际操作过,后面会继续测试这个操作。




    测试结果:
    1,正常切换,数据完整。
    2,正常切换,但是主从数据相差一条。
    3,正常切换,数据完整。
    4,正常切换,数据完整。
  • 相关阅读:
    记一次手工端假设之旅
    宝塔面板相关笔记
    linux ubuntu centos 相关笔记
    问题解决笔记,Restarting network (via systemctl):: Job for network.service failed. ...
    Ubuntu中使用yum
    小说爬取 python + urllib + lxml
    wsgiref错误解决笔记 "write() argument must be a bytes instance"
    个人作品导航:
    django基础一
    前端小知识(5)--响应式页面实现
  • 原文地址:https://www.cnblogs.com/google4y/p/2137558.html
Copyright © 2020-2023  润新知