一、DRBD简介
DRBD的全称为:Distributed ReplicatedBlock Device(DRBD)分布式块设备复制,DRBD是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。你可以把它看作是一种网络RAID。它允许用户在远程机器上建立一个本地块设备的实时镜像。
1.1、DRBD是如何工作的呢?
(DRBD Primary)负责接收数据,把数据写到本地磁盘并发送给另一台主机(DRBD Secondary)。另一个主机再将数据存到自己的磁盘中。目前,DRBD每次只允许对一个节点进行读写访问,但这对于通常的故障切换高可用集群来说已经足够用了。有可能以后的版本支持两个节点进行读写存取。
1.2、DRBD与HA的关系
一个DRBD系统由两个节点构成,与HA集群类似,也有主节点和备用节点之分,在带有主要设备的节点上,应用程序和操作系统可以运行和访问DRBD设备(/dev/drbd*)。在主节点写入的数据通过DRBD设备存储到主节点的磁盘设备中,同时,这个数据也会自动发送到备用节点对应的DRBD设备,最终写入备用节点的磁盘设备上,在备用节点上,DRBD只是将数据从DRBD设备写入到备用节点的磁盘中。现在大部分的高可用性集群都会使用共享存储,而DRBD也可以作为一个共享存储设备,使用DRBD不需要太多的硬件的投资。因为它在TCP/IP网络中运行,所以,利用DRBD作为共享存储设备,要节约很多成本,因为价格要比专用的存储网络便宜很多;其性能与稳定性方面也不错
二、DRBD复制模式
2.1、协议A:
异步复制协议。一旦本地磁盘写入已经完成,数据包已在发送队列中,则写被认为是完成的。在一个节点发生故障时,可能发生数据丢失,因为被写入到远程节点上的数据可能仍在发送队列。尽管,在故障转移节点上的数据是一致的,但没有及时更新。这通常是用于地理上分开的节点
2.2、协议B:
内存同步(半同步)复制协议。一旦本地磁盘写入已完成且复制数据包达到了对等节点则认为写在主节点上被认为是完成的。数据丢失可能发生在参加的两个节点同时故障的情况下,因为在传输中的数据可能不会被提交到磁盘
2.3、协议C:
同步复制协议。只有在本地和远程节点的磁盘已经确认了写操作完成,写才被认为完成。没有任何数据丢失,所以这是一个群集节点的流行模式,但I / O吞吐量依赖于网络带宽
一般使用协议C,但选择C协议将影响流量,从而影响网络时延。为了数据可靠性,我们在生产环境使用时须慎重选项使用哪一种协议
三、 DRBD工作原理图
DRBD是linux的内核的存储层中的一个分布式存储系统,可用使用DRBD在两台Linux服务器之间共享块设备,共享文件系统和数据。类似于一个网络RAID-1的功能,如图所示:
四、安装配置
4.1、准备:
两个节点test1.inzwc.com和test2.inzwc.com均按照centos7.0系统,每个节点两块磁盘,一块用作根分区一块用作drbd
配置hosts文件(2个节点都需执行)
节点1
echo '192.168.91.221 test1.inzwc.com ' >>/etc/hosts
echo '192.168.91.222 test2.inzwc.com ' >>/etc/hosts
echo '192.168.91.223 test3.inzwc.com ' >>/etc/hosts
echo '192.168.91.221 mfsmaster ' >>/etc/hosts
节点2
echo '192.168.91.221 test1.inzwc.com ' >>/etc/hosts
echo '192.168.91.222 test2.inzwc.com ' >>/etc/hosts
echo '192.168.91.223 test3.inzwc.com ' >>/etc/hosts
echo '192.168.91.222 mfsmaster ' >>/etc/hosts
修改主机名:
节点1
hostnamectl set-hostname test1.inzwc.com
su -l
节点2
hostnamectl set-hostname test2.inzwc.com
su -l
更换yum源:
1、备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
CentOS 6
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
运行以下命令生成缓存:
yum clean all
yum makecache
安装ntpdate
为了保证各服务器间时间一致,使用ntpdate同步时间。
yum install -y ntpdate wget lrzsz vim net-tools
加入crontab
crontab -l
1 * * * * (/usr/sbin/ntpdate -s ntp1.aliyun.com;/usr/sbin/hwclock -w) > /dev/null 2>&1
4.2、配置信任关系(2个节点都需执行):
ssh-keygen -t dsa -f ~/.ssh/id_dsa -N ""
ssh-copy-id test1.inzwc.com
ssh-copy-id test2.inzwc.com
4.3、磁盘分区如下
节点1
root># lsblk
节点2
root># lsblk
4.4、创建lvm(2个节点都需执行)
pvcreate /dev/vdb
vgcreate mfsdata /dev/vdb
lvcreate --size 8G --name mfsmeta mfsdata
lvcreate --name data1 -l 100%FREE mfsdata #使用卷组mfsdata剩下的所有空间创建逻辑卷data1
mkdir /data1
mkfs.xfs /dev/mfsdata/data1
mount /dev/mfsdata/data1 /data1 #这个空间是给mfschunkserver使用
4.5、关闭SeLinux和防火墙(2个节点都需执行)
setenforce 0
sed -i.bak "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i "s/SELINUXTYPE=targeted/SELINUXTYPE=disabled/g" /etc/selinux/config
systemctl stop firewalld # 关闭服务
systemctl disable firewalld # 禁止开机启动
4.6、安装drbd(2个节点都需执行)
yum install kernel-devel kernel kernel-headers -y
需要执行上面的命令,先升级内核,然后重启,不然会报下面错误
modprobe drbd
modprobe: FATAL: Module drbd not found.
加载不了drbd模块
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结尾的文件
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf";
include "drbd.d/*.res";
b、/etc/drbd.d/global_common.conf说明
global {
usage-count yes;
# minor-count dialog-refresh disable-ip-verification
}
common {
handlers {
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
wfc-timeout 120;
degr-wfc-timeout 120;
}
options {
# cpu-mask on-no-data-accessible
}
disk {
# 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
al-extents 3389;
disk-barrier no;
disk-flushes no;
on-io-error detach;
resync-rate 40M;
}
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
cram-hmac-alg sha1;
shared-secret "zwcdrbd224";
max-buffers 8000;
max-epoch-size 8000;
unplug-watermark 16;
sndbuf-size 512k;
}
}
c、创建/etc/drbd.d/drbd.res并写入
vim /etc/drbd.d/drbd.res
resource r0 {
protocol C;
meta-disk internal;
device /dev/drbd0;
syncer {
verify-alg sha1;
}
net {
allow-two-primaries;
}
on test1.inzwc.com{
disk /dev/mfsdata/mfsmeta;
address 192.168.91.221:7789;
}
on test2.inzwc.com{
disk /dev/mfsdata/mfsmeta;
address 192.168.91.222:7789;
}
}
d、将配置文件拷贝到节点2上
root># scp -rp /etc/drbd.d/* test2.inzwc.com:/etc/drbd.d/
6、启用drbd
a、主节点(节点1)
drbdadm create-md r0
modprobe drbd
drbdadm up r0
b、配置对端节点(节点2)
drbdadm create-md r0
modprobe drbd
drbdadm up r0
或者节点1,远程执行命令
ssh test2.inzwc.com “drbdadm create-md r0”
ssh test2.inzwc.com “modprobe drbd”
ssh test2.inzwc.com “drbdadm up r0”
c、强制将设置为primary(节点1)
drbdadm --force primary r0
#查看状态 drbd-overview 或 cat /proc/drbd
test1.inzwc.com<2017-02-25 00:01:53> /etc/drbd.d
root># cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r---n-
ns:391092 nr:0 dw:0 dr:392168 al:8 bm:0 lo:0 pe:6 ua:1 ap:0 ep:1 wo:d oos:7998568
[>....................] sync'ed: 4.7% (7808/8188)M
finish: 0:04:06 speed: 32,476 (32,476) K/sec
#发现正在同步数据
c、创建文件系统,格式化设备并挂载(只能在主节点执行)
文件系统只能挂载在主(Primary)节点上,因此在设置好主节点后才可以对DRBD设备进行格式化操作
格式化文件系统
mkfs.xfs /dev/drbd0
mkdir /drbddata
挂载文件系统
mount /dev/drbd0 /drbddata
查看挂载
root># mount |grep drbd
/dev/drbd0 on /mfsmastermeta type xfs (rw,relatime,attr2,inode64,noquota)
注释:
“/dev/drbd0”为资源中定义已定义的资源名称
查看DRBD状态
root># drbd-overview
0:r0/0 Connected Primary/Primary UpToDate/UpToDate /mfsmastermeta xfs 8.0G 33M 8.0G 1%
注释:
Primary:当前节点为主;在前面为当前节点
Secondary:备用节点为次
7、相关配置操作
7.1、资源的连接状态详细介绍
如何查看资源连接状态?
root># drbdadm cstate r0
Connected
资源的连接状态;一个资源可能有以下连接状态中的一种
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:以本地节点为验证目标的线上设备验证正在执行
7.2、资源角色
查看资源角色命令
test1.inzwc.com<2017-02-14 18:14:44> /etc/drbd.d
root># drbdadm role r0
Primary/Secondary
test1.inzwc.com<2017-02-14 18:14:48> /etc/drbd.d
root># cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:8400954 nr:0 dw:12638 dr:8390626 al:15 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
test2.inzwc.com<2017-02-14 18:14:55> ~
root># drbdadm role r0
Secondary/Primary
test2.inzwc.com<2017-02-14 18:16:00> ~
root># cat /proc/drbd
version: 8.4.9-1 (api:1/proto:86-101)
GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by akemi@Build64R7, 2016-12-04 01:08:48
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:0 nr:8400954 dw:8400954 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
注释:
Parimary 主:资源目前为主,并且可能正在被读取或写入,如果不是双主只会出现在两个节点中的其中一个节点上
Secondary 次:资源目前为次,正常接收对等节点的更新
Unknown 未知:资源角色目前未知,本地的资源不会出现这种状态
7.3、硬盘状态
查看硬盘状态命令
root># drbdadm dstate r0
UpToDate/UpToDate
本地和对等节点的硬盘有可能为下列状态之一:
Diskless 无盘:本地没有块设备分配给DRBD使用,这表示没有可用的设备,或者使用drbdadm命令手工分离或是底层的I/O错误导致自动分离
Attaching:读取无数据时候的瞬间状态
Failed 失败:本地块设备报告I/O错误的下一个状态,其下一个状态为Diskless无盘
Negotiating:在已经连接的DRBD设置进行Attach读取无数据前的瞬间状态
Inconsistent:数据是不一致的,在两个节点上(初始的完全同步前)这种状态出现后立即创建一个新的资源。此外,在同步期间(同步目标)在一个节点上出现这种状态
Outdated:数据资源是一致的,但是已经过时
DUnknown:当对等节点网络连接不可用时出现这种状态
Consistent:一个没有连接的节点数据一致,当建立连接时,它决定数据是UpToDate或是Outdated
UpToDate:一致的最新的数据状态,这个状态为正常状态
7.4、启用和禁用资源
drbdadm up
手动启用资源
drbdadm up r0
手动禁用资源
drbdadm down r0
注释:
resource:为资源名称;当然也可以使用all表示[停用|启用]所有资源
7.5、升级和降级资源
升级资源
drbdadm primary
降级资源
drbdadm secondary
注释:在单主模式下的DRBD,两个节点同时处于连接状态,任何一个节点都可以在特定的时间内变成主;但两个节点中只能一为主,如果已经有一个主,需先降级才可能升级;在双主模式下没有这个限制
7.6、初始化设备同步
选择一个初始同步源;如果是新初始化的或是空盘,这个选择可以是任意的,但是如果其中的一个节点已经在使用并包含有用的数据,那么选择同步源是至关重要的;如果选错了初始化同步方向,就会造成数据丢失,因此需要十分小心
启动初始化完全同步,这一步只能在初始化资源配置的一个节点上进行,并作为同步源选择的节点上;命令如下:
test1.inzwc.com<2017-02-14 18:25:13> /etc/drbd.d
root># drbdadm -- --overwrite-data-of-peer primary r0
root># 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
注释: r0:为资源名称
查看同步进度也可使用以下命令
root># drbd-overview
0:r0/0 Connected Primary/Primary UpToDate/UpToDate /mfsmastermeta xfs 8.0G 33M 8.0G 1%
注释:
Primary:当前节点为主;在前面为当前节点
Secondary:备用节点为次
7.8、切换主备测试是否同步成功
节点1执行(主节点切换为备节点)
[root@server1 drbd.d]# mount /dev/drbd0 /mfsmastermeta/ #将格式化好的磁盘挂载到/mfsmastermeta上
[root@server1 drbd.d]# cd /mfsmastermeta/ #切换到/mfsmastermeta
[root@server1 mfsmastermeta]# ls
lost+found
[root@server1 mfsmastermeta]# touch file{1..4} #创建几个文件
[root@server1 mfsmastermeta]# ls
file1 file2 file3 file4 lost+found
[root@server1 mfsmastermeta]# cd
[root@server1 ~]# umount /mfsmastermeta/ #卸载
[root@server1 ~]# drbdadm secondary r0 #将服务端1变成secondary
[root@server1 ~]# cat /proc/drbd 或 drbd-overview #查看
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build [email protected], 2016-10-08 15:10:25
1: cs:Connectedro:Secondary/Secondary ds:UpToDate/UpToDate C r-----
ns:2163404 nr:0dw:66352 dr:2098429 al:13 bm:128 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
节点2执行(备节点切换为主节点)
[root@server2 drbd.d]# drbdadm primary r0 #将服务端2变成primary
[root@server2 drbd.d]# cat /proc/drbd #查看
version: 8.4.3 (api:1/proto:86-101)
GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build [email protected], 2016-10-08 15:10:25
1: cs:Connectedro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:0 nr:2163404dw:2163404 dr:664 al:0 bm:128 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
[root@server2 drbd.d]# mount /dev/drbd0 /mfsmastermeta/ #挂载
[root@server2 drbd.d]# cd /mfsmastermeta/
[root@server2 mnt]# ls #查看,同步成功
file1 file2 file3 file4 lost+found
8、DRBD脑裂的模拟及修复
注释:我们还接着上面的实验继续进行,现在HA-NODE2为主节点而HA-NODE1为备节点
8.1、断开主(parmary)节点;
关机、断开网络或重新配置其他的IP都可以;这里选择的是断开网络
8.2、查看两节点状态
[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-----
由上可以看到两个节点已经无法通信;HA-NODE2为主节点,HA-NODE1为备节点
8.3、将HA-NODE1节点升级为主(primary)节点并挂载资源
[root@ha-node1 ~]# umount -l /mfsmastermeta
[root@ha-node1 ~]# drbdadm primary r0
[root@ha-node1 ~]# drbd-overview
0:drbd/0 StandAlone Primary/Unknown UpToDate/DUnknown r-----
[root@ha-node1 ~]# mount /dev/drbd0 /mfsmastermeta
[root@ha-node1 ~]# mount | grep drbd0
/dev/drbd1 on /mnt type ext4 (rw)
8.4、假如原来的主(primary)节点修复好重新上线了,这时出现了脑裂情况
[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 )
8.5、再次查看两节点的状态
[root@ha-node2 ~]# drbdadm role r0
Primary/Unknown
参考文档:http://man.linuxde.net/vgcreate
http://blog.csdn.net/wylfengyujiancheng/article/details/50669947
http://www.linuxidc.com/Linux/2015-03/115465.htm