1. 程式人生 > >DRBD的介紹與安裝

DRBD的介紹與安裝

linu out 相同 暫停 等待 link tab oba F5

一、DRBD介紹
介紹部分來自:http://www.ywnds.com/?p=6619
1 DRBD基本功能
Distributed Replicated Block Device(DRBD)是一種基於軟件的,無共享,復制的存儲解決方案,在服務器之間的對塊設備(硬盤,分區,邏輯卷等)進行鏡像。
DRBD是將不同機器上的兩塊大小相同的硬盤或是兩個分區讓它們的每一位都對齊,從而當用戶空間有數據要存儲到主節點磁盤時,工作在內核空間的DRBD會監控數據,一旦發現數據是要存儲到定義了DRBD的分區上後,就會把數據復制一份通過網絡傳送到備用節點上來。備用節點上運行一個服務時刻可以接收對方發來的數據,然後接到內核中,內核中的DRBD接收到數據後通過內核保存到磁盤上。雙方式通過DRBD協議按位存儲數據。
在高可用(HA)中使用DRBD功能,可以代替使用一個共享盤陣。本地(主節點)與遠程主機(備節點)的數據可以保證實時同步。當本地系統出現故障時,遠程主機上還會保留有一份相同的數據,可以繼續使用。需要說明一點的是DRBD只支持兩個節點不支持多節點。
2、DRBD部署模式
①、主從模式
DRBD主從架構中,主節點可以讀寫數據而從節點不能讀寫,連掛載都不允許,否則會造成文件系統崩潰,但是主從的節點可以相互切換,如可以把主節點分區卸載後把主節點轉為從,然後把分區掛在到從節點上,再把從轉為主。
②、雙主模式
由於DRBD是在兩臺獨立的機器上實現數據塊同步,所以單憑在一個節點上寫數據時施加鎖機制而另外一個節點要寫數據時看不到對方施加的鎖,因此會照成數據損壞。但是如果把DRBD用在高可用集群中就可以實現雙主模型,在高可用中把DRBD定義成主從資源基於分布式文件鎖DLM加集群文件系統gfs或ocfs,這樣一來當一端在寫入數據時因為是DLM+GFS,所以就會通知給另外一端的DRBD從而避免數據損壞(雙主模型並不是並行讀寫)。
3、DRBD數據同步模式
由於DRBD將數據發送給對端服務器之後還要確定對方的回應以確定數據是否安全存儲,然後DRBD程序才退出,最終應用程序完成數據存儲。這樣一來DRBD發送數據並接收到回應的時間就是應用程序執行的過程時間。所以又涉及到了數據安全跟性能之間平衡了,DRBD提供了異步、半同步、同步等工作方式。
①、異步復制
異步復制協議。一旦本地磁盤寫入已經完成,數據包已在發送隊列中,則寫被認為是完成的。在一個節點發生故障時,可能發生數據丟失,因為被寫入到遠程節點上的數據可能仍在發送隊列。盡管,在故障轉移節點上的數據是一致的,但沒有及時更新。這通常是用於地理上分開的節點。

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

③、同步復制
同步復制協議。只有在本地和遠程節點的磁盤已經確認了寫操作完成,寫才被認為完成。沒有任何數據丟失,所以這是一個群集節點的流行模式,但I / O吞吐量依賴於網絡帶寬。
一般使用協議C,但選擇C協議將影響流量,從而影響網絡時延。為了數據可靠性,我們在生產環境使用時須慎重選項使用哪一種協議。

二、DRBD主從模式安裝配置

1、安裝前期準備

①、準備兩塊獨立磁盤
[root@node-001 ~]# fdisk -l | grep /dev/vdb
Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors

[root@node-002 ~]# fdisk -l | grep /dev/vdb
Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors

②、關閉防火墻和SELINUX
systemctl stop firewalld
setenforce 0

