一、 DRBD介紹
官方站點:http://www.drbd.org/
DRBD(Distributed Replicated Block Device)是一個基於塊設備級別在遠程服務器直接同步和鏡像數據的軟件,用軟件實現的、無共享的、服務器之間鏡像塊設備內容的存儲複製解決方案。它可以實現在網絡中兩臺服務器之間基於塊設備級別的實時鏡像或同步複製(兩臺服務器都寫入成功)/異步複製(本地服務器寫入成功),相當於網絡的RAID1,由於是基於塊設備(磁盤,LVM邏輯卷),在文件系統的底層,所以數據複製要比cp命令更快,DRBD已經被MySQL官方寫入文檔手冊作爲推薦的高可用的方案之一。
二、簡要規劃
系統環境 | |||||
系統 | OEL6.6 | ||||
系統位數 | x86_64 | ||||
內核版本 | 3.8.13-44.1.1.el6uek.x86_64 | ||||
軟件環境 | |||||
DRBD | drbd-8.4.6 drbd-utils-8.9.5 | ||||
drbd下載地址 | http://www.drbd.org/en/community/download | ||||
wget http://www.drbd.org/download/drbd/8.4/drbd-8.4.6.tar.gz | |||||
系統規劃 | |||||
主機名 | IP | ||||
db-1-1 | 192.168.192.21 管理IP 10.0.100.21 DRBD數據傳輸IP 192.168.192.100 VIP | ||||
db-1-2 | 192.168.192.22 管理IP 10.0.100.22 DRBD數據傳輸IP 192.168.192.100 VIP | ||||
基本配置 | |||||
cat << EOF > /etc/hosts 127.0.0.1 localhost localhost.localdomain 192.168.192.21 db-1-1 10.0.100.21 priv-1-1 192.168.192.22 db-1-2 10.0.100.22 priv-1-2 192.168.192.100 vip EOF --配置服務器間主機路由 --時間同步 | |||||
磁盤 | 容量 | 分區 | 掛載點 | 說明 | |
/dev/sdb | 1G | /dev/sdb1 | /dbdata/ | 存放數據 | |
/dev/sdb2 | 存放drbd 元數據(metadata) | ||||
注意: 1、metadata分區一定不能格式化建立文件系統(sdb2存放drbd同步的狀態信息) 2、分好的分區不要進行掛載 3、生產環境DRBD metadata分區一般可設置爲1-2G,數據分區看需求 4、在生產環境中兩塊硬盤一樣大 |
三、編譯安裝
--依賴包安裝:
#yum install -y kernel kernel-devel kernel-headers gcc flex libxslt
1)、編譯安裝drbd:
# tar zxvf drbd-8.4.6.tar.gz
# cd drbd-8.4.6
# make KDIR=/usr/src/kernels/$(uname -r)
# make install KDIR=/usr/src/kernels/$(uname -r)
--卸載:
# make uninstall KDIR=/usr/src/kernels/$(uname -r)
# make KDIR=/usr/src/kernels/$(uname -r) clean
--編譯成功模塊安裝位置
# modprobe -l | grep -i drbd
updates/drbd.ko
--加載模塊
# modprobe drbd
# lsmod | grep drbd
drbd 362965 4
libcrc32c 1252 1 drbd
注意:設置 echo 'modprobe drbd' >> /etc/rc.local 並禁止drbd模塊開機自動加載。
如果drbd服務是開機自啓動的,會先啓動drbd服務在加載drbd的順序,導致drbd啓動不了出現的問題。
2)、編譯安裝drbd-utils
# tar zxvf drbd-utils-8.9.5.tar.gz
# cd drbd-utils-8.9.5
# ./configure --prefix=/usr --without-83support
# make && make install
--卸載:
# make uninstall && make clean
--安裝成功後drbd相關的工具(drbdadm,drbdsetup)被安裝到 /usr/lib/ 目錄下
# whereis drbd
drbd: /usr/etc/drbd.d /usr/etc/drbd.conf /lib/drbd /usr/lib/drbd /usr/share/man/man8/drbd.8
--添加drbd服務並禁止自啓動
# cp /usr/etc/rc.d/init.d/drbd /etc/rc.d/init.d/
# chkconfig --add drbd
# chkconfig drbd off
# chkconfig drbd --list
四、DRBD配置
本次編譯安裝配置文件位置:/usr/etc/drbd.conf
配置文件主要分爲三個部分:global、common、resource
DRBD配置文件:
# cp /usr/etc/drbd.d/global_common.conf /usr/etc/drbd.d/global_common.conf.bak # > /usr/etc/drbd.d/global_common.conf # vi /usr/etc/drbd.d/global_common.conf # DRBD is the result of over a decade of development by LINBIT. # In case you need professional services for DRBD or have # feature requests visit http://www.linbit.com global { #是否參加DRBD 使用者統計,默認參加 usage-count no; # minor-count dialog-refresh disable-ip-verification # cmd-timeout-short 5; cmd-timeout-medium 121; cmd-timeout-long 600; } common { #使用DRBD 的第三種同步協議(A B C),大多數用C,表示收到遠程主機的寫入確認後認爲寫入完成 protocol C; handlers { # These are EXAMPLE handlers only. # They may have severe implications, # like hard resetting the node under certain circumstances. # Be careful when chosing your poison. # 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"; # fence-peer "/usr/lib/drbd/crm-fence-peer.sh"; # split-brain "/usr/lib/drbd/notify-split-brain.sh root"; # out-of-sync "/usr/lib/drbd/notify-out-of-sync.sh root"; # before-resync-target "/usr/lib/drbd/snapshot-resync-target-lvm.sh -p 15 -- -c 16k"; # after-resync-target /usr/lib/drbd/unsnapshot-resync-target-lvm.sh; } startup { # wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb #在啓用DRBD塊時,初始化腳本drbd會阻塞啓動進程的運行,直到對等節點的出現。該選項就是用來限制這個等待時間的,默認爲0,即不限制,永遠等待。 wfc-timeout 120; #也是用於限制等待時間,只是作用的情形不同:它作用於一個降級集羣(即那些只剩下一個節點的集羣)在重啓時的等待時間。 degr-wfc-timeout 120; } options { # cpu-mask on-no-data-accessible } disk { # size on-io-error fencing disk-barrier disk-flushes # disk-drain md-flushes resync-rate resync-after al-extents # c-plan-ahead c-delay-target c-fill-target c-max-rate # c-min-rate disk-timeout # 策略:發生I/O錯誤的節點將放棄底層設備,以diskless mode繼續工作 on-io-error detach; #size 454G; no-disk-flushes; no-md-flushes; } net { # protocol timeout max-epoch-size max-buffers unplug-watermark # connect-int ping-int sndbuf-size rcvbuf-size ko-count # allow-two-primaries cram-hmac-alg shared-secret after-sb-0pri # after-sb-1pri after-sb-2pri always-asbp rr-conflict # ping-timeout data-integrity-alg tcp-cork on-congestion # congestion-fill congestion-extents csums-alg verify-alg # use-rle sndbuf-size 512k; #如果搭檔節點沒有在此時間內發來應答包,那麼就認爲搭檔節點已經死亡 # timeout 60; #6 seconds(unit = 0.1 seconds) #如果無法立即連接上遠程DRBD設備,系統將斷續嘗試連接 # connect-int10; # 10 seconds(unit = 1 second) #如果連接到遠程DRBD設備的TCP/IP的空閒時間超過此值,系統將生成一個keep-alive包來檢測對等節點是否還存活 # ping-int10; # 10 seconds(unit = 1 second) # ping-timeout5; # 500 ms (unit = 0.1 seconds) # 該選項設定一個由drbd分配的最大請求數,單位是頁面大小(PAGE_SIZE),大多數系統中,頁面大小爲4KB。這些buffer用來存儲那些即將寫入磁盤的數據。最小值爲32(即128KB)。這個值大一點好。 max-buffers 8000; unplug-watermark 1024; # 該選項設定了兩次write barriers之間最大的數據塊數。如果選項的值小於10,將影響系統性能。 max-epoch-size 8000; # ko-count 4; # 雙主模式配置選項 # allow-two-primaries; # 該選項設定內核支持的一個算法,用於網絡上的用戶數據的一致性校驗。通常的數據一致性校驗,由TCP/IP頭中所包含的16位校驗和來進行,而該選項可以使用內核所支持的任一算法。該功能默認關閉。 cram-hmac-alg "sha1"; # 用來設定在對待節點授權中使用的密碼,最長64個字符。 shared-secret "wQZb8s8som9uMKrzj"; after-sb-0pri disconnect; after-sb-1pri disconnect; after-sb-2pri disconnect; rr-conflict disconnect; # data-integrity-alg "md5"; # no-tcp-cork; } syncer { #設置主用節點和備用節點同步時的網絡速率最大值,單位是字節 rate 150M; al-extents 517; } } #資源名字爲 dbdata_r0 resource dbdata_r0 { #每個主機的說明以on開頭,後面是`hostname` on db-1-1 { #drbd設備名稱 device /dev/drbd1; #/dev/drbd1使用的磁盤分區/dev/sdb1 disk /dev/sdb1; #兩臺主機端口必須一致 #設置DRBD的監聽端口,用於與另一臺主機通信, 如果開啓防火牆,需要打開此端口 address 10.0.100.21:7788; #DRBD的元數據存放方式 meta-disk /dev/sdb2 [0]; } on db-1-2 { device /dev/drbd1; disk /dev/sdb1; #兩臺主機端口必須一致,如果開啓防火牆,需要打開此端口 address 10.0.100.22:7788; meta-disk /dev/sdb2 [0]; } }
注:兩個節點配置一樣,這裏將 resource 配置放在了global_common.conf裏
--將配置複製都 db-1-2 主機相應目錄下
#scp /usr/etc/drbd.d/global_common.conf db-1-2:/usr/etc/drbd.d/
五、初始化DRBD
關閉防火牆
#service iptables stop
--初始化meta分區(創建設備元數據,這一步必須僅在創建初始化設備時完成,它初始化DRBD元數據)
#drbdadm create-md dbdata_r0
#mkdir -p /usr/var/run/drbd
--啓動drbd服務
#service drbd start
--初始化設備同步(覆蓋備節點,保持數據一致)
#drbdadm -- --overwrite-data-of-peer primary dbdata_r0
--通過cat /proc/drbd查看具體信息
六、掛載寫入數據
--掛載drbd分區到/dbdata數據目錄,要在想設置爲主節點的節點上(data-1-1)執行
#mount /dev/drbd1 /dbdata
#drbdadm primary dbdata_r0 或者 drbdadm primary all
--測試數據同步,在主節點創建數據
# dd if=/dev/zero of=/dbdata/test.tmp bs=1M count=200;sync
--從節點查看數據
#data-1-2上執行(從節點)
#停drbd,將磁盤分區掛載到臨時目錄查看
#drbdadm down dbdata_r0
#mount /dev/sdb1 /mnt
#ls /mnt
七、數據同步測試
① 正常狀態
[root@db-1-1 /dbdata] #cat /proc/drbd version: 8.4.6 (api:1/proto:86-101) GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-1, 2016-06-03 02:20:22 1: cs:Connected ro:Primary/Secondary ds:Diskless/UpToDate C r----- ns:0 nr:669 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0 [root@db-1-2 /root] #cat /proc/drbd version: 8.4.6 (api:1/proto:86-101) GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-2, 2016-06-03 02:20:39 1: cs:Connected ro:Secondary/Primary ds:UpToDate/Diskless C r----- ns:669 nr:0 dw:0 dr:669 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
上面的結果顯示 db-1-1爲主節點,db-1-2爲備節點
② 模擬db-1-1宕機
[root@db-1-1 /root] #umount /dev/drbd1 [root@db-1-1 /root] #df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 9.2G 6.6G 2.1G 76% / tmpfs 743M 0 743M 0% /dev/shm /dev/sda1 93M 57M 30M 66% /boot [root@db-1-1 /root] #drbdadm down all [root@db-1-1 /root] #cat /proc/drbd version: 8.4.6 (api:1/proto:86-101) GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-1, 2016-06-03 02:20:22 [root@db-1-2 /root] #cat /proc/drbd version: 8.4.6 (api:1/proto:86-101) GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-2, 2016-06-03 02:20:39 1: cs:WFConnection ro:Secondary/Unknown ds:UpToDate/DUnknown C r----- ns:669 nr:0 dw:0 dr:669 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0 [root@db-1-2 /root] #drbdadm primary all [root@db-1-2 /root] #mount /dev/drbd1 /dbdata [root@db-1-2 /root] #df -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 9.2G 6.6G 2.1G 76% / tmpfs 743M 0 743M 0% /dev/shm /dev/sda1 93M 57M 30M 66% /boot /dev/drbd1 988M 1.3M 919M 1% /dbdata [root@db-1-2 /root] #cat /proc/drbd version: 8.4.6 (api:1/proto:86-101) GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-2, 2016-06-03 02:20:39 1: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----- ns:669 nr:0 dw:16624 dr:2016 al:6 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:16624
上面的結果顯示 db-1-1宕機後,db-1-2可以升級爲主節點,可掛載drbd1分區繼續使用
③ 正常切換
1、在目前的主節點上卸載磁盤分區
[root@db-1-2 /] #umount /dbdata
2、現有主節點降級
[root@db-1-2 /] #cat /proc/drbd version: 8.4.6 (api:1/proto:86-101) GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-2, 2016-06-03 02:20:39 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:17325 nr:0 dw:16656 dr:18724 al:6 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0 [root@db-1-2 /] #drbdadm secondary all [root@db-1-2 /] #cat /proc/drbd version: 8.4.6 (api:1/proto:86-101) GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-2, 2016-06-03 02:20:39 1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----- ns:17341 nr:0 dw:16672 dr:18724 al:6 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
上面的結果顯示 db-1-2 以由Primary降級爲Secondary。
[root@db-1-1 /] #cat /proc/drbd version: 8.4.6 (api:1/proto:86-101) GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-1, 2016-06-03 02:20:22 1: cs:Connected ro:Secondary/Secondary ds:UpToDate/UpToDate C r----- ns:0 nr:16672 dw:16672 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
可以看到,兩個節點都處於Secondary的狀態,接下來就要指定一個主節點,在需要變成主用節點的服務器上執行如下命令:
[root@db-1-1 /] #drbdadm primary all [root@db-1-1 /] #cat /proc/drbd version: 8.4.6 (api:1/proto:86-101) GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-1, 2016-06-03 02:20:22 1: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r----- ns:0 nr:16672 dw:16672 dr:669 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0 [root@db-1-2 /] #cat /proc/drbd version: 8.4.6 (api:1/proto:86-101) GIT-hash: 833d830e0152d1e457fa7856e71e11248ccf3f70 build by root@db-1-2, 2016-06-03 02:20:39 1: cs:Connected ro:Secondary/Primary ds:UpToDate/UpToDate C r----- ns:17341 nr:0 dw:16672 dr:18724 al:6 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:d oos:0
上面的結果顯示 db-1-1 以由Secondary升級爲Primary。
在新的主用節點掛載DRBD磁盤分區,並查看數據
[root@db-1-1 /] #mount /dev/drbd1 /dbdata
八、注意事項
1.主備服務器同步的兩個分區大小最好相同(網上沒有關於分區大小是否一定要相同的確切說法);
2.開始同步兩個節點的磁盤,需要一定時間,在同步完成前,不要重啓,否則會重新同步;
3.掛載之前一定要先切換當前節點爲主節點;
4.兩個節點中,同一時刻只能有一臺處於primary狀態,另一臺處於secondary狀態;
5.處於從節點(secondary)狀態的服務器不能加載drbd塊設備;
6.將主節點切換爲從節點之前要先卸載;
7.一臺主機切換爲主節點之前,要確保另一臺主機已切換爲從節點。
九、DRBD日常管理參考
v drbd腦裂解決方法
① 在從節點上執行
modprobe drbd
drbdadm secondary dbdata-rs0
drbdadm up dbdata-rs0
drbdadm disconnect dbdata-rs0
drbd -- --discard-my-data connect dbdata-r0
② 在主節點上通過 cat /proc/drbd 查看,如果不是WFConnection狀態,需要手動連接
drbdadm connect dbdata-r0
v 檢查DRBD的狀態
① drbd-overview #查看DRBD狀態最方便的方法
② cat /proc/drbd #可以查看DRBD的實時狀態
③ drbdadm cstate data #也可以查看資源的連接狀態
④ drbdadm role data #也可以查看資源的角色
⑤ drbdadm dstate data #查看資源的硬盤狀態
v 啓用資源
① 若是配置成集羣,就是用集羣資源管理程序。
② 也可在系統啓動的時候使用/etc/init.d/drbd初始腳本
③ 或手動 drbdadm up <resource>/all
v 禁用資源
① drbdadm down <resource>/all 可臨時禁用指定的或所用的資源
v 重新配置資源
注意事項:
① 對資源的任何改變,都要包含到/etc/drbd.conf
② 將修改的/etc/drbd.conf在兩個節點之間進行同步
③ 分別在兩個節點上執行drbdadm adjust <resource>/all命令。
v 資源角色的設置
① drbdadm primary <resource>
② drbdadm secondary <resource>
③ 在單主模式(DRBD的默認模式),同一時間只允許有一個節點時 primary 模式;雙主模式,兩個節點可同時都是 primary 模式。
v 故障轉移
如果沒有使用 Pacemaker,手動故障轉移操作如下:
① 在當前主節點,作如下操作:
umount /dev/drbd1
drbdadm secondary <resource>
② 在另外一個節點或我們希望要提升爲主節點的節點,做如下操作:
drbdadm primary <resource>
mount /dev/drbd1 <mountpoint>
v DRBD的升級
此處例子是從8.3.x升級到8.4.x
① 將yum倉庫更新到8.4,就是更新/etc/yum.repos.d/<name>.repo
② 確定節點間的同步都已是UpToDate/UpToDate
③ 先從secondary節點開始升級,兩種:
手動方法: /etc/init.d/drbd stop
Pacemaker方法:crm node standby clone1
④ 然後使用yum upgrade 升級軟件
⑤ /etc/init.d/drbd start 或 crm node online clone1 啓動服務
⑥ 將主備節點的角色切換,再重複以上五個步驟。
⑦ 因爲8.4向後兼容8.3的配置,所以可以使用命令 drbdadm dump all 可以輸出升級後的配置。可是作爲升級的憑據。
v DRBD的降級
以下操作都是在兩個節點上同時操作的
① 停止DRBD服務:service drbd stop
② 卸載已經掛載的設備:umount /dev/drbd1
③ 將節點角色改爲secondary:drbdadm secondary r0
然後執行如下命令:
④ drbdadm down all
⑤ drbdadm apply-al all
⑥ rmmod drbd
如果使用的是yum倉庫安裝的,那麼就:
⑦ yum -y remove drbd kmod-drbd
⑧ 然後,重新安裝8.3版本的
小結:所謂降級,其實就是卸載,刪除新版本的,再安裝舊版本的
v 啓用雙主模式
啓用雙主模式既可以是永久性的也可以額是臨時性的。使用雙主模式,資源必須被配置成協議C。
永久性雙主模式的配置:
① 必須在net區域,設置allow-two-primaries選項爲yes。
② 之後同步修改後的文件到對等節點,然後在分別在兩個節點上運行drbdadm adjust <resource>
③ 最後就可以在兩個節點上同事執行drbdadm primary <resource>命令
臨時性雙主模式的配置:
① 在單主模式中臨時啓用雙主模式可以使用,drbdadm net-options --protocol=C --allow-two-primaries <resource>
② 結束掉臨時雙主模式,則使用rbdadm net-options --protocol=C --allow-two-primaries=no,即可。
自動啓動雙主模式:
① 如果希望在重啓系統或重啓DRBD時,自動啓動雙主模式(已經被配置爲支持雙主模式),則在startup區域,將become-primary-on 選項設置爲both即可。(注:如果使用pacemaker來管理DRBD配置,則不需要這個設置)
v 使用在線設備驗證
啓用在線驗證:
① 默認情況下是沒有啓動的。若啓用,就在net區段配置選項verify-alg <algorithm>; algorithm可以是sha1、md5、crc32c中的任何一種。
在線驗證的調用:
② 在啓用在線驗證後,就可以使用 drbdadm verify <resource>來進行調用了。使用此命令可以對資源啓動在線驗證。如果找到的任何沒有同步的塊,它會將這些塊做標記並且寫信息到內核日誌裏面。
③ 如果在驗證中找到了沒有同步的塊,那麼可以在驗證完成後使用
drbdadm disconnect <resource>
drbdadm connect <resource>
兩條命令實現再同步
自動在線驗證:
④ 可以通過創建名爲/etc/cron.d/drbd-verify的文件,內容如下
32 0 * * 0 root/sbin/drbdadm verify <resource>/all
來實現自動在線驗證。(注:文件內容含義是在每星期日的凌點32分時,通過cron調用設備驗證。