DRBD
DRBD是一种块设备,属于DAS,可以被应用在高可用(HA)中,类似于raid 1的镜像功能,当写入数据时,数据会被工作在内核中DRBD模块通过网络发送到网络中的另一台主机。常工作于主备模式,数据实时同步,当主节点出现故障,备节点的可切换成主节点立马恢复工作。
DRBD工作模型

DRBD的工作特性:
- 实时同步
- 对用户透明
- 可以实现同步和异步同步
数据同步存在三种模型:
protocol [A|B|C]:
- A: Async 异步,相当于同步数据发送到主节点的tcp/ip协议栈就返回
- B: Semi-Sync 半同步,相当于同步数据发送到备节点的tcp/ip协议栈返回
- C: Sync 同步,将同步数据写入备节点磁盘才返回
工作类型:
主要工作在master/slave的模型,master工作的情况下,备节点不得挂载读写,否则文件系统奔溃。
dual master,双主模式,只有工作在集群文件系统的时候才可以使用,需要集群文件锁的信息层的支持。
安装DRBD
DRBD默认内核没有,我们需要第三方的加载内核模块支持:
1 | centos 6 |
2 | rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org |
3 | rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm |
4 | yum install -y kmod-drbd84 drbd84-utils |
5 | |
6 | centos 7 |
7 | rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org |
8 | rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm |
9 | yum install -y kmod-drbd84 drbd84-utils |
配置DRBD
配置文件:
1 | /etc/drbd.conf |
2 | /etc/drbd.d/global_common.conf: 提供全局配置,及多个drbd设备相同的配置 |
3 | /etc/drbd.d/*.res: 资源定义 |
4 | |
5 | global: 全局属性,定义drbd自己的工作特性 |
6 | common: 通用特性,定义多组drbd设备的通用特性 |
7 | *。res: 资源特有特性 |
DRB配置实例
node1 10.211.55.48
node2 10.211.55.49
准备工作:
- 时间同步
- 主机名于hostname相同
- /etc/hosts解析主机名
node1
1~]#cat /etc/drbd.conf2include "drbd.d/global_common.conf";3include "drbd.d/*.res";4~]# cat /etc/drbd.d/global_common.conf5global {6usage-count no;7}8common {9disk { on-io-error detach; #io出错的磁盘,摘掉10}11net { cram-hmac-alg "sha1"; #加密算法12shared-secret "mydrbdlab"; #加密密钥13protocol C; #工作模型14}15syncer {16rate 100M; #同步速率17}18}19~]# cat /etc/drbd.d/mystore.res20resource mystore {21device /dev/drbd0;22disk /dev/sdb;23meta-disk internal;24on node1 {25address 10.211.55.48:7789;26}27on node2 {28address 10.211.55.49:7789;29}3031}32~]# scp /etc/drbd.d/{mystore.res,global_common.conf} node2:/etc/drbd.d33初始化资源34~]# drbdadm create-md mystore;ssh node2 'drbdadm create-md mystore'35启动服务36~]# service drbd start;ssh node2 "service drbd start"37~]# cat /proc/drbd38version: 8.4.9-1 (api:1/proto:86-101)39GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by mockbuild@Build64R6, 2016-12-13 18:38:15400: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r-----41ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:1048540442~]# drbd-overview430:mystore Connected Secondary/Secondary Inconsistent/Inconsistent C r----44两个都是备节点,切换下成主节点45在要设置为Primary的节点上可以执行如下命令的一个:46(1) ~]# drbdsetup /dev/drbd0 primary –o47(2) ~]# drbdadm -- --overwrite-data-of-peer primary mystore48(3) ~]# drbdadm primary --force mystore4950设有主备节点后,开始位对齐:51~]# cat /proc/drbd52version: 8.4.9-1 (api:1/proto:86-101)53GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by mockbuild@Build64R6, 2016-12-13 18:38:15540: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----55ns:1228800 nr:0 dw:0 dr:1229464 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:925660456[=>..................] sync'ed: 11.8% (9036/10236)M57finish: 0:03:51 speed: 39,936 (39,636) K/sec5859等位对齐,我们就可以在主节点挂载使用块设备了:60~]# cat /proc/drbd61version: 8.4.9-1 (api:1/proto:86-101)62GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by mockbuild@Build64R6, 2016-12-13 18:38:15630: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----64ns:24 nr:10619544 dw:21104972 dr:1045 al:2 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:06566~]# mkfs.ext4 /dev/drbd067~]# mount /dev/drbd0 /mnt68~]# cd /mnt69~]# echo 'hello drdb' > hello70~]# cd ..71~]# umount /mnt72~]# drbdadm secondary mystorenode2
1~]# drbdadm primary mystore2~]# cat /proc/drbd3version: 8.4.9-1 (api:1/proto:86-101)4GIT-hash: 9976da086367a2476503ef7f6b13d4567327a280 build by mockbuild@Build64R6, 2016-12-13 18:38:1550: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----6ns:24 nr:10619544 dw:21104972 dr:1045 al:2 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:078~]# mount /dev/drbd0 /mnt9~]# cd /mnt10~]# ll11total 2012-rw-r--r--. 1 root root 11 May 19 03:53 hello13drwx------. 2 root root 16384 May 19 03:52 lost+found14~]# cat hello15hello drdb
我们切换DRBD的主从模式挂载都是很麻烦,所以在这个时候我们可以考虑使用高可用集群的crm来管理DRBD资源。