③、我們需要修改hosts文件保證hosts之間能夠互相訪問
[root@node-001 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.17.2.140 sz-xh_42f-op-test-docker-001
10.17.2.47 sz-xh_42f-op-test-docker-002
10.17.2.45 node-001
10.17.2.13 node-002

[root@node-002 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
10.17.2.140 sz-xh_42f-op-test-docker-001
10.17.2.47 sz-xh_42f-op-test-docker-002
10.17.2.45 node-001
10.17.2.13 node-002

④、在node-001修改ssh互信
[root@node-001 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
17:12:68:f3:bb:96:47:eb:6b:45:12:21:16:57:92:1b root@node-001
The key‘s randomart image is:
+--[ RSA 2048]----+
|       .=.++.    |
|      +. +E.     |
|     . o. .+     |
|        ..o..    |
|        S..o     |
|        ... .    |
|         + o     |
|        + +      |
|       . +o.     |
+-----------------+
[root@node-001 ~]# ssh-copy-id node-002
The authenticity of host ‘[node-002]:65300 ([10.17.2.13]:65300)‘ can‘t be established.
ECDSA key fingerprint is 48:5e:de:e1:d7:b6:f5:55:54:7f:3c:2b:39:70:a8:74.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@node-002‘s password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh ‘node-002‘"
and check to make sure that only the key(s) you wanted were added.

⑤、在node-001和node-002上設置時鐘同步
[root@node-001 ~]# crontab -e
*/5 * * * * ntpdate cn.pool.ntp.org   ###添加任務 

[root@node-002 ~]# crontab -e
*/5 * * * * ntpdate cn.pool.ntp.org   ###添加任務

在node-001和node-002上可以看到已經添加時間任務:

[root@node-001 ~]# crontab -l
*/5 * * * * ntpdate cn.pool.ntp.org
[root@node-002 ~]# crontab -l
*/5 * * * * ntpdate cn.pool.ntp.org 

2、開始安裝drbd包

在node-001和node-002操作
[root@node-001 ~]# yum install gcc gcc-c++ make glibc flex kernel kernel-devel kernel-headers -y
[root@node-001 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@node-001 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@node-001 ~]# yum install -y kmod-drbd84 drbd84-utils

[root@node-002 ~]# yum install gcc gcc-c++ make glibc flex kernel kernel-devel kernel-headers -y
[root@node-002 ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@node-002 ~]# rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
[root@node-002 ~]# yum install -y kmod-drbd84 drbd84-utils

3、主配置文件

/etc/drbd.conf #主配置文件 
/etc/drbd.d/global_common.conf #全局配置文件
/etc/drbd.conf說明 
主配置文件中包含了全局配置文件及”drbd.d/”目錄下以.res結尾的文件
# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example
include "drbd.d/global_common.conf";
include "drbd.d/*.res"; 

4、修改配置文件

[root@node-001 ~]# cat /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 {
    usage-count no; #是否參加DRBD使用統計,默認為yes。官方統計drbd的裝機量,改為no

    # 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-error detach; #配置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-target c-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;    #設置主備節點同步時的網絡速率
    }
}

註釋: 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錯誤 
定義一個資源 

5、創建資源文件

在node-001和node-002分別創建/etc/drbd.d/git.res並寫入
resource git { #資源名稱
protocol C; #使用協議
meta-disk internal;
device /dev/drbd1; #DRBD設備名稱
syncer {
verify-alg sha1;# 加密算法
}
net {
allow-two-primaries;
}
on node-001 {
disk /dev/vdb;
address 10.17.2.45:7789; #設置DRBD監聽地址與端口
}
on node-002 {
disk /dev/vdb;
address 10.17.2.13:7789;
}
}

6、啟用drbd

modprobe drbd
drbdadm create-md git
drbdadm up git
rbdadm -- --force primary git

配置對端節點
ssh node-002 "drbdadm create-md git"
ssh node-002 "modprobe drbd"
ssh node-002 "drbdadm up git"

報錯:Command ‘drbdmeta 1 v08 /dev/vdb internal apply-al‘ terminated with exit code 255
解決:dd if=/dev/zero of=/dev/vdb bs=1M count=100

7、創建文件系統

文件系統只能掛載在主(Primary)節點上,因此在設置好主節點後才可以對DRBD設備進行格式化操作格式化文件系統
Primary:當前節點為主;在前面為當前節點 
Secondary:備用節點為次 
查看當前節點角色
[root@node-001 ~]# drbdadm role git
Secondary/Primary

[root@node-002 data]# drbdadm role git
Primary/Secondary
可知primary節點是004,在節點004上執行以下命令
mkfs.ext4 /dev/drbd1
mount /dev/drbd1 /data

查看drbd狀態使用cat /proc/drbd 或drbd-overview
[root@node-002 data]# drbd-overview
NOTE: drbd-overview will be deprecated soon.
Please consider using drbdtop.

 1:git/0  SyncTarget Primary/Secondary Inconsistent/UpToDate /data xfs 100G 33M 100G 1% 
    [=====>..............] sync‘ed: 31.4% (66744/97164)M     

8、切換主備測試是否同步成功

在node-002創建數據並執行降級操作,切換為備節點
創建測試文件
[root@node-002 data]# touch /data/testfile.{1..4}
[root@node-002 data]# ll /data
total 0
-rw-r--r-- 1 root root 0 Jun 14 09:20 testfile.1
-rw-r--r-- 1 root root 0 Jun 14 09:20 testfile.2
-rw-r--r-- 1 root root 0 Jun 14 09:20 testfile.3
-rw-r--r-- 1 root root 0 Jun 14 09:20 testfile.4
執行降級操作
[root@node-002 data]# cd ~
[root@node-002 ~]# umount /data
[root@node-002 ~]# drbdadm secondary git
[root@node-002 ~]# drbd-overview
NOTE: drbd-overview will be deprecated soon.
Please consider using drbdtop.

 1:git/0  SyncTarget Secondary/Secondary Inconsistent/UpToDate 
    [=======>............] sync‘ed: 44.1% (54340/97164)M    

在node-001執行升級操作,切換為primary節點
[root@node-001 ~]# drbdadm primary git
[root@node-001 ~]# drbdadm role git
Primary/Secondary
[root@node-001 ~]# mount /dev/drbd1 /data
[root@node-001 ~]# ll /data
total 0
-rw-r--r-- 1 root root 0 Jun 14 09:20 testfile.1
-rw-r--r-- 1 root root 0 Jun 14 09:20 testfile.2
-rw-r--r-- 1 root root 0 Jun 14 09:20 testfile.3
-rw-r--r-- 1 root root 0 Jun 14 09:20 testfile.4

至此,數據同步成功,DRBD主從模式部署完成

9、常用命令操作

①、資源的連接狀態詳細介紹,如何查看資源連接狀態?

[root@node-001 ~]# drbdadm cstate git
SyncSource

資源的連接狀態;一個資源可能有以下連接狀態中的一種
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@node-001 ~]# drbdadm role git
Primary/Secondary

