天天看點

DRBD--監控篇

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中顯示出來;在監控它之前,先看看他常見的一些狀态;

   第一行&amp;第二行顯示的是drbd版本資訊和一些編譯資訊,重點在第三行:

   cs(connection state) 連接配接狀态:(可以通過 drbdadm cstate &lt;res&gt; 檢視)

       正常狀态的是: 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 &lt;res&gt;

   正常情況下,兩端都是 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>&amp;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>} &gt;= DBG ) {</code>

<code>      </code><code>&amp;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>&amp;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>&lt; </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,如需轉載請自行聯系原作者