一、 DRBD介绍


官方站点:http://www.drbd.org/
DRBD(Distributed Replicated Block Device)是一个基于块设备级别在远程服务器直接同步和镜像数据的软件,用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。它可以实现在网络中两台服务器之间基于块设备级别的实时镜像或同步复制(两台服务器都写入成功)/异步复制(本地服务器写入成功),相当于网络的RAID1,由于是基于块设备(磁盘,LVM逻辑卷),在文件系统的底层,所以数据复制要比cp命令更快,DRBD已经被MySQL官方写入文档手册作为推荐的高可用的方案之一。
 

二、简要规划

 

系统环境

系统

OEL6.6

系统位数

x86_64

内核版本

3.8.13-44.1.1.el6uek.x86_64

软件环境

DRBD

drbd-8.4.6

drbd-utils-8.9.5

drbd下载地址

http://www.drbd.org/en/community/download

wget http://www.drbd.org/download/drbd/8.4/drbd-8.4.6.tar.gz
wget http://www.drbd.org/download/drbd/utils/drbd-utils-8.9.5.tar.gz

系统规划

主机名

IP

db-1-1

192.168.192.21    管理IP

10.0.100.21       DRBD数据传输IP

192.168.192.100   VIP

db-1-2

192.168.192.22    管理IP

10.0.100.22       DRBD数据传输IP

192.168.192.100   VIP

基本配置

cat << EOF > /etc/hosts

127.0.0.1         localhost  localhost.localdomain

192.168.192.21    db-1-1

10.0.100.21       priv-1-1

192.168.192.22    db-1-2

10.0.100.22       priv-1-2

192.168.192.100   vip

EOF

--配置服务器间主机路由
#db-1-1:
route add -host 10.0.100.22 dev eth1
#db-1-2:
route add -host 10.0.100.21 dev eth1

--时间同步
crontab -l
*/5 * * * * `which ntpdate` pool.ntp.org >/dev/null 2>&1

磁盘

容量

分区

挂载点

说明

/dev/sdb

1G

/dev/sdb1

/dbdata/

存放数据

/dev/sdb2

存放drbd 元数据(metadata)

注意:

1、metadata分区一定不能格式化建立文件系统(sdb2存放drbd同步的状态信息)

2、分好的分区不要进行挂载

3、生产环境DRBD metadata分区一般可设置为1-2G,数据分区看需求

4、在生产环境中两块硬盘一样大

--sdb磁盘(小于2T)采用fdisk命令进行分区,两个分区sdb1和sdb2
#fdisk /dev/sdb
 n-->p-->1-->+1024M
 n-->p-->2-->回车--w
#fdisk快速分区
#echo -e "n\np\n1\n\n+1024M\nn\np\n2\n\n\nw" fdisk /dev/sdb
--对sdb1进行格式化,而sdb2分区为meta data分区,不需要格式化操作
#mkfs.ext4 /dev/sdb1
--关闭强制检查挂载次数限制(可选)
#tune2fs -c -1 /dev/sdb1

 

三、编译安装

 

--依赖包安装:

#yum install -y kernel kernel-devel kernel-headers gcc flex libxslt

 

1)、编译安装drbd:
# tar zxvf drbd-8.4.6.tar.gz
# cd drbd-8.4.6
# make KDIR=/usr/src/kernels/$(uname -r)
# make install KDIR=/usr/src/kernels/$(uname -r)

--卸载:
# make uninstall KDIR=/usr/src/kernels/$(uname -r)
# make KDIR=/usr/src/kernels/$(uname -r) clean

--编译成功模块安装位置
# modprobe -l | grep -i drbd
   updates/drbd.ko
--加载模块
# modprobe drbd
# lsmod | grep drbd
  drbd                  362965  4
  libcrc32c               1252  1 drbd

注意:设置 echo 'modprobe drbd' >> /etc/rc.local 并禁止drbd模块开机自动加载。
       如果drbd服务是开机自启动的,会先启动drbd服务在加载drbd的顺序,导致drbd启动不了出现的问题。

 

2)、编译安装drbd-utils
# tar zxvf drbd-utils-8.9.5.tar.gz
# cd drbd-utils-8.9.5
# ./configure --prefix=/usr --without-83support
# make && make install

--卸载:
# make uninstall && make clean

