歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

DRBD原理及特性概述

Distributed Replicated Block Device(DRBD)是一個用軟件實現的、無共享的、服務器之間鏡像塊設備內容的存儲復制解決方案。其核心功能通過Linux的內核實現,比文件系統更加靠近操作系統內核及IO棧。DRBD是由內核模塊和相關腳本而構成,用以構建高可用性的集群。其實現方式是通過網絡來鏡像整個設備。你可以把它看作是一種網絡RAID。它允許用戶在遠程機器上建立一個本地塊設備的實時鏡像。

一、DRBD鏡像特性及其工作原理

1、特性

實時性: 當應用對磁盤的數據進行修改時,復制立即發生。
透明性: 應用程序的數據存儲在鏡像設備上是獨立和透明的,數據可存儲在不同的服務器上。
同步鏡像和異步鏡像:
a、同步鏡像,當本地發申請進行寫操作進行時,同步寫到兩台服務器上。
b、異步鏡像,當本地寫申請已經完成對本地的寫操作時,開始對對應的服務器進行寫操作。

2、原理圖

file system->buffer cache ->drbd->disk scheduler->disk drivers
DRBD原理圖

二、DRBD基礎特性

1、資源

DRBD主要是對磁盤資源的管控,因此在DRBD模塊中,資源是所有可復制移動存儲設備的總稱。
資源名: 
    資源名可以指定除了空格外 us-ascii 中的任意字符。
DRBD 設備: 
    DRBD 的虛擬塊設備。它有一個主設備號為 147 的設備,默認的它的次要號碼編從 0 開始。
    相關的塊設備需命名為/ dev/ drbdm,其中 M 是設備的次要號碼。
磁盤配置: 
    DRBD 內部應用需要本地數據副本,元數據。
網絡配置: 
    各個對等接點間需要進行數據通信。

2、資源角色

DRBD角色: primary<->secondary 
主:  在主 DRBD 設備中可以進行不受限制的讀和寫的操作。
    他可用來創建和掛載文件系統、初始化或者是直接 I/O 的快設備,等等。
備:  
    接收所有來自對等節點的更新,不能被應用也不能被讀寫訪問。主要目的是保持緩沖及數據一致性。
人工干預和管理程序的自動聚類算法都可以改變資源的角色。資源可以由被變換為主,以及主到備。

3、特性

支持復制傳輸數據完整性驗證(驗證算法:MD5、SHA-1、CRC-32C)

此特性針對在復制過程中由於網絡傳輸原因導致的數據不一致。 DRBD對每個
要復制的塊生成一個校驗和(摘要信息),用來對peer端數據進行完整性校驗,如果接收到的
塊的校驗和與source端的校驗和不一致,將會要求重傳。

resource 
net {
data-integrity-alg ;
}
...
}

支持在線設備驗證

如果我們不在傳輸過程中對數據進行校驗,我們仍然可以采用在線設備驗證的方
式,原理同上,我們可以采用定時任務周期性的對數據進行驗證。
默認情況下在線設備驗證是未啟用的,可以在配置文件/etc/drbd.conf添加。

resource 
net {
verify-alg ;
}
...
}

驗證命令: drbdadm verify 

磁盤IO錯誤處理策略

磁盤出現IO錯誤時候,我們應該采用何種策略呢? 
DRBD提供三種策略,分別是: detach 、 pass_on 、 call-local-io-error。
detach
    這是默認和推薦的選項。如果在節點上發生底層的磁盤 I/O 錯誤,它會將設備
    運行在 diskless 無盤模式下。所有的對節點的讀寫將會從對端節點進行,這種情況下雖然性能有所下降,
    但是仍然可以提供服務,很明顯在高可用的情況下,這個策略使我們的首選。
pass_on
    drbd 會將 I/O 錯誤報告到上層。在主節點上,它會將其報告給掛載的文件系統,
    但是在此節點上就往往忽略(因此此節點上沒有可以報告的上層)

local-io-error
    調用本地磁盤 I/O 處理程序中定義的命令。 這就需要有相應有讓 local-io-error
    調用的資源處理程序處理錯誤的命令。這就給管理員留有足夠自由的權力使用命令或者是腳
    本調用 local-io-error 處理 I/O 錯誤。

resource  {
disk {
on-io-error ;
...
}
...
}

過期數據處理策略

過期數據不是不一致性數據,只是說secondary不再與priamry同步數據了, secondary相當於是
一個snapshot,這時候如果發生切換,那麼可想而知,數據的一致性就會出現問題,我們需要通
過某些策略來防止這種情況的發生:當出現過期數據的時候, drbd的連接狀態將會由connect變為
Wfconnection,這時候Pacemaker不會允許過期數據的節點提升為primary

暫停復制

對於一些網絡狀態不好的情況,如果我們采用協議C進行復制,那麼數據復制延時將會很嚴重,
這時候我們可以采用暫停復制的策略,這樣當網絡狀況不好的時候, primary端將會暫停復制,
primary和secondary將會處於鏈式的不同步狀態,當帶寬變為可用的時候,復制將會繼續進行。

同步速率配置

可以根據網絡帶寬或網絡資源狀況配置同步速率以及使用臨時速率,可變速率等。
同步速率設置的超過網絡的最大可用帶寬也是沒有任何意義的。
請注意,同步的速率是 bytes 字節,而不是 bits/s。
resource 
disk {
sync-rate 40M;
...
}
...
}
根據經驗同步速率比較合理的是可用帶寬的 30%。
計算公式:   MIN(I/O子系統,網絡I/O)*0.3
假定一個 I/O 子系統能支持 180MB/s 的吞吐量, 而千兆網絡可支持 110MB/s,
此時網絡帶寬會成為瓶頸,可以計算出,同步速率:110*0.3=33MB/s

