博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
DRBD--监控篇
阅读量:7052 次
发布时间:2019-06-28

本文共 4161 字,大约阅读时间需要 13 分钟。

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,如需转载请自行联系原作者

你可能感兴趣的文章
谁来为程序猿的996买单?
查看>>
面试题(6)
查看>>
2017-07-07
查看>>
EasyUI介绍
查看>>
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
查看>>
微信相册
查看>>
java验证码/servlet
查看>>
1:spring mvc 概述
查看>>
Java 打包成 exe 文件
查看>>
go开发环境goclipse的安装
查看>>
Android NDK学习(2)使用cygwin生成.so库文件
查看>>
android使用notifyDataSetChanged()方法,listview数据没有更新
查看>>
MySQL中group_concat函数
查看>>
linux 学习笔记--磁盘管理
查看>>
SmartAuditor播放器不能搜索
查看>>
Weblogic10.3.6 for solaris10 x64安装
查看>>
eval解析JSON对象中的注意点
查看>>
为何有着良好设计的系统代码反而不容易看懂?
查看>>
Windows下Apache以FastCGI模式运行PHP
查看>>
Linux下无线网卡的安装
查看>>