分类: LINUX
2018-09-11 09:18:00
监控系统,是运维工程师和研发工程师的眼睛。它帮助工程师在第一时间发现网站的问题。
服务器的整个生命周期,都要和监控系统打交道。服务器上架,需要加入基础监控,比如CPU负载、内存等等;当服务器上开始跑应用时,需要加入对应的应用监控,比如MySQL等;当服务器维护时,又要暂停这些报警,否则你明明在维护MySQL,监控系统还给你报警说MySQL挂了。这些操作,手动去做非常麻烦,需要跟运维的其他系统共同协作,比如CMDB中一台机器上架了,那么监控系统自动加入监控。
1、为什么需要监控系统
在一个IT环境中会存在各种各样的设备,比如硬件设备、软件设备,其系统的构成也是非常复杂的
底层:网络:网路环境(内网环境,外网环境)
硬件:服务器,存储,网络设备等
系统架构: 操作系统:Linux、Unix、Windows等
虚拟化:VMware、KVM等
集群:LVS、Keepalived、HaProxy等
上层应用:数据库:MySQL、MariaBD、Oracle、SQL Server等
应用软件:Nginx、Apache、PHP、Tomcat等
多种应用构成复杂的IT业务系统,保证这些资源的正常运转,是一个公司IT部门的职责。而要让这些应用能够稳定地运行,则需要专业IT人员进行设计、架构、维护和调优。在这个过程中,为了及时掌握基础环境和业务应用系统的可用性,需要获取各个组件的运行状态,如CPU的利用率、系统的负载、服务的运行、端口的连通、带宽流量、网站访问状态码等信息。而这一切都离不开监控系统。
2、监控系统的实现
一个监控系统的组成大体可以分为两部分:数据采集部分(客户端)和数据存储分析报警展示部分(服务器端)。这两部分构成了监控系统的基本模型。
数据采集的工作模式可以分为被动模式(服务器端到客户端采集数据)和主动模式(客户端主动上报数据到服务器端)。通常,大多数监控系统应该能同时支持这两种模式。被动模式对服务器的开销比较大,适合小规模的监控环境;主动模式对服务器的开销较小,适合大规模的监控环境。
采集数据的协议方式可以分为两种:专用客户端采集和公用协议采集(SSH、Telnet等)。对于采集到的监控数据,可以将其存储到数据库或者文本或者其他方式,具体采用哪一种,应根据实际情况而定。
对于一般的监控环境,被监控的节点不多,产生的数据较少,采用C\S架构就可以,这种架构适合于规模较小、处于同一地域的环境。 Socket STMP
对于大规模的监控环境,被监控的节点多,且监控类型多,监控产生的数据和网络连接开销会非常的巨大,而且由于跨地域等多种因素影响,需要分布式的解决方案,常见的方式为C\P\S(Client\Proxy\Server)架构采用中间代理将大大提高监控服务端的处理速度,从而能支撑构建大型分布式监控的环境。
监控系统更重要的功能是告警和处理事故,这对及时解决问题和故障自愈非常重要。告警的时候,需要考虑到故障的有效汇报和集中汇报,防止出现“告警洪水”(同一类告警信息重复大量地发送)。
3、监控系统的开源软件现状
在监控软件中,开源的解决方案有流量监控(Cacti)和性能告警(Nagios、Zabbix)可供选择,并且每种软件都有自己的特点和功能,各自的侧重点和目标不完全相同,在设计理念和实现方法上也大同小异,但都具有共同的特征,比如:采集数据,分析展示,告警以及简单的故障自动处理。最终都能达到对IT系统服务可用性的一个完全展示。
Cacti(仙人掌)是一套基于PHP、MySQL、SNMP和RRDtool开发的网络流量监测图形分析工具。它通过snmp来获取数据,使用RRDtool绘图,但使用者无需了解RRDtool复制的参数。它提供了非常强大的数据和用户管理功能,可以指定每一个用户能查看树状结构、主机设备以及任何一张图,还可以与LDAP结合进行用户认证,同时也能自定义模板,在历史数据的展示监控方面,功能相当不错。Cacti通过添加模块,使不同设备的监控添加具有可复用性,并且具备可自定义绘图的功能,具有强大的运算能力。
Nagios是一个企业级的监控系统,可监控服务的运行状态和网络信息等,并能监视所指定的本地或远程主机参数以及服务,同时还提供异常告警通知功能等。Nagios可以运行在Linux和UNIX平台上,同时提供一个可选的基于浏览器的web界面,以方便系统管理人员查看网络状态、各种系统问题,以及日志等。Nagios的功能侧重于监控服务的可用性,能及时跟进触发条件告警。目前,Nagios也占有一定的市场份额,不过Nagios并没有与时俱进,已经不能满足与多变的监控需求,架构的扩展性和使用的便捷性有待增强。
Zabbix是一个分布式监控系统,支持多种采集方式和采集客户端,有专用的Agent(代理),也可以支持SNMP、IPMI、JMX、Telnet、SSH等多种协议,它将采集到的数据存放在数据库中,然后对其进行分析整理,达到条件触发告警。其灵活的扩展性和丰富的功能是其他监控系统所不能比的。相对来说,它的总体功能做得非常优秀。
还有很多监控系统比如OpenTSDB、Ganglia、Zenoss Core、Graphite、SmokePing、MRTG等等。
监控系统的原理探究
(1)试想一个很小的网站,刚上线也许就只有一个VPS或者一台服务器。随着业务的发展,它逐渐成为一个大型的网站,服务器从一台发展到多台,运维人员从一个发展到多个,业务战线也从一条发展到多条,这时候出现故障的概率就会大大增加。当有一天,你作为该网站的运维人员,你的老板问你为何某个服务不可使用,为何出现故障时,而身为运维人员的你却不知道故障出现在哪里,此时你是不称职的。如果换一个角度,在未发生故障的时候就已经把故障解决了,那你就是幕后英雄。
监控系统就是在发生故障之前,监控系统中会隐约显现故障的前期迹象,这也适用于其他事物,任何事物的发生必有其原因和条件。有经验的人会从这小小的迹象中发现更大的问题,例如,突发的流量增长,突发的访问量增大,某台服务器的瞬间负载变高,都表明了即将出现异常情况。对出现的故障,能及时通知告警和故障的自动修复,对运维人员响应处理故障的速度会大大加快,甚至在异常严重的故障情况下,对及时采用应急预案,有不可或缺的作用。如果没有监控,故障的反馈往往来自用户的报告,然后才由运维人员处理。
监控系统的实现
监控系统往往需要对物理硬件和软件的性能和参数进行数据汇集,实现集中管理和统一分析。在一个监控系统中,构成要素为监控服务器端程序、数据存储、被采集节点等相关模块,其告警分析和自动故障处理功能有服务器端执行。在数据采集完成之后,需要对采集到的数据进行分析和处理,判断是否有异常,是否属于告警条件。告警条件如何设置呢?通常是根据实际的经验值、业务的需求来设置告警阈值。达到告警条件时,则发送告警信息给管理人员,然而,对于有些故障,我们希望程序能自动处理,减少人工干预,让程序自动修复,只在出现严重故障、程序无法判断的时候,才告警通知管理人员处理。
一个监控系统往往需要集成资产管理,可以从逻辑上展示业务和功能的信息,通过对其进行数据分析,做到对投资与回报的一个反馈展示,为资产的合理规划与使用提供了依据。从其工作模式来看,监控系统的数据采集可以分为两种:主动监控和被动监控,一个理想的监控系统,其采集端支持的采集方式越多,其扩张能力越强大,适用的环境场合越多。
监控系统需要提供一个API,方便其他功能系统对监控数据进行操作管理,这在业务系统精密的情况下显得特别重要,通常能对外提供API功能的软件,其用户群会更广,产品会越做越好。API一般可以分为SOAP、RESTful等形式,数据类型有JSON、XML等多种。
常见的监控系统性能采集指标:
监控项目 |
详细内容 |
主机监控 |
CPU、内存磁盘的剩余空间、利用率、I/O、SWAP使用率、系统UP时间、进程数、负载 |
网卡监控 |
Ping的往返时间及包成功率、网卡流量,包括流入/流出量和错误的数据包数 |
文件监控 |
监控文件大小,Hash值,匹配查询、字符串存在于否 |
URL监控 |
监测指定URL访问过程中的返回码、下载时间及文件大小,支持内容匹配 |
应用程序 |
端口和内存使用率、CPU使用率、服务状态、请求数、并发连接数、消息队列的字节数、Client事务处理数、Service状态等 |
数据库 |
监测数据库中指定的表空间、数据库的游标数、Session数、事务数、死锁数、缓冲池命中率、库Cache命中率、当前连接数、进程的内存利用率等性能参数 |
日志 |
错误日志匹配、特定字符串匹配 |
硬件 |
温度、风扇转速、电压等 |
监控系统对时间的要求
监控系统需要根据实际应用的需求,实时/非实时地采集和展示数据。另外,包括历史趋势数据的展示和分析,以及容量报表、可用性报告的生成。
监控系统的告警需求
支持多种方式,如短信、邮件和其他接口。具备可定制化功能,对第三方告警介质提供可编程接口。这一点在很多场合非常重要。支持对告警内容的分析自动处理,防止误报、漏报,以及防止抖动。这一点对大多数监控系统都是一个值得挑战和研究的课题。
简而言之,监控数据的采集、存储、分析和故障报告是每个监控系统的基本功能,其他复杂的附加功能则是监控系统的增值业务。
zabbix安装:
[root@localhost ~]# yum install -y gcc mysql-server mysql-devel libcurl-devel net-snmp-devel php php-gd php-xml php-mysql php-mbstring php-bcmath httpd
[root@localhost ~]# rpm -ivh php-bcmath-5.3.3-3.el6_2.5.x86_64.rpm --nodeps
[root@localhost ~]# rpm -ivh php-mbstring-5.3.3-3.el6_2.5.x86_64.rpm --nodeps
[root@localhost ~]# tar -zxvf zabbix-2.2.6.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/zabbix-2.2.6/
[root@localhost zabbix-2.2.6]# ./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --with-net-snmp --with-libcurl --enable-proxy --with-mysql=/usr/bin/mysql_config && make && make install
[root@localhost zabbix-2.2.6]# ln -s /usr/local/zabbix/sbin/* /usr/local/sbin/
[root@localhost zabbix-2.2.6]# ln -s /usr/local/zabbix/bin/* /usr/local/bin/
[root@localhost ~]# useradd zabbix
[root@localhost zabbix-2.2.6]# vim /etc/services
zabbix-agent 10050/tcp # Zabbix Agent
zabbix-agent 10050/udp # Zabbix Agent
zabbix-trapper 10051/tcp # Zabbix Trapper
zabbix-trapper 10051/udp # Zabbix Trapper
[root@localhost zabbix-2.2.6]# vim /usr/local/zabbix/etc/zabbix_server.conf
DBName=zabbix //修改数据库的名称
DBUser=zabbix //数据库用户名称
DBPassword=123.com //登陆数据库的密码
ListenIP=127.0.0.1 //数据库的IP地址
AlertScriptsPath=/usr/local/zabbix/share/zabbix/alertscripts //zabbix相关脚本的路径
[root@localhost zabbix-2.2.6]# vim /usr/local/zabbix/etc/zabbix_agentd.conf
Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d/
UnsafeUserParameters=1 //用户认证
[root@localhost~]# cp /usr/src/zabbix-2.2.6/misc/init.d/fedora/core/zabbix_agentd /etc/init.d/
[root@localhost ~]# cp /usr/src/zabbix-2.2.6/misc/init.d/fedora/core/zabbix_server /etc/init.d/
[root@localhost ~]# vim /etc/init.d/zabbix_server
BASEDIR=/usr/local/zabbix
[root@localhost ~]# vim /etc/init.d/zabbix_agentd
BASEDIR=/usr/local/zabbix
[root@localhost ~]# chmod +x /etc/init.d/zabbix_agentd
[root@localhost ~]# chmod +x /etc/init.d/zabbix_server
[root@localhost ~]# /etc/init.d/zabbix_agentd start
Starting zabbix_agentd: [确定]
[root@localhost ~]# /etc/init.d/zabbix_server start
Starting zabbix_server: [确定]
[root@localhost ~]# chkconfig --add zabbix_agentd
[root@localhost ~]# chkconfig zabbix_agentd on
[root@localhost ~]# chkconfig --add zabbix_server
[root@localhost ~]# chkconfig zabbix_server on
配置mysql
[root@localhost ~]# service mysqld restart
[root@localhost ~]# chkconfig --add mysqld
[root@localhost ~]# chkconfig mysqld on
[root@localhost ~]# mysqladmin -u root password '123.com'
[root@localhost ~]# mysql -u root -p
mysql> create database zabbix default character set utf8;
Query OK, 1 row affected (0.00 sec)
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by '123.com';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
[root@localhost ~]# mysql -u zabbix -p zabbix < /usr/src/zabbix-2.2.6/database/mysql/schema.sql
[root@localhost ~]# mysql -u zabbix -p zabbix < /usr/src/zabbix-2.2.6/database/mysql/images.sql
[root@localhost ~]# mysql -u zabbix -p zabbix < /usr/src/zabbix-2.2.6/database/mysql/data.sql
[root@localhost ~]# mysql -u root -p123.com
配置PHP
[root@localhost ~]# vim /etc/php.ini
max_execution_time = 300 //每个脚本的最大执行时间,默认单位为秒
max_input_time = 300 //每个脚本可能花在解析请求数据上的最长时间
post_max_size = 16M //PHP将接受的POST数据的最大大小。
date.timezone =Asia/Shanghai //定义日期函数使用的默认时区
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
DirectoryIndex index.php index.html index.html.var
[root@localhost ~]# cp -r /usr/src/zabbix-2.2.6/frontends/php/ /var/www/html/zabbix
[root@localhost ~]# chown -R apache.apache /var/www/html/zabbix/
[root@localhost ~]# service httpd restart
[root@localhost ~]# chkconfig --add httpd
[root@localhost ~]# chkconfig httpd on
[root@localhost ~]# firefox