DRBD是通过块设备组成的高可用集群,他的设备和设备之间的连接需要网络支持,可以理解为是基于网络的raid-1设备.在mysql的官网上,也把DRDB做成mysql镜像的一种高可用解决方案,当然,他能为更多的自身不能做数据镜像的程序提供数据镜像的功能,如:nfs.在CentOS 2.6.33的版本以后,DRBD被直接编译进了内核中,下图是他的工作原理图.注:此为官方截图

DRBD的工作空间分为两层,一层为用户空间,一层为内核空间.用户空间主要提供调用内核空间的DRBD的应用程序,常用的用户空间的工具为drbdadm,其配置文件是 /etc/drbd.conf(/etc/drdb.d/*)其中 /etc/drbd.conf仅用include指令将文件片段整合起来,/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件。其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源;drdbmeta一般是修复DRDB时才使用.

一个磁盘的工作模式是,用户空间的程序向磁盘写数据,首先会把数据放在缓存中,然后再有缓存(BUFFER/CACHE)把数据交给磁盘调度器(DISK SCHED),DISK SCHED把需要写入磁盘的数据分类,把数据按不同的磁道进行分类,以便于提高硬盘的性能,最后由磁盘驱动想磁盘中写入数据.而在BUFFER/CACHE向DISK SCHED写入数据时,DRBD会把数据复制一份,然后通过TCP/IP协议封装成TCP/IP报文,基于网络传送给另外一台主机对等的设备,另外一台主机接受到报文后,经过网卡设备后有TCp/IP解封装,交给DRDB—>DISK SCHED—>DISK DRIVERA,然后把数据写入磁盘,以实现数据镜像.

对于以上的传送方式,有三种传输的模式:

 
    
  1: A:异步;异步的性能最高,数据只需要到达本机的TCP/IP协议栈
  2: B:半同步;数据只需要到达对方主机的TCP/IP协议栈;
  3: C:同步;同步的数据最安全,数据需要写入对方主机的磁盘中,一般使用同步,默认也是同步

DISK SCHED有4个调度器:

 
    
  1: 完全公平队列
  2: 最后期限
  3: 期望:用的少
  4: 不做排序,先到先得,针对于固态硬盘之类的.,因为不用寻道

DRBD的工作是在两台主机上,所以需要资源:

 
    
  1: 资源名:不包括空白字符的ACSII
  2: DRDB设备:drbd的访问路径,设备文件 /dev/drbd#
  3: 磁盘:就是磁盘咯
  4: 网络配置:就是网络配置咯

DRBD特性:

 
    
  1: 一般只能做主从,主的能读能写,从的连挂载都不能,并且只能一个主节点,一个从节点,不能一主多从.两个节点都需要提供服务,当主的节点挂了,需要借助高可用服务来把从的提升为主的,特殊情况(基于高可用集群的分布式锁),可以实现主主.
  2: DRDB本身没有探测对方是否宕机的方法,他需要借助高可用服务来实现此功能

对于脑裂,DRBD有四中处理方式

 
     
  1: 新成为主节点的把数据丢弃,再同步老节点的数据
  2: 把老的主节点的数据丢弃,再同步新节点的数据
  3: 谁的数据修改的少,谁主动丢弃数据
  4: 如果有个节点从没发生过数据修改,那就不用动了 

DRBD的工具

 
     
  1: 用户空间工具,跟内核版本没太大的关系,与内核工具版本对应就型
  2: 内核工具,须与当下内核版本严格对应
  3: 如下说明:
  4: drbd-8.4.3-33.el6.x86_64.rpm                                       #用户空间工具,只要内核工具是8.4.3的都可以适用
  5: drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.x86_64.rpm                   #内核工具,必须内核是2.6.32-385.e16的内核才可以使用,下同
  6: drbd-kmdl-2.6.32-431.11.2.el6.centos.plus-8.4.3-33.el6.x86_64.rpm
  7: drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm
DRBD版本
 
     
  1: CentOS 5 
  2:   8.0, 8.2, 8.3(默认版本)
  3: CentOS6
  4:   8.4

前提

 
     
  1: 本配置共有两个测试节点,分别lidefu1和lidefu2,相的IP地址分别为172.16.21.1和172.16.21.2;
  2: lidefu1和lidefu2两个节点上各提供了一个大小相同的分区作为drbd设备;我们这里为在两个节点上均为/dev/sdb1,大小为512M;
  3: 系统为CentOS 6.5,x86_64平台;
准备工作
 
    
  1: 两个节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致;因此,需要保证两个节点上的/etc/hosts文件均为下面的内容:
  2: 172.16.21.1 lidefu1
  3: 172.16.21.2 lidefu2
  4: 
  5: 为了使得重新启动系统后仍能保持如上的主机名称,还分别需要在各节点执行类似如下的命令:
  6: 
  7: Node1:
  8: # sed -i 's@\(HOSTNAME=\).*@\1lidefu1@g'
  9: # hostname lidefu1
 10: 
 11: Node2:
 12: # sed -i 's@\(HOSTNAME=\).*@\1lidefu2@g'
 13: # hostname lidefu2
 14: 两个节点的时间要保持一直,这个是易忘点

双机互信

 
    
  1: lidefu1
  2:   ssh-keygen -t rsa -P ''
  3:   ssh-copy-id -i .ssh/id_rsa.pub root@lidefu2
  4: lidefu2
  5:  ssh-keygen -t rsa -P ''
  6:  ssh-copy-id -i .ssh/id_rsa.pub root@lidefu1

下载安装drbd服务器端和客户端,可以使用uname –r 看内核版本

 
    
  1: get drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.x86_64.rpm 
  2: 他们几乎没有依赖关系,所以可以直接安装
  3: lidefu1
  4: rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.x86_64.rpm 
  5: lidefu2
  6: rpm -ivh drbd-8.4.3-33.el6.x86_64.rpm drbd-kmdl-2.6.32-358.el6-8.4.3-33.el6.x86_64.rpm 
查看安装生成的文件
 
     
  1: rpm -ql drbd
查看drbd的主配置文件
 
     
  1: vim /etcdrbr.conf                      #东西很少,只是做个样子,包含其他的配置文件而已
  2: include "drbd.d/global_common.conf";   #包含全局
  3: include "drbd.d/*.res";                #包含drdb/*.res的所有配置
查看global_common.conf
 
 
     
  1: vim /etc/drbd.d/global_common.conf
  2: #注:以下的每个定义都需要 ";" 结尾
  3: global {
  4:         usage-count yes;   #yes表示drdb的官方站点可以收集你的安装信息,使用统计
  5:         # minor-count dialog-refresh disable-ip-verification
  6: }
  7: 
  8: common {                   #提供默认配置的,包含多个子段
  9:         handlers {         #处理器,一般用不上,因为drbd多用在高可用集群中,高可用集群自己有处理能力
 10:                 # These are EXAMPLE handlers only.
 11:                 # They may have severe implications,
 12:                 # like hard resetting the node under certain circumstances.
 13:                 # Be careful when chosing your poison.
 14:                 #在handlers中,一般启用下面三项就行,剩下的启用可能会和高可用集群的程序冲突
 15:                   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"; #主节点降级的处理方式
 16:                   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"; #发生脑裂后找不到主节点后的处理方式
 17:                   local-io-error "/usr/lib/drbd/notify-io-error.sh; /usr/lib/drbd/notify-emergency-shutdown.sh; echo o > /proc/sysrq-trigger ; halt -f";   #如果本地I/O报错,就执行后面的程序
 18:                 # fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
 19:                 # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; #脑裂的处理方式
 20:                 # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root";
 21:                 # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k";
 22:                 # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh;
 23:         }   
 24: 
 25:         startup {
 26:                 # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb
 27:                 # wfc-timeout #等待超时时间
 28:                 #der-wfc-timeout #降级等待超时时间 
 29:                 #outdated-wfc-timeout  #过期时间
 30:                 #wait-after-sb #等待脑裂后重新上线的时间
 31:                 #wfc-timeout 120;
 32:                 #degr-wfc-timeout 60; #此时间要短于上面的wfc-timeout的时间
 33:         }   
 34: 
 35:         options {
 36:                 # cpu-mask on-no-data-accessible
 37:         }   
 38: 
 39:         disk {
 40:                 # size max-bio-bvecs on-io-error fencing disk-barrier disk-flushes #
 41:                 # disk-drain md-flushes resync-rate resync-after al-extents
 42:                 # c-plan-ahead c-delay-target c-fill-target c-max-rate
 43:                 # c-min-rate disk-timeout
 44:                 on-io-error detach;I/O错误就把磁盘拆掉
 45:         }
 46: 
 47:         net {   #跟网络相关的配置
 48:                 # protocol timeout max-epoch-size max-buffers unplug-watermark
 49:                 # connect-int ping-int sndbuf-size rcvbuf-size ko-count
 50:                 # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri
 51:                 # after-sb-1pri after-sb-2pri always-asbp rr-conflict
 52:                 # ping-timeout data-integrity-alg tcp-cork on-congestion
 53:                 # congestion-fill congestion-extents csums-alg verify-alg
 54:                 # use-rle
 55:                 protocol C;    #使用的协议版本为C,同步
 56:                 cram-hmac-alg "sha1";       #加密算法
 57:                 shared-secret "lidefu";  #双方共享的密钥
 58:         }
 59:         syncer {
 60:                 rate 1000M;  #双方同步时的速率为1000M
 61:         }
 62: }

分别在lidefu1和lidefu2准备一个5G的磁盘,准备好磁盘后别忘了使用 partx –a /dev/sdb

 
     
  1: lidefu1
  2: dd if=/dev/zero of=/dev/sdb bs=500 count=1
  3: fdisk /dev/sdb
  4: n
  5: 1
  6: 
  7: +5G
  8: w
  9: lidefu2
 10: dd if=/dev/zero of=/dev/sdb bs=500 count=1
 11: fdisk /dev/sdb
 12: n
 13: 1
 14: 
 15: +5G
 16: w

在lidefu2上配置资源的配置文件

 

 
    
  1: vim /etc/drbd.d/mystore.res  #必须是以.res结尾的文件
  2: 
  3: resource mystore {
  4:      on lidefu1{
  5:             device /dev/drbd0; #以drdb#数字命令
  6:             disk /dev/sdb1;    #在节点lidefu1上的磁盘分区
  7:             address 172.16.21.1:7789; #监听的套接字
  8:             meta-disk internal;  #存放drbd源数据的磁盘,internal表示就存在/dev/sdb1上
  9: }
 10:      on lidefu2{
 11:             device /dev/drbd0; 
 12:             disk /dev/sdb1;
 13:             address 172.16.21.2:7789;
 14:             meta-disk internal; 
 15: }
 16: }
 17: ------------------------------还可以使用下面的方式--------------------------------
 18: resource mystore {   #相同的资源可以定义在一起
 19:             device /dev/drbd0;
 20:             disk /dev/sdb1;
 21:             meta-disk internal;
 22:      on lidefu1{                            
 23:             address 172.16.21.1:7789;             
 24: }
 25:      on lidefu2{
 26:             address 172.16.21.2:7789; 
 27: }
 28: }

同步两个节点的配置文件

 
     
  1: /usr/bin/scp global_common.conf mystore.res root@lidefu1:/etc/drbd.d/

初始化两个节点的资源

 
     
  1: lidefu2
  2: drbdadm create-md mystore  #mystore是资源名
  3: lidefu1
  4: drbdadm create-md mystore

启动两个节点的drbd,需要都启动,否则一方会持续等待另一方的启动

 
     
  1: lidefu2
  2: service drbd start
  3: lidefu1
  4: service drbd start

查看drbd的磁盘状态,也可以使用drbd-overview查看

 
     
  1: cat /proc/drbd 
  2: ro:Secondary/Secondary        #表示双方都是从节点
  3: ds:Inconsistent/Inconsistent  #数据还处于不一致状态

设置一方为主节点,要在把哪一方设置为主节点,就在上面执行命令

 
     
  1: drbdadm primary --force mystore
  2: watch -n 1 'cat /proc/drbd'
  3: ro:Primary/Secondary    #表示当前节点是主节点,以左边的为准
  4: ds:UpToDate/UpToDate    #同步源数据完成

改变节点的主从状态,需要在各自当前的节点执行命令

 
     
  1: lidefu2
  2: drbdadm secondary mystore  #降级为从节点
  3: lidefu1
  4: drbdadm primary mystore    #升级为主节点

格式化磁盘,只能在主节点上格式化,并且也只有主节点能被挂载使用

 
     
  1: mke2fs -t ext4 /dev/drbd0

杂操作

 
     
  1: mount /dev/drbd0 /mnt         #在主节点上挂载使用
  2: cp /etc/fstab /mnt            #复制文件进去
  3: vim /mnt/fstab                #编辑该文件
  4: umount /mnt                   #卸载,要先卸载才能降级
  5: drbdadm secondary mystore     #降级,只有lidefu2降级了,lidefu1才能提升为主节点
  6: #切换到lidefu1,从节点
  7: drbdadm primary mystore       #首先要提升为主节点,才能挂载 
  8: mount /dev/drbd0 /mnt         #挂载
  9: cat /fstab                    #验证是否是lidefu2更改过的文件