--安装成功后drbd相关的工具(drbdadm,drbdsetup)被安装到 /usr/lib/ 目录下
# whereis drbd
drbd: /usr/etc/drbd.d /usr/etc/drbd.conf /lib/drbd /usr/lib/drbd /usr/share/man/man8/drbd.8

--添加drbd服务并禁止自启动

# cp /usr/etc/rc.d/init.d/drbd /etc/rc.d/init.d/
# chkconfig --add drbd
# chkconfig drbd off
# chkconfig drbd --list

 

四、DRBD配置

 

本次编译安装配置文件位置:/usr/etc/drbd.conf
配置文件主要分为三个部分:global、common、resource
DRBD配置文件:

# cp /usr/etc/drbd.d/global_common.conf /usr/etc/drbd.d/global_common.conf.bak
# > /usr/etc/drbd.d/global_common.conf 
# vi /usr/etc/drbd.d/global_common.conf
# DRBD is the result of over a decade of development by LINBIT.
# In case you need professional services for DRBD or have
# feature requests visit http://www.linbit.com
global {
        #是否参加DRBD 使用者统计,默认参加
        usage-count no; 
        # minor-count dialog-refresh disable-ip-verification
        # cmd-timeout-short 5; cmd-timeout-medium 121; cmd-timeout-long 600;
}
common {
        #使用DRBD 的第三种同步协议(A B C),大多数用C,表示收到远程主机的写入确认后认为写入完成
protocol C; 
handlers {
         # These are EXAMPLE handlers only.
         # They may have severe implications,
         # like hard resetting the node under certain circumstances.
         # Be careful when chosing your poison.
         # pri-on-incon-degr "/usr/lib/drbd/notify-pri-on-incon-degr.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
         # pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
         # local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";
         # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
         # split-brain "/usr/lib/drbd/notify-split-brain.sh root";
         # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
         # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
         # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
        }
startup {
         # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
         #在启用DRBD块时,初始化脚本drbd会阻塞启动进程的运行,直到对等节点的出现。该选项就是用来限制这个等待时间的,默认为0,即不限制,永远等待。
         wfc-timeout 120;
         #也是用于限制等待时间,只是作用的情形不同:它作用于一个降级集群(即那些只剩下一个节点的集群)在重启时的等待时间。
         degr-wfc-timeout 120;
        }
options {
         # cpu-mask on-no-data-accessible
        }
   disk {
         # size on-io-error fencing disk-barrier disk-flushes
         # disk-drain md-flushes resync-rate resync-after al-extents
         # c-plan-ahead c-delay-target c-fill-target c-max-rate
         # c-min-rate disk-timeout
         # 策略:发生I/O错误的节点将放弃底层设备,以diskless mode继续工作
         on-io-error  detach;
         #size 454G;
         no-disk-flushes;
         no-md-flushes;
        }
    net {
         # protocol timeout max-epoch-size max-buffers unplug-watermark
         # connect-int ping-int sndbuf-size rcvbuf-size ko-count
         # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
         # after-sb-1pri after-sb-2pri always-asbp rr-conflict
         # ping-timeout data-integrity-alg tcp-cork on-congestion
         # congestion-fill congestion-extents csums-alg verify-alg
         # use-rle
         sndbuf-size 512k;
         #如果搭档节点没有在此时间内发来应答包,那么就认为搭档节点已经死亡
         # timeout 60; #6 seconds(unit = 0.1 seconds)
         #如果无法立即连接上远程DRBD设备,系统将断续尝试连接
         # connect-int10; # 10 seconds(unit = 1 second)
         #如果连接到远程DRBD设备的TCP/IP的空闲时间超过此值,系统将生成一个keep-alive包来检测对等节点是否还存活
         # ping-int10; # 10 seconds(unit = 1 second)
         # ping-timeout5; # 500 ms (unit = 0.1 seconds)
         # 该选项设定一个由drbd分配的最大请求数,单位是页面大小(PAGE_SIZE),大多数系统中,页面大小为4KB。这些buffer用来存储那些即将写入磁盘的数据。最小值为32(即128KB)。这个值大一点好。
         max-buffers 8000;
         unplug-watermark 1024;
         # 该选项设定了两次write barriers之间最大的数据块数。如果选项的值小于10,将影响系统性能。
         max-epoch-size 8000;
         # ko-count 4;
         # 双主模式配置选项
         # allow-two-primaries;
         # 该选项设定内核支持的一个算法,用于网络上的用户数据的一致性校验。通常的数据一致性校验,由TCP/IP头中所包含的16位校验和来进行,而该选项可以使用内核所支持的任一算法。该功能默认关闭。
         cram-hmac-alg "sha1";
         # 用来设定在对待节点授权中使用的密码,最长64个字符。
         shared-secret "wQZb8s8som9uMKrzj";
         after-sb-0pri disconnect;
         after-sb-1pri disconnect;
         after-sb-2pri disconnect;
         rr-conflict disconnect;
         # data-integrity-alg "md5";
         # no-tcp-cork;
        }
 syncer {
         #设置主用节点和备用节点同步时的网络速率最大值,单位是字节
         rate 150M;
         al-extents 517;
        }
}
#资源名字为 dbdata_r0
resource dbdata_r0 {
    #每个主机的说明以on开头,后面是`hostname`
   on db-1-1 {
              #drbd设备名称
              device /dev/drbd1;
              #/dev/drbd1使用的磁盘分区/dev/sdb1
              disk /dev/sdb1;
              #两台主机端口必须一致
              #设置DRBD的监听端口,用于与另一台主机通信, 如果开启防火墙,需要打开此端口
              address 10.0.100.21:7788;
              #DRBD的元数据存放方式
              meta-disk /dev/sdb2 [0];
            }
   on db-1-2 {
              device /dev/drbd1;
              disk /dev/sdb1;
              #两台主机端口必须一致,如果开启防火墙,需要打开此端口
              address 10.0.100.22:7788; 
              meta-disk /dev/sdb2 [0];
            }
}

