DRBD是一個用軟件實現的、無共享的、服務器之間鏡像塊設備內容的存儲複製解決方案。DRBD的功能是通過linux內核實現的,它是通過tcp/ip協議,和網卡通信保持數據同步的。
DRBD有三種協議:
協議A:數據在本地完成寫操作且數據已經發送到TCP/IP協議棧的隊列中,則認爲寫操作完成。如果本地節點的寫操作完成,此時本地節點發生故障,而數據還處在TCP/IP隊列中,則數據不會發送到對端節點上。因此,兩個節點的數據將不會保持一致。這種協議雖然高效,但是並不能保證數據的可靠性。
協議B:數據在本地完成寫操作且數據已到達對端節點則認爲寫操作完成。如果兩個節點同時發生故障,即使數據到達對端節點,這種方式同樣也會導致在對端節點和本地節點的數據不一致現象,也不具有可靠性。
協議C:只有當本地節點的磁盤和對端節點的磁盤都完成了寫操作,才認爲寫操作完成。這是集羣流行的一種方式,應用也是最多的,這種方式雖然不高效,但是最可靠。
環境:
192.168.40.12 centosA
192.168.40.19 centosB
修改hosts文件保持兩臺服務器能互相通信,然後建立ssh互信:
[root@centosa ~]# ssh-keygen [root@centosa ~]# ssh-copy-id centosB
設置時間同步:
[root@centosa ~]# crontab -l */5 * * * * /usr/sbin/ntpdatecn.pool.ntp.org [root@centosb ~]# crontab -l */5 * * * * /usr/sbin/ntpdatecn.pool.ntp.org
安裝DRBD:
[root@centosa ~]# rpm --importhttps://www.elrepo.org/RPM-GPG-KEY-elrepo.org [root@centosa ~]# rpm -Uvhhttp://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm [root@centosa ~]# yum install -ykmod-drbd84 drbd84-utils
兩個節點都安裝。
修改配置文件:
[root@centosa ~]# cat/etc/drbd.d/global_common.conf # DRBD is the result of over a decade ofdevelopment by LINBIT. # In case you need professional servicesfor DRBD or have # feature requests visithttp://www.linbit.com global { usage-countno; #是否參加DRBD使用統計,默認爲yes。官方統計drbd的裝機量 #Decide what kind of udev symlinks you want for "implicit" volumes #(those without explicit volume <vnr> {} block, implied vnr=0): #/dev/drbd/by-resource/<resource>/<vnr> (explicit volumes) #/dev/drbd/by-resource/<resource> (default for implict) udev-always-use-vnr;# treat implicit the same as explicit volumes #minor-count dialog-refresh disable-ip-verification #cmd-timeout-short 5; cmd-timeout-medium 121; cmd-timeout-long 600; } common { protocol C; #使用DRBD的同步協議 handlers{ #These are EXAMPLE handlers only. #They may have severe implications, #like hard resetting the node under certain circumstances. #Be careful when choosing 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; #quorum-lost "/usr/lib/drbd/notify-quorum-lost.sh root"; } startup{ #wfc-timeout degr-wfc-timeout outdated-wfc-timeout wait-after-sb } options{ #cpu-mask on-no-data-accessible #RECOMMENDED for three or more storage nodes with DRBD 9: #quorum majority; #on-no-quorum suspend-io | io-error; } disk{ on-io-errordetach; #配置I/O錯誤處理策略爲分離 #size on-io-error fencing disk-barrier disk-flushes #disk-drain md-flushes resync-rate resync-after al-extents # c-plan-ahead c-delay-targetc-fill-target c-max-rate # c-min-rate disk-timeout } net{ #protocol timeout max-epoch-size max-buffers #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 } syncer{ rate 1024M; #設置主備節點同步時的網絡速率 } }
創建配置文件:
[root@centosa ~]# cat /etc/drbd.d/mysql.res resource mysql { ##資源名稱 protocol C; ##使用的協議 meta-disk internal; device /dev/drbd1; ##DRBD設備名稱 syncer { verify-alg sha1; ##加密算法 } net { allow-two-primaries; } on centosa { disk /dev/sdb1; ##drbd使用的磁盤分區 address 192.168.40.12:7789; ##設置drbd監聽地址與端口 } on centosb { disk /dev/sdb1; address 192.168.40.19:7789; } }
將配置文件複製到對端節點:
[root@centosa ~]# scp -rp /etc/drbd.d/*centosb:/etc/drbd.d/
在centosa上啓動:
[root@centosa ~]# drbdadm create-md mysql initializing activity log initializing bitmap (64 KB) to all zero Writing meta data... New drbd meta data block successfullycreated.
[root@centosa ~]# modprobe drbd
查看內核是否已加載了模塊:
[root@centosa ~]# lsmod | grep drbd drbd 396875 0 libcrc32c 12644 2 xfs,drbd
用drbd啓動mysql並設置centosa爲主mysql:
[root@centosa ~]# drbdadm up mysql [root@centosa ~]# drbdadm -- --forceprimary mysql
查看狀態:
[root@centosa ~]# cat /proc/drbd version: 8.4.10-1 (api:1/proto:86-101) GIT-hash:a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-1514:23:22 1:cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----s ns:0 nr:0 dw:0 dr:912 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:foos:2096028
在對端節點執行操作:
[root@centosb ~]# drbdadm create-md mysql initializing activity log initializing bitmap (64 KB) to all zero Writing meta data... New drbd meta data block successfullycreated. [root@centosb ~]# modprobe drbd [root@centosb ~]# drbdadm up mysql
在對端查看狀態:
[root@centosb ~]# cat /proc/drbd version: 8.4.10-1 (api:1/proto:86-101) GIT-hash:a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-1514:23:22 1:cs:SyncTarget ro:Secondary/Primary ds:Inconsistent/UpToDate C r----- ns:0 nr:1748992 dw:1748992 dr:0 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:foos:347036 [===============>....]sync'ed: 83.6% (347036/2096028)K finish:0:00:08 speed: 39,832 (39,748) want: 59,560 K/sec
格式化並掛載:
[root@centosa ~]# mkfs.xfs /dev/drbd1 [root@centosa ~]# mount /dev/drbd1 /data
在數據庫添加一個數據庫:
MariaDB [(none)]> create databasecentos; Query OK, 1 row affected (0.04 sec) MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | centos | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec)
查看數據庫存放位置:
[root@centosa ~]# ls /data aria_log.00000001 aria_log_control centos ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema test
停止數據庫並卸載:
[root@centosa ~]# systemctl stop mariadb [root@centosa ~]# umount /data
要想從能掛載必須將主降爲從:
[root@centosa ~]# drbdadm secondary mysql
然後去到從,將從升爲主然後掛載:
[root@centosb ~]# drbdadm primary mysql [root@centosb ~]# mount /dev/drbd1 /data
查看是否有數據庫文件:
[root@centosb ~]# cd /data [root@centosb data]# ls aria_log.00000001 aria_log_control centos ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema test