套用至 SUSE Linux Enterprise High Availability Extension 12

15 DRBD

分散式複製區塊裝置 (DRBD*) 可讓您跨 IP 網路為位於兩個不同站台的兩個區塊裝置建立鏡像。與 Corosync 搭配使用時,DRBD 支援分散式高可用性 Linux 叢集。本章節將介紹如何安裝及設定 DRBD。

15.1 概念綜覽

DRBD 能在將資料從主要裝置複製到次要裝置時,確保兩份資料保持一致。您可以將其視為網路 RAID 1。它會即時執行資料的鏡像複製,因此其複製會持續進行。應用程式無須知曉其資料實際上儲存在其他磁碟上。

重要
重要:未加密資料

鏡像複製間的資料流量不會加密。為了保證資料交換的安全,您應該為連線部署虛擬私人網路 (VPN) 解決方案。

DRBD 是 Linux 核心模組,位於下層的 I/O 規劃程式和上層的檔案系統之間,請參閱圖形 15.1 「DRBD 在 Linux 中的位置」。若要與 DRBD 通訊,使用者需使用高階指令 drbdadm。為最大限度地提升靈活性,DRBD 隨附有低階工具 drbdsetup

DRBD 在 Linux 中的位置
圖形 15.1 DRBD 在 Linux 中的位置

藉由 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 的任何嘗試都會失敗,因為這些空間不用於儲存使用者資料。

15.2 安裝 DRBD 服務

依照第 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,並插入上面的指令行。

15.3 設定 DRBD 服務

注意
注意:所需的調整

下面的程序使用伺服器名稱 jupiter 與 venus,以及叢集資源名稱 r0。它會將 jupiter 設定為主要節點,並使用 /dev/sda1 儲存資料。請務必修改指示,以使用您自己的節點與檔案名稱。

開始設定 DRBD 前,請確定 Linux 節點中的區塊裝置已就緒並已分割 (如果需要)。下面的程序假設您擁有 jupiter 與 venus 兩個節點,並且它們應使用 TCP 連接埠 7788。請確定您的防火牆中已開啟此連接埠。

若要手動設定 DRBD,請執行下列步驟:

過程 15.1 手動設定 DRBD
  1. 如果叢集已在使用 DRBD,請將叢集置於維護模式:

    root # crm configure edit node alice attributes maintenance="true"

    如果叢集已在使用 DRBD,而您跳過了此步驟,即時組態中的語法錯誤會導致服務關閉。

  2. root 使用者身分登入。

  3. 變更 DRBD 的組態檔案︰

    1. 開啟檔案 /etc/drbd.conf 並插入以下幾行 (如果它們尚不存在)︰

      include "drbd.d/global_common.conf";
      include "drbd.d/*.res";

      從 DRBD 8.3 開始,組態檔案已分割為多個獨立檔案,位於 /etc/drbd.d/ 目錄下。

    2. 開啟檔案 /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

    3. 建立檔案 /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
        }
      }

      1

      可用於與需要這些資源的服務建立某種關聯的名稱。例如 nfshttpmysql_0postgres_wal,等等。

      2

      DRBD 的裝置名稱及其次要編號。

      上面的範例為 DRBD 使用了次要編號 0。Udev 整合程序檔將會為您提供一個符號連結 /dev/drbd/by-res/nfs/0。或者,在組態中省略裝置節點名稱,改為使用下行︰

      device minor 0

      3

      在兩個節點間複製的原始裝置。請注意,本範例中兩個節點上的裝置是相同的。如果您需要不同的裝置,請將 disk 參數移至 on 主機。

      4

      meta-disk 參數通常包含值 internal,但您也可以指定具體的裝置來儲存中繼資料。如需相關資訊,請參閱http://www.drbd.org/users-guide-emb/ch-internals.html#s-metadata

      5

      On 區段指定要對其套用此組態陳述式的主機。

      6

      各節點的 IP 位址與埠號。每個資源都需要各自的連接埠,通常從 7788 開始。

      7

      同步速率。將其設定為磁碟空間和網路頻寬中較小者的三分之一。此設定只能限制重新同步操作,對複製不起作用。

  4. 檢查組態檔案的語法。若以下指令傳回錯誤,請檢查您的檔案︰

    root # drbdadm dump all
  5. 如果您之前已設定 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/
  6. 在每個節點上輸入以下指令以啟始化兩個系統上的中繼資料:

    root # drbdadm create-md r0
    root # systemctl start drbd.service

    如果磁碟包含您不再需要的檔案系統,請使用以下指令損毀檔案系統結構,然後重複此步驟︰

    root #  dd if=/dev/zero of=/dev/sda1 count=16 bs=1M
  7. 在每個節點上輸入以下指令,檢查 DRBD 狀態︰

    root # systemctl status drbd.service

    正常情況下會顯示如下內容︰

    [... version string omitted ...]
    m:res  cs         ro                   ds                         p  mounted  fstype
    0:r0   Connected  Secondary/Secondary  Inconsistent/Inconsistent  C
  8. 在目標主要節點 (本範例中為 jupiter) 上啟動重新同步程序︰

    root # drbdadm -- --overwrite-data-of-peer primary r0
  9. 再次使用 systemctl status drbd.service 檢查狀態,重新同步之後,您將看到:

    
    
    
    ...
    m:res  cs         ro                 ds                 p  mounted  fstype
    0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C

    兩個節點上 ds 列中的狀態 (磁碟狀態) 都必須為 UpToDate。

  10. 在您的 DRBD 裝置上建立檔案系統,例如︰

    root # mkfs.ext3 /dev/drbd/by-res/r0/0
  11. 掛接檔案系統並投入使用︰

    root # mount /dev/drbd /mnt/
  12. 重設叢集的維護模式旗標:

    root # crm configure edit node alice attributes maintenance="false"

或者,若要使用 YaST 設定 DRBD,請執行下列步驟︰

過程 15.2 使用 YaST 設定 DRBD
  1. 啟動 YaST 並選取組態模組高可用性 › DRBD。如果您已設定了 DRBD 組態,YaST 會向您發出警告。YaST 將會變更您的組態,並將原來的 DRBD 組態檔案另存為 *.YaSTsave

    啟動組態 › 開機中的開機旗標保留原樣 (預設為 off);請不要變更該設定,因為 Pacemaker 會管理此服務。

  2. 實際的資源組態在資源組態中設定 (請參閱圖形 15.2 「資源組態」)。

    資源組態
    圖形 15.2 資源組態

    新增可建立新資源。以下參數需要設定兩次︰

    資源名稱

    資源的名稱 (強制)

    名稱

    相關節點的主機名稱

    位址:埠

    相應節點的 IP 位址與連接埠號 (預設為 7788)

    裝置

    用於存取所複製資料的區塊裝置路徑。

    磁碟

    在兩個節點間複製的裝置。

    中繼磁碟

    中繼磁碟可設定為 internal 值,或指定由索引定義的具體裝置,以存放 DRBD 所需的中繼資料。

    也可為多重 drbd 資源使用一個真實裝置。例如,如果第一個資源使用的中繼磁碟/dev/sda6[0],您可以將 /dev/sda6[1] 用於第二個資源。不過,此磁碟上必須為每個資源至少預留 128 MB 的空間。固定中繼資料大小會限制您可複製的最大資料大小。

    上述所有選項在 /usr/share/doc/packages/drbd/drbd.conf 檔案與 drbd.conf(5) 線上文件中都以範例進行了說明。

  3. 如果您之前已設定 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/
  4. 在每個節點上輸入以下指令,以在兩個系統上啟始化並啟動 DRBD 服務︰

    root # drbdadm create-md r0
    root # systemctl start drbd.service
  5. alice 上輸入以下指令,將 alice 設定為主要節點:

    root # drbdsetup /dev/drbd0 primary --overwrite-data-of-peer
  6. 在每個節點上輸入以下指令,檢查 DRBD 服務狀態︰

    root # systemctl status drbd.service

    等到兩個節點上的區塊裝置完全同步後再繼續操作。重複 systemctl status drbd.service 指令以追蹤同步進度。

  7. 兩個節點上的區塊裝置完全同步後,以偏好的檔案系統格式化主要節點上的 DRBD 裝置。可以使用任何 Linux 檔案系統。建議使用 /dev/drbd/by-res/RESOURCE 名稱。

15.4 測試 DRBD 服務

