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.rpm7: drbd-kmdl-2.6.32-431.el6-8.4.3-33.el6.x86_64.rpm
DRBD版本
1: CentOS 52: 8.0, 8.2, 8.3(默认版本)3: CentOS64: 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.conf2: #注:以下的每个定义都需要 ";" 结尾3: global {4: usage-count yes; #yes表示drdb的官方站点可以收集你的安装信息,使用统计5: # minor-count dialog-refresh disable-ip-verification6: }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-sb27: # 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-accessible37: }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-extents42: # c-plan-ahead c-delay-target c-fill-target c-max-rate43: # c-min-rate disk-timeout44: on-io-error detach;I/O错误就把磁盘拆掉45: }46:47: net { #跟网络相关的配置48: # protocol timeout max-epoch-size max-buffers unplug-watermark49: # connect-int ping-int sndbuf-size rcvbuf-size ko-count50: # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri51: # after-sb-1pri after-sb-2pri always-asbp rr-conflict52: # ping-timeout data-integrity-alg tcp-cork on-congestion53: # congestion-fill congestion-extents csums-alg verify-alg54: # use-rle55: protocol C; #使用的协议版本为C,同步56: cram-hmac-alg "sha1"; #加密算法57: shared-secret "lidefu"; #双方共享的密钥58: }59: syncer {60: rate 1000M; #双方同步时的速率为1000M61: }62: }
分别在lidefu1和lidefu2准备一个5G的磁盘,准备好磁盘后别忘了使用 partx –a /dev/sdb
1: lidefu12: dd if=/dev/zero of=/dev/sdb bs=500 count=13: fdisk /dev/sdb4: n5: 16:7: +5G8: w9: lidefu210: dd if=/dev/zero of=/dev/sdb bs=500 count=111: fdisk /dev/sdb12: n13: 114:15: +5G16: 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: lidefu22: drbdadm create-md mystore #mystore是资源名3: lidefu14: drbdadm create-md mystore
启动两个节点的drbd,需要都启动,否则一方会持续等待另一方的启动
1: lidefu22: service drbd start3: lidefu14: service drbd start
查看drbd的磁盘状态,也可以使用drbd-overview查看
1: cat /proc/drbd2: ro:Secondary/Secondary #表示双方都是从节点3: ds:Inconsistent/Inconsistent #数据还处于不一致状态
设置一方为主节点,要在把哪一方设置为主节点,就在上面执行命令
1: drbdadm primary --force mystore2: watch -n 1 'cat /proc/drbd'3: ro:Primary/Secondary #表示当前节点是主节点,以左边的为准4: ds:UpToDate/UpToDate #同步源数据完成
改变节点的主从状态,需要在各自当前的节点执行命令
1: lidefu22: drbdadm secondary mystore #降级为从节点3: lidefu14: 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更改过的文件