1、DRBD简介
DRBD的全称为:Distributed ReplicatedBlock Device(DRBD)分布式块设备复制,DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是经过网络来镜像整个设备。你能够把它看做是一种网络RAID。它容许用户在远程机器上创建一个本地块设备的实时镜像。
1.一、DRBD是如何工做的呢?
(DRBD Primary)负责接收数据,把数据写到本地磁盘并发送给另外一台主机(DRBD Secondary)。另外一个主机再将数据存到本身的磁盘中。目前,DRBD每次只容许对一个节点进行读写访问,但这对于一般的故障切换高可用集群来讲已经足够用了。有可能之后的版本支持两个节点进行读写存取。
1.二、DRBD与HA的关系
一个DRBD系统由两个节点构成,与HA集群相似,也有主节点和备用节点之分,在带有主要设备的节点上,应用程序和操做系统能够运行和访问DRBD设备(/dev/drbd*)。在主节点写入的数据经过DRBD设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的DRBD设备,最终写入备用节点的磁盘设备上,在备用节点上,DRBD只是将数据从DRBD设备写入到备用节点的磁盘中。如今大部分的高可用性集群都会使用共享存储,而DRBD也能够做为一个共享存储设备,使用DRBD不须要太多的硬件的投资。由于它在TCP/IP网络中运行,因此,利用DRBD做为共享存储设备,要节约不少成本,由于价格要比专用的存储网络便宜不少;其性能与稳定性方面也不错
2、DRBD复制模式
2.一、协议A:
异步复制协议。一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。在一个节点发生故障时,可能发生数据丢失,由于被写入到远程节点上的数据可能仍在发送队列。尽管,在故障转移节点上的数据是一致的,但没有及时更新。这一般是用于地理上分开的节点
2.二、协议B:
内存同步(半同步)复制协议。一旦本地磁盘写入已完成且复制数据包达到了对等节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的状况下,由于在传输中的数据可能不会被提交到磁盘
2.三、协议C:
同步复制协议。只有在本地和远程节点的磁盘已经确认了写操做完成,写才被认为完成。没有任何数据丢失,因此这是一个群集节点的流行模式,但I / O吞吐量依赖于网络带宽
通常使用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,咱们在生产环境使用时须慎重选项使用哪种协议node
3、 DRBD工做原理图
DRBD是Linux的内核的存储层中的一个分布式存储系统,可用使用DRBD在两台Linux服务器之间共享块设备,共享文件系统和数据。相似于一个网络RAID-1的功能,如图所示:mysql
4、安装配置 (节点1上操做)
4.一、准备:
两个节点ha-node1和ha-node2均按照centos7.0系统,每一个节点两块磁盘,一块用做根分区一块用做drbdlinux
192.168.8.51 ha-node1 192.168.8.52 ha-node2
节点1算法
# hostnamectl set-hostname ha-node1 # su -l
# hostnamectl set-hostname ha-node2 # su -l
[root@ha-node2 corosync]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 19.5G 0 part ├─centos-swap 253:0 0 2G 0 lvm [SWAP] └─centos-root 253:1 0 17.5G 0 lvm / sdb 8:16 0 20G 0 disk sr0 11:0 1 1024M 0 rom [root@ha-node1 corosync]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 500M 0 part /boot └─sda2 8:2 0 19.5G 0 part ├─centos-swap 253:0 0 2G 0 lvm [SWAP] └─centos-root 253:1 0 17.5G 0 lvm / sdb 8:16 0 20G 0 disk sr0 11:0 1 1024M 0 rom
# pvcreate /dev/sdb # vgcreate data /dev/sdb # lvcreate --size 2G --name mysql data
setenforce 0 sed -i.bak "s/SELINUX=enforcing/SELINUX=permissive/g" /etc/selinux/config systemctl disable firewalld.service systemctl stop firewalld.service iptables --flush
echo '192.168.8.51 ha-node1 ' >>/etc/hosts echo '192.168.8.52 ha-node2 ' >>/etc/hosts
# chkconfig chronyd off # chkconfig ntpd on # sed -i "/^server\ 3.centos.pool/a server\ 10.239.44.128 " /etc/ntp.conf # service ntpd start # ntpq -p
# ssh-keygen -t dsa -f ~/.ssh/id_dsa -N "" # ssh-copy-id ha-node1 # ssh-copy-id ha-node2
# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org # rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm # yum install -y kmod-drbd84 drbd84-utils
/etc/drbd.conf #主配置文件
/etc/drbd.d/global_common.conf #全局配置文件
a、/etc/drbd.conf说明
主配置文件中包含了全局配置文件及”drbd.d/”目录下以.res结尾的文件sql
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example include "drbd.d/global_common.conf"; include "drbd.d/*.res";
global { usage-count no; #是否参加DRBD使用统计,默认为yes。官方统计drbd的装机量 # minor-count dialog-refresh disable-ip-verification } common { protocol C; #使用DRBD的同步协议 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 } options { # cpu-mask on-no-data-accessible } disk { on-io-error detach; #配置I/O错误处理策略为分离 # size max-bio-bvecs 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 } 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 } syncer { rate 1024M; #设置主备节点同步时的网络速率 } }
detach 分离:这是默认和推荐的选项,若是在节点上发生底层的硬盘I/O错误,它会将设备运行在Diskless无盘模式下
pass_on:DRBD会将I/O错误报告到上层,在主节点上,它会将其报告给挂载的文件系统,可是在此节点上就每每忽略(所以此节点上没有能够报告的上层)
-local-in-error:调用本地磁盘I/O处理程序定义的命令;这须要有相应的local-io-error调用的资源处理程序处理错误的命令;这就给管理员有足够自由的权力命令命令或是脚本调用local-io-error处理I/O错误
定义一个资源
c、建立/etc/drbd.d/MySQL.res并写入centos
resource mysql { #资源名称 protocol C; #使用协议 meta-disk internal; device /dev/drbd1; #DRBD设备名称 syncer { verify-alg sha1;# 加密算法 } net { allow-two-primaries; } on ha-node1 { disk /dev/data/mysql; drbd1使用的磁盘分区为"mysql" address 192.168.8.51:7789; #设置DRBD监听地址与端口 } on ha-node2 { disk /dev/data/mysql; address 192.168.8.52:7789; } }
# scp -rp /etc/drbd.d/* ha-node2:/etc/drbd.d/
# drbdadm create-md mysql # modprobe drbd # drbdadm up mysql # drbdadm -- --force primary mysql
# cat /proc/drbd
ssh ha-node2 “drbdadm create-md mysql” ssh ha-node2 “modprobe drbd” ssh ha-node2 “drbdadm up mysql”
# mkfs.xfs /dev/drbd1 # mount /dev/drbd1 /mnt
6.一、资源的链接状态详细介绍
如何查看资源链接状态?api
[root@ha-node1 ~]# drbdadm cstate mysql #mysql为资源名称 WFConnection
StandAlone 独立的:网络配置不可用;资源尚未被链接或是被管理断开(使用 drbdadm disconnect 命令),或是因为出现认证失败或是脑裂的状况
Disconnecting 断开:断开只是临时状态,下一个状态是StandAlone独立的
Unconnected 悬空:是尝试链接前的临时状态,可能下一个状态为WFconnection和WFReportParams
Timeout 超时:与对等节点链接超时,也是临时状态,下一个状态为Unconected悬空
BrokerPipe:与对等节点链接丢失,也是临时状态,下一个状态为Unconected悬空
NetworkFailure:与对等节点推进链接后的临时状态,下一个状态为Unconected悬空
ProtocolError:与对等节点推进链接后的临时状态,下一个状态为Unconected悬空
TearDown 拆解:临时状态,对等节点关闭,下一个状态为Unconected悬空
WFConnection:等待和对等节点创建网络链接
WFReportParams:已经创建TCP链接,本节点等待从对等节点传来的第一个网络包
Connected 链接:DRBD已经创建链接,数据镜像如今可用,节点处于正常状态
StartingSyncS:彻底同步,有管理员发起的刚刚开始同步,将来可能的状态为SyncSource或PausedSyncS
StartingSyncT:彻底同步,有管理员发起的刚刚开始同步,下一状态为WFSyncUUID
WFBitMapS:部分同步刚刚开始,下一步可能的状态为SyncSource或PausedSyncS
WFBitMapT:部分同步刚刚开始,下一步可能的状态为WFSyncUUID
WFSyncUUID:同步即将开始,下一步可能的状态为SyncTarget或PausedSyncT
SyncSource:以本节点为同步源的同步正在进行
SyncTarget:以本节点为同步目标的同步正在进行
PausedSyncS:以本地节点是一个持续同步的源,可是目前同步已经暂停,多是由于另一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
PausedSyncT:以本地节点为持续同步的目标,可是目前同步已经暂停,这能够是由于另一个同步正在进行或是使用命令(drbdadm pause-sync)暂停了同步
VerifyS:以本地节点为验证源的线上设备验证正在执行
VerifyT:以本地节点为验证目标的线上设备验证正在执行
5.二、资源角色
查看资源角色命令服务器
[root@ha-node ~]# drbdadm role mysql Secondary/Secondary [root@ha-node1ha-node1 ~]# cat /proc/drbd version: 8.4.3 (api:1/proto:86-101) GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-05-27 04:30:21 0: cs:Connected ro: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 ep:1 wo:f oos:2103412
Parimary 主:资源目前为主,而且可能正在被读取或写入,若是不是双主只会出如今两个节点中的其中一个节点上
Secondary 次:资源目前为次,正常接收对等节点的更新
Unknown 未知:资源角色目前未知,本地的资源不会出现这种状态
5.三、硬盘状态
查看硬盘状态命令网络
[root@ha-node1ha-node1 ~]# drbdadm dstate mysql Inconsistent/Inconsistent
Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误致使自动分离
Attaching:读取无数据时候的瞬间状态
Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘
Negotiating:在已经链接的DRBD设置进行Attach读取无数据前的瞬间状态
Inconsistent:数据是不一致的,在两个节点上(初始的彻底同步前)这种状态出现后当即建立一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态
Outdated:数据资源是一致的,可是已通过时
DUnknown:当对等节点网络链接不可用时出现这种状态
Consistent:一个没有链接的节点数据一致,当创建链接时,它决定数据是UpToDate或是Outdated
UpToDate:一致的最新的数据状态,这个状态为正常状态
5.四、启用和禁用资源
手动启用资源并发
手动启用资源 drbdadm up <resource> 手动禁用资源 drbdadm down <resource>
resource:为资源名称;固然也可使用all表示[停用|启用]全部资源
5.五、升级和降级资源
升级资源 drbdadm primary <resource> 降级资源 drbdadm secondary <resource>
5.六、初始化设备同步
选择一个初始同步源;若是是新初始化的或是空盘,这个选择能够是任意的,可是若是其中的一个节点已经在使用并包含有用的数据,那么选择同步源是相当重要的;若是选错了初始化同步方向,就会形成数据丢失,所以须要十分当心
启动初始化彻底同步,这一步只能在初始化资源配置的一个节点上进行,并做为同步源选择的节点上;命令以下:
[root@ha-node1 ~]# drbdadm -- --overwrite-data-of-peer primary mysql [root@ha-node1 ~]# cat /proc/drbd #查看同步进度 version: 8.4.3 (api:1/proto:86-101) GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-05-27 04:30:21 0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---n- ns:1897624 nr:0 dw:0 dr:1901216 al:0 bm:115 lo:0 pe:3 ua:3 ap:0 ep:1 wo:f oos:207988 [=================>..] synced: 90.3% (207988/2103412)K finish: 0:00:07 speed: 26,792 (27,076) K/sec ######当同步完成时如如下状态 version: 8.4.3 (api:1/proto:86-101) GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by gardner@, 2013-05-27 04:30:21 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:2103412 nr:0 dw:0 dr:2104084 al:0 bm:129 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
查看同步进度也可以使用如下命令
drbd-overview
文件系统只能挂载在主(Primary)节点上,所以在设置好主节点后才能够对DRBD设备进行格式化操做
格式化文件系统
[root@ha-node1 ~]# mkfs.ext4 /dev/drbd1
[root@ha-node1 ~]# mount /dev/drbd1 /mnt/
[root@ha-node1 ~]# mount |grep drbd1 /dev/drbd1 on /mnt type ext4 (rw)
“/dev/drbd1”为资源中定义已定义的资源名称
查看DRBD状态
[root@ha-node1 ~]# drbd-overview 0:drbd/0 Connected Primary/Secondary UpToDate/UpToDate C r-----
Primary:当前节点为主;在前面为当前节点
Secondary:备用节点为次
5.八、切换主备节点
先把当前主节点降级为次
[root@ha-node1 ~]# drbdadm secondary mysql
[root@ha-node1 ~]# drbd-overview 0:drbd/0 Connected Secondary/Secondary UpToDate/UpToDate C r-----
[root@ha-node2 ~]# drbdadm primary mysql
[root@ha-node2 ~]# drbd-overview 0:drbd/0 Connected Primary/Secondary UpToDate/UpToDate C r-----
[root@ha-node2 ~]# mount /dev/drbd1 /mnt/ [root@ha-node2 ~]# ls /mnt/ lost+found test
注释:咱们还接着上面的实验继续进行,如今HA-NODE2为主节点而HA-NODE1为备节点
6.一、断开主(parmary)节点;
关机、断开网络或从新配置其余的IP均可以;这里选择的是断开网络
6.二、查看两节点状态
[root@ha-node2 ~]# drbd-overview 0:drbd/0 WFConnection Primary/Unknown UpToDate/DUnknown C r----- /mnt ext4 2.0G 68M 1.9G 4% [root@ha-node1 ~]# drbd-overview 0:drbd/0 StandAlone Secondary/Unknown UpToDate/DUnknown r-----
6.三、将HA-NODE1节点升级为主(primary)节点并挂载资源
[root@ha-node1 ~]# drbdadm primary mysql [root@ha-node1 ~]# drbd-overview 0:drbd/0 StandAlone Primary/Unknown UpToDate/DUnknown r----- [root@ha-node1 ~]# mount /dev/drbd1 /mnt/ [root@ha-node1 ~]# mount | grep drbd1 /dev/drbd1 on /mnt type ext4 (rw)
[root@ha-node2 ~]# tail -f /var/log/messages Sep 19 01:56:06 ha-node2 kernel: d-con drbd: Terminating drbd_a_drbd Sep 19 01:56:06 ha-node2 kernel: block drbd1: helper command: /sbin/drbdadm initial-split-brain minor-0 exit code 0 (0x0) Sep 19 01:56:06 ha-node2 kernel: block drbd1: Split-Brain detected but unresolved, dropping connection! Sep 19 01:56:06 ha-node2 kernel: block drbd1: helper command: /sbin/drbdadm split-brain minor-0 Sep 19 01:56:06 ha-node2 kernel: block drbd1: helper command: /sbin/drbdadm split-brain minor-0 exit code 0 (0x0) Sep 19 01:56:06 ha-node2 kernel: d-con drbd: conn( NetworkFailure -> Disconnecting ) Sep 19 01:56:06 ha-node2 kernel: d-con drbd: error receiving ReportState, e: -5 l: 0! Sep 19 01:56:06 ha-node2 kernel: d-con drbd: Connection closed Sep 19 01:56:06 ha-node2 kernel: d-con drbd: conn( Disconnecting -> StandAlone ) Sep 19 01:56:06 ha-node2 kernel: d-con drbd: receiver terminated Sep 19 01:56:06 ha-node2 kernel: d-con drbd: Terminating drbd_r_drbd Sep 19 01:56:18 ha-node2 kernel: block drbd1: role( Primary -> Secondary )
[root@ha-node1 ~]# drbdadm role drbd Primary/Unknown [root@ha-node2 ~]# drbdadm role mysql Primary/Unknown
root@ha-node1 ~]# drbd-overview 0:mysql/0 StandAlone Primary/Unknown UpToDate/DUnknown r----- /mnt ext4 2.0G 68M 1.9G 4% [root@ha-node2 ~]# drbd-overview 0:mysql/0 WFConnection Primary/Unknown UpToDate/DUnknown C r----- /mnt ext4 2.0G 68M 1.9G 4%
6.七、在HA-NODE1备用节点处理办法
[root@ha-node1 ~]# umount /mnt/ [root@ha-node1 ~]# drbdadm disconnect drbd drbd: Failure: (162) Invalid configuration request additional info from kernel: unknown connection Command 'drbdsetup disconnect ipv4:192.168.137.225:7789 ipv4:192.168.137.222:7789' terminated with exit code 10 [root@ha-node1 ~]# drbdadm secondary drbd [root@ha-node1 ~]# drbd-overview 0:drbd/0 StandAlone Secondary/Unknown UpToDate/DUnknown r----- [root@ha-node1 ~]# drbdadm connect --discard-my-data drbd
[root@ha-node1 ~]# drbd-overview 0:drbd/0 WFConnection Secondary/Unknown UpToDate/DUnknown C r-----
[root@ha-node2 ~]# drbdadm connect drbd
[root@ha-node2 ~]# drbd-overview 0:mysql/0 Connected Primary/Secondary UpToDate/UpToDate C r----- /mnt ext4 2.0G 68M 1.9G 4% [root@ha-node1 ~]# drbd-overview 0:mysql/0 Connected Secondary/Primary UpToDate/UpToDate C r-----