DRBD--监控篇

简介:

1
2
3
4
5
[root@drbd-master ~] # cat /proc/drbd
version: 8.3.15 (api:88 /proto :86-97)
GIT- hash : 0ce4d235fc02b5c53c1c52c53433d11a694eab8c build by root@localhost.localdomain, 2013-09-15 17:06:03
  0: cs:Connected ro:Primary /Secondary  ds:UpToDate /UpToDate  C r-----
     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


   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权限,各位当心,要不自己写也可以,下面只是个借鉴思路:

1
2
3
4
5
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
my  @cmd  = `which drbd-overview`;
   if  @cmd  == 0 ) {
     $rc  = 2800;
     &FromDualMySQLagent::mylog ( $main::gParameter { 'LogFile' }, ERR,  "drbd-overview does not exist (rc=$rc)." );
     return  $rc ;
   }
   chomp  $cmd [0];
   my  @stdout  = ` $cmd [0]`;
   foreach  @stdout  ) {
     chomp  $_ ;
     if  $main::gParameter { 'Debug' } >= DBG ) {
       &FromDualMySQLagent::mylog ( $main::gParameter { 'LogFile' }, DBG,  $_ );
     }
     if  $_  =~ /^\s+(\d+):(\w+)\s+(\w+)\s+(\w+\/\w+)\s+(\w+\/\w+)\s+(\w)/ ||
          $_  =~ /^\s+(\d+):(\?\?not-found\?\?)\s+(\w+)\s+(\w+\/\w+)\s+(\w+\/\w+)\s+(\w)/ ) {
       push ( @drbdDevices , $1);
       $drbdData [$1]{ 'name' } = $2;
       $drbdData [$1]{ 'cstate' } = $3;
       $drbdData [$1]{ 'role' } = $4;
       $drbdData [$1]{ 'dstate' } = $5;
       $drbdData [$1]{ 'protocol' } = $6;
。。。。。。。
my  $file  '/proc/drbd' ;
   if  ( ! -r  $file  ) {
     $rc  = 2801;
     &FromDualMySQLagent::mylog ( $main::gParameter { 'LogFile' }, ERR,  "Cannot read on $file (rc=$rc)." );
     return  $rc ;
   }
   my  @stdout  = `cat  $file `;
   $_ $stdout [0];
   chomp ;
   $gVersion  $_ ;
   my  $device ;
   for  my  $i  = 1;  $i  $#stdout $i  += 2 ) {
     # We are not intersted in 1st line because we got it already
     # with the drbd-overview command
     $_  $stdout [ $i +1];
     chomp ;
     if  $_  =~ /^\s+(\d+):/ ) {
       $device  = $1;
     }






本文转自 位鹏飞 51CTO博客,原文链接:http://blog.51cto.com/weipengfei/1331408,如需转载请自行联系原作者

目录
相关文章
|
API
DRBD常用管理篇
      在DRBD进入使用阶段之后,要经常查看它的工作状态,通过这些状态来判断DRBD运行情况。 1) 使用drbd-overview命令观察状态      最为简便的方式就是运行drbd-overview命令 # drb...
1409 0