1、DRBD簡介
DRBD的全稱爲:Distributed ReplicatedBlock Device(DRBD)分佈式塊設備複製,DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集羣.其實現方式是經過網絡來鏡像整個設備.你能夠把它看做是一種網絡RAID.它容許用戶在遠程機器上創建一個本地塊設備的實時鏡像.
1.DRBD是如何工做的呢?
(DRBD Primary)負責接收數據,把數據寫到本地磁盤併發送給另外一臺主機(DRBD Secondary).另外一個主機再將數據存到本身的磁盤中.目前,DRBD每次只容許對一個節點進行讀寫訪問,但這對於一般的故障切換高可用集羣來講已經足夠用了.有可能之後的版本支持兩個節點進行讀寫存取.
2.DRBD與HA的關係
一個DRBD系統由兩個節點構成,與HA集羣相似,也有主節點和備用節點之分,在帶有主要設備的節點上,應用程序和操做系統能夠運行和訪問DRBD設備(/dev/drbd*).在主節點寫入的數據經過DRBD設備存儲到主節點的磁盤設備中,同時,這個數據也會自動發送到備用節點對應的DRBD設備,最終寫入備用節點的磁盤設備上,在備用節點上,DRBD只是將數據從DRBD設備寫入到備用節點的磁盤中.如今大部分的高可用性集羣都會使用共享存儲,而DRBD也能夠做爲一個共享存儲設備,使用DRBD不須要太多的硬件的投資.由於它在TCP/IP網絡中運行,因此,利用DRBD做爲共享存儲設備,要節約不少成本,由於價格要比專用的存儲網絡便宜不少;其性能與穩定性方面也不錯
2、DRBD複製模式
1.協議A:
異步複製協議.一旦本地磁盤寫入已經完成,數據包已在發送隊列中,則寫被認爲是完成的.在一個節點發生故障時,可能發生數據丟失,由於被寫入到遠程節點上的數據可能仍在發送隊列.儘管,在故障轉移節點上的數據是一致的,但沒有及時更新.這一般是用於地理上分開的節點
2.協議B:
內存同步(半同步)複製協議.一旦本地磁盤寫入已完成且複製數據包達到了對等節點則認爲寫在主節點上被認爲是完成的.數據丟失可能發生在參加的兩個節點同時故障的狀況下,由於在傳輸中的數據可能不會被提交到磁盤
3.協議C:
同步複製協議.只有在本地和遠程節點的磁盤已經確認了寫操做完成,寫才被認爲完成.沒有任何數據丟失,因此這是一個羣集節點的流行模式,但I / O吞吐量依賴於網絡帶寬
通常使用協議C,但選擇C協議將影響流量,從而影響網絡時延.爲了數據可靠性,咱們在生產環境使用時須慎重選項使用哪種協議node
3、 DRBD工做原理圖
DRBD是linux的內核的存儲層中的一個分佈式存儲系統,可用使用DRBD在兩臺Linux服務器之間共享塊設備,共享文件系統和數據.相似於一個網絡RAID-1的功能mysql
4、安裝配置 (節點1上操做)linux
兩個節點ha-node1和ha-node2均爲centos7系統,每一個節點兩塊磁盤,一塊用做根分區一塊用做drbd算法
關閉防火牆(每一個節點都需執行)sql
192.168.94.11 ha-node1 vim
192.168.94.22 ha-node2centos
節點1 [root@DaMoWang ~]# hostnamectl set-hostname ha-node1 [root@DaMoWang ~]# su -l 上一次登陸:日 9月 16 14:40:38 CST 2018從 192.168.94.1pts/0 上 [root@ha-node1 ~]# 節點2 [root@DaMoWang ~]# hostnamectl set-hostname ha-node2 [root@DaMoWang ~]# su -l 上一次登陸:日 9月 16 14:40:38 CST 2018從 192.168.94.1pts/0 上 [root@ha-node2 ~]#
建立lvm(每一個節點都需執行)api
[root@ha-node1 ~]# pvcreate /dev/sdb Physical volume "/dev/sdb" successfully created. [root@ha-node1 ~]# vgcreate data /dev/sdb Volume group "data" successfully created [root@ha-node1 ~]# lvcreate --size 2G --name mysql data Logical volume "mysql" created. [root@ha-node1 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─centos-root 253:0 0 17G 0 lvm / └─centos-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 20G 0 disk └─data-mysql 253:2 0 2G 0 lvm sr0 11:0 1 4.2G 0 rom
配置主機名映射(每一個節點都須要執行)服務器
[root@ha-node1 ~]# echo -e "192.168.94.11 ha-node1 \n192.168.94.22 ha-node2" >> /etc/hosts
配置ssh互信(每一個節點都需執行)網絡
[root@ha-node1 ~]# ssh-keygen -t rsa -f ~/.ssh/id_rsa -N "" -q [root@ha-node1 ~]# ssh-copy-id ha-node1 [root@ha-node1 ~]# ssh-copy-id ha-node2
安裝drbd (每一個節點都安裝)
[root@ha-node1 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org [root@ha-node1 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm [root@ha-node1 ~]# yum install -y kmod-drbd84 drbd84-utils
配置文件說明
/etc/drbd.conf #主配置文件
/etc/drbd.d/global_common.conf #全局配置文件
[root@ha-node1 ~]# grep -Ev '^$|#' /etc/drbd.d/global_common.conf global { usage-count no; #是否參加DRBD使用統計,默認爲yes。官方統計drbd的裝機量 } 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 { } options { } disk { on-io-error detach; # 配置I/O錯誤處理策略爲分離 } net { } syncer { rate 1024M; # 設置主備節點同步時的網絡速率 } }
註釋 : on-io-error 策略可能爲如下選項之一
detach 分離:這是默認和推薦的選項,若是在節點上發生底層的硬盤I/O錯誤,它會將設備運行在Diskless無盤模式下
pass_on:DRBD會將I/O錯誤報告到上層,在主節點上,它會將其報告給掛載的文件系統,可是在此節點上就每每忽略(所以此節點上沒有能夠報告的上層)
-local-in-error:調用本地磁盤I/O處理程序定義的命令;這須要有相應的local-io-error調用的資源處理程序處理錯誤的命令;這就給管理員有足夠自由的權力命令命令或是腳本調用local-io-error處理I/O錯誤
定義一個資源
建立/etc/drbd.d/mysql.res並寫入
[root@ha-node1 ~]# vim /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 ha-node1 { disk /dev/data/mysql; # drbd1使用的磁盤分區爲"mysql" address 192.168.94.11:7789; # 設置DRBD監聽地址與端口 } on ha-node2 { disk /dev/data/mysql; address 192.168.94.22:7789; } }
注意 : 該配置文件裏不能註釋 , 不然會報錯
將配置文件拷貝到node2上
[root@ha-node1 ~]# cp -rp /etc/drbd.d/* ha-node2:/etc/drbd.d/
啓用drbd(節點一)
[root@ha-node1 ~]# drbdadm create-md mysql initializing activity log initializing bitmap (64 KB) to all zero Writing meta data... New drbd meta data block successfully created. [root@ha-node1 ~]# modprobe drbd [root@ha-node1 ~]# drbdadm up mysql [root@ha-node1 ~]# drbdadm -- --force primary mysql
查看狀態
[root@ha-node1 ~]# cat /proc/drbd
version: 8.4.11-1 (api:1/proto:86-101)
GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-04-26 12:10:42
1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:5068 nr:0 dw:0 dr:7188 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2091984
[>....................] sync'ed: 0.4% (2091984/2097052)K
finish: 0:20:06 speed: 1,688 (1,688) K/sec
[root@ha-node1 ~]# cat /proc/drbd version: 8.4.11-1 (api:1/proto:86-101) GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-04-26 12:10:42 1: cs:WFConnection ro:Primary/Unknown ds:UpToDate/DUnknown C r----s ns:0 nr:0 dw:0 dr:2120 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:2097052
配置另外一節點
[root@ha-node1 ~]# ssh ha-node2 'drbdadm create-md mysql' initializing bitmap (64 KB) to all zero initializing activity log Writing meta data... New drbd meta data block successfully created. [root@ha-node1 ~]# ssh ha-node2 'modprobe drbd' [root@ha-node1 ~]# ssh ha-node2 'drbdadm up mysql'
格式化設備並掛載
[root@ha-node1 ~]# mkfs.xfs /dev/drbd1 meta-data=/dev/drbd1 isize=512 agcount=4, agsize=131066 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0, sparse=0 data = bsize=4096 blocks=524263, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal log bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@ha-node1 ~]# mkdir /data [root@ha-node1 ~]# vim /etc/my.cnf 修改mysql的數據存放位置 datadir=/data [root@ha-node1 ~]# chown -R mysql.mysql /data/ [root@ha-node1 ~]# mount /dev/drbd1 /data/ [root@ha-node1 ~]# systemctl start mariadb [root@ha-node1 ~]# mysql MariaDB [(none)]> create database mingming; MariaDB [(none)]> show databases; +---------------------+ | Database | +---------------------+ | information_schema | | #mysql50#lost+found | | mingming | | mysql | | performance_schema | | test | +---------------------+ 6 rows in set (0.00 sec)
查看資源鏈接狀態
[root@ha-node1 ~]# drbdadm cstate mysql
Connected
資源的鏈接狀態;一個資源可能有如下鏈接狀態中的一種
StandAlone 獨立的:網絡配置不可用;資源尚未被鏈接或是被管理斷開(使用 drbdadm disconnect 命令),或是因爲出現認證失敗或是腦裂的狀況
Disconnecting 斷開:斷開只是臨時狀態,下一個狀態是StandAlone獨立的
Unconnected 懸空:是嘗試鏈接前的臨時狀態,可能下一個狀態爲WFconnection和WFReportParams
Timeout 超時:與對等節點鏈接超時,也是臨時狀態,下一個狀態爲Unconected懸空
BrokerPipe:與對等節點鏈接丟失,也是臨時狀態,下一個狀態爲Unconected懸空
NetworkFailure:與對等節點推進鏈接後的臨時狀態,下一個狀態爲Unconected懸空
ProtocolError:與對等節點推進鏈接後的臨時狀態,下一個狀態爲Unconected懸空
TearDown 拆解:臨時狀態,對等節點關閉,下一個狀態爲Unconected懸空
WFConnection:等待和對等節點創建網絡鏈接
WFReportParams:已經創建TCP鏈接,本節點等待從對等節點傳來的第一個網絡包
Connected 鏈接:DRBD已經創建鏈接,數據鏡像如今可用,節點處於正常狀態
StartingSyncS:徹底同步,有管理員發起的剛剛開始同步,將來可能的狀態爲SyncSource或PausedSyncS
StartingSyncT:徹底同步,有管理員發起的剛剛開始同步,下一狀態爲WFSyncUUID
WFBitMapS:部分同步剛剛開始,下一步可能的狀態爲SyncSource或PausedSyncS
WFBitMapT:部分同步剛剛開始,下一步可能的狀態爲WFSyncUUID
WFSyncUUID:同步即將開始,下一步可能的狀態爲SyncTarget或PausedSyncT
SyncSource:以本節點爲同步源的同步正在進行
SyncTarget:以本節點爲同步目標的同步正在進行
PausedSyncS:以本地節點是一個持續同步的源,可是目前同步已經暫停,多是由於另一個同步正在進行或是使用命令(drbdadm pause-sync)暫停了同步
PausedSyncT:以本地節點爲持續同步的目標,可是目前同步已經暫停,這能夠是由於另一個同步正在進行或是使用命令(drbdadm pause-sync)暫停了同步
VerifyS:以本地節點爲驗證源的線上設備驗證正在執行
VerifyT:以本地節點爲驗證目標的線上設備驗證正在執行
查看資源角色命令
[root@ha-node1 ~]# drbdadm role mysql
Primary/Secondary
Parimary 主:資源目前爲主,而且可能正在被讀取或寫入,若是不是雙主只會出如今兩個節點中的其中一個節點上
Secondary 次:資源目前爲次,正常接收對等節點的更新
Unknown 未知:資源角色目前未知,本地的資源不會出現這種狀態
查看硬盤狀態命令
[root@ha-node1 ~]# drbdadm dstate mysql
UpToDate/UpToDate
本地和對等節點的硬盤有可能爲下列狀態之一:
Diskless 無盤:本地沒有塊設備分配給DRBD使用,這表示沒有可用的設備,或者使用drbdadm命令手工分離或是底層的I/O錯誤致使自動分離
Attaching:讀取無數據時候的瞬間狀態
Failed 失敗:本地塊設備報告I/O錯誤的下一個狀態,其下一個狀態爲Diskless無盤
Negotiating:在已經鏈接的DRBD設置進行Attach讀取無數據前的瞬間狀態
Inconsistent:數據是不一致的,在兩個節點上(初始的徹底同步前)這種狀態出現後當即建立一個新的資源。此外,在同步期間(同步目標)在一個節點上出現這種狀態
Outdated:數據資源是一致的,可是已通過時
DUnknown:當對等節點網絡鏈接不可用時出現這種狀態
Consistent:一個沒有鏈接的節點數據一致,當創建鏈接時,它決定數據是UpToDate或是Outdated
UpToDate:一致的最新的數據狀態,這個狀態爲正常狀態
手動禁用、啓用資源
[root@ha-node1 ~]# drbdadm down mysql # 禁用資源
[root@ha-node1 ~]# drbdadm up mysql # 啓動資源
資源名稱也可使用all表示[停用|啓用]全部資源
升級和降級資源
[root@ha-node1 ~]# drbdadm primary mysql # 升級爲主節點
[root@ha-node1 ~]# drbdadm secondary mysql # 降級爲次節點
在單主模式下的DRBD,兩個節點同時處於鏈接狀態,任何一個節點均可以在特定的時間內變成主;但兩個節點中只能一爲主,若是已經有一個主,需先降級纔可能升級;在雙主模式下沒有這個限制
初始化設備同步
選擇一個初始同步源;若是是新初始化的或是空盤,這個選擇能夠是任意的,可是若是其中的一個節點已經在使用幷包含有用的數據,那麼選擇同步源是相當重要的;若是選錯了初始化同步方向,就會形成數據丟失,所以須要十分當心
啓動初始化徹底同步,這一步只能在初始化資源配置的一個節點上進行,並做爲同步源選擇的節點上
[root@ha-node1 ~]# drbdadm -- --overwrite-data-of-peer primary mysql
建立文件系統
文件系統只能掛載在主(Primary)節點上,所以在設置好主節點後才能夠對DRBD設備進行格式化操做
格式化文件系統
[root@ha-node1 ~]# mkfs.ext4 /dev/drbd1
掛載文件系統
[root@ha-node1 ~]# mount /dev/drbd1 /data/
切換主備節點
[root@ha-node1 ~]# systemctl stop mariadb [root@ha-node1 ~]# umount /data/ [root@ha-node1 ~]# drbdadm secondary mysql [root@ha-node2 ~]# drbdadm primary mysql [root@ha-node2 ~]# drbd-overview NOTE: drbd-overview will be deprecated soon. Please consider using drbdtop. 1:mysql/0 Connected Primary/Secondary UpToDate/UpToDate /data ext4 2.0G 36M 1.8G 2% [root@ha-node2 ~]# mount /dev/drbd1 /data/ [root@ha-node2 ~]# chown -R mysql.mysql /data/ [root@ha-node2 ~]# systemctl start mariadb [root@ha-node2 ~]# mysql MariaDB [(none)]> show databases; +---------------------+ | Database | +---------------------+ | information_schema | | #mysql50#lost+found | | mingming | | mysql | | performance_schema | | test | +---------------------+ 6 rows in set (0.00 sec)
在同步磁盤以前 應該先把每一個次節點提高爲主節點 而後格式化磁盤 再將爲次節點同步數據 , 不然同步完數據後 沒辦法再格式化了