Parimary 主:資源目前為主,並且可能正在被讀取或寫入,如果不是雙主只會出現在兩個節點中的其中一個節點上
Secondary 次:資源目前為次,正常接收對等節點的更新
Unknown 未知:資源角色目前未知,本地的資源不會出現這種狀態

③、查看硬盤狀態命令
[root@node-001 ~]# drbdadm dstate git
UpToDate/Inconsistent

本地和對等節點的硬盤有可能為下列狀態之一:
Diskless 無盤:本地沒有塊設備分配給DRBD使用,這表示沒有可用的設備,或者使用drbdadm命令手工分離或是底層的I/O錯誤導致自動分離
Attaching:讀取無數據時候的瞬間狀態
Failed 失敗:本地塊設備報告I/O錯誤的下一個狀態,其下一個狀態為Diskless無盤
Negotiating:在已經連接的DRBD設置進行Attach讀取無數據前的瞬間狀態
Inconsistent:數據是不一致的,在兩個節點上(初始的完全同步前)這種狀態出現後立即創建一個新的資源。此外,在同步期間(同步目標)在一個節點上出現這種狀態
Outdated:數據資源是一致的,但是已經過時
DUnknown:當對等節點網絡連接不可用時出現這種狀態
Consistent:一個沒有連接的節點數據一致,當建立連接時,它決定數據是UpToDate或是Outdated
UpToDate:一致的最新的數據狀態,這個狀態為正常狀態

④、啟動、停止資源

啟動資源  drbdadm up git
停止資源  drbdadm down git

git:為資源名稱;當然也可以使用all表示[停用|啟用]所有資源

⑤、升級和降級資源

升級資源 drbdadm primary git
降級資源 drbdadm secondary git
同步資源 drbdadm -- --overwrite-data-of-peer primary git

git:為資源名稱。在單主模式下的DRBD,兩個節點同時處於連接狀態,任何一個節點都可以在特定的時間內變成主;但兩個節點中只能一為主,如果已經有一個主,需先降級才可能升級;在雙主模式下沒有這個限制。

DRBD的介紹與安裝