假定一個 I/O 子系統能支持 80MB/s 的吞吐量,而千兆網絡可支持 110MB/s,
此時磁盤I/O會成為瓶頸,可以計算出,同步速率:80*0.3=24MB/s

腦裂通知和自動恢復

split brain實際上是指在某種情況下,造成drbd的兩個節點斷開連接,都以primary的身份來運行。當drbd某primary節點連接對方節點准備發送信息的時候如果發現對方也是primary狀態,那麼會立刻自行斷開連接,並認定當前已經發生split brain了,這時候他會在系統日志中記錄以下信息:“Split-Brain detected,dropping connection!”當發生split brain之後,如果查看連接狀態,其中至少會有一個是StandAlone狀態,另外一個可能也是StandAlone(如果是同時發現split brain狀態),也有可能是WFConnection的狀態。

自動處理:
    a、 Discarding modifications made on the younger primary
        ---後切換成primary角色的節點數據將會被丟棄
    b、 Discarding modifications made on the older primary
        ---先切換成primary角色的節點數據將會被丟棄
    c、 Discarding modifications on the primary with fewer changes 
        --–哪個節點更改的數據少就丟棄
    d、 Graceful recovery from split brain if one host has had no intermediate changes
        ---如果有節點根本沒有更新數據,就直接恢復

drbd 腦裂主要在 net 配置,有以下關鍵字:
after-sb-0pri:裂腦已經被探測到,但是現在沒有節點處於主角色,對於這個選項, drbd 有以下關鍵字:
    disconnect:
        不需要自動恢復,僅僅是調用裂腦處理程序的腳本(如果配置了),斷開連接並出在斷開模式。
    discard-younger-primary:
        放棄和回滾最後成為主的上面所做的修改。
    discard-least-changes:
        放棄和回滾,變動比較少的主機上的修改。
    discard-zero-changes:
        如果任何節點都沒有發生任何變化,僅僅申請在一個節點上做出繼續修改即可。

after-sb-1pri:裂腦已經被探測到,現有有一個節點處於主角色,對於這個選項, drbd 有以下關鍵字:
disconnect:
    和 after-sb-0pri 一樣, 調用裂腦處理程序的腳本(如果配置了),斷開連接並出在斷開模式。
consensus:
    和 after-sb-0pri 中同樣的修復策略。 如果利用這些策略裂腦危害能選擇,那就能自動解決。 否則,同樣斷開指定的動作。
call-pri-lost-after-sb:
    和 after-sb-0pri 中同樣的修復策略。如果利用這些策略裂腦危害能選擇,就在受危害的節點上調用 
    pri-lost-after-sb 程序。這個程序必須確認在 handlers 中配置,並考慮到從集群中移除該節點。
discard-secondary:
    不管哪個主機只要處於次角色,都是裂腦的危害者。

after-sb-2pri:在兩個節點都處於主角色時,裂腦被發現。次選項使用和after-sb-1pri同樣的關鍵字,丟棄次節點並達成共識。

配置示例:
resource  {
handlers {
split-brain "/usr/lib/drbd/notify-split-brain.sh root" //可能是目前系統中一個可執行的文件。
...                                        //e.g. split-brain "/usr/lib/drbd/notify-split-brain.sh root";
}                                          //如上通過電子郵件的方式發送到指定的地址。
net {                                     
after-sb-0pri discard-zero-changes;        //腦裂的相關自動修復策略
after-sb-1pri discard-secondary;
after-sb-2pri disconnect;
...
}
...

手動處理
    首先在確定要作為secondary的節點上面切換成secondary並放棄該資源的數據
        drbdadm secondary 
        drbdadm connect --discard-my-data 
    在要作為primary的節點重新連接secondary(如果這個節點當前的連接狀態為WFConnection的話,可以省略)
        drbdadm connect 
    當作完這些動作之後,從新的primary到secondary的re-synchnorisation會自動開始。

三、DRBD的復制模式及復制協議

1、復制模式

單主模式:
在單主模式下, 任何資源在任何特定的時間,集群中只存在一個主節點。 正是因為這樣在集群中
只能有一個節點可以隨時操作數據,這種模式可用在任何的文件系統上( EXT3、 EXT4、 XFS等等)。

雙主模式:
在雙主模式下,任何資源在任何特定的時間,集群中都存在兩個主節點。猶豫雙方數據存在並發
的可能性,這種模式需要一個共享的集群文件系統,利用分布式的鎖機制進行管理,如 GFS 和
OCFS2。部署雙主模式時, DRBD 是負載均衡的集群,這就需要從兩個並發的主節點中選取一個首選的
訪問數據。這種模式默認是禁用的,如果要是用的話必須在配置文件中進行聲明。(DRBD8.0 之後支持)

2、復制協議

協議A: 
    數據一旦寫入磁盤並發送到網絡中就認為完成了寫入操作。
    在一個節點發生故障時,可能發生遠程節點上的數據可能仍在發送隊列導致數據丟失。
協議B: 
    收到接收確認就認為完成了寫入操作。
    數據丟失可能發生在參加的兩個節點同時故障的情況下。
協議C: 
    收到寫入確認就認為完成了寫入操作。無數據丟失,主流配置,I/O 吞吐量依賴於網絡帶寬。
Copyright © Linux教程網 All Rights Reserved