注:两个节点配置一样,这里将 resource 配置放在了global_common.conf里

 

--将配置复制都 db-1-2 主机相应目录下
#scp /usr/etc/drbd.d/global_common.conf db-1-2:/usr/etc/drbd.d/

 

五、初始化DRBD

 

关闭防火墙
#service iptables stop
--初始化meta分区(创建设备元数据,这一步必须仅在创建初始化设备时完成,它初始化DRBD元数据)
#drbdadm create-md dbdata_r0
#mkdir -p /usr/var/run/drbd
--启动drbd服务
#service drbd start
--初始化设备同步(覆盖备节点,保持数据一致)
#drbdadm -- --overwrite-data-of-peer primary dbdata_r0 

--通过cat /proc/drbd查看具体信息

 

六、挂载写入数据

 

--挂载drbd分区到/dbdata数据目录,要在想设置为主节点的节点上(data-1-1)执行
#mount /dev/drbd1 /dbdata
#drbdadm primary dbdata_r0 或者 drbdadm primary all
--测试数据同步,在主节点创建数据
# dd if=/dev/zero of=/dbdata/test.tmp bs=1M count=200;sync 

 

--从节点查看数据
#data-1-2上执行(从节点)
#停drbd,将磁盘分区挂载到临时目录查看
#drbdadm down dbdata_r0
#mount /dev/sdb1 /mnt
#ls /mnt

 

七、数据同步测试

 

① 正常状态

[root@db-1-1 /dbdata]
#cat /proc/drbd 
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-1, 2016-06-03 02:20:22
 1: cs:Connected ro:Primary/Secondary ds:Diskless/UpToDate C r-----
    ns:0 nr:669 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
[root@db-1-2 /root]
#cat /proc/drbd 
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-2, 2016-06-03 02:20:39
 1: cs:Connected ro:Secondary/Primary ds:UpToDate/Diskless C r-----
    ns:669 nr:0 dw:0 dr:669 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0

上面的结果显示 db-1-1为主节点,db-1-2为备节点

② 模拟db-1-1宕机

[root@db-1-1 /root]
#umount /dev/drbd1
[root@db-1-1 /root]
#df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       9.2G  6.6G  2.1G  76% /
tmpfs           743M     0  743M   0% /dev/shm
/dev/sda1        93M   57M   30M  66% /boot
[root@db-1-1 /root]
#drbdadm down all
[root@db-1-1 /root]
#cat /proc/drbd 
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-1, 2016-06-03 02:20:22
[root@db-1-2 /root]
#cat /proc/drbd 
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-2, 2016-06-03 02:20:39
 1: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r-----
    ns:669 nr:0 dw:0 dr:669 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