如果安裝與組態程序按預期執行,您現在就可以執行基本的 DRBD 功能測試。此測試也有助於瞭解軟體的工作原理。

  1. 測試 jupiter 上的 DRBD 服務。

    1. 開啟終端機主控台,然後以 root 身分登入。

    2. 在 jupiter 上建立掛接點,如 /srv/r0

      root # mkdir -p /srv/r0
    3. 掛接 drbd 裝置︰

      root # mount -o rw /dev/drbd0 /srv/r0
    4. 從主要節點建立檔案︰

      root # touch /srv/r0/from_jupiter
    5. 卸載 jupiter 上的磁碟︰

      root # umount /srv/r0
    6. 在 jupiter 上輸入以下指令,將 jupiter 上的 DRBD 服務降級︰

      root # drbdadm secondary
  2. 測試 venus 上的 DRBD 服務。

    1. 在 venus 上開啟終端機主控台,然後以 root 身分登入。

    2. 在 venus 上,將 DRBD 服務升級為主要服務︰

      root # drbdadm primary
    3. 在 venus 上檢查 venus 是否為主要節點︰

      root # systemctl status drbd.service
    4. 在 venus 上建立掛接點,如 /srv/r0mount

      root # mkdir /srv/r0mount
    5. 在 venus 上掛接 DRBD 裝置︰

      root # mount -o rw /dev/drbd_r0 /srv/r0mount
    6. 驗證您在 jupiter 上建立的檔案是否存在︰

      root # ls /srv/r0

      此時應列出 /srv/r0mount/from_jupiter 檔案。

  3. 如果服務在兩個節點上都可執行,即表示 DRBD 設定已完成。

  4. 再次將 jupiter 設為主要節點。

    1. 在 venus 上輸入以下指令,卸下 venus 上的磁碟︰

      root # umount /srv/r0
    2. 在 venus 上輸入以下指令,將 venus 上的 DRBD 服務降級︰

      root # drbdadm secondary
    3. 在 jupiter 上,將 DRBD 服務升級為主要服務︰

      root # drbdadm primary
    4. 在 jupiter 上檢查 jupiter 是否為主要節點︰

      root # systemctl status drbd.service
  5. 若要讓服務在伺服器出現問題時自動啟動並容錯移轉,您可以使用 Pacemaker/Corosync 將 DRBD 設定為高可用性服務。如需關於如何安裝和設定 SUSE Linux Enterprise 12 的資訊,請參閱第 II 部分「組態與管理」

15.5 調整 DRBD

調整 DRBD 的方法有多種︰

  1. 使用外部磁碟儲存中繼資料。這可能會有所幫助,不過會降低維護方便性。

  2. 建立 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 時才有效。

  3. 透過 sysctl 變更接收和傳送緩衝區設定,以調整網路連接。

  4. 在 DRBD 組態中變更 max-buffers 和/或 max-epoch-size

  5. 根據您的 IO 模式增大 al-extents 值。

  6. 如果您有一個配備了 BBU (電池備份單元) 的硬體 RAID 控制器,設定 no-disk-flushesno-disk-barrier 和/或 no-md-flushes 可能會有所幫助。

  7. 根據工作負載啟用讀取平衡。請參閱 http://blogs.linbit.com/p/256/read-balancing/,以取得詳細資料。

15.6 DRBD 疑難排解

DRBD 設定涉及眾多不同的元件,因此導致問題發生的原因多種多樣。以下各節將介紹幾種常見的情況並提供了多種解決方案。

15.6.1 組態

如果初始的 DRBD 設定未依預期運作,則可能是由於組態有問題。

若要獲取有關組態的資訊,請執行下列步驟︰

  1. 開啟終端機主控台,然後以 root 身分登入。

  2. 執行 drbdadm (含 -d 選項),測試組態檔案。輸入下列指令︰

    root # drbdadm -d adjust r0

    adjust 選項的試執行 (dry run) 期間,drbdadm 會將 DRBD 資源的實際組態與 DRBD 組態檔案進行比較,但不會執行呼叫。檢閱輸出,以確定您瞭解所有錯誤的來源及原因。

  3. 如果檔案 /etc/drbd.d/*drbd.conf 中存在錯誤,請更正後再繼續。

  4. 如果分割區與設定均正確,請再次執行 drbdadm (不含 -d 選項)。

    root # drbdadm adjust r0

    此指令會將組態檔案套用於 DRBD 資源。

15.6.2 主機名稱

與核心中儲存的主機名稱相比 (請參閱 uname -n 輸出),DRBD 的主機名稱區分大小寫 (Node0 是不同於 node0 的主機)。

如果您擁有多個網路裝置,並希望使用專屬的網路裝置,主機名稱可能不會解析成所使用的 IP 位址。在這種情況下,可以使用參數 disable-ip-verification

15.6.3 TCP 埠 7788

如果您的系統無法連接至對等系統,可能是因為本地防火牆有問題。依預設,DRBD 使用 TCP 埠 7788 存取其他節點。請確定在兩個節點上均可存取此連接埠。

15.6.4 DRBD 裝置在重新開機後損毀

如果 DRBD 不知道存放最新資料的真實裝置,就會導致電腦分裂狀態。在這種情況下,各個 DRBD 子系統將會做為次要項目出現,並且不會相互連接。在這種情況下,可以在記錄資料中尋找以下訊息:

Split-Brain detected, dropping connection!

若要解決此問題,請在要丟棄資料的節點上輸入以下指令︰

root # drbdadm secondary r0 
root # drbdadm -- --discard-my-data connect r0

在含有最新資料的節點上,輸入以下指令︰

root # drbdadm connect r0

如此會將一個節點的資料覆寫為對等節點的資料,因此兩個節點上的檢視窗將會保持一致,從而使問題得到解決。

15.7 更多資訊

下列開放原始碼資源適用於 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 的最新宣告。

列印此頁面