什麼是DRBD?node
分佈式複製塊設備。當你將數據寫入本地的DRBD設備上的文件系統時,數據同時會被髮送到遠程端的另外一邊的DRBD設備文件系統裏,保障數據實時同步,當本地的DRBD設備忽然故障,遠程節點還保留一份如出一轍的數據,根據這個特性,能夠結合heatbeat的ha開源軟件,實現高可用!linux
咱們都把DRBD理解是網絡raid1磁盤陣列。c++
DRBD底層設備能夠是vim
1)一塊磁盤,或者一個分區。api
2)raid設備。bash
3)邏輯卷lvm。網絡
4)任何塊設備。異步
DRBD支持三種不一樣的複製協議。協議A,協議B,協議C。分佈式
協議A,異步複製協議。此協議只要本地寫操做完成,就認爲DRBD整個流程的寫操做就完成。ide
協議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 primary { device /dev/drbd0; disk /dev/vdb1; address 192.168.4.10:7788; meta-disk internal; } on secondary { 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
最終在測試機器上運行沒問題,主備上對此測試。