線上服務的主機發生異常狀況時,備援節點主機必須立即啟動替代,才能夠讓服務不致中斷,並且要即時保持各個節點主機資料同步,確保在取代服務時,資料依然是最新的。對此,本文將介紹一套頗富盛名的資料同步軟體DRBD,並實際操作示範。
對於系統管理者而言,相信建置一個高可用性(High Availability)的系統,並且能夠全天候24小時無休地運作,是追求的主要目標之一。為了完成高可用性的目標,通常會建構叢集(Cluster)架構,建立一群服務主機(又稱為「節點」),並利用架構中未參與線上服務的主機,為線上服務主機建立備援系統(以下簡稱為「備援節點」)。
當線上服務的主機發生異常狀況的時候,備援節點主機就能夠立即啟動,來取代線上主機的服務,讓服務不致於被中斷。
為了能夠無縫接軌地取代線上服務,必須即時保持叢集架構中各個節點主機資料的同步,以確保備援節點在取代服務時,其資料依然是最新的狀態,本文將介紹Linux系統下一套頗富盛名的資料同步軟體DRBD(Distributed Replicated Block Device),將區塊裝置的內容同步至異地主機上,其官方網址為「https://www.drbd.org/」。
在此,先簡單說明Linux系統中的區塊裝置。區塊裝置泛指磁碟(Disk)存取系統,系統會藉由區塊裝置檔案目錄(位於「/dev/」,圖1所示為存取硬碟的區塊裝置檔案)來存取相關的磁碟裝置。
在叢集架構中,即可利用DRBD軟體將線上服務主機的異動資料,透過網路傳輸的方式,即時地將所有資料異動到其他的備援節點,來同步叢集架構中各個節點的資料。
什麼是DRBD
為了保障資料的安全或增進資料讀寫的效率,通常會在敏感的系統上建置磁碟陣列(Redundant Array of Independent Disks,RAID),利用虛擬化儲存技術,將多個磁碟組合成硬碟陣列組,來提升磁碟存取的效能或建立容錯的磁碟陣列,其中最常見的應用方式是RAID-1功能。
RAID-1磁碟陣列會將資料儲存至不同的磁碟,這樣一來,即使其中某個磁碟發生問題,也能將資料安全地回復。但是,RAID-1架構僅能侷限在同地的同一台主機上。在實務上,經常需要RAID-1功能,但若希望能夠將資料同步至異地的主機,便可採用DRBD技術來完成具有異地同步資料的RAID-1功能。
簡單來說,DRBD就是網路型的RAID-1技術,可利用網路即時地將區塊級別(例如硬碟或分割區)的資料同步至遠端的主機。接下來,說明DRBD的主要功能。
即時資料同步功能
當應用程式更動磁碟內的資料後,所更動的資料將持續地將資料同步至異地的主機磁碟,而這一切的過程,對應用程式來說都沒有任何的影響,也就是說,應用程式並不需要做任何的調整。
DRBD相關名詞介紹
為了因應不同的作業環境,DRBD提供了三種不同的資料同步協定,在介紹之前,先簡單說明與DRBD有關的名詞。
表示要被備份的主機磁碟,使用者可操作此節點的資料。任何在此節點上的資料變動,均會即時地以網路的方式同步至從節點。
表示備份資料的目的地,此節點並不能直接操作資料,而是被動地接收主節點所傳遞的資料。
在DRBD的架構中,會將系統上所有的硬體視為資源(最常見的是磁碟),DRBD就是利用網路將相關資源的內容同步至從節點。
角色(Role)即表示為主節點或是從節點。
三種資料同步協定
簡單介紹過DRBD的相關名詞後,接著說明DRBD所提供的三種資料同步協定。
Protocol A是非同步(Asynchronous)的資料同步協定。當主節點在寫入資料完成後,資料尚在主節點主機上預備以網路送至從節點時,就會被認定已完成同步作業。在此情況下,如果主節點在送出資料之前就發生異常,將會導致從節點無法接收到資料,因而造成雙方節點的資料不一致。
Protocol B又稱為記憶體同步,屬於一種半同步(Semi-synchronous)的資料同步協定,與Protocol A最大的不同,在於主節點的資料已寫入資料並發送至從節點後(此時該資料尚未寫入從節點的磁碟,而是還暫時儲存在從節點的記憶體內),即認定已完成資料同步作業。在此情況下,除非在從節點尚未將資料寫入磁碟前,發生斷電現象而導致儲存在記憶體中的資料遺失,導致無法正常寫入到磁碟,否則應該不會發生雙方節點資料不一致的情況。
Protocol C為同步(Synchronous)的資料同步協定,是最嚴謹的協定。在此協定中,須等到從節點所接收到的資料實際寫入到磁碟後,才會認定資料同步作業完成。此為DRBD最常用的協定,也是本文所要採用的協定。
單主節點模式與雙主節點模式
在系統實作架構上,DRBD提供了單主節點模式與雙主節點模式。
單主節點模式指的是,在任何時間內,僅有一個單主節點模式的節點操作資料,並會將相關的資料以網路同步到異地的從節點,亦即一般所認知的主從式架構。
而雙主模式的架構,代表使用者可從主節點與從節點同時操作資料,此種架構可有效地增進資料的存取效率,通常可運用在平行處理資料的存取。在本文中,將實作單一主節點模式的架構並模擬主節點發生異常後,如何啟動從節點來回復資料。
安裝DRBD
在此以CentOS 7作業系統並採取RPM套件安裝的方式做示範,由於DRBD並未被收錄在標準的RPM庫(Repository),因此必須先安裝ELRepo(Extra Packages for Enterprise Linux)套件,這是額外提供的RPM庫,大部分的檔案系統或顯示卡的驅動程式會被收錄在此類的RPM庫中。
DRBD套件就是被收錄在這個RPM庫內,因此必須透過此RPM庫來安裝DRBD。可使用下列的指令來安裝ELRepo:
rpm --import https://www.elrepo. org/RPM-GPG-KEY-elrepo.org rpm -Uvh http://www.elrepo.org/ elrepo-release-7.0-3.el7.elrepo. noarch.rpm
接著,再安裝相關系統核心RPM,執行如下指令:
yum -y install kernel-devel kernel kernel-headers
最後,繼續執行以下指令來安裝DRBD:
yum -y install drbd90-utils kmod- drbd90
DRBD應用程式介紹
安裝完成之後,DRBD將提供一個名為「drbd」的核心模組程式以及管理應用程式,以下先說明其常用的相關應用程式。
drbdadm是drbd主要的應用程式,使用者可利用此程式來新建資源或設定角色(例如Primary或Secondary),其使用語法如下(其中參數選項並非必要參數):
drbdadm [參數選項] 命令參數 資源名稱
以下將僅介紹常用的命令參數,並分別加以說明:
連線系統上的硬體至DRBD資源,例如連接硬碟至資源。
斷線DRBD資源上已連線的系統硬體。
設定DRBD資源連線至網路上。
將DRBD資源的網路功能斷線。
設定連線系統的硬體至DRBD的資源並將該資源連線至網路,亦即執行attach和connect功能。
將DRBD資源的網路功能斷線,並斷線該DRBD資源上已連線的系統硬體,亦即執行detach和disconnect功能。
表示設定DRBD資源所在的主機角色為主節點。
表示設定DRBD資源所在的主機角色為從節點。
檢查節點目前角色的資訊,相關角色資訊說明如下:
Primary:表示為主節點角色,可在此節點上進行檔案的讀取與寫入操作。
Secondary:表示為從節點角色,不能直接在此節點上進行檔案的讀取與寫入操作,僅能被動地從主節點上取得資料。
Unknown:表示無法確認節點的角色,此訊息通常代表異常。
此參數用來顯示資源的連接狀態,例如「drbdadmin cstate drbd0」為顯示drbd0資源的連接狀態。執行完畢,將回覆資源連接的相關狀態,常見的連接狀態如下所述:
Connected:此為正常運作的狀態,表示已進入連接狀態並且啟用了資料同步的功能,在此狀態下,任何在主節點上的資源內容若有任何異動,均會透過網路同步至從節點。
Unconnected:這是一種臨時的狀態,表示資源正在嘗試進行連接。
Disconnecting:這是一種臨時的狀態,表示資源正在失去連接。
StandAlone:表示沒有可用來同步資料的網路,此狀態通常發生在管理者手動使用drbdadmin disconnect指令中斷連接狀態後。
TimeOut:表示嘗試進行資源連接的時間已經逾時。
顯示磁碟狀態的資訊,例如「drbdadmin dstate drbd0」可顯示drbd0資源的磁碟狀態。常見的磁碟狀態,以下將分別說明:
uptodate:表示各個節點的資料為最新且為一致的狀態,此為正常的狀態。
outdated:表示資料已經是過期的狀態,如果出現此狀態,代表資料同步可能出現問題,而需要手動來處理資料同步的問題。
DUknown:表示磁碟處於不明確的狀態。
Diskless:表示無磁碟狀態,此種狀態顯示該DRBD資源並沒有被附加上系統硬體,通常發生在資源沒有或未成功Attach系統硬體。
Consistent:表示在沒有連接時,資料是一致的狀態
Inconsistent:表示同步資料不一致的狀態,此狀態最常見的原因為drbd資源剛建立新的資源後,且在進行初始化同步作業完成之前,會先以此狀態表示。
新建並初始化DRBD資源,在首次資源上線應用之前,必須先執行此指令。
用來即時監控DRBD資源的狀態,使用者可利用此程式來監控資源上的網路狀態以及相關使用狀態等資訊。
相關組態檔設定
在簡單的說明DRBD應用程式的用法後,接下來介紹相關組態檔的設定。基本上,DRBD可設定「/etc/drbd.d/global_common.conf」(此為一般設定)及設定「/etc/drbd.d/」目錄下副檔名為.res的組態檔(此為設定資源相關資訊的檔案),組態檔採用區段格式來設定,其檔案格式如下:
主區段名稱
{
參數名稱
子區段名稱
{
參數設定
}
}
例如,類似以下的設定內容:
global {
usage-count no;
}
其常用的區段名稱,分別說明如下:
在此區段中通常會設定可共同使用的參數設定,以下是常用的設定:
disable-ip-verification:在預設的情況下,DRBD會檢查主機名稱與IP位址是否匹配。如果不想使用此項檢查,可利用此參數取消相關檢查。
usage-count [yes|no]:DRBD提供一個使用DRBD軟體的統計網站,網址為「http://usage.drbd.org」,此參數即為設定是否要參加此統計。
resource是DRBD主要的區段設定,在此區段中通常會設定系統內資源的相關資訊,最常見的是設定系統內磁碟區的相關設定,其設定語法如下所示(其中#為註解):
resource 資源名稱
{
on 節點名稱 #設定節點的資訊
{
參數設定
}
}
而其常用的設定,如下所述:
disk:設定此節點所掛載之系統磁碟區的位置,例如「/dev/sda1」。
device:設定此節點所要使用之裝置檔案的位置,例如「/dev/sda1」。
address:設定此節點之IP和通訊埠的資訊,例如「192.168.1.10:7979」。
resync-rate:設定節點在資料同步時所使用的速率資訊。
除了設定資源的資訊外,也會在此區段中設定Startup的區段以指定資源啟動時的相關行為,例如設定wfc-timeout參數來指定連線資料的逾時時間,單位為秒。
在此區段設定中,通常會設定相關共用的選項,其中最常用的設定為net區段,基本上會在此區段中設定所要使用的資料同步協定,例如Protocol C。
開始系統實作
接著,實作「單主節點模式」的DRBD架構,並說明如何在主節點發生異常後,由從節點來回復資料。
本次的系統相關架構如圖2所示,其中主節點主機名稱為node1且IP為192.168.198.150,而從節點主機名稱為node2且IP為192.168.198.151。
這裡想要同步node1節點之sda3磁碟分割區的資料,至node2節點上的sda3分割區,因此在實作之前,要先確認兩個節點之欲同步分割區容量是否相同。
可利用「fdisk -l」指令來查看系統分割區,並確認兩個節點上的sda3分割區容量是否相同,如圖3所示為兩個節點的分割區資訊。
由於DRBD預設是利用解析主機名稱的方式來取得節點的IP,因此先在兩個節點的「/etc/hosts」加上主機名稱與IP資訊的相關對應資訊,相關設定如圖4所示。
然後,繼續在兩個節點新增區塊設備裝置檔案來操作DRBD資源。同樣地,在兩個節點上執行下列指令來新增名稱為「drbd0」的裝置檔案:
mknod /dev/drbd0 b 147 0
在系統相關設定完成後,接下來可以先設定相關DRBD的組態檔內容。首先,在兩個節點上設定「/etc/drbd.d/global_common.conf」,設定內容如圖5所示,表示將要使用Protocol C的資料同步方式。
設定好「/etc/drbd.d/global_common.conf」之後,同樣地在兩個節點上新增資源檔案,檔名為「/etc/drbd.d/drbd0.res」,其內容如圖6所示,表示設定資源名稱為「drbd0」,並設定相關節點的IP及通訊埠資訊。
組態檔案設定完畢,繼續在兩個節點上執行「modprobe drbd」,以載入drbd的核心模組。載入模組後,利用「lsmod | grep drbd」指令來查看是否有載入成功,如圖7所示。
在成功載入drbd模組後,由於將會使用區塊裝置檔案「/dev/drbd0」來操作drbd的資源,因此要先確認兩個節點上是否有「/dev/drbd0」檔案,如果沒有,就利用「mknod /dev/drbd0 b 147 0」指令來新建區塊裝置檔案。
建立區塊裝置檔案成功後,接著同樣在兩個節點上執行「drbdadm create-md drbd0」指令來新建並初始化名稱為「drbd0」的資源。在初始化完成後,便可在兩個節點上啟動drbd服務,立即執行「systemctl start drbd」指令來啟動drbd服務。
由於drbd預設會使用通訊埠7789進行服務,因此在成功啟動服務後,即可在兩個節點上執行「netstat -anpt | grep LIS」指令,檢查是否有網路服務在通訊埠7789服務,如圖8所示,顯示node1與node2節點已經建立連接。
成功啟動drbd服務後,接下來設定兩個節點的角色。首先,設定node1節點的角色為Primary,在node1節點上執行下列指令:
drbdadm up drbd0 #啟動drbd0資源連線 drbdadm primary drbd0 #設定角色為 primary
設定角色成功後,接著利用「drbdadm role drbd0」指令檢查node1目前的角色。對node1而言,此時應該回覆的資訊為Primary,表示node1目前為主節點的角色。然後,在node2節點上執行下列指令來啟用資源:
drbdadm up drbd0
同樣地,以「drbdadm primary drbd0」指令來檢查node2的角色資訊,此時應該回覆為Secondary,表示node1目前為從節點。
實作至此步驟,雙方節點應該已連線並完成資料同步的準備,接著可在兩個節點上執行「drbdadm cstate drbd0」指令來檢查資源連線狀態,如果一切順利,應可發現兩個節點所回覆的訊息均為Connected,表示已正常連線了。
緊接著,可利用在主節點(node1)上新增一個檔案(假設檔名為drbdtest1),而後模擬node1節點系統損壞,由node2節點來接手。藉由查看node2節點上的檔案系統是否有drbdtest1檔案,來確認資料同步作業是否有正常地進行。
一開始,在node1先將drbd0掛載至「/mnt」目錄,相關指令如下:
mount /dev/drbd0 /mnt #掛載drbd0 裝置至/mnt目錄 echo "hello world 1" > /mnt/drbdtest1 #在drbd0裝置上新增檔名為drbdtest1的檔案 umount /mnt #卸載drbd0裝置
此時,drbdtest1檔案應該已透過網路同步至從節點(node2)上。接著,假設node1節點出現異常,因此要轉由node2節點服務。此時必須先將node1節點降級為Secondary角色,並將node2節點升級為Primary角色。再藉由查看node2節點上是否有drbdtest1檔案,來驗證DRBD是不是已正常地進行資料同步的作業。
首先,在node1節點上執行「drbdadm secondary drbd0」指令,將node1節點轉換為Secondary角色。接著,再到node2節點上執行「drbdadm primary drbd0」指令,將node2節點轉換為Primary角色。此時,node2已升級成Primary角色。
最後,在node2節點上同樣以下列指令來確認node2節點是否有drbdtest1檔案,執行結果如圖9所示:
mount /dev/drbd0 /mnt ls /mnt umont /mnt
如果發現drbdtest1檔案,就表示實作DRBD的資料同步功能已經成功。
<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>