drbd(四):drbd多节点(drbd9)
1.drbd多节点简介
在drbd9以前,drbd一直只能配置两个节点,要么是primary/secondary,要么是primary/primary。虽然在这些版本上也能配置第三个节点实现三路节点的同步,但这个第三节点一般都只当作备份drbd设备,几乎没人去使用drbd配置3节点。
但是在drbd9中,drbd可以定义环状网络的多节点,最多支持16个节点。这些节点之间,两两都要握手。例如,下图是5节点的drbd环状图。
对于host1节点来说,它有4个对端(peer)节点:host2、host3、host4、host5。这4个节点组成host1的"搭档"(partner)。请区分peer和partner:peer是节点与节点之间的关系,称为对端;partner是节点和其他所有节点的关系。虽然,是否区分peer和partner不影响drbd9的使用,但是看drbd9文档的时候有用。
根据上图,每节点都需要和其他任意一个节点建立连接,因此2节点的drbd只需一个连接对,3节点的drbd需要3个连接对,4个节点需要6个连接对,16个节点需要120个连接对。
在drbd84和以前的版本上,几乎总是使用/proc/drbd文件来获取节点之间的状态信息。但是这个文件只能记录两个节点的信息,而drbd9支持多个节点,这个文件已经无法完整记录各节点之间的关系,因此/proc/drbd已经完全废弃了。
在drbd9上,可以使用drbdadm status
或drbdsetup status
等命令获取各节点的信息。
由于每个节点都需要和其他所有节点通信,因此每个节点的元数据区的大小都要比两节点时的元数据翻(N-1)倍,这意味着很容易出现元数据区空间不足的情况。因此,请保证每个节点的元数据区够大。如果drbdadm up
启动失败,可以查看/var/log/message日志进行排查是否是因为元数据区的问题。
drbd9.0中还不支持多节点的多主模型(虽能实现,但官方说没有测试,很危险),在drbd9.1中将正式支持多节点的多主模型。而单主模型的drbd,又没必要多节点,所以在drbd9中,新添加的多节点特性有点不上不下。
最后,目前还不适合使用drbd9.0,不少新添加的功能还没有完善。
2.配置3节点的drbd
以下是/etc/drbd.d/rs0.res文件中的内容:
resource rs0 { volume 0 { device /dev/drbd0; disk /dev/sdb2; meta-disk /dev/sdb1; } volume 1 { device /dev/drbd1; disk /dev/sdb4; meta-disk /dev/sdb3; } on drbd90.longshuai.com { address 192.168.100.56:7788; node-id 0; # 需要定义每个节点标识符id } on drbd91.longshuai.com { address 192.168.100.55:7788; node-id 1; } on drbd92.longshuai.com { address 192.168.100.58:7788; node-id 2; } connection { # 定义环状网络中的连接对 host drbd90.longshuai.com port 7001; host drbd91.longshuai.com port 7010; } connection { host drbd91.longshuai.com port 7012; host drbd92.longshuai.com port 7021; } connection { host drbd90.longshuai.com port 7002; host drbd92.longshuai.com port 7020; } }
其中connection指令定义节点与节点之间的连接对,由于这里配置的是3节点,因此配置了3个连接对,分别是(drbd90,drbd91),(drbd90,drbd92),(drbd91,drbd92)。
此外还定义了每个连接对之间tcp通信的端口。如果服务器上的网卡够多,可以为每个连接对都使用单独的IP地址。
如果各连接对之前都不单独定义通信端口,而是使用address指令上的默认端口,则可以将上面所有connection指令简化为一个"connection-mesh"指令。如下:
connection-mesh { hosts drbd90.longshuai.com drbd91.longshuai.com drbd92.longshuai.com; }
然后在三个节点上都执行:
drbdadm up rs0
这表示3个节点的所有卷组都建立连接、启动资源。如果想要指定只和某节点建立连接,则可以使用"--peer"选项来指定host指令中的对端。
以下是drbd90.longshuai.com的状态:
[root@drbd90 ~]# drbdadm status rs0 rs0 role:Secondary volume:0 disk:Inconsistent volume:1 disk:Inconsistent drbd91.longshuai.com role:Secondary volume:0 peer-disk:Inconsistent volume:1 peer-disk:Inconsistent drbd92.longshuai.com role:Secondary volume:0 peer-disk:Inconsistent volume:1 peer-disk:Inconsistent
以下是drbd91.longshuai.com的状态:
[root@drbd91 ~]# drbdadm status rs0 rs0 role:Secondary volume:0 disk:Inconsistent volume:1 disk:Inconsistent drbd90.longshuai.com role:Secondary volume:0 peer-disk:Inconsistent volume:1 peer-disk:Inconsistent drbd92.longshuai.com role:Secondary volume:0 peer-disk:Inconsistent volume:1 peer-disk:Inconsistent
以下是drbd92.longshuai.com的状态:
[root@drbd92 ~]# drbdadm status rs0 rs0 role:Secondary volume:0 disk:Inconsistent volume:1 disk:Inconsistent drbd90.longshuai.com role:Secondary volume:0 peer-disk:Inconsistent volume:1 peer-disk:Inconsistent drbd91.longshuai.com role:Secondary volume:0 peer-disk:Inconsistent volume:1 peer-disk:Inconsistent
将drbd90.longshuai.com节点升级为primary,并查看该节点的状态。
[root@drbd90 ~]# drbdadm --force primary rs0 [root@drbd90 ~]# drbdadm status rs0 rs0 role:Primary volume:0 disk:UpToDate volume:1 disk:UpToDate drbd91.longshuai.com role:Secondary volume:0 replication:SyncSource peer-disk:Inconsistent done:0.01 volume:1 replication:SyncSource peer-disk:Inconsistent done:0.01 drbd92.longshuai.com role:Secondary volume:0 replication:SyncSource peer-disk:Inconsistent done:0.01 volume:1 replication:SyncSource peer-disk:Inconsistent done:0.01
再查看drbd91.longshuai.com的状态。
[root@drbd91 ~]# drbdadm status rs0 rs0 role:Secondary volume:0 disk:Inconsistent volume:1 disk:Inconsistent drbd90.longshuai.com role:Primary volume:0 replication:SyncTarget peer-disk:UpToDate done:2.53 volume:1 replication:SyncTarget peer-disk:UpToDate done:3.08 drbd92.longshuai.com role:Secondary volume:0 peer-disk:Inconsistent resync-suspended:peer volume:1 peer-disk:Inconsistent resync-suspended:peer
注意其中的resync-suspended状态,表示本端和drbd92.longshuai.com节点之间并不同步,它们之间的同步操作处于挂起状态。
同理,drbd92.longshuai.com节点上的状态也这样,和drbd91.longshuai.com节点之间是不会进行同步的,它们的同步操作被挂起。
[root@drbd92 ~]# drbdadm status rs0 rs0 role:Secondary volume:0 disk:Inconsistent volume:1 disk:Inconsistent drbd90.longshuai.com role:Primary volume:0 replication:SyncTarget peer-disk:UpToDate done:22.15 volume:1 replication:SyncTarget peer-disk:UpToDate done:6.72 drbd91.longshuai.com role:Secondary volume:0 peer-disk:Inconsistent resync-suspended:peer volume:1 peer-disk:Inconsistent resync-suspended:peer
如果启动资源的时候出现如下错误:
[root@drbd90 ~]# drbdadm up rs0 0: Failure: (162) Invalid configuration request Command 'drbdsetup attach 0 /dev/sdb2 /dev/sdb1 flexible' terminated with exit code 10 1: Failure: (162) Invalid configuration request Command 'drbdsetup attach 1 /dev/sdb4 /dev/sdb3 flexible' terminated with exit code 10
且查看资源的状态时发现本端节点是Diskless,说明资源没有和底层设备关联成功。这可能是底层设备的问题,而底层设备的问题,大多数都是元数据区的问题。
[root@drbd90 ~]# drbdadm status rs0 rs0 role:Secondary volume:0 disk:Diskless volume:1 disk:Diskless drbd91.longshuai.com connection:StandAlone drbd92.longshuai.com connection:StandAlone
再查看drbd的日志。很明显,是元数据区的bitmap槽不够。之所以不够,是因为在创建元数据区的时候已经将槽位创建完成了。
[root@drbd90 ~]# vim /var/log/messages Apr 1 00:19:47 drbd90 kernel: drbd rs0: Starting worker thread (from drbdsetup [75059]) Apr 1 00:19:47 drbd90 kernel: drbd rs0 drbd91.longshuai.com: Starting sender thread (from drbdsetup [75067]) Apr 1 00:19:47 drbd90 kernel: drbd rs0 drbd92.longshuai.com: Starting sender thread (from drbdsetup [75069]) Apr 1 00:19:47 drbd90 kernel: drbd rs0/0 drbd0: disk( Diskless -> Attaching ) Apr 1 00:19:47 drbd90 kernel: drbd rs0/0 drbd0: Maximum number of peer devices = 1 Apr 1 00:19:47 drbd90 kernel: drbd rs0/0 drbd0: Not enough free bitmap slots (available=0, needed=1) Apr 1 00:19:47 drbd90 kernel: drbd rs0/0 drbd0: disk( Attaching -> Diskless ) Apr 1 00:19:47 drbd90 kernel: drbd rs0/1 drbd1: disk( Diskless -> Attaching ) Apr 1 00:19:47 drbd90 kernel: drbd rs0/1 drbd1: Maximum number of peer devices = 1 Apr 1 00:19:47 drbd90 kernel: drbd rs0/1 drbd1: Not enough free bitmap slots (available=0, needed=1) Apr 1 00:19:47 drbd90 kernel: drbd rs0/1 drbd1: disk( Attaching -> Diskless )
这时需要添加bitmap槽,或者重建元数据区(可以dump元数据区,再手动编辑元数据区,再导入),甚至扩大元数据区。目前,drbd添加bitmap槽的方法还比较复杂,可参考https://docs.linbit.com/docs/users-guide-9.0/#s-rebalance-workflow。在以后版本中,drbdadm将可以一条命令添加bitmap槽。
回到Linux系列文章大纲:http://www.cnblogs.com/f-ck-need-u/p/7048359.html
回到网站架构系列文章大纲:http://www.cnblogs.com/f-ck-need-u/p/7576137.html
回到数据库系列文章大纲:http://www.cnblogs.com/f-ck-need-u/p/7586194.html
转载请注明出处:http://www.cnblogs.com/f-ck-need-u/p/8691373.html
注:若您觉得这篇文章还不错请点击右下角推荐,您的支持能激发作者更大的写作热情,非常感谢!
下一篇: redis分布式锁之可重入锁的实现代码