1.
引言
我们的系统一旦上线跑起来我们自然希望它一直相安无事,不要宕机,不要无响应,不要慢腾腾的。但是这不是打开机器电源然后放任不管就可以得到的(如果你就是这种情景,说明你人品太好了)。所以我们要监视系统的运行状况,发现问题及时处理。
要做到系统的监控,大的方向有几种方法:
1)派人盯着
2)自己写个脚本进行监视
3)使用已有的监控软件
关于第1种方法请不要笑话。在业务的关键时点可能需要安排人员守在旁边,万一发生问题可以及时处理,数据库服务公司还为此开展一项专门的业务,叫"DBA值守"。不过DBA一般也不会蛮干,也会使用第2种和第3种方法。
第2种方法适用面较窄,且有重复发明轮子的嫌疑。
所以下面我们来讨论第3种方法(相信有人已经烦了要扔鸡蛋了。好吧,我承认写下前两种方法纯粹为了娱乐)。
2. 概述
先概括一下需求吧。系统的监控,无非是下面几个任务。
1)监视服务的中断
监视服务的中断或者提前发现异常(如磁盘空闲容量过低)
2)报警
发现问题后,通过邮件等形式通知相关人员及时处理。
3)记录性能数据
记录CPU,MEM,IO,Network以及数据库相关的统计信息,便于发现和调查性能问题。
4)趋势分析
图形化显示现在的和历史的性能数据
目前能用于系统监控的开源软件很多,并且它们的侧重点往往不同,需要根据需求做选择。下面介绍几个常用的,并且以个人视角做个简单评价。
3. 性能数据的存储
性能数据有些明显的特征
1)时间相关
2)只有插入和查询操作
3) 旧的历史数据可以被废弃
针对这些特征,很多监控软件使用专门时系数据工具RRDTool存储数据,比如Cacti,Ganglia,SmokePing。另一些这使用通用的关系数据库,比如nagios,zabbix。更有使用Hbase的OpenTSDB。为了更好的理解现有的很多监控软件,有必要先介绍一下RRDTool。
3.1 RRDTool
RRDtool不是一个监控软件,而是一个能对时系数据进行高性能记录检索和图形展现的开源库。不少监控软件都使用了RRDtool,所以有必要了解一下RRDtool。
RRDtool之所以叫RRD(Round Robin Database)
Tool,是因其存储数据的方式而得名。可以讲其想象成一个固定大小的环形存储空间,每插入一条记录,当前位置指针向前移动一下,指针移动一圈后覆盖之前的数据。这种结构使得RRD的大小不会扩张,因此也就不需要维护,特别适合性能数据采集的场景。
RRDtool的功能有两个,一是作为时系数据的存储引擎,二是将存储的时系数据按不同要求绘制成png图片。看看下面的例子。
0)安装RRDtool
1)创建一个RRD
rrdtool create test.rrd \ --start 920804400 \ DS:speed:COUNTER:600:U:U \ RRA:AVERAGE:0.5:1:24 \ RRA:AVERAGE:0.5:6:10 |
2)插入数据
rrdtool update test.rrd 920804700:12345 920805000:12357 920805300:12363 rrdtool update test.rrd 920805600:12363 920805900:12363 920806200:12373 rrdtool update test.rrd 920806500:12383 920806800:12393 920807100:12399 rrdtool update test.rrd 920807400:12405 920807700:12411 920808000:12415 rrdtool update test.rrd 920808300:12420 920808600:12422 920808900:12423 |
3)查询数据
[root@zabbix ~]# rrdtool fetch test.rrd AVERAGE --start 920804400 --end 920809200 speed
920804700: -nan 920805000: 4.0000000000e-02 920805300: 2.0000000000e-02 920805600: 0.0000000000e+00 920805900: 0.0000000000e+00 920806200: 3.3333333333e-02 920806500: 3.3333333333e-02 920806800: 3.3333333333e-02 920807100: 2.0000000000e-02 920807400: 2.0000000000e-02 920807700: 2.0000000000e-02 920808000: 1.3333333333e-02 920808300: 1.6666666667e-02 920808600: 6.6666666667e-03 920808900: 3.3333333333e-03 920809200: -nan 920809500: -nan |
4)绘图
rrdtool graph speed.png \ --start 920804400 --end 920808000 \ DEF:myspeed=test.rrd:speed:AVERAGE \ LINE2:myspeed#FF0000 |
speed.png:
4. 性能数据的采集
RRDtool或RDB可以解决性能数据的存储问题,但这些性能数据从哪收集呢?数据采集的方法很自由,常用的方法大概可以归纳为以下几种:
1)代理(agent)
一个专门收集性能数据的东西,一般是运行于被监控机器上的某个Deamon。代理采集数据然后传给监控服务器,那么代理又是如何得到数据的呢?无非是调用OS
API,执行某个命令或者脚本。因为一般可以定制代理调用的脚本,所以代理采集数据的能力也是可以自由定制的。
2)远程协议
用于管理的共通协议SNMP,IMPI。或者常用的服务协议,http,ftp,ftp等。或是可以远程执行命令的协议telnet和ssh。只要设置好相应的参数就可以透过网络实施远程监视了。
3)定制脚本
有些管理系统上可以配置用于监控的定制脚本。有了定制脚本就可以自由扩展监控对象了。
下面介绍监控相关的共通协议SNMP和IMPI。
4.1 SNMP
SNMP全称是Simple Network Management Protocol,SNMP的目标是管理互联网Internet上众多厂家生产的软硬件平台。被管理的系统上运行一个叫做代理者(agent)的软件元件,通过SNMP向管理系统报告。代理者和管理系统之间通信的方式有两种,一种是管理系统向代理者询问一个具体的参数值(比如:你产生了多少ICMP不可达差错),另一种是代理者向管理系统主动报告有某些重要事情发生(比如:一个网口掉线了)。
关于代理者和管理系统之间的交互,SNMP定义了5种报文
1)get-request:从代理处提取一个或多个参数值
2)get-next-request:从代理处提取一个或多个参数的下一个参数值
3)set-request:设置代理的一个或多个参数值
4)get-response:返回的一个或多个参数值。它是1)~3)的响应。
5)trap:代理主动发出报文,通知管理系统某些事情发生。
在SNMP体系中由代理提供,由管理系统查询和设置的信息集合称之为MIB(管理信息库)。MIB中的信息通过OID(对象标示符识别),比如:1.3.6.1.2.1.1.1.0。关于OID的定义可参照相关RFC。比如:
http://www.ietf.org/rfc/rfc1907.txt
标准中也有给厂商预留的OID(1.3.6.1.4.1),这样厂商可以在此OID下面进行扩展。
很多网络设备都内置SNMP代理,这样外面的监控服务器可以通过SNMP协议获取信息。对于普通的服务器,可以通过安装一个snmp代理软件提供snmp信息。比如:
安装和运行snmp代理
[root@zabbix ~]# yum install net-snmp [root@zabbix ~]# /etc/init.d/snmpd start |
通过SNMP查看系统描述
[root@zabbix ~]# snmpget -v2c -c public localhost 1.3.6.1.2.1.1.1.0 SNMPv2-MIB::sysDescr.0 = STRING: Linux zabbix 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 |
或者
root@zabbix ~]# snmpget -v2c -c public localhost iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0 SNMPv2-MIB::sysDescr.0 = STRING: Linux zabbix 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 |
或者
[root@zabbix ~]# snmpget -v2c -c public localhost sysDescr.0 SNMPv2-MIB::sysDescr.0 = STRING: Linux zabbix 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 |
4.2 IPMI
IPMI(Intelligent Platform Management
Interface)即智能平台管理接口是使硬件管理具备“智能化”的新一代通用接口标准。用户可以利用 IPMI
监视服务器的物理特征,如温度、电压、电扇工作状态、电源供应以及机箱入侵等。Ipmi 最大的优势在于它是独立于
CPU BIOS 和 OS 的,所以用户无论在开机还是关机的状态下,只要接通电源就可以实现对服务器的监控。
要使用IPMI,服务器硬件本身必须提供对ipmi的支持。大多数厂商的服务器都支持IPMI,但并不是所有服务器都支持,所以应该先通过产品手册或在BIOS中确定服务器是否支持ipmi。如果你用的PC机或者虚拟机那肯定没戏了。
通过ipmitool,可以本地或远程经由impi获取机器信息或控制机器。比如:
# ipmitool -I lan -H 服务器地址 -U root -P 密码 power status # ipmitool -I lan -H 服务器地址 -U root -P 密码 power reset (硬重启) |
5 几款通用的监控软件
有了前面的介绍,就很容把一些常用开源监控软件规个类了。
1)MRTG
SNMP数据采集+包含PNG图片的html输出工具。数据存储使用自己的log格式,也可以采用rrdtool。MRTG不是完整的监控系统,当成工具让perl或其他脚本来调用还可以。
2)Cacti
rrdtool的Web前端,通过SNMP数据采集,也可以定制采集数据的脚本。支持模板定义,图形功能很强,但不能报警,常被拿来和nagios配合使用。
3)nagios
数据采集支持主动代理,被动代理,各种网络协议(snmp,HTTP、FTP、SSH等),支持分布式部署,告警功能强大,特色功能是支持对主机的冗余监控,是功能很全面的一款监控软件,但nagios易用性比较差,图形展示能力很弱。
4)zabbix
zabbix和nagios一样是功能全面的监控软件。但是比nagios更加好用,图形能力更强,所以面临nagios和zabbix二选一的时候建议zabbix。
zabbix的数据采集支持Zabbix agent,ICMP,SNMP,IPMI,http,ssh,定制脚本等
发现问题自动告警
数据展示盒配置设置全部统一的WEB GUI管理
支持分布式部署
支持模板和自动发现功能可以轻松的在大规模环境下部署
5)其他
其他也有几款,比如以性能和大规模监控为卖点的Ganglia和OpenTSDB,但是个人认为通常大多数的场景,zabbix完全够用了。
|