什么是DRBD?
分布式复制块设备。当你将数据写入本地的DRBD设备上的文件系统时,数据同时会被发送到远程端的另一边的DRBD设备文件系统里,保障数据实时同步,当本地的DRBD设备突然故障,远程节点还保留一份一模一样的数据,根据这个特性,可以结合heatbeat的ha开源软件,实现高可用!
我们都把DRBD理解是网络raid1磁盘阵列。
DRBD底层设备可以是
1)一块磁盘,或者一个分区。
2)raid设备。
3)逻辑卷lvm。
4)任何块设备。
DRBD支持三种不同的复制协议。协议A,协议B,协议C。
协议A,异步复制协议。此协议只要本地写操作完成,就认为DRBD整个流程的写操作就完成。
协议B,内存同步复制协议。本地写操作完成,并检测到数据到达DRBD的另一边, 就认为DRBD整个流程的写操作就完成。
协议C,同步复制协议。当本地DRBD设备写操作和远程DRBD设备写操作都完成了,就认为DRBD整个流程的写操作就完成。最长用的是协议C,测试环境下也是用的协议C,它可以提供保证的数据一致性和可靠性。需要的磁盘I/O最高。
heartbeat是一个开源项目。提供linux可靠,可用和可服务性。核心,就是采用心跳检测机制。
如果心跳线或网络出现问题,容易出现脑裂现象!这也是制约该技术大规模部署应用的原因。
实验环境准备:
1.关闭防火墙。
2.hosts文件。
3.ntp对时。
4.准备两台机器primary和secondary。
5.每台机器上单独拿一块硬盘或单独分区做为DRBD底层设备(大小建议一样)。
6.网卡两块,两个网段,其中一网段是数据通信并heartbeat对外提供VIP的网段,另外一段做为重要的心跳线,heartbeat的核心。
7.primary上 eth0:192.168.4.10 eth1:10.0.54.10
8.secondary上 eth0:192.168.4.11 eth1:10.0.54.11
两台机器上都关闭iptables和selinux
[root@primary ~]# service iptables stop [root@primary ~]# setenforce 0 [root@zprimary ~]# sed -i /SELINUX=/s/permissive/disabled/ /etc/selinux/config [root@secondary ~]# service iptables stop [root@secondary ~]# setenforce 0 [root@secondary ~]# sed -i /SELINUX=/s/permissive/disabled/ /etc/selinux/config
修改hosts文件
[root@primary ~]#vim /etc/hosts primary 192.168.4.10 secondary 192.168.4.11 [root@secondary ~]#vim /etc/hosts primary 192.168.4.10 secondary 192.168.4.11
ntp对时
[root@primary ~]#ntpdate ntp.api.bz [root@secondary ~]#ntpdate ntp.api.bz
分区如下:/dev/vdb1 大小8G
fdisk /dev/vdb #分区省略
安装DRBD和配置
安装包下载地址:http://oss.linbit.com/drbd/
安装依赖包
[root@primary ~]#yum install gcc gcc-c++ make glibc flex kernel-devel kernel-headers [root@secondary ~]#yum install gcc gcc-c++ make glibc flex kernel-devel kernel-headers
这里提供安装包8.4.3(两机器同样的操作)
[root@primary ~]#tar zxvf drbd-8.4.3.tar.gz [root@primary ~]#cd drbd-8.4.3 ./configure --prefix=/usr/local/drbd --with-km make && 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 drbd on [root@primary ~]#modprobe drbd #加载drbd.ko模块 [root@primary ~]#lsmod |grep drbd #查看
两台机器创建硬件设备DRBD
[root@primary ~]#mknod /dev/drbd0 b 147 0
两台下载NFS包(注意不需要自己开启NFS服务,下面搭建heartbeat会来完成)
[root@primary ~]#yum install -y nfs* [root@primary ~]#vim /etc/exports /data 192.168.4.0/255.255.255.0(rw,no_root_squash,no_all_squash,sync) [root@primary ~]#mkdir /data [root@primary ~]#/etc/init.d/rpcbind start [root@primary ~]#chkconfig rpcbind on [root@primary ~]#chkconfig nfs off 修改DRBD文件配置 [root@primary ~]#vim /usr/local/drbd/etc/drbd.conf resource r0 { #创建的资源名称,和下面创建与之对应 protocol C; #采用C协议 startup { wfc-timeout 0; degr-wfc-timeout 120; } disk { on-io-error detach; } net { timeout 60; connect-int 10; ping-int 10; max-buffers 2048; max-epoch-size 2048; } syncer { rate 30M; } on zabbix-server { device /dev/drbd0; disk /dev/vdb1; address 192.168.4.10:7788; meta-disk internal; } on zabbix-agent { device /dev/drbd0; disk /dev/vdb1; address 192.168.4.11:7788; meta-disk internal; } }
两台创建资源r0
[root@primary ~]#drbdadm create-md r0 [root@secondary ~]#drbdadm create-md r0
两台启动DRBD,设置开机启动
[root@primary ~]#service drbd start [root@primary ~]#chkconfig drbd on
查看当前DRBD状态
[root@primary ~]#cat /proc/drbd 或者 [root@primary ~]#service drbd status
主上初始化
[root@primary ~]#drbdsetup /dev/drbd0 primary --force #第一次设置 [root@primary ~]#drbdadm primary r0
在查看当前DRBD状态
[root@primary ~]#cat /proc/drbd #能看到primary机器上状态已经变成primary了 或者 [root@primary ~]#service drbd status
格式化DRBD(只在主上操作,备用状态的不允许对DRBD设备进行任何操作,包括只读)
[root@primary ~]#mkfs.ext4 /dev/drbd0
Heartbeat 安装配置(两台设备)
[root@primary ~]#yum install -y heartbeat cd /usr/share/doc/heartbeat-3.0.4/ cp ha.cf haresources authkeys /etc/ha.d/
修改primary(secondary的ip为10.0.54.10)的ha.cf
[root@primary ~]#vim /etc/ha.d/ha.cf logfile /var/log/ha-log logfacility local0 keepalive 2 deadtime 5 ucast eth1 10.0.54.11 #采用心跳网口对方ip auto_failback off node primary secondary
修改authkeys(两个机器相同配置)
[root@primary ~]#vim /etc/ha.d/authkeys #自选1 2 3 模式 auth 1 1 crc [root@primary ~]# chmod 600 /etc/ha.d/authkeys
编辑haresources(这里两个主机相同配置,注:从上不要把primary改成secondary)
[root@primary ~]#vim /etc/ha.d/haresources #VIP设置为192.168.4.100,参考文件倒数后面的一个例题 primary IPaddr::192.168.4.100/24/eth0 drbddisk::r0 Filesystem::/dev/drbd0::/data::ext4 killnfsd [root@primary ~]#vim /etc/ha.d/resource.d/killnfsd killall -9 nfsd; /etc/init.d/nfs restart; exit 0 [root@primary ~]#find / -name drbddisk #查看drbddisk脚本在哪,有的时候没有该脚本。 [root@primary ~]#cp /usr/local/drbd/etc/ha.d/resource.d/drbddisk /etc/ha.d/resource.d/ [root@primary ~]#chmod 755 /etc/ha.d/resource.d/drbddisk
重启heartbeat(先主上开启)
[root@primary ~]#/etc/init.d/heartbeat start
测试,故障模拟及故障排查
[root@primary ~]#ping 192.168.4.100 PING 192.168.4.100 (192.168.4.100) 56(84) bytes of data. 64 bytes from 192.168.4.100: icmp_seq=1 ttl=64 time=0.026 ms 64 bytes from 192.168.4.100: icmp_seq=2 ttl=64 time=0.020 ms 64 bytes from 192.168.4.100: icmp_seq=3 ttl=64 time=0.016 m [root@primary ~]#df -h #主上自动挂载了 /dev/drbd0 7.8G 18M 7.4G 1% /data 找一台客户端A,挂载NFS [root@room3pc0A ~]# showmount -e 192.168.4.100 Export list for 192.168.4.100: /data 192.168.4.0/255.255.255.0 [root@room3pc0A ~]#vim /etc/fstab 192.168.4.100:/data /liuqingqing nfs _netdev,defaults 0 0 [root@room3pc0A ~]#mkdir /liuqingqing [root@room3pc0A ~]#mount -a [root@room3pc0A ~]#df -h 192.168.4.100:/data 7.8G 18M 7.4G 1% /liuqingqing
故障模拟(直接把主关机)
[root@primary ~]#init 0 ..... ..... ..... 等一会儿在ping 192.168.4.100 [root@secondary ~]#ping 192.168.4.100 PING 192.168.4.100 (192.168.4.100) 56(84) bytes of data. 64 bytes from 192.168.4.100: icmp_seq=1 ttl=64 time=0.016 ms 64 bytes from 192.168.4.100: icmp_seq=2 ttl=64 time=0.021 ms [root@secondary ~]#df -h #自动挂载在从上,实现了高可用。 /dev/drbd0 7.8G 18M 7.4G 1% /data
并且客户端机器挂在的目录,不受影响。 故障排查: 查看日志 [root@primary ~]#tail -f /var/log/messege [root@primary ~]#tail -f /var/log/ha-log 查看DRBD状态(如,刚才把主关掉之后,自己变成从了) [root@primary ~]# cat /proc/drbd version: 8.4.3 (api:1/proto:86-101) GIT-hash: 89a294209144b68adb3ee85a73221f964d3ee515 build by root@primary, 2016-09-21 09:13:16 0: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate 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:f oos:0
出现脑裂现象处理
在secondary上操作
[root@secondary ~]#drbdadm secondary r0 [root@secondary ~]#drbdadm disconnect all [root@secondary ~]#drbdadm --discard-my-data connect r0
在primary上操作
[root@primary ~]#drbdadm disconnect all [root@primary ~]#connect r0
最终在测试机器上运行没问题,主备上对此测试。
本文出自 “蚂蚱小子” 博客,请务必保留此出处http://zxlwz.blog.51cto.com/6952946/1855079
项目:一次测试环境下的高可用NFS文件服务器(DRBD+heartbeat+NFS)
原文地址:http://zxlwz.blog.51cto.com/6952946/1855079