磁盘镜像技术DRBD
什么是DRBD
DRBD是由内核模块和相关脚本构成,用以构建高可用性的集群。其实现方式是通过网络来镜像整个设备。它允许用户在远程机器上建立一个本地块设备的实时镜像。也可以把它看成一个网络RAID1
工作原理:
DRBD负责接收数据,把数据写到本地磁盘,然后发送给另一个主机。另一个主机再将数据存到自己的磁盘中。目前,DRBD每次只允许对一个节点进行读写访问,这对于通常的故障切换高可用性集群已经够了。
DRBD协议:
A:数据一旦写入磁盘并发送到网络中就认为完成了写入操作
B:收到接受确认就认为完成了写入操作
C:收到写入确认就完成了写入操作
目前运用最多的就是C协议
DRBD的三个进程:
drbd0――worker:主进程
drbd0――asender:primary上drbd0的数据发送进程
drbd0――receiver;secondary上drbd0的数据接受进程
配置DRBD前需要注意几点:
mount drbd设备以前必须把设备切换到primary状态
两个节点中,同一时刻只能有一台处于primary状态,另一台处于secondary状态,处于secondary状态的服务器上不能加载drbd设备。主备服务器同步的两个分区大小最好相同,这样不至于浪费磁盘空间,因为drbd镜像相当于网络raid1
前提:
1)本配置共有两个测试节点,分别master-drbd和slave-drbd ,相的IP地址分别为192.168.32.200和192.168.32.202;
2)master-drbd和slave-drbd两个节点上各提供了一个大小相同的分区作为drbd设备;我们这里为在两个节点上均为/dev/sdb1,大小为20GB;
3)系统为centos6.5平台;
4)内核:2.6.32-431.el6.x86_64
1、准备工作
两个节点的主机名称和对应的IP地址解析服务可以正常工作,且每个节点的主机名称需要跟"uname -n“命令的结果保持一致;因此,需要保证两个节点上的/etc/hosts文件均为下面的内容:
192.168.32.200 master-drbd
192.168.32.202 slave-drbd
2.下载软件包
wget http://oss.linbit.com/drbd/8.4/drbd-8.4.3.tar.gz
drbd共有两部分组成:内核模块和用户空间的管理工具。
3.准备环境
首先确认他的内核版本
[root@master-drbd drbd.d]# uname -r
2.6.32-431.el6.x86_64
然后挂载光盘
mount /dev/sr0 /media/ #这里因为是虚拟机,所以他的系统盘就叫sr0
cd /media/Packages/
rpm -ivh flex-2.5.35-9.el6.x86_64 kernel-devel-2.6.32-431.el6.x86_64 kernel-headers-2.6.32-504.3.3.el6.x86_64
4.安装drbd
tar zxvf drbd-8.4.1.tar.gz
cd drbd-8.4.1
./configure --prefix=/usr/loca/drbd --with-km #--prefix是制定安装路径。--with-km是启用内核模块
make KDIR=/usr/src/kernels/2.6.32-431.el6.x86_64/ #KDIR指的是自己的内核路径
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-431.el6.x86_64/
cp drbd.ko /lib/modules/2.6.32-431.el6.x86_64/kernel/lib/
moprobe drbd #加载内核模块
lsmod | grep drbd
drbd 303476 0
libcrc32c 1246 1 drbd
5.配置DRBD
drbd的主配置文件为/usr/local/drbd/etc/drbd.conf;为了管理的便捷性,目前通常会将些配置文件分成多个部分,
且都保存至/usr/local/drbd/etc/drbd.d目录中,主配置文件中仅使用"include"指令将这些配置文件片断整合起来。
通常,/etc/drbd.d目录中的配置文件为global_common.conf和所有以.res结尾的文件。其中global_common.conf中主要定义global段和common段,而每一个.res的文件用于定义一个资源。
resource段则用于定义drbd资源,每个资源通常定义在一个单独的位于/etc/drbd.d目录中的以.res结尾的文件中。资源在定义时必须为其命名,名字可以由非空白的ASCII字符组成。每一个资源段的定义中至少要包含两个host子段,以定义此资源关联至的节点,其它参数均可以从common段或drbd的默认中进行继承而无须定义。
下面的操作在master-drbd上完成。
1)配置global-common.conf
global {
usage-count no;#是否参加drbd的使用者统计,默认为yes
# minor-count dialog-refresh disable-ip-verification
}
common {
protocol C;#使用drbd的同步协议
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";
}
startup {
#wfc-timeout 120;
#degr-wfc-timeout 120;
}
disk {
on-io-error detach;#配置I/O错误处理策略为分离
rate 50M;#设置主备节点同步时的网络速率
}
net {
cram-hmac-alg "sha1";
shared-secret "drbd";
}
}
2)定义一个资源drbd.res,内容如下:
resource r0 { #r0是定义资源的名字
on master-drbd { #on后面是主机名称
address 192.168.32.200:7801;#设置DRBD的监听端口,用于与另一台主机通信。
volume 0 {
device /dev/drbd0; #drbd设备名称
disk /dev/sdb1; #drbd使用的磁盘分区为sdb1
meta-disk internal;
}
}
on slave-drbd {
address 192.168.32.202:7801;
volume 0 {
device /dev/drbd0;
disk /dev/sdb1;
meta-disk internal;
}
}
}
以上文件在两个节点上必须相同,因此,可以基于ssh将刚才配置的文件全部同步至另外一个节点。
6.在两个节点上初始化已定义的资源并启动服务:
1)启动服务,在master-drbd和slave-drbd上分别执行:
/etc/init.d/drbd start
2)查看启动状态:
# cat /proc/drbd
version: 8.3.8 (api:88/proto:86-94)
GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by [email protected], 2010-06-04 08:04:16
0: cs:Connected ro:Secondary/Secondary ds:Inconsistent/Inconsistent C r----
ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:505964
也可以使用drbd-overview命令来查看:
3)查看监听端口
[root@master-drbd drbd.d]# netstat -lanput | grep 7801
tcp 0 0 192.168.32.200:7801 192.168.32.202:34061 ESTABLISHED -
tcp 0 0 192.168.32.200:59747 192.168.32.202:7801 ESTABLISHED -
4)从上面的信息中可以看出此时两个节点均处于Secondary状态。于是,我们接下来需要将其中一个节点设置为Primary。在要设置为Primary的节点上执行如下命令:
#drbdsetup primary all
注: 也可以在要设置为Primary的节点上使用如下命令来设置主节点:
drbdadm -- --overwrite-data-of-peer primary r0
而后再次查看状态,可以发现数据同步过程已经开始:
# drbd-overview
0:r0 SyncSource Primary/Secondary UpToDate/Inconsistent C r----
[============>.......] sync'ed: 66.2% (172140/505964)K delay_probe: 35
等数据同步完成以后再次查看状态,可以发现节点已经牌实时状态,且节点已经有了主次:
# drbd-overview
0:r0 Connected Primary/Secondary UpToDate/UpToDate C r----
7.格式化文件系统
mkfs.ext4 /dev/drbd0
mkdir /data #创建挂载目录
mount /dev/drbd0 /data#挂载文件系统
df -h #查看挂载
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root 18G 1.7G 15G 10% /
tmpfs 495M 0 495M 0% /dev/shm
/dev/sda1 485M 34M 426M 8% /boot
/dev/drbd0 20G 182M 19G 1% /data
注意:文件系统的挂载只能在Primary节点进行,因此,也只有在设置了主节点后才能对drbd设备进行格式化:
7.写入文件
cd /data
dd if=/dev/zero of=test bs=1M count=10 #创建一个10M的文件
[root@slave-drbd data]# ll
total 10256
-rw-r--r-- 1 root root 10485760 Jan 10 01:54 1.txt
drwx------ 2 root root 16384 Jan 10 01:53 lost+found
8、切换Primary和Secondary节点
对主Primary/Secondary模型的drbd服务来讲,在某个时刻只能有一个节点为Primary,因此,要切换两个节点的角色,只能在先将原有的Primary节点设置为Secondary后,才能原来的Secondary节点设置为Primary:
注意:这里必须先把master-drbd的挂载目录卸载掉
master-drbd:
drbdadm secondary all
查看 状态
cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by [email protected], 2015-01-10 04:56:32
0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r-----
ns:21011460 nr:24 dw:473584 dr:20539309 al:137 bm:1280 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
slave-drbd:
drbdadm primary all
[root@slave-drbd ~]# cat /proc/drbd
version: 8.4.1 (api:1/proto:86-100)
GIT-hash: 91b4c048c1a0e06777b5f65d312b38d47abaea80 build by root@puppet-client, 2015-01-23 20:48:04
0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
ns:24 nr:21011460 dw:21011484 dr:1021 al:3 bm:1280 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0
mkdir /data
mount /dev/drbd0 /data
使用下面的命令查看在此前在主节点上复制至此设备的文件是否存在:
[root@slave-drbd data]# ll
total 10256
-rw-r--r-- 1 root root 10485760 Jan 10 01:54 1.txt
drwx------ 2 root root 16384 Jan 10 01:53 lost+found
drbd 8.4中第一次设置某节点成为主节点的命令
# drbdadm primary --force resource
参考文献:存储高可用――DRBD单主模式的搭建 - 时间煮雨 - 51CTO技术博客
http://watchman110.blog.51cto.com/9194028/1608052
CentOS 6.4下DRBD 安装配置_服务器应用_Linux公社-Linux系统门户网站
http://www.linuxidc.com/Linux/2013-09/90536.htm
模拟脑裂:DRBD脑裂 - 大脸猫的日志 - 网易博客
http://zhangmaojun023.blog.163.com/blog/static/10919584620128270550813/
drbd注意事项参考:drbd注意事项_迷失de墙角_新浪博客
http://blog.sina.com.cn/s/blog_75a07c3b0101k4cg.html