[root@db-1-2 /root]
#drbdadm primary all
[root@db-1-2 /root]
#mount /dev/drbd1 /dbdata
[root@db-1-2 /root]
#df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       9.2G  6.6G  2.1G  76% /
tmpfs           743M     0  743M   0% /dev/shm
/dev/sda1        93M   57M   30M  66% /boot
/dev/drbd1      988M  1.3M  919M   1% /dbdata
[root@db-1-2 /root]
#cat /proc/drbd 
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-2, 2016-06-03 02:20:39
 1: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r-----
    ns:669 nr:0 dw:16624 dr:2016 al:6 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:16624

上面的结果显示 db-1-1宕机后,db-1-2可以升级为主节点,可挂载drbd1分区继续使用

③ 正常切换

1、在目前的主节点上卸载磁盘分区

[root@db-1-2 /]
#umount /dbdata

2、现有主节点降级

 [root@db-1-2 /]
#cat /proc/drbd 
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-2, 2016-06-03 02:20:39
 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:17325 nr:0 dw:16656 dr:18724 al:6 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
[root@db-1-2 /]
#drbdadm secondary all
[root@db-1-2 /]
#cat /proc/drbd 
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-2, 2016-06-03 02:20:39
 1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:17341 nr:0 dw:16672 dr:18724 al:6 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0

上面的结果显示 db-1-2 以由Primary降级为Secondary。

[root@db-1-1 /]
#cat /proc/drbd 
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-1, 2016-06-03 02:20:22
 1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:16672 dw:16672 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0

可以看到,两个节点都处于Secondary的状态,接下来就要指定一个主节点,在需要变成主用节点的服务器上执行如下命令:

[root@db-1-1 /]
#drbdadm primary all
[root@db-1-1 /]
#cat /proc/drbd 
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-1, 2016-06-03 02:20:22
 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:0 nr:16672 dw:16672 dr:669 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
 
[root@db-1-2 /]
#cat /proc/drbd 
version: 8.4.6 (api:1/proto:86-101)
GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-2, 2016-06-03 02:20:39
 1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
    ns:17341 nr:0 dw:16672 dr:18724 al:6 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0

上面的结果显示 db-1-1 以由Secondary升级为Primary。

在新的主用节点挂载DRBD磁盘分区,并查看数据

[root@db-1-1 /]
#mount /dev/drbd1 /dbdata

 

八、注意事项

 

  1.主备服务器同步的两个分区大小最好相同(网上没有关于分区大小是否一定要相同的确切说法);
  2.开始同步两个节点的磁盘,需要一定时间,在同步完成前,不要重启,否则会重新同步; 
  3.挂载之前一定要先切换当前节点为主节点;
  4.两个节点中,同一时刻只能有一台处于primary状态,另一台处于secondary状态;
  5.处于从节点(secondary)状态的服务器不能加载drbd块设备;
  6.将主节点切换为从节点之前要先卸载;
  7.一台主机切换为主节点之前,要确保另一台主机已切换为从节点。

 

九、DRBD日常管理参考

 

v drbd脑裂解决方法
  ①  在从节点上执行
   modprobe drbd
   drbdadm secondary dbdata-rs0
   drbdadm up dbdata-rs0
   drbdadm disconnect dbdata-rs0
   drbd -- --discard-my-data connect dbdata-r0
  ②  在主节点上通过 cat /proc/drbd 查看,如果不是WFConnection状态,需要手动连接
drbdadm connect dbdata-r0

v 检查DRBD的状态
  ① drbd-overview           #查看DRBD状态最方便的方法
  ② cat /proc/drbd          #可以查看DRBD的实时状态
  ③ drbdadm cstate data     #也可以查看资源的连接状态
  ④ drbdadm role data       #也可以查看资源的角色
  ⑤ drbdadm dstate data     #查看资源的硬盘状态
v 启用资源
  ① 若是配置成集群,就是用集群资源管理程序。
  ② 也可在系统启动的时候使用/etc/init.d/drbd初始脚本
  ③ 或手动 drbdadm up <resource>/all
v 禁用资源
  ① drbdadm down <resource>/all 可临时禁用指定的或所用的资源
