1>监控概述
通常运维人员在一个企业当中所需要管理一台或者多台服务器,或者甚至更多,特别是BAT公司或者门户级别的公司,一个人管理的服务器可能上百甚至上千台 而在这些管理的过程当中,作为运维人员我们需要知道我所管理的每一个服务器所运行的详细状态,其中包括,物理资源的消耗状态(CPU 内存 硬盘 IO 等等)以及网 络带宽和每一个服务器上所运行的每一个服务所在某一个时段当中的某一个时刻所有运行的状态,能够清晰地展示给我们运维人员观看,而且的话当这个服务状态出现 问题之后能给我们的运维人一个非常直接的提示或者说告警信息,甚至可以去尝试去修复这个服务器的故障的状态,我们把它称为监控系统,各位可想而就这么一个监控 系统给我们的运维工作带来多大的便捷性!
2>常见的监控开源工具
1)Cacti概述
cacti只是一个图形展示工具.其实就是一堆(php)脚本和RRDTool绘图工具;
这些PHP脚本能调用这个工具(rrdtool)来实现数据的获取存储和保存以及通过图形来展示,只不过展示的时候CACTI作为前端来实现的,而且展示这些数据,数 据的类型必须是跟时间序列相关的数据才可以; 什么是时间序列? 比如说:我想探测1天当中早上8点最高温度是多高,最低温度是多高,早上9点最高温度是多高, 最低温度是多高,那这个时间数据,根据我们时间的向后走动、向前扭转而有了不同的数据走势这么一种数据时间,我们把它称为时间序列数据。如果我们想探测一 个服务器的端口是不是在线的话。你一想一想80端口是不是在线、8点是不是在线,9点是不是在线、11点是不是在线,这个时间序列有关系没有?那么它只有两种状 态,要么在线,要么不再线,不再线的话时间序列还有没有时间呢?是不是就没有了?那么因此通过cati来展示这种非时间序列或者意义不大的数据的走势,那么它就 不是cati的优势所在了.也不是cati的特点;这个时候就需要另外一种工具来实现呢。这个工具叫做Nagios.
2)Nagios 概述
Nagios 专门就是用来监控服务的简单状态。比如说是不是在线?那么在线就是online,不再线就offline 或者是正在从offline 恢复成online的过程当中,比如说 本来我的服务是ON的突然之间变成了OFF了。那很显然是不是发生了状态转换了?一旦发生状态转换以后我们的Nagios可以自动探测的到这个状态,而且Nagios可 以根据自己强大的报警功能给管理员发送告警信息.所以我们说Nagios是一个状态监控工具,而Cacti是一个时间序列数据的展示工具.所以很多公司为了实现监控功 能。将这两种工具结合一起来一起使用。
3)Zabbix
那么随着科技的发展,互联技术的高速更新。人们就像这又没有一种方法,将以上两种功能集合到一个软件当中去了?于是乎就出现了我们所谓的Zabbix 。
3>Cacti协议组成
Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具;
1)SNMP的工作原理
那么首先我们需要先通过一个SNMP来了解一个网络监控到底是如何进行的。SNMP的全称叫做"Simple Network Manangerment Protocol"
2)SNMP 有三个版本V1 V2 V3
v1 都是基于communities来实现,它有三种communitie
(1)read_only
对它只读--->
NMS监控端-------------->被监控端
NMS只针对于被监控端有只读的功能
(2)read_write
对它可写--->
NMS监控端-------------->被监控端
NMS可以命令去控制被监控端做一些事情,比如停止一个服务等。
(3)trap 捕获(陷阱)
NMS等待--->被监控的通知。
比如客户端1被监控端出现故障了,这个时候会通知信息告知NMS,NMS可以捕获这个信息。
3)一个网络中被监控的对象
通常网络被监控的对象有哪些类型?
(1)、fault Management
故障管理,能探测服务器所发生的故障
(2)、Configureation Management
每个服务器上它的配置是否工作正常的。
(3)、Accounting Management
记账管理,每一个登陆到服务器上的用户是不是都是我们所允许的用户,这个作为用户审核使用。
(4)、Performance Management
性能管理,比如CPU使用多高,内存使用了多少?
(5)、Secruity Management
安全管理系统监控,比如IDS FW等等。
4)NMS和agent通信流程
那么我们知道NMS和agent要基于snmp协议。那么snmp协议是基于UDP协议的,正常情况下我们的哪一个服务被动的打开端口?是NMS还是agent?并等待 其他人的连接?agent应该打开一个端口,随时等待服务器发来的请求.
(1)、被监控端(agent)首先被动打开一个UDP 161接口,随时等待服务器端的查询请求;
(2)、一担被监控端自己发生故障,它可以向监控端(NMS)发起显陷阱(trap)通知 对方发送一个trap告诉监控端,老子这里出大事了,发大水了,出故障了,你 快来看看啊,从而及时引起监控端的注意;
(3)、既然是agent向监控端发送trap信息,那么监控端是不是也的被动打开一个端口?这个UDP端口为162,当然只还是那句话,只有双方共同用到trap之后, 监控端才需要打开162。否则是不需要的;
(4)、但不管怎么讲 他们也是通过IP协议数据报,通过UDP协议进行封装。IP封装最终发送给被监控端。被监控端执行以后反馈给监控端,也是个UDP协议。 之所以使用UDP主要是为了实现速度,为了速度考虑。TCP建立虽然可靠,但是需要3次握手,是要很多时间,等你握手握完了,啊,我快挂了,赶紧过 来检查;手没握完别人就挂了,更别说采取什行动了,好,这是双方通信的简单机制;
5)SNMP 内置的Communites
对于SNMP的communite来讲任何一个设备或者任何一个主机通常都有两个内置的Communites,只要我们装上系统以后启用了SNMP的功能。就会有这两个机制。
(1) public (只读) communite
(2) private (读写的) communite
再说一遍只要主机启用了snmp那么主机机会有两个默认的communite的,一个是public,一个是private。
就是我们的MYSQL一样,装完之后默认就有一个ROOT用户,如果不改密码是不是所有的人都能连接进来?那么我们的SNMP也是这样的;
6)SNMP 当中的MIB库介绍
管理信息基础"(Management Infomation Base)
我们想通过SNMP去监控一个一个设备,标识每一个设备唯一(oid)的号必须依赖一个叫做MIB subtree的一个库信息表来实现。MIB信息库跟DNS一样是一个到树形 结构;
MIB-II subtree
(1)、比如要监控一个主机跟系统相关的信息,根DNS一样一层层的往下找,
MIB库当中如何找到这个信息的OID(OID-Object Identifiers)?一个OID是一个唯一的键值对,该代理存放这些值并让它们可用,一个 SNMP管理器(客户)可以向代理查询键值对中的特定信息;
(2)、找到跟主机相关的信息为systemA(1) 那么树形结构OID为:1.3.6.1.2.1.1
7)SNMP 命令去获取OID
我们可以通过snmp(options)选项可以去获得oid信息,常用的有四种:
(1) get方式
(2) getnext方式
(3) getbulk方式
(4) set方式
8)SNMP 安装包
net-snmp(agent被监控端)
net-snmp-utils(主监控端所要用的命令)
说明:对被监控端我们只要安装一个net-snmp就可以了,但是主监控端如果想接收agent发送过来的trap信息的话。那么则将net-snmp的装上去。如果只 是 单纯的是去获取被监控端获取数据的话,那么主监控端只需要安装一个net-snmp-utils这个包就好了。
# yum -y install net-snmp net-snmp-utils
9)SNMP 实际操作
环境:10.0.10.201 ,既为监控端又为被监控端
(1) 查看可以获取的当前用户的信息
# snmpwalk -v 2c -c public localhost
获取本地资源所有的信息
-v 版本为2c
-c public(communite为public)
有三个mib库位我们提供了信息.但是在ls /usr/share/snmp/mibs/ 下面有很多mib库,为甚么只有3个库位我们提供了信息呢?
(2) 编辑OID范围可以看到更多的信息.
# vim /etc/snmp/snmpd.conf
# /etc/init.d/snmd restart
这个这个subtee的范围执定当中,只包含了三个MIB库当中的部分信息,如果想看到的范围更广。我们可以这样调整。这样看到范围就更广
# snmpwalk -v 2c -c public localhost
(3)snmpget查看特定OID的资源
# snmpwalk -v 2c -c public localhost
# snmpget -v 2c -c public localhost HOST-RESOURCES-MIB::hrSystemUptime.0 查看特定的资源
(4)定义获取资源的权限:
# vim /etc/snmp/snmpd.conf
#com2sec notConfigUser default public 系统默认是default所有人都可以获取,很危险,这个位置应该改成主监控端的地址,我这里主监控端为 自己,所有写127.0.0.1
com2sec notConfigUser 127.0.0.1 mypublic communitie可以自己定义名字。通常这个名字在企业里面会改的很复杂。别人越难猜越好。
测试一下:# snmpwalk -v 2c -c public 127.0.0.1 是否用可以获取到呢?如果使用 # snmpwalk -v 2c -c mypublic 127.0.0.1 试试。是否可以获 取到数据呢?
2》Cacti相关:
1. cacti是用php语言实现的一个软件,它的主要功能是用snmp服务获取数据,然后用rrdtool储存和更新数据,当用户需要查看数据的时候用rrdtool生成图表呈现给用 户,因此,snmp和rrdtool是cacti的关键,Snmp关系着数据的收集,rrdtool关系着数据存储和图表的生成;
2. Mysql配合PHP程序存储一些变量数据并对变量数据进行调用,如:主机名、主机ip、snmp团体名、端口号、模板信息等变量;
3. snmp抓到数据不是存储在mysql中,而是存在rrdtool生成的rrd文件中(在cacti根目录的rra文件夹下)。rrdtool对数据的更新和存储就是对rrd文件的处理,rrd文件是 大小固定的档案文件(RoundRobinArchive),它能够存储的数据笔数在创建时就已经定义;
1>Cacti组成部分
Data Retrieval
Cacti首先要做的工作就是收集数据,cacti使用Poller(轮询器)收集数据。Poller是操作系统scheduler的扩展,如在类Unix系统中的crontab。现在的IT设施中 会有许多不同的设备,如服务器、网络设备等,cacti主要使用SNMP协议来从远端的设备上收集数据,所有可以使用SNMP协议的设备都可以被cacti监控;
Data Storage
存储收集到的数据有许多方法,可以使用数据库、平面文件等,cacti使用的是RDDTool。RRD是Round Robin Database(环形数据库)的缩写,RRD用来存 储和显示时间序列数据,如网络带宽、机房温度、服务器负载等,RRD使用非常紧凑的方式存储数据,数据不会随着时间的推移而增大,RRD还可以生成美观的 图形。这些特性使得cacti没有存储需求。RRD也做一席位其他的工作,如RRD会将原始数据与已整合的数据进行合并,以使得历史数据的存储节省空间,RRD支 持的整合功能包括:AVERAGE, MAXIMUM, MINIMUM和LAST;
Data Presentation
Cacti最大的一个特点是内置了RRDTool画图功能,将其与通用的web服务器相结合,可以实现在任意平台上使用浏览器就可以查看监控画面;
2>Cacti原理图
3>特性
(1)、采集数据
(2)、保存数据
(3)、数据展示
(4)、数据分析和报警,
因为Cacti的数据采集的时间是统一的,而且采集的数据项目也是比较多,如果应用大规模网络的,这里面牵扯到一个并发和服务器的I/O读写。所以cacti不适应于大规 模;
3》Cacti 服务端安装
1>安装关联包
# yum -y install php php-mysql php-snmp mysql mysql-server net-snmp net-snmp-libs net-snmp-utils php-pdo perl-DBD-MySQL rrdtool
2>配置SNMP
#vim /etc/snmp/snmpd.conf
#将下边这行中的default
com2sec notConfigUser default public
#改为:127.0.0.1
com2sec notConfigUser 127.0.0.1 public
com2sec notConfigUser 10.0.0.0/16 public
#将下边这行中的systemview
access notConfigGroup "" any noauth exact systemview none none
#改为:all
access notConfigGroup "" any noauth exact all none none
#将下边这行的注释“#”去掉
view all included .1 80
3>重启snmpd服务
# /etc/init.d/snmpd restart
# chkconfig snmpd on
4>安装Cacti
# wget http://www.cacti.net/downloads/cacti-0.8.8b.tar.gz 下载cacti主文件
# tar -xvf cacti-0.8.8b.tar.gz
# mv cacti-0.8.8b /var/www/html/cacti
# chown apache:apahce /var/www/html/cacti/ -R
# chmod 755 /var/www/html/cacti/ -R
5>启动Mysql配置数据库
# /etc/init.d/mysqld restart
# mysql –uroot –p
> create database cacti default character set utf8; 注意咯。为utf8为否是乱码
> grant all privileges on cacti.* to cacti@localhost identified by 'cacti' with grant option;
> grant all privileges on cacti.* to cacti@127.0.0.1 identified by 'cacti' with grant option;
>use cacti;
>source /var/www/html/cacti/cacti.sql;
> flush privileges;
>quit
6>修改cacti PHP文件,修改数据库地址
#vim /var/www/html/cacti/include/config.php
$database_type = "mysql";
$database_default = "cacti";
$database_hostname = "localhost";
$database_username = "cacti";
$database_password = "cacti";
$database_port = "3306";
# vim /etc/php.ini
;date.timezone =
date.timezone = Asia/Shanghai
# crontab –e
*/5 * * * * /usr/bin/php /var/www/html/cacti/poller.php >/dev/null 2>&1
# /etc/init.d/crond restart
7>验证安装
在浏览器里面打开
(1)然后-> #点“Next”-> #选择“New Install”,点击“Next” ->确保所有的路径都是显示“FOUND”,没有“NOT FOUND”的->点击Finish 完成安装。
(2)要求输入用户密码登陆,输入默认用户和密码为:admin 密码:admin
第一次登陆要求修改密码:请输入新的密码修改
(3)登陆成功后。到此界面
4》Cacti 客户端安装
1>安装snmp
# yum -y install net-snmp
2>配置snmp
#vim /etc/snmp/snmpd.conf
#将下边这行中的default
com2sec notConfigUser default public
#改为:127.0.0.1
com2sec notConfigUser 10.0.0.201 public 修改成cacti服务器的IP地址
#将下边这行中的systemview
access notConfigGroup "" any noauth exact systemview none none
#改为:all
access notConfigGroup "" any noauth exact all none none
#将下边这行的注释“#”去掉
view all included .1 80
3>重启snmp服务
# # /etc/init.d/snmpd restart
5》Cacti 的使用
1>新建一个本地主机
(1)、选择Devices
(2)、选择ADD 添加
(3)、输入信息à然后点击右下角Create
(4)、创建成功后如下图
(5)、为监控模板创建图形文件
(6)、勾选所有模板,点击Create
(7)、选择创建图形的颜色
(8)、创建成功
(9)、加入默认树图
(10)、选择ADD
(11)、选择HOST –〉Create创建
(12)选择树图查看
(13)查看日志轮询情况。就是执行计划任务的情况
14、轮询是否报错。这个将决定状态是否UP
15、如果没有up,手动执行
/usr/bin/php /var/www/html/cacti/poller.php 执行一边轮询和数据生成.
生成的数据在:/var/www/html/cacti/rra 里面
每次执行轮询的记录在/var/www/html/cacti/log 日志里面