且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

drbd之node间数据同步复制&&脑裂修复

更新时间:2022-09-13 15:58:48

Distributed Replicated Block Device(DRBD)是一个用软件实现的、无共享的、服务器之间镜像块设备内容的存储复制解决方案。


数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)
DRBD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃。
DRBD的位置处于文件系统以下,比文件系统更加靠近操作系统内核及IO栈。
工具:
drbdadm:高级管理工具,管理/etc/drbd.conf,向drbdsetup和drbdmeta发送指令,
drbdsetup:配置装载进kernel的DRBD模块,平时很少直接用
drbdmeta:管理META数据结构,平时很少直接用。
在DRBD中,资源是特指某复制的存储设备的所有方面。包括资源名称、DRBD设备(/dev/drbdm,这里m是设备最小号,最大号可到147)、磁盘配置(使本地数据可以为DRBD所用)、网络配置(与对方通信)
每个资源有个角色,是Primary或Secondary,下面简称“主”和“备”
主角色的DRBD设备可以不受限制的读和写,比如创建和映射文件系统、对于块设备的raw或直接IO访问。
备角色的DRBD设备接受来自对方的所有修改,但是不能被应用程序读写,甚至只读也不行。
角色可以改变。

DRBD 是由内核模块和相关脚本而构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。您可以把它看作是一种网络RAID;Drbd 负责接收数据,把数据写到本地磁盘,然后发送给另一个主机。另一个主机再将数据存到自己的磁盘中。

原理:

每个设备(drbd
提供了不止一个设备)都有一个状态,可能是‘主’状态或‘辅助’状态。在带有主要设备的节点上,应用程序应能运行和访问设   
备(/dev/nbX)。每次写入都会发往本地低层设备和带有‘辅助’状态设备的节点中。次要设备只能简单地把数据写入它的低层块设备上。
   读取数据通常在本地进行。
       如果主节点发生故障,心跳将会把辅助设备转换到主状态,并启动其上的应用程序。(如果您将它和无日志FS 一起使用,则需要运行fsck)。
   如果发生故障的节点恢复工作,它就会成为新的辅助节点,而且必须使自己的内容与主节点的内容保持同步。当然,这些操作不会干扰到后台的服务。

环境:centos6.0  修改hosts

        node1:192.168.182.128  

       node2:192.168.182.131

每个node都一个空白的分区(不创建任何分区)或新增的disk;本文是新增的一个disk(8G)

1、yum -y install gcc kernel-devel kernel-headers flex

drbd之node间数据同步复制&&脑裂修复

2、下载drbd  wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz

安装drbd;

tar zxvf drbd-8.4.3.tar.gz

cd drbd-8.4.3

./configure --prefix=/usr/local/drbd --with-km

make KDIR=/usr/src/kernels/2.6.32-71.el6.i686/

make install

mkdir -p /usr/local/drbd/var/run/drbd

cp /usr/local/drbd/etc/rc.d/init.d/drbd /etc/rc.d/init.d

chkconfig --add drbd

chkconfig drbd on

drbd之node间数据同步复制&&脑裂修复

安装drbd模块:

cd drbd

#make clean

#make KDIR=/usr/src/kernels/2.6.32-71.el6.i686/

cp drbd.ko /lib/modules/`uname -r`/kernel/lib/

depmod

modprobe drbd

drbd之node间数据同步复制&&脑裂修复

1、到此两台机器的drbd安装完毕;开始config

node1:

cd /usr/local/drbd/etc/drbd.d

mv global_common.conf global_common.conf.bak

vim global_common.conf

global    {
   usage-count    yes;  #是否参加DRBD使用者统计,默认yes
   }
   common    {
   net    {
      protocol    C;  #使用drbd的第三种同步协议,表示收到远程主机的写入确认后,则认为写入完成.
   }
   }

vim r0.res

resource    r0    {
       on node1    {   #每个主机的说明以on开头,后面是hostname
       device    /dev/drbd1;   drbd设备名
       disk    /dev/sdb1;  #/dev/drbd1使用的磁盘分区是/dev/sdb1。
       address    192.168.182.128:7789;    #设置DRBD的监听端口,用于与另一台主机通信。
       meta-disk    internal;
   }
       on node2    {
       device    /dev/drbd1;
       disk    /dev/sdb1;
       address    192.168.182.131:7789;
       meta-disk    internal;
   }
}

将上面这个配置文件分别复制到两台主机的/etc/drbd.d目录下。drbd.conf的配置参数很多,有兴趣的话可以使用命令:man drbd.conf来查看了解更多的参数说明;

2、 启动DRBD

在两个节点执行
在启动DRBD之前,你需要分别在两台主机的sdb1分区上,创建供DRBD记录信息的数据块.分别在两台主机上执行: 
[root@Centos ~]# drbdadm create-md r0 或者执行drbdadm create-md all
[root@Centos ~]# drbdadm create-md r0
在两个节点启动服务
[root@Centos ~]#/etc/init.d/drbd start
[root@Centos ~]#/etc/init.d/drbd start
***同时启动
在任意节点查看节点状态