v 重新配置资源
  注意事项:
  ① 对资源的任何改变,都要包含到/etc/drbd.conf
  ② 将修改的/etc/drbd.conf在两个节点之间进行同步
  ③ 分别在两个节点上执行drbdadm adjust <resource>/all命令。
v 资源角色的设置
  ① drbdadm primary <resource>
  ② drbdadm secondary <resource>
  ③ 在单主模式(DRBD的默认模式),同一时间只允许有一个节点时 primary 模式;双主模式,两个节点可同时都是 primary 模式。
v 故障转移
  如果没有使用 Pacemaker,手动故障转移操作如下:
  ① 在当前主节点,作如下操作:
  umount /dev/drbd1
  drbdadm secondary <resource>
  ② 在另外一个节点或我们希望要提升为主节点的节点,做如下操作:
  drbdadm primary <resource>
  mount /dev/drbd1 <mountpoint>
v DRBD的升级
  此处例子是从8.3.x升级到8.4.x
  ① 将yum仓库更新到8.4,就是更新/etc/yum.repos.d/<name>.repo
  ② 确定节点间的同步都已是UpToDate/UpToDate
  ③ 先从secondary节点开始升级,两种:
  手动方法: /etc/init.d/drbd stop
  Pacemaker方法:crm node standby clone1
  ④ 然后使用yum upgrade 升级软件
  ⑤ /etc/init.d/drbd start 或 crm node online clone1 启动服务
  ⑥  将主备节点的角色切换,再重复以上五个步骤。
  ⑦ 因为8.4向后兼容8.3的配置,所以可以使用命令 drbdadm dump all 可以输出升级后的配置。可是作为升级的凭据。
v DRBD的降级
  以下操作都是在两个节点上同时操作的
  ① 停止DRBD服务:service drbd stop
  ② 卸载已经挂载的设备:umount /dev/drbd1
  ③ 将节点角色改为secondary:drbdadm secondary r0
  然后执行如下命令:
  ④ drbdadm down all
  ⑤ drbdadm apply-al all
  ⑥ rmmod drbd
  如果使用的是yum仓库安装的,那么就:
  ⑦ yum -y remove drbd kmod-drbd
  ⑧ 然后,重新安装8.3版本的
  小结:所谓降级,其实就是卸载,删除新版本的,再安装旧版本的
v 启用双主模式
  启用双主模式既可以是永久性的也可以额是临时性的。使用双主模式,资源必须被配置成协议C。
  永久性双主模式的配置:
  ① 必须在net区域,设置allow-two-primaries选项为yes。
  ② 之后同步修改后的文件到对等节点,然后在分别在两个节点上运行drbdadm adjust <resource>
  ③ 最后就可以在两个节点上同事执行drbdadm primary <resource>命令
  临时性双主模式的配置:
  ① 在单主模式中临时启用双主模式可以使用,drbdadm net-options --protocol=C --allow-two-primaries <resource>
  ② 结束掉临时双主模式,则使用rbdadm net-options --protocol=C --allow-two-primaries=no,即可。
  自动启动双主模式:
  ① 如果希望在重启系统或重启DRBD时,自动启动双主模式(已经被配置为支持双主模式),则在startup区域,将become-primary-on 选项设置为both即可。(注:如果使用pacemaker来管理DRBD配置,则不需要这个设置)
v 使用在线设备验证
  启用在线验证:
  ① 默认情况下是没有启动的。若启用,就在net区段配置选项verify-alg <algorithm>; algorithm可以是sha1、md5、crc32c中的任何一种。
  在线验证的调用:
  ② 在启用在线验证后,就可以使用 drbdadm verify <resource>来进行调用了。使用此命令可以对资源启动在线验证。如果找到的任何没有同步的块,它会将这些块做标记并且写信息到内核日志里面。
  ③ 如果在验证中找到了没有同步的块,那么可以在验证完成后使用
  drbdadm disconnect <resource>
  drbdadm connect <resource>
  两条命令实现再同步
  自动在线验证:
  ④ 可以通过创建名为/etc/cron.d/drbd-verify的文件,内容如下
  32 0 * * 0 root/sbin/drbdadm verify <resource>/all
  来实现自动在线验证。(注:文件内容含义是在每星期日的凌点32分时,通过cron调用设备验证。