数据镜像:实时、透明、同步(所有服务器都成功后返回)、异步(本地服务器成功后返回)
DRBD的核心功能通过Linux的内核实现,最接近系统的IO栈,但它不能神奇地添加上层的功能比如检测到EXT3文件系统的崩溃。
DRBD的位置处于文件系统以下,比文件系统更加靠近操作系统内核及IO栈。
工具:
drbdadm:高级管理工具,管理/etc/nf,向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
2、下载drbd wget
安装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模块:
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
1、到此两台机器的drbd安装完毕;开始config
node1:
cd /usr/local/drbd/etc/drbd.d
mv nf nf.bak
vim nf
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目录下。nf的配置参数很多,有兴趣的话可以使用命令:man nf来查看了解更多的参数说明;
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
最好同时启动
在任意节点查看节点状态
对输出的含义解释如下:
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
执行此命令后,开始同步两台机器对应磁盘的数据
从输出可知:
“ro状态现在变为“Primary/Secondary”,“ds”状态也变为“UpToDate/Inconsistent”,也就是“实时/不一致”状态,现在数据正在主备两个主机的磁盘间进行同步,且同步进度为8.4%,同步速度每秒10M左右。
等待片刻,再次查看同步状态,输出如下:
可以看到同步完成了,并且“ds“状态也变为“UpToDate/UpToDate”了。即为“实时/实时”状态了。
格式化disk
mkfs.ext4 /dev/drbd1
接下了就可以mount 使用了
现在来说,只是我们在主节点写入,另一个节点的数据就同步了,我们来测试下,我往里面拖拉一个2.8G的iso;
现在我查看node2的disk里面有没有;进行drbd主备间的切换;
首先;
[root@Centos ~]#umount /mnt
[root@Centos ~]# drbdadm secondary r0
在另外一个Node1:
[root@Centos ~]# drbdadm primary r0
[root@Centos ~]# mount /dev/drbd1 /mnt/
事实证明是ok的;
另外一种非正常的切换,比如主节点的drbd挂掉了;
[root@Centos ~]# /etc/init.d/drbd stop
这些主节点的drbd级别自动secondary了;无需再操作降级
在另一台机器:
[root@Centos ~]# drbdadm primary r0
如果报错:
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
发现在同步数据,所以可以随时写入,都保持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异常
下面先将node2进行了primary
在drbd2处理方法:
[root@drbd2 /]# drbdadm disconnect r0
[root@drbd2 /]# drbdadm secondary r0
[root@drbd2 /]# drbdadm -- --discard-my-data connect r0
#该命令告诉drbd,secondary上的数据不正确,以primary上的数据为准。
需要在drbd1上重连接资源:
[root@drbd1 ~]# drbdadm connect fs
再次启动drbd2上的drbd服务,OK
这样drbd1就能和drbd2开始连接上了,并且保证数据不会丢失:
如果异常connect,可以先disconnect下。然后发现启动也正常了