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

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;
    }