1.幾種獲取狀態信息的方法
drbd有很多獲取信息的方式。在drbd84和之前的版本,大多都使用cat /proc/drbd
來獲取信息,多數情況下,這個文件展示的信息對于管理和維護drbd來說已經足夠。
例如以下是drbd84上兩個volume的節點狀態信息:
[root@drbd1 ~]# cat /proc/drbd
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:220: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----ns:76408 nr:0 dw:76408 dr:3441 al:22 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:01: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----ns:4957732 nr:0 dw:76324 dr:4883249 al:29 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
但從drbd9開始,/proc/drbd文件已經廢棄了(其實從drbd84就已經廢棄了,只不過仍然能獲取信息),因為drbd9中添加了幾個新狀態信息,也修改了一些信息的顯示名稱,而這個文件并沒有"跟上腳步"。以下是drbd9中該文件展示的信息。
[root@drbd91 ~]# cat /proc/drbd
version: 9.0.9-1 (api:2/proto:86-112)
GIT-hash: f7b979e7af01813e031aac579140237640c94569 build by mockbuild@, 2017-09-14 17:45:45
Transports (api:16): tcp (9.0.9-1)
在drbd9中,更多的是使用drbdadm
或drbdsetup
來獲取節點的狀態信息。當然,在drbd84中也可以使用它們來獲取詳細的信息,只不過使用/proc/drbd既方便,又簡潔,多數人都直接更愿意使用/proc/drbd。
例如,使用drbdadm獲取節點的基本信息。
######### drbdadm status [--verbose] RESOURCE[root@drbd90 ~]# drbdadm status rs0
rs0 role:Primaryvolume:0 disk:UpToDatevolume:1 disk:UpToDatedrbd91.longshuai.com role:Secondaryvolume:0 replication:SyncSource peer-disk:Inconsistent done:0.43volume:1 replication:SyncSource peer-disk:Inconsistent done:23.72[root@drbd90 ~]# drbdadm status rs0 --verbose
drbdsetup status rs0
rs0 role:Primaryvolume:0 disk:UpToDatevolume:1 disk:UpToDatedrbd91.longshuai.com role:Secondaryvolume:0 replication:SyncSource peer-disk:Inconsistent done:7.04volume:1 replication:SyncSource peer-disk:Inconsistent done:48.44
使用drbdsetup獲取更詳細的信息:
######### drbdsetup status [--verbose] [--statistics] RESOURCE`[root@drbd90 ~]# drbdsetup status rs0 --verbose --statistics
rs0 node-id:0 role:Primary suspended:nowrite-ordering:flushvolume:0 minor:0 disk:UpToDatesize:4882432 read:537552 written:0 al-writes:0 bm-writes:0 upper-pending:0 lower-pending:0 al-suspended:no blocked:novolume:1 minor:1 disk:UpToDatesize:4882432 read:2811712 written:0 al-writes:0 bm-writes:0 upper-pending:0 lower-pending:0 al-suspended:no blocked:nodrbd91.longshuai.com node-id:1 connection:Connected role:Secondary congested:novolume:0 replication:SyncSource peer-disk:Inconsistent done:11.00 resync-suspended:noreceived:0 sent:537096 out-of-sync:4345336 pending:0 unacked:0volume:1 replication:SyncSource peer-disk:Inconsistent done:57.58 resync-suspended:noreceived:0 sent:2811256 out-of-sync:2071176 pending:0 unacked:0
除此之外,還可以使用drbd-overview
獲取一些簡單的信息。
[root@drbd91 ~]# drbd-overview
NOTE: drbd-overview will be deprecated soon.
Please consider using drbdtop.0:rs0/0 Connected(2*) Second/Primar UpToDa/UpToDa 1:rs0/1 Connected(2*) Second/Primar UpToDa/UpToDa
2.狀態
/proc/drbd文件中的狀態信息如下:
[root@drbd1 ~]# cat /proc/drbd
version: 8.4.10-1 (api:1/proto:86-101)
GIT-hash: a4d5de01fffd7e4cde48a080e2c686f9e8cebf4c build by mockbuild@, 2017-09-15 14:23:220: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----ns:76408 nr:0 dw:76408 dr:3441 al:22 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
其中第三行中:
0
是drbd的次設備號(minor),表示該行是/dev/drbd0資源的信息。cs
是connect state,即節點的連接狀態。ro
是roles,即節點的角色狀態。ds
是disk state,即磁盤的狀態,也即drbd底層設備的狀態。C
是drbd的復制協議,即A、B、C協議。r-----
是IO標記,反應的是該資源的IO狀態信息。共有6種IO狀態標記符號。
第四行是drbd同步過程中的狀態,總體概括為"性能指標"。
以下翻譯自官方手冊: users-guide-8.4 和 users-guide-9.0 。如果有疑問,可從官方手冊自行查找答案。
2.1 連接狀態(connect state,cs)和復制狀態
節點間通過TCP連接進行通信,在建立連接、斷開連接、特殊情況下有很多種連接狀態。
建立TCP連接后,還有稱為"DRBD"的連接。DRBD連接建立完成,表示元數據區、數據區等一切都已準備好,可以進行任何數據同步的操作。
節點間的連接狀態既可以從/proc/drbd文件中獲取,也可以使用下面的命令來獲取。
[root@drbd91 ~]# drbdadm cstate rs0
Connected
drbd84中,將連接狀態和復制狀態全部都歸類為連接狀態。但在drbd9中,由于可以通過net指令定義多個drbd節點,它更網絡對端和volume的概念。因此它將和連接關系不大的狀態獨立劃分為"復制狀態(replication)"中,例如同步、驗證相關的狀態。本文就懶得去區分它們了,都放在一起解釋吧。
有以下幾種連接狀態,其中最常捕獲到的狀態已經加粗顯示。
WFConnection
:當前節點正在等待對端節點出現。例如對方節點drbdadm down
后,本節點將處于本狀態。StandAlone
:無連接。出現這種狀態可能是因為:未連接過、使用drbdadm disconnect
斷開連接、節點由于身份驗證的原因未成功加入drbd集群使得連接被刪除、腦裂后斷開連接。Disconnecting
:斷開連接的一個臨時過渡狀態。它很快就會切入下一狀態就是StandAlone。Unconnected
:嘗試再次發起TCP連接時的一個臨時連接狀態(是連接超時后再次發送連接請求產生的狀態),它的下一個狀態可能是WFConnection,也可能是WFReportParams。Timeout
:和對端通信超時時的臨時狀態。下一個狀態就是Unconnection。BrokenPipe
:和對端連接丟失時的臨時狀態。下一個狀態是Unconnection。NetworkFailure
:和對端連接丟失時的臨時狀態。下一個狀態是Unconnection。(沒錯,和上面的一樣)ProtocolError
:和對端連接丟失時的臨時狀態。下一個狀態是Unconnection。(沒錯,還是和上面的一樣)TearDown
:對端關閉TCP連接時的臨時狀態。下一個狀態是Unconnection。Connected
:DRBD連接已經建立完成,數據鏡像已經激活成功。這個狀態是drbd正常運行時的狀態。WFReportParams
:TCP連接已經建立完成,該節點正在等待對端的第一個數據包。StartingSyncS
:全盤數據同步中。只有在初始化時才應該全盤同步。下一個狀態是:SyncSource或PauseSyncS。StartingSyncT
:全盤數據同步中。只有在初始化時才應該全盤同步。下一個狀態是:WFSyncUUID。WFBitMapS
:部分數據正在同步。下一個狀態是:SyncSource或PauseSyncS。WFBitMapT
:部分數據正在同步。下一個狀態是:WFSyncUUID。WFSyncUUID
:同步馬上就要開始了。下一個狀態:SyncTarget或PauseSyncT。SyncSource
:正在同步,且本節點是數據同步的源端。SyncTartget
:正在同步,且本節點是數據同步的目標端。PauseSyncS
:本節點是同步的源端節點,但同步過程當前被暫停。出現這種狀態的原因可能是當前同步進程依賴于另一個同步進程完成,或者使用drbdadm pause-sync
手動中斷了同步操作。PauseSyncT
:本節點是同步的目標端,但同步過程當前被暫停。出現這種狀態的原因可能是當前同步進程依賴于另一個同步進程完成,或者使用drbdadm pause-sync
手動中斷了同步操作。VerifyS
:正在進行在線設備驗證,且本節點將成為驗證的源端。VerifyT
:正在進行在線設備驗證,且本節點將成為驗證的目標端。
在drbd9中,WFConnection狀態改為connecting狀態。刪除了WFReportParams狀態。添加了以下幾個同步相關的狀態:
Off
:該卷組還未同步,因為連接未建立。Established
:所有對該卷組的寫操作已經在線完成同步。這是drbd正常運行時的狀態。Ahead
:數據同步操作被掛起,因為網絡套接字中達到了一定的堵塞程度,無法應付更多的負載。該狀態需要配置"on-congestion"選項來啟用。Behind
:對端將數據同步操作掛起,因為網絡套接字中達到了一定的堵塞程度,無法應付更多的負載。該狀態需要在對端節點上配置"on-congestion"選項來啟用。
2.2 角色狀態(roles,ro)
資源的角色狀態既可以從/proc/drbd文件中獲取,也可以使用下面的命令來獲取。
[root@drbd1 ~]# drbdadm role data1
Primary/Unknown
Primary/Unknown
在角色狀態信息中,本地節點總是標記在第一位,遠程節點標記在結尾。
可能的節點角色狀態有:
Primary
:資源的primary角色,該角色狀態下的drbd設備可以進行掛載、讀、寫等。在沒有啟用多主復制模型(dual-primary mode),只能有一個primary節點。Secondary
:資源的secondary角色。該角色狀態下的drbd設備會接收來自primary端的數據更新(除非和對端不是primary)。且該角色的drbd設備不可掛載、不可讀、不可寫。Unknown
:資源的角色未知。本地節點的角色狀態絕對不可能會是這種狀態。只有對端節點斷開連接時對端節點才處于Unknown狀態。
2.3 磁盤狀態(disk state,ds)
磁盤的狀態既可以從/proc/drbd文件中獲取,也可以使用下面的命令來獲取。
# drbdadm dstate <resource>
UpToDate/UpToDate
在磁盤狀態信息中,本地節點的磁盤狀態總是標記在第一位,遠程節點標記在結尾。這兩端節點的狀態信息都可能為以下值:
Diskless
:沒有為DRBD驅動分配底層塊設備。這意味著資源可能從沒有和它的底層塊設備進行關聯綁定(attach),也可能是手動detach解除了關聯,還可能是出現了底層IO錯誤時自動detach。Attaching
:讀取元數據時的一個短暫的狀態。Failed
:本地塊設備故障時的一個短暫的狀態,下一個狀態是:Diskless。Negotiating
:在已連接的DRBD設備上還要進行Attach時的一個短暫的狀態。Inconsistent
:數據不一致。在雙方節點(還未進行全盤同步之前)剛創建新的資源時會立即進入此狀態。在某一端(目標段)正接收同步數據時,也會進入不一致狀態。Outdated
:資源的數據是一致的,但是數據過期了。(例如,已經同步后secondary下線了,之后又上線了,在還沒開始重新同步的時候就是Outdated狀態)DUnknown
:用于標識對端節點沒有連接時的磁盤狀態。Consistent
:連接斷開時的數據處于一致性狀態,當連接建立后,將決定數據是UpToDate還是Outdated狀態。UpToDate
:資源的數據是一致的,且數據是最新的。這是drbd數據正常時的狀態。
2.4 IO狀態標記
IO狀態標記表示的是當前資源的IO操作狀態。共有6種狀態:
IO掛起
:r或s都可能表示IO掛起,一般是r。r=running,s=suspended。串行重新同步
:資源正在等待進行重新同步,但被resync-after
選項延遲了同步進度。該狀態標記為"a",通常該狀態欄應該處于"-"。對端初始化同步掛起
:資源正在等待進行重新同步,但對端節點因為某些原因而IO掛起。該狀態標記為"p",通常該狀態欄應該處于"-"。本地初始化同步掛起
:資源正在等待進行重新同步,但本節點因為某些原因而IO掛起。該狀態標記為"u",通常該狀態欄應該處于"-"。本地IO阻塞
:通常該狀態欄應該處于"-"。可能有以下幾種標記:d
:因為DRBD內部原因導致的IO阻塞。b
:后端設備正處于IO阻塞。n
:網絡套接字阻塞。a
:網絡套接字和后端塊設備同時處于阻塞狀態。
Activity Log更新掛起
:當al更新被掛起時,處于該狀態,標記為"s",通常該狀態欄應該處于"-"。(如果不知道什么是Active Log,請無視本標記)
2.5 性能指標
主要是一些計數器和計量器的值。
請結合drbd原理圖進行理解:
drbd84中使用縮寫符號來標記性能指標,而drbd9中使用全稱來表示。例如drbd84中的ns和drbd9中的send是同一個意思。
ns/send (network send)
:通過網絡連接發送給對端的數據量,單位為Kb。nr/receive (network receive)
:通過網絡連接接收到對端發送來的數據量,單位為Kb。dw/written (disk write)
:該卷(volume)寫入本地磁盤的數據量,單位為Kb。dr/read (disk read)
:該卷(volume)從本地磁盤讀取的數據量,單位為Kb。al/al-writes (activity log)
:元數據區中al更新的次數。bm/bm-writes (bit map)
:元數據區中bitmap更新的次數。lo/lower-pending (local count)
:DRBD發起的打開本地IO子系統的請求次數。pe/pending (pending)
:本地發送給對端但卻沒有回復的次數。ua/unacked (unacknowledged)
:接收到對端發送的請求但卻沒有給予回復的請求數量。ap/upper-pending (application pending)
:轉發給DRBD的IO塊的請求,但DRBD還沒給予回復的請求數量。ep (epochs)
:epoch對象的數量。通常為1。drbd9中沒有該指標。wo/write-ordering (write order)
:當前正在使用的write order方法:b(barrier), f(flush), d(drain)或n(none)。oos/out-of-sync (out of sync)
:當前不同步的數據量,單位為Kb。
上面所有"未給予回復"的指標數量都表示動作還未完成,需要回復后才表示操作完成。這些未回復數值不能太大。
此外,drbd9中添加了以下幾個指標:
resync-suspended
:重新同步操作當前是否被掛起。可能的值為no/user/peer/dependency。blocked
:本地IO的擁擠情況。no
:本地IO不擁擠。upper
:DRBD層之上的IO被阻塞。例如到文件系統上的IO阻塞。可能有以下幾種原因:- 管理員使用
drbdadm suspend-io
命令掛起了IO操作。 - 短暫的IO阻塞,例如attach/detach導致的。
- 刪除了緩沖區。
- bitmap的IO等待。
- 管理員使用
lower
:底層設備處于擁擠狀態。