1
2
3
4
5
<code>[root@drbd-master ~]</code><code># cat /proc/drbd</code>
<code>version: 8.3.15 (api:88</code><code>/proto</code><code>:86-97)</code>
<code>GIT-</code><code>hash</code><code>: 0ce4d235fc02b5c53c1c52c53433d11a694eab8c build by [email protected], 2013-09-15 17:06:03</code>
<code> </code><code>0: cs:Connected ro:Primary</code><code>/Secondary</code> <code>ds:UpToDate</code><code>/UpToDate</code> <code>C r-----</code>
<code> </code><code>ns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:0</code>
drbd 的狀态顯示,都可以從/proc/drbd中顯示出來;在監控它之前,先看看他常見的一些狀态;
第一行&第二行顯示的是drbd版本資訊和一些編譯資訊,重點在第三行:
cs(connection state) 連接配接狀态:(可以通過 drbdadm cstate <res> 檢視)
正常狀态的是: connected
其餘的均為不正常狀态,可能是瞬間變化的;
standalone :資源沒有連接配接(認證失敗或者腦裂)或者被手動斷開(drbdadm disconnect)
disconnect :認證失敗或者腦裂
disconnecting、unconnected、timeout、brokerpipe、networkfailure、protocolerror、 teardown(對等節點連接配接關閉) 都是臨時狀态,最終都會經過unconnected狀态最終轉變為 下面的 wfconnection(等待和對等節點建立網絡連接配接) 或者 wfreportparams(已建立好連接配接 正等待對等節點傳來第一個資料包)
StartingSyncs:完全同步,由admin發起的剛剛開始同步,下一步狀态為syncsource(以本節 點為同步源進行同步中)或者PausedSyncS(本地是一個持續同步源,由于可能另外一個同步 正在進行或者使用drbdadm pause-sync 暫停了同步)
WFBitmapS:部分同步剛剛開始,下一個狀态可能是syncsource或者pausedsyncs
WFBitmapT:部分同步剛剛開始,下一個是WFSyncUUID (同步即将開始)
SyncTarget:以本節點為同步目标進行同步
PausedSyncT:以本節點為持續同步目标,但由于另一個同步正在進行或者使 用 drbdadb pause-sync 暫停了同步
VerifyS:以本地節點為驗證源驗證線上的裝置
VerifyT:以本地節點為目标源驗證線上的裝置
第二個字段:ro 代表角色,無外乎三種, primary,secondary,unknown(這種角色一般在對等節點未連接配接的時候會出現)
第三個字段:ds,代表兩個節點的磁盤狀态,這個是很重要的;指令:drbdadm dstate <res>
正常情況下,兩端都是 uptodate/uptodate
其他的狀态,就需要修複啦:
Diskless ,本地沒有塊裝置配置設定給drbd使用,可能是drbdadm 操作造成或者底層IO錯誤出發了 disklesee操作
attaching:讀取中繼資料時候的狀态;
failed:本地磁盤報告IO錯誤,下一個狀态是diskless
Negotiating:在已連接配接的DRBD裝置上進行attach讀取中繼資料前的瞬間狀态
inconsistent:資料不一緻,多發生在第一次建立同步的時候;
outdated:資料一緻但已過時;
Dunknown:對等節點網絡暫時不可用
Consistent:這個狀态多發生在一個沒有連接配接的節點上,當建立連接配接後,它決定資料是uptodate或者是outdated
其實說了這麼多,drbd之是以有這麼多狀态,軟體作者已經很謹慎啦,判斷出多種狀态;
第四個字段(這個其實不怎麼重要的): 這個是最短的,也是最不好判斷的: 正常狀态是r----- 表示IO狀态,一共6個
1、IO suspension: r 表示運作, s表示suspended io 暫停狀态
2、Serial resyncchronization: 串行同步,資源等待同步時延遲了重新同步,此時狀态為A
3、Peer-initiated sync suspension:對等節點發起同步暫停,此時狀态為p
4、Local initiated sync suspension:本地發起同步暫停,此時狀态為u;
5、Locally blocked io, 可能的辨別是: d:印一個短暫的磁盤狀态導緻drbd 内部出現IO阻塞
b:備用裝置io阻塞; n:網絡socket 出現阻塞; a裝置的io和網絡同時阻塞
6、activity log update suspension 活動日志更新暫停,此時辨別為s
第五個字段可以說性能名額啦
ns nr 是相對應的,一個接受一個發送,機關都是KB
dw dr 是相對應的,寫入和讀取磁盤資料,機關都是KB
al (activity log):活動日志區的中繼資料更新
bm:(bit map) 位圖區中繼資料更新
lo:(local coutn) 本地計數,drbd 請求開放本地IO子系統的數量;
pe:Number of requests sent to the partner, but that have not yet been answered by the latter.
ua:Number
of requests received by the partner via the network connection, but that have not yet been answered.
ap:(application pending):資料塊IO請求到drbd,但drbd并為做出相應
ep:(epochs):一定數量的epoch,通常為1,使用阻礙或者沒有排序寫法時,會增加io負載;
wo:(write order 寫入順序)目前使用的方法:b(barrier 阻塞),f flush ,d drain n none
oos:(out of sync ) kB 同步
監控腳本,我偷個懶,不重複早輪子了,上個zabbix的 mpm的drbd 監控:
貼幾個核心代碼:
不過要提醒下zabbix 監控 drbd 需要的是root權限,各位當心,要不自己寫也可以,下面隻是個借鑒思路:
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<code>my</code> <code>@cmd</code> <code>= `which drbd-overview`;</code>
<code> </code><code>if</code> <code>( </code><code>@cmd</code> <code>== 0 ) {</code>
<code> </code><code>$rc</code> <code>= 2800;</code>
<code> </code><code>&FromDualMySQLagent::mylog</code><code>(</code><code>$main::gParameter</code><code>{</code><code>'LogFile'</code><code>}, ERR, </code><code>"drbd-overview does not exist (rc=$rc)."</code><code>);</code>
<code> </code><code>return</code> <code>$rc</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>chomp</code> <code>$cmd</code><code>[0];</code>
<code> </code><code>my</code> <code>@stdout</code> <code>= `</code><code>$cmd</code><code>[0]`;</code>
<code> </code><code>foreach</code> <code>( </code><code>@stdout</code> <code>) {</code>
<code> </code><code>chomp</code> <code>$_</code><code>;</code>
<code> </code><code>if</code> <code>( </code><code>$main::gParameter</code><code>{</code><code>'Debug'</code><code>} >= DBG ) {</code>
<code> </code><code>&FromDualMySQLagent::mylog</code><code>(</code><code>$main::gParameter</code><code>{</code><code>'LogFile'</code><code>}, DBG, </code><code>$_</code><code>);</code>
<code> </code><code>}</code>
<code> </code><code>if</code> <code>( </code><code>$_</code> <code>=~ /^\s+(\d+):(\w+)\s+(\w+)\s+(\w+\/\w+)\s+(\w+\/\w+)\s+(\w)/ ||</code>
<code> </code><code>$_</code> <code>=~ /^\s+(\d+):(\?\?not-found\?\?)\s+(\w+)\s+(\w+\/\w+)\s+(\w+\/\w+)\s+(\w)/ ) {</code>
<code> </code><code>push</code><code>(</code><code>@drbdDevices</code><code>, $1);</code>
<code> </code><code>$drbdData</code><code>[$1]{</code><code>'name'</code><code>} = $2;</code>
<code> </code><code>$drbdData</code><code>[$1]{</code><code>'cstate'</code><code>} = $3;</code>
<code> </code><code>$drbdData</code><code>[$1]{</code><code>'role'</code><code>} = $4;</code>
<code> </code><code>$drbdData</code><code>[$1]{</code><code>'dstate'</code><code>} = $5;</code>
<code> </code><code>$drbdData</code><code>[$1]{</code><code>'protocol'</code><code>} = $6;</code>
<code>。。。。。。。</code>
<code>my</code> <code>$file</code> <code>= </code><code>'/proc/drbd'</code><code>;</code>
<code> </code><code>if</code> <code>( ! -r </code><code>$file</code> <code>) {</code>
<code> </code><code>$rc</code> <code>= 2801;</code>
<code> </code><code>&FromDualMySQLagent::mylog</code><code>(</code><code>$main::gParameter</code><code>{</code><code>'LogFile'</code><code>}, ERR, </code><code>"Cannot read on $file (rc=$rc)."</code><code>);</code>
<code> </code><code>my</code> <code>@stdout</code> <code>= `cat </code><code>$file</code><code>`;</code>
<code> </code><code>$_</code><code>= </code><code>$stdout</code><code>[0];</code>
<code> </code><code>chomp</code><code>;</code>
<code> </code><code>$gVersion</code> <code>= </code><code>$_</code><code>;</code>
<code> </code><code>my</code> <code>$device</code><code>;</code>
<code> </code><code>for</code> <code>( </code><code>my</code> <code>$i</code> <code>= 1; </code><code>$i</code> <code>< </code><code>$#stdout</code><code>; </code><code>$i</code> <code>+= 2 ) {</code>
<code> </code><code># We are not intersted in 1st line because we got it already</code>
<code> </code><code># with the drbd-overview command</code>
<code> </code><code>$_</code> <code>= </code><code>$stdout</code><code>[</code><code>$i</code><code>+1];</code>
<code> </code><code>chomp</code><code>;</code>
<code> </code><code>if</code> <code>( </code><code>$_</code> <code>=~ /^\s+(\d+):/ ) {</code>
<code> </code><code>$device</code> <code>= $1;</code>
本文轉自 位鵬飛 51CTO部落格,原文連結:http://blog.51cto.com/weipengfei/1331408,如需轉載請自行聯系原作者