前言:先把DRBD高可用大概的寫一下,後面再引入分佈式系統與DRBDR相結合更加明顯凸顯他們各自實現的功能,從而總體體現出相對比較可靠(穩定)的狀態。
node
1、DRBD簡介
mysql
一、DRBD是啥、能幹啥?
算法
DRBD全稱::Distributed ReplicatedBlock Device分佈式塊設備複製,是一種基於軟件的,無共享的,複製的存儲解決方案,鏡像主機之間的塊設備(硬盤,分區,邏輯卷等)的內容。DRBD功能是由drbd內核模塊和相關腳本構成,用來構建高可用集羣(主要是儲存方面)。通常來講,首先DRBD分爲兩塊,一塊是在本地,另外一塊是在遠端,其次還會給這兩塊分別劃分等級,一開始劃給本地這塊primary,給遠端那塊劃secondary。sql
關於DRBD鏡像數據:bash
實時:當應用程序修改設備上的數據時,複製會持續發生。服務器
透明:應用程序不須要知道數據存儲在多臺主機上。網絡
同步或異步:經過同步鏡像,在全部主機上執行寫入操做後,都會通知應用程序的寫入完成。經過異 步鏡像,當本地完成寫入操做時,應用程序將被通知寫入完成,這一般在傳播到其餘主機以前。less
二、DRBD實現的原理
ssh
DRBD primary本地這塊(主機磁盤)負責接受寫入的數據,而且把寫入的數據發送給DRBD Secondary遠端那塊(主機磁盤),簡單來講就是把寫入本地的數據,經過網絡傳輸的方式複製到遠端,在遠端創建了一個數據鏡像。異步
3、三種複製模式
協議A:
異步複製協議。一旦本地磁盤寫入已經完成,數據包已在發送隊列中,則寫被認爲是完成的。在一個節點發生故障時,可能發生數據丟失,由於被寫入到遠程節點上的數據可能仍在發送隊列。儘管,在故障轉移節點上的數據是一致的,但沒有及時更新。這一般是用於地理上分開的節點。
協議B:
內存同步(半同步)複製協議。一旦本地磁盤寫入已完成且複製數據包達到了對等節點則認爲寫在主節點上被認爲是完成的。數據丟失可能發生在參加的兩個節點同時故障的狀況下,由於在傳輸中的數據可能不會被提交到磁盤。
協議C:
同步複製協議。只有在本地和遠程節點的磁盤已經確認了寫操做完成,寫才被認爲完成。沒有任何數據丟失,因此這是一個羣集節點的流行模式,但I / O吞吐量依賴於網絡帶寬。
注意:通常使用協議C,但選擇C協議將影響流量,從而影響網絡時延。爲了數據可靠性,咱們在生產環境使用時須慎重選項使用哪種協議。
四、DRBD工做原理圖
大牛版:
菜鳥版:
2、DRBD實戰配置
一、環境佈置
系統版本、軟件:vmworkstation、CENTOS 7.3
虛擬機及IP:兩臺虛擬機node3(10.0.0.5)、node4(10.0.0.6)
軟件包:yum安裝kmod-drbd8四、drbd84-utils(包要同版本)
二、通訊、同步配置
⑴、修改node三、nide4的hosts文件,經過此文件解析到主機IP
⑵、ssh免密登入
[root@node3 ~]#ssh-keygen #屢次回車直到密鑰建立完成 [root@node3 ~]#ssh-copy-id node4
⑶、設置兩臺服務器時鐘服務器
[root@node3 ~]# crontab -l */5 * * * * ntpdate cn.pool.ntp.org #在node3 [root@node4 ~]# crontab -l */5 * * * * ntpdate cn.pool.ntp.org #在node4
⑷、關閉防火牆和SELINUX
三、安裝elrepo源,安裝drbd
[root@node3 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org [root@node3 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm [root@node3 ~]# yum install -y kmod-drbd84 drbd84-utils
四、在兩臺虛擬機服務器上個各添加一塊大小相同磁盤,重啓虛擬機
五、兩臺服務器配置drbd配置文件
[root@node3 ~]# cat /etc/drbd.conf ##不用改動此文件 # You can find an example in /usr/share/doc/drbd.../drbd.conf.example include "drbd.d/global_common.conf"; include "drbd.d/*.res";
#配置全局配置文件 [rootglob@node3 ~]# cat /etc/drbd.d/global_common.conf global { usage-count no; # minor-count dialog-refresh disable-ip-verification } 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; } net { } syncer { rate 1024M; }
##建立資源配置文件 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 node3 { disk /dev/sdb; drbd1使用的磁盤分區爲"mysql",指定新加的磁盤 address 10.0.0.5:7789; #設置DRBD監聽地址與端口 } on node4 { disk /dev/sdb; address 10.0.0.6:7789; } }
##在node4也使用相同的配置 [root@node3 ~]# scp -p global_common.conf mysql.res
六、啓動brbd內核模塊、建立啓動資源、查看磁盤狀態
#node三、node4查看內核模塊是否已經加載 [root@node3 ~]# lsmod | grep drbd #沒有則主動加載 [root@node3 ~]# modprobe drbd #若是顯示沒有此模塊是由於系統內核版本過低,不支持模塊須要升級 #執行能夠用 yum install kernel* 方式來更新 #也能夠 yum kernel-devel kernel kernel-headers -y ##########################node4相同操做######################################
#建立資源 [root@node3 ~]# drbdadm create-md mysql initializing activity log initializing bitmap (160 KB) to all zero Writing meta data... New drbd meta data block successfully created. #啓動資源、指定本機爲primary [root@node3 ~]# drbdadm up mysql [root@node3 ~]# drbdadm -- --force primary mysql #node4 [root@node4 ~]# drbdadm create-md mysql [root@node4 ~]# drbdadm up mysql
[root@nod4 ~]# drbdadm dstate mysql #Inconsistent/Inconsistent #本地和對等節點的硬盤有可能爲下列狀態之一: #Diskless 無盤:本地沒有塊設備分配給DRBD使用,這表示沒有可用的設備,或者使用drbdadm命令手工分離或是底層的I/O錯誤致使自動分離 #Attaching:讀取無數據時候的瞬間狀態 #Failed 失敗:本地塊設備報告I/O錯誤的下一個狀態,其下一個狀態爲Diskless無盤 #Negotiating:在已經鏈接的DRBD設置進行Attach讀取無數據前的瞬間狀態 #Inconsistent:數據是不一致的,在兩個節點上(初始的徹底同步前)這種狀態出現後當即建立一個新的資源。此外,在同步期間(同步目標)在一個節點上出現這種狀態 #Outdated:數據資源是一致的,可是已通過時 #DUnknown:當對等節點網絡鏈接不可用時出現這種狀態 #Consistent:一個沒有鏈接的節點數據一致,當創建鏈接時,它決定數據是UpToDate或是Outdated #UpToDate:一致的最新的數據狀態,這個狀態爲正常狀態
七、格式化drbd磁盤
[root@node3 ~]# mkfs.xfs /dev/drbd1 ...
八、掛載/dev/drbd1磁盤到primary
[root@node3 ~]# mkdir /data [root@node3 ~]# mount /dev/drbd1 /data
3、簡單測試drbr高可用
##先在主從結點上建立一個文件,在從節點一樣建立一個/data目錄 [root@node3 data]# echo "11111" > 123.txt [root@node4 /]#mkdir data ##先把主結點降爲從結點(先卸載才能變爲從): [root@node3 etc]# umount /data/ [root@node3 etc]# drbdadm secondary mysql [root@node3 etc]# drbd-overview NOTE: drbd-overview will be deprecated soon. Please consider using drbdtop. 1:mysql/0 Connected Secondary/Secondary UpToDate/UpToDate ## [root@node4 ~]# drbdadm primary mysql You have new mail in /var/spool/mail/root [root@node4 ~]# drbd-overview NOTE: drbd-overview will be deprecated soon. Please consider using drbdtop. 1:mysql/0 Connected Primary/Secondary UpToDate/UpToDate 三、而後咱們掛載試一下: [root@node3 ~]# mount /dev/drbd1 /data/ [root@node3 ~]# cat /data/123.txt 11111
3、總結
到此爲止drbd的通常搭建就完成了,學過KEEPAKIVED實現高可用的同窗可能會以爲drdb這個實現方式有點太LOW了,實現高可用還須要人工干預,那在實際生產環境還一直放我的在旁邊守着?因此爲了讓他實現「自動化」我後面會寫用drbd+corosync+pacemaker+crmsh來自動的切換故障節點,這樣纔夠「高大上」。