drbd之node间数据同步复制&&脑裂修复

对输出的含义解释如下:
ro表示角色信息,第一次启动drbd时,两个drbd节点默认都处于Secondary状态,
ds是磁盘状态信息,“Inconsistent/Inconsisten”,即为“不一致/不一致”状态,表示两个节点的磁盘数据处于不一致状态。“UpToDate/UpToDate”。即为“实时/实时”状态了。
Ns表示网络发送的数据包信息。
Dw是磁盘写信息
Dr是磁盘读信息

设置主节点
由于默认没有主次节点之分,因而需要设置两个主机的主次节点,选择需要设置为主节点的主机,然后执行如下命令:
[root@Centos ~]#drbdsetup /dev/drbd1 primary --o
或者执行下面命令也是可以的
[root@Centos ~]#drbdadm -- --overwrite-data-of-peer primary all
第一次执行完此命令后,在后面如果需要设置哪个是主节点时,就可以使用另外一个命令:

drbdadm primary r0或者drbdadm primary all

执行此命令后,开始同步两台机器对应磁盘的数据

drbd之node间数据同步复制&&脑裂修复

从输出可知:
   “ro状态现在变为“Primary/Secondary”,“ds”状态也变为“UpToDate/Inconsistent”,也就是“实时/不一致”状态,现在数据正在主备两个主机的磁盘间进行同步,且同步进度为8.4%,同步速度每秒10M左右。
等待片刻,再次查看同步状态,输出如下:

drbd之node间数据同步复制&&脑裂修复

可以看到同步完成了,并且“ds“状态也变为“UpToDate/UpToDate”了。即为“实时/实时”状态了。

格式化disk

mkfs.ext4 /dev/drbd1

drbd之node间数据同步复制&&脑裂修复

接下了就可以mount 使用了

drbd之node间数据同步复制&&脑裂修复

现在来说,只是我们在主节点写入,另一个节点的数据就同步了,我们来测试下,我往里面拖拉一个2.8G的iso;

drbd之node间数据同步复制&&脑裂修复

现在我查看node2的disk里面有没有;进行drbd主备间的切换;

首先;

[root@Centos ~]#umount /mnt
[root@Centos ~]# drbdadm secondary r0

在另外一个Node1:

[root@Centos ~]# drbdadm primary r0

[root@Centos ~]# mount /dev/drbd1 /mnt/

drbd之node间数据同步复制&&脑裂修复

事实证明是ok的;

另外一种非正常的切换,比如主节点的drbd挂掉了;

[root@Centos ~]# /etc/init.d/drbd stop

这些主节点的drbd级别自动secondary了;无需再操作降级

在另一台机器:

[root@Centos ~]# drbdadm primary r0

drbd之node间数据同步复制&&脑裂修复

如果报错:
2: State change failed: (-7) Refusing to be Primary while peer is not outdated
Command 'drbdsetup 2 primary' terminated with exit code 11
因此,必须在备用节点执行如下命令:
[root@Centos ~]# drbdsetup /dev/drbd0 primary --o
或者
[root@Centos ~]# drbdadm -- --overwrite-data-of-peer primary all
此时就可以正常切换了。
当在备用节点执行切换到主节点命令后,原来的主用节点自动变为备用节点。无需在主用节点再次执行切换到备用节点的命令。

当你在备用节点写入数据了,然后主节点起来,/etc/init.d/drbd start

drbd之node间数据同步复制&&脑裂修复

发现在同步数据,所以可以随时写入,都保持sync


Ps:

1、当用两个分区的时候,如果不能create-md可以先dd下

dd if=/dev/zero of=/dev/sd[a-z]n bs=1M count=n;


脑裂修复:

在一台机器重启后出现了脑裂现象;node2和node1都unkown状况了,node2启动drbd异常

drbd之node间数据同步复制&&脑裂修复

drbd之node间数据同步复制&&脑裂修复


下面先将node2进行了primary

  1. 在drbd2处理方法:

  2. [root@drbd2 /]# drbdadm disconnect r0 

  3. [root@drbd2 /]# drbdadm secondary r0

  4. [root@drbd2 /]# drbdadm -- --discard-my-data connect r0

#该命令告诉drbd,secondary上的数据不正确,以primary上的数据为准。

  1. 需要在drbd1上重连接资源:

  2. [root@drbd1 ~]# drbdadm connect fs 

再次启动drbd2上的drbd服务,OK

这样drbd1就能和drbd2开始连接上了,并且保证数据不会丢失:

如果异常connect,可以先disconnect下。然后发现启动也正常了



本文转自 西索oO 51CTO博客,原文链接:http://blog.51cto.com/lansgg/1194252