1. 程式人生 > >(HA)DRBD原理簡介到實戰配置

(HA)DRBD原理簡介到實戰配置

分布式 mfs 系統

前言:先把DRBD高可用大概的寫一下,後面再引入分布式系統與DRBDR相結合更加明顯凸顯他們各自實現的功能,從而整體體現出相對比較可靠(穩定)的狀態。


一、DRBD簡介

1、DRBD是啥、能幹啥?

DRBD全稱::Distributed ReplicatedBlock Device分布式塊設備復制,是一種基於軟件的,無共享的,復制的存儲解決方案,鏡像主機之間的塊設備(硬盤,分區,邏輯卷等)的內容。DRBD功能是由drbd內核模塊和相關腳本構成,用來構建高可用集群(主要是儲存方面)。一般來說,首先DRBD分為兩塊,一塊是在本地,另一塊是在遠端,其次還會給這兩塊分別劃分等級,一開始劃給本地這塊primary,給遠端那塊劃secondary。

關於DRBD鏡像數據:

實時:當應用程序修改設備上的數據時,復制會持續發生。

透明:應用程序不需要知道數據存儲在多臺主機上。

同步或異步:通過同步鏡像,在所有主機上執行寫入操作後,都會通知應用程序的寫入完成。通過異 步鏡像,當本地完成寫入操作時,應用程序將被通知寫入完成,這通常在傳播到其他主機之前。


2、DRBD實現的原理

DRBD primary本地這塊(主機磁盤)負責接受寫入的數據,並且把寫入的數據發送給DRBD Secondary遠端那塊(主機磁盤),簡單來說就是把寫入本地的數據,通過網絡傳輸的方式復制到遠端,在遠端建立了一個數據鏡像。


3、三種復制模式

協議A:

異步復制協議。一旦本地磁盤寫入已經完成,數據包已在發送隊列中,則寫被認為是完成的。在一個節點發生故障時,可能發生數據丟失,因為被寫入到遠程節點上的數據可能仍在發送隊列。盡管,在故障轉移節點上的數據是一致的,但沒有及時更新。這通常是用於地理上分開的節點。

協議B:

內存同步(半同步)復制協議。一旦本地磁盤寫入已完成且復制數據包達到了對等節點則認為寫在主節點上被認為是完成的。數據丟失可能發生在參加的兩個節點同時故障的情況下,因為在傳輸中的數據可能不會被提交到磁盤。

協議C:

同步復制協議。只有在本地和遠程節點的磁盤已經確認了寫操作完成,寫才被認為完成。沒有任何數據丟失,所以這是一個群集節點的流行模式,但I / O吞吐量依賴於網絡帶寬。

註意:一般使用協議C,但選擇C協議將影響流量,從而影響網絡時延。為了數據可靠性,我們在生產環境使用時須慎重選項使用哪一種協議。


4、DRBD工作原理圖

大牛版:


技術分享

菜鳥版:

技術分享菜鳥版圖片來自簡書作者:宇信智臻sy

二、DRBD實戰配置


1、環境布置

軟件:vmworkstation

虛擬機及IP:兩臺虛擬機node3(10.0.0.5)、node4(10.0.0.6)

軟件包:yum安裝kmod-drbd84、drbd84-utils(包要同版本)

2、通信、同步配置

⑴、修改node3、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

3、安裝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


4、在兩臺虛擬機服務器上個各添加一塊大小相同磁盤,重啟虛擬機


5、兩臺服務器配置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


6、啟動brbd內核模塊、創建啟動資源、查看磁盤狀態

#node3、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:一致的最新的數據狀態,這個狀態為正常狀態

7、格式化drbd磁盤

[root@node3 ~]# mkfs.xfs /dev/drbd1
...

8、掛載/dev/drbd1磁盤到primary

[root@node3 ~]# mkdir /data
[root@node3 ~]# mount /dev/drbd1 /data

技術分享


三、簡單測試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 
 
3、然後我們掛載試一下:
[root@node3 ~]# mount /dev/drbd1 /data/
[root@node3 ~]# cat /data/123.txt
11111


三、總結

到此為止drbd的一般搭建就完成了,我準備後寫一篇drbd做高可用,過KEEPAKIVED實現高可用的同學可能會覺得drdb這個實現方式有點太LOW了,實現高可用還需要人工幹預,那在實際生產環境還一直放個人在旁邊守著?所以為了讓他實現“自動化”我後面會寫用drbd+corosync+pacemaker+crmsh來自動的切換故障節點,這樣才夠“高大上”。


本文出自 “自己找自己” 博客,請務必保留此出處http://bluesrer.blog.51cto.com/10918251/1977153

(HA)DRBD原理簡介到實戰配置