[root@drbd-master ~]# cat /proc/drbd version: 8.3.15 (api:88/proto:86-97) GIT-hash: 0ce4d235fc02b5c53c1c52c53433d11a694eab8c build by [email protected], 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; }