分散式複製區塊裝置 (DRBD*) 可讓您跨 IP 網路為位於兩個不同站台的兩個區塊裝置建立鏡像。與 Corosync 搭配使用時,DRBD 支援分散式高可用性 Linux 叢集。本章節將介紹如何安裝及設定 DRBD。
DRBD 能在將資料從主要裝置複製到次要裝置時,確保兩份資料保持一致。您可以將其視為網路 RAID 1。它會即時執行資料的鏡像複製,因此其複製會持續進行。應用程式無須知曉其資料實際上儲存在其他磁碟上。
鏡像複製間的資料流量不會加密。為了保證資料交換的安全,您應該為連線部署虛擬私人網路 (VPN) 解決方案。
DRBD 是 Linux 核心模組,位於下層的 I/O 規劃程式和上層的檔案系統之間,請參閱圖形 15.1 「DRBD 在 Linux 中的位置」。若要與 DRBD 通訊,使用者需使用高階指令 drbdadm。為最大限度地提升靈活性,DRBD 隨附有低階工具 drbdsetup。
藉由 DRBD,使用者可以使用 Linux 支援的任何區塊裝置,通常包括︰
分割區或完整硬碟
軟體 RAID
邏輯磁碟區管理 (Logical Volume Manager,LVM)
企業卷冊管理系統 (EVMS)
依預設,DRBD 使用 7788 及更高的 TCP 埠來處理 DRBD 節點之間的通訊。請確定您的防火牆不會阻止所用連接埠上的通訊。
您必須先對 DRBD 裝置進行設定,然後才能在其上建立檔案系統。所有與使用者資料相關的操作都只應透過 /dev/drbd_N 裝置執行,不能在原始裝置上執行,因為 DRBD 會將原始裝置最後的部分用於儲存中繼資料。使用原始裝置會導致資料不一致。
憑藉 udev 整合,您還可以獲得 /dev/drbd/by-res/RESOURCES 格式的符號連結,這種連結更易於使用,而且還能預防在記錯裝置次要編號的情況下出現安全問題。
例如,如果原始裝置的大小為 1024 MB,則 DRBD 裝置只能使用 1023 MB 來儲存資料,另有大約 70 KB 隱藏留做儲存中繼資料之用。透過 /dev/drbdN 存取其餘 KB 的任何嘗試都會失敗,因為這些空間不用於儲存使用者資料。
依照第 I 部分「安裝與設定」所述,在網路叢集中的兩台 SUSE Linux Enterprise Server 機器上都安裝 High Availability Extension 附加產品。安裝 High Availability Extension 時會安裝 DRBD 程式檔案。
如果您不需要完整的叢集堆疊,而只想使用 DRBD,請安裝 drbd 套件。
若要簡化 drbdadm (drbd 套件的其中一部分) 的使用,可以使用 Bash 補齊支援。如果要在目前的外圍程序工作階段中將其啟用,請插入以下指令︰
root #source/etc/bash_completion.d/drbdadm.sh
若要將其永久用於 root,請建立或延伸檔案 /root/.bashrc,並插入上面的指令行。
下面的程序使用伺服器名稱 jupiter 與 venus,以及叢集資源名稱 r0。它會將 jupiter 設定為主要節點,並使用 /dev/sda1 儲存資料。請務必修改指示,以使用您自己的節點與檔案名稱。
開始設定 DRBD 前,請確定 Linux 節點中的區塊裝置已就緒並已分割 (如果需要)。下面的程序假設您擁有 jupiter 與 venus 兩個節點,並且它們應使用 TCP 連接埠 7788。請確定您的防火牆中已開啟此連接埠。
若要手動設定 DRBD,請執行下列步驟:
如果叢集已在使用 DRBD,請將叢集置於維護模式:
root #crmconfigure edit node alice attributes maintenance="true"
如果叢集已在使用 DRBD,而您跳過了此步驟,即時組態中的語法錯誤會導致服務關閉。
以 root 使用者身分登入。
變更 DRBD 的組態檔案︰
開啟檔案 /etc/drbd.conf 並插入以下幾行 (如果它們尚不存在)︰
include "drbd.d/global_common.conf"; include "drbd.d/*.res";
從 DRBD 8.3 開始,組態檔案已分割為多個獨立檔案,位於 /etc/drbd.d/ 目錄下。
開啟檔案 /etc/drbd.d/global_common.conf。該檔案中已包含一些預定義的值。轉至 startup 區段,並插入以下幾行︰
startup {
# wfc-timeout degr-wfc-timeout outdated-wfc-timeout
# wait-after-sb;
wfc-timeout 100;
degr-wfc-timeout 120;
}這些選項可用於減少開機過程中的逾時,詳細資料請參閱 http://www.drbd.org/users-guide-emb/re-drbdconf.html。
建立檔案 /etc/drbd.d/r0.res,再根據具體情況變更以下幾行,然後儲存︰
resource r0 { 1
device /dev/drbd0; 2
disk /dev/sda1; 3
meta-disk internal; 4
on jupiter { 5
address 192.168.1.10:7788; 6
}
on venus { 5
address 192.168.1.11:7788; 6
}
syncer {
rate 7M; 7
}
}
可用於與需要這些資源的服務建立某種關聯的名稱。例如 | |
DRBD 的裝置名稱及其次要編號。
上面的範例為 DRBD 使用了次要編號 0。Udev 整合程序檔將會為您提供一個符號連結
| |
在兩個節點間複製的原始裝置。請注意,本範例中兩個節點上的裝置是相同的。如果您需要不同的裝置,請將 | |
meta-disk 參數通常包含值 | |
| |
各節點的 IP 位址與埠號。每個資源都需要各自的連接埠,通常從 | |
同步速率。將其設定為磁碟空間和網路頻寬中較小者的三分之一。此設定只能限制重新同步操作,對複製不起作用。 |
檢查組態檔案的語法。若以下指令傳回錯誤,請檢查您的檔案︰
root #drbdadmdump all
如果您之前已設定 Csync2 (這應該是預設設定),則 DRBD 組態檔案現已包含在需要同步的檔案清單中。若要同步化這些檔案,請使用:
root #csync2-xv /etc/drbd.d/
如果您未設定或不想使用 Csync2,請手動將 DRBD 組態檔案複製到另一個節點:
root #scp/etc/drbd.conf venus:/etc/ scp /etc/drbd.d/* venus:/etc/drbd.d/
在每個節點上輸入以下指令以啟始化兩個系統上的中繼資料:
root #drbdadmcreate-md r0root #systemctlstart drbd.service
如果磁碟包含您不再需要的檔案系統,請使用以下指令損毀檔案系統結構,然後重複此步驟︰
root #ddif=/dev/zero of=/dev/sda1 count=16 bs=1M
在每個節點上輸入以下指令,檢查 DRBD 狀態︰
root #systemctlstatus drbd.service
正常情況下會顯示如下內容︰
[... version string omitted ...] m:res cs ro ds p mounted fstype 0:r0 Connected Secondary/Secondary Inconsistent/Inconsistent C
在目標主要節點 (本範例中為 jupiter) 上啟動重新同步程序︰
root #drbdadm-- --overwrite-data-of-peer primary r0
再次使用 systemctl status drbd.service 檢查狀態,重新同步之後,您將看到:
... m:res cs ro ds p mounted fstype 0:r0 Connected Primary/Secondary UpToDate/UpToDate C
兩個節點上 ds 列中的狀態 (磁碟狀態) 都必須為 UpToDate。
在您的 DRBD 裝置上建立檔案系統,例如︰
root #mkfs.ext3/dev/drbd/by-res/r0/0
掛接檔案系統並投入使用︰
root #mount/dev/drbd /mnt/
重設叢集的維護模式旗標:
root #crmconfigure edit node alice attributes maintenance="false"
或者,若要使用 YaST 設定 DRBD,請執行下列步驟︰
啟動 YaST 並選取組態模組 › 。如果您已設定了 DRBD 組態,YaST 會向您發出警告。YaST 將會變更您的組態,並將原來的 DRBD 組態檔案另存為 *.YaSTsave。
將 › 中的開機旗標保留原樣 (預設為 off);請不要變更該設定,因為 Pacemaker 會管理此服務。
實際的資源組態在中設定 (請參閱圖形 15.2 「資源組態」)。
按可建立新資源。以下參數需要設定兩次︰
|
|
資源的名稱 (強制) |
|
|
相關節點的主機名稱 |
|
|
相應節點的 IP 位址與連接埠號 (預設為 7788) |
|
|
用於存取所複製資料的區塊裝置路徑。 |
|
|
在兩個節點間複製的裝置。 |
|
|
可設定為
也可為多重 drbd 資源使用一個真實裝置。例如,如果第一個資源使用的為 |
上述所有選項在 /usr/share/doc/packages/drbd/drbd.conf 檔案與 drbd.conf(5) 線上文件中都以範例進行了說明。
如果您之前已設定 Csync2 (這應該是預設設定),則 DRBD 組態檔案現已包含在需要同步的檔案清單中。若要同步化這些檔案,請使用:
root #csync2-xv /etc/drbd.d/
如果您未安裝或不想使用 Csync2,請手動將 DRBD 組態檔案複製到另一個節點 (此範例中的另一個節點 venus):
root #scp/etc/drbd.conf venus:/etc/ scp /etc/drbd.d/* venus:/etc/drbd.d/
在每個節點上輸入以下指令,以在兩個系統上啟始化並啟動 DRBD 服務︰
root #drbdadmcreate-md r0root #systemctlstart drbd.service
在 alice 上輸入以下指令,將 alice 設定為主要節點:
root #drbdsetup/dev/drbd0 primary --overwrite-data-of-peer
在每個節點上輸入以下指令,檢查 DRBD 服務狀態︰
root #systemctlstatus drbd.service
等到兩個節點上的區塊裝置完全同步後再繼續操作。重複 systemctl status drbd.service 指令以追蹤同步進度。
兩個節點上的區塊裝置完全同步後,以偏好的檔案系統格式化主要節點上的 DRBD 裝置。可以使用任何 Linux 檔案系統。建議使用 /dev/drbd/by-res/RESOURCE 名稱。
如果安裝與組態程序按預期執行,您現在就可以執行基本的 DRBD 功能測試。此測試也有助於瞭解軟體的工作原理。
測試 jupiter 上的 DRBD 服務。
開啟終端機主控台,然後以 root 身分登入。
在 jupiter 上建立掛接點,如 /srv/r0︰
root #mkdir-p /srv/r0
掛接 drbd 裝置︰
root #mount-o rw /dev/drbd0 /srv/r0
從主要節點建立檔案︰
root #touch/srv/r0/from_jupiter
卸載 jupiter 上的磁碟︰
root #umount/srv/r0
在 jupiter 上輸入以下指令,將 jupiter 上的 DRBD 服務降級︰
root #drbdadmsecondary
測試 venus 上的 DRBD 服務。
在 venus 上開啟終端機主控台,然後以 root 身分登入。
在 venus 上,將 DRBD 服務升級為主要服務︰
root #drbdadmprimary
在 venus 上檢查 venus 是否為主要節點︰
root #systemctlstatus drbd.service
在 venus 上建立掛接點,如 /srv/r0mount︰
root #mkdir/srv/r0mount
在 venus 上掛接 DRBD 裝置︰
root #mount-o rw /dev/drbd_r0 /srv/r0mount
驗證您在 jupiter 上建立的檔案是否存在︰
root #ls/srv/r0
此時應列出 /srv/r0mount/from_jupiter 檔案。
如果服務在兩個節點上都可執行,即表示 DRBD 設定已完成。
再次將 jupiter 設為主要節點。
在 venus 上輸入以下指令,卸下 venus 上的磁碟︰
root #umount/srv/r0
在 venus 上輸入以下指令,將 venus 上的 DRBD 服務降級︰
root #drbdadmsecondary
在 jupiter 上,將 DRBD 服務升級為主要服務︰
root #drbdadmprimary
在 jupiter 上檢查 jupiter 是否為主要節點︰
root #systemctlstatus drbd.service
若要讓服務在伺服器出現問題時自動啟動並容錯移轉,您可以使用 Pacemaker/Corosync 將 DRBD 設定為高可用性服務。如需關於如何安裝和設定 SUSE Linux Enterprise 12 的資訊,請參閱第 II 部分「組態與管理」。
調整 DRBD 的方法有多種︰
使用外部磁碟儲存中繼資料。這可能會有所幫助,不過會降低維護方便性。
建立 udev 規則,以變更 DRBD 裝置的 read-ahead。將下行儲存到檔案 /etc/udev/rules.d/82-dm-ra.rules 中,並根據工作負載變更 read_ahead_kb 的值︰
ACTION=="add", KERNEL=="dm-*", ATTR{bdi/read_ahead_kb}="4100"此行僅在您使用 LVM 時才有效。
透過 sysctl 變更接收和傳送緩衝區設定,以調整網路連接。
在 DRBD 組態中變更 max-buffers 和/或 max-epoch-size。
根據您的 IO 模式增大 al-extents 值。
如果您有一個配備了 BBU (電池備份單元) 的硬體 RAID 控制器,設定 no-disk-flushes、no-disk-barrier 和/或 no-md-flushes 可能會有所幫助。
根據工作負載啟用讀取平衡。請參閱 http://blogs.linbit.com/p/256/read-balancing/,以取得詳細資料。
DRBD 設定涉及眾多不同的元件,因此導致問題發生的原因多種多樣。以下各節將介紹幾種常見的情況並提供了多種解決方案。
如果初始的 DRBD 設定未依預期運作,則可能是由於組態有問題。
若要獲取有關組態的資訊,請執行下列步驟︰
開啟終端機主控台,然後以 root 身分登入。
執行 drbdadm (含 -d 選項),測試組態檔案。輸入下列指令︰
root #drbdadm-d adjust r0
在 adjust 選項的試執行 (dry run) 期間,drbdadm 會將 DRBD 資源的實際組態與 DRBD 組態檔案進行比較,但不會執行呼叫。檢閱輸出,以確定您瞭解所有錯誤的來源及原因。
如果檔案 /etc/drbd.d/* 與 drbd.conf 中存在錯誤,請更正後再繼續。
如果分割區與設定均正確,請再次執行 drbdadm (不含 -d 選項)。
root #drbdadmadjust r0
此指令會將組態檔案套用於 DRBD 資源。
與核心中儲存的主機名稱相比 (請參閱 uname -n 輸出),DRBD 的主機名稱區分大小寫 (Node0 是不同於 node0 的主機)。
如果您擁有多個網路裝置,並希望使用專屬的網路裝置,主機名稱可能不會解析成所使用的 IP 位址。在這種情況下,可以使用參數 disable-ip-verification。
如果您的系統無法連接至對等系統,可能是因為本地防火牆有問題。依預設,DRBD 使用 TCP 埠 7788 存取其他節點。請確定在兩個節點上均可存取此連接埠。
如果 DRBD 不知道存放最新資料的真實裝置,就會導致電腦分裂狀態。在這種情況下,各個 DRBD 子系統將會做為次要項目出現,並且不會相互連接。在這種情況下,可以在記錄資料中尋找以下訊息:
Split-Brain detected, dropping connection!
若要解決此問題,請在要丟棄資料的節點上輸入以下指令︰
root #drbdadm secondary r0root #drbdadm-- --discard-my-data connect r0
在含有最新資料的節點上,輸入以下指令︰
root #drbdadmconnect r0
如此會將一個節點的資料覆寫為對等節點的資料,因此兩個節點上的檢視窗將會保持一致,從而使問題得到解決。
下列開放原始碼資源適用於 DRBD︰
專案首頁 http://www.drbd.org。
請參閱 Highly Available NFS Storage with DRBD and Pacemaker。
http://clusterlabs.org/wiki/DRBD_HowTo_1.0,由 Linux Pacemaker Cluster Stack Project 提供。
配送的產品中包含以下 DRBD 的 man 頁面︰drbd(8)、drbddisk(8)、drbdsetup(8)、drbdsetup(8)、drbdadm(8)、drbd.conf(5)。
/usr/share/doc/packages/drbd/drbd.conf 中可找到含備註的 DRBD 範例組態。
此外,為了更方便地在整個叢集中進行儲存管理,請參閱 http://blogs.linbit.com/p/666/drbd-manager 上關於 DRBD-Manager 的最新宣告。