监控基础
以下监控系统内容很多都淘汰了,现在大多都用Prometheus了
监控系统
介绍
规模带来的挑战
- 每当系统规模扩大10倍,原有的技术栈则需要替代
- 更多系统、设备、应用的数量,不同的部署地点、不同的业务需求
- 系统问题不能及时得到反馈,响应处理不及时(被动响应)
- 设备服务间存在复杂的依赖关系,问题定位困难(这是分层带来的困扰)
- 网络问题造成应用无法访问
- 数据库问题造成应用无法访问
- 资源抢占造成后台进程系统杀掉
- 来自用户的问题反馈通常存在误导因素
- 系统缺乏统一的监控告警机制、失控
- 需要统一的监控系统,能自动告警、问题处理
监控系统介绍
可以周期性的检查系统、服务是否可用
日常使用的监控系统
- Nagios
- Zabbix
- Manageengine
- Solarwind
监控技术
- 第一类:基于客户端
- 适用于通用操作系统,需要在被监视设备上安装监控程序
- 第二类:基于SNMP协议
- 普遍使用、硬件设备
- 私有的协议扩展
nagios介绍
Nagios是插件式的结构,它本身没有任何监控功能,所有的监控都是通过插件进行的,因此其是高度模块化和富于弹性的。
nagios是开源的系统监控工具
- 自动监视系统运行状态
- 发现问题及时通知相关人
- 支持客户端和SNMP兼容设备
支持的两类监控对象
- Host:物理的、虚拟的、网络设备、打印机等(可分组划分)
- Service:系统功能(系统服务、资源占用CPU、内存、存储)
- Service至少关联到一个Host
检查结果的4种状态
- OK
- Warning
- Critical
- Unknown
- 具体的性能按需定义为以上状态
基于插件的系统框架
- nagios将要检查什么,以及warning、critical的标准交给插件
- 所有检查工作由插件完成,并分析检查结果
- 内建插件主要由C语言开发(需要编译安装)
- 不支持的检查功能可自行开发插件
清晰的对象定义系统
- Commands:插件之上的抽象层,将类似的操作分组处理
- Time periods:应该或不应该执行监控操作的时间跨度,可以定义某个时间不做监控
- Hosts / Groups:一个或是一组主机(一个主机可以属于多个组)
- Services:主机上需要监视的具体功能和资源(CPU、存储、web服务)
- Contacts / Groups:联系人
- Notifications:不同等级事件、时间通知谁什么内容
- 何时以何种方式通知谁,具体什么信息
- 不是严格意义的对象,是其他对象的集合
- Escalations:通知升级,告警持续一定时间后升级
Nagios是一个依赖系统
- 系统和服务依赖网络设备
- 服务之间互相依赖,被依赖的服务故障时,依赖它的服务不再检查和告警
计划宕机
- 维护性宕机调度时nagios不发告警
- 也可以通知计划宕机维护
软硬状态
- 为避免随机和临时性故障告警,Nagios状态区分软硬状态
- 当前与之前检测状态不同时故障为软状态,相同则为硬状态,这是怕网络状态抖动,要连续检测多次有问题,才置为硬状态。
Nagios
Nagios安装
自动安装
ubuntu官方库包含Nagios3.X版本
1 | sudo apt install nagios3 nagios-plugins |
nagios官方最新版4,需要手动编译安装,Nagios3和4相当于python2和3的版本差异,Nagios3和4的版本都是独立发展的。
提供了web访问方式
编译安装
需要的依赖软件包
C编译器、C语言开发库、OpenSSL实现web加密访问、MySQL存储历史数据、PHP、SNMP、图形组件
1 | sudo apt install -y wget gcc make binutils cpp libpq-dev libmysqlclient-dev libssl1.0.0 libssl-dev pkg-config libgd-dev libgd-tools perl libperl-dev libnet-snmp-perl snmp apache2 apache2-utils libapache2-mod-php unzip tar gzip php php-gd |
创建目录结构
1 | sudo mkdir /opt/nagios # 二进制、插件、程序安装目录 |
创建用户和组账号
1 | sudo groupadd nagios # 后台进程运行账号 |
文件系统权限
1 | chown nagios:nagios /opt/nagios /etc/nagios /var/nagios |
下载源码
1 | wget https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.4.5.tar.gz |
编译安装nagios
1 | cd cd nagios-4.4.5/ |
验证配置文件
1 | su -c '/opt/nagios/bin/nagios -v /etc/nagios/nagios.cfg' # 验证例子文件 |
编译安装插件
1 | cd ../nagios-plugins-2.3.1/ |
创建站点配置文件
1 | cd /etc/apache2/conf-available/ |
加载模块并启动站点
1 | a2enmod cgi |
设置web登录密码
1 | htpasswd -c /etc/nagios/htpasswd.users nagiosadmin # 创建基本账号身份认证密码,将nagiosadmin账号密码存入/etc/nagios/htpasswd.users目录下 |
web访问
Nagios配置
配置文件
1 | /etc/nagios # 存放配置文件的目录 |
目录结构
1 | cd /etc/nagios |
修改主配置文件
1 | vi /etc/nagios/nagios.cfg |
监控体系架构
nagios启动过程中要读取主配置文件,主配置文件中我们指定了其他的具体要监视的那些配置文件中的目录。
而具体监视的是什么呢?首先要定义主机,所有的服务都不能脱离主机单独存在,而主机是监视的开始,只有有了一个定义好的对象主机,才能对主机上的服务资源进行监控。
nagios系统要求一个主机至少定义一个服务。
如何检查呢?在command.cfg文件中定义检查指令,通过插件来完成检查。在command.cfg中还定义了检查完了如何处置的步骤,可以发邮件给负责人或者直接操作。
监控过程中会涉及到各种宏,在资源文件中定义宏。
nagios宏
介绍
可以在资源文件中定义256个宏,这些宏可以在Host中调用Host里面的属性。一方面可以在资源文件中手工定义,另一方面Host、Service、Contact这些对象,nagios会默认的生成对应的宏。
举例:
1 | vi /etc/nagios/objects/localhost.cfg |
- 这里用host_name主机名来区分,人为定义的用来区分这台主机是用来干什么用的。
- alias是别名、描述名,可以写一段描述,更加清晰的描述这台主机是干什么用的
- address是主机IP地址。
nagios系统会针对不同类型的对象(Host、Service、Contact)不同的属性会自动生成对应的宏。
1 | # 一旦定义好了主机对象,就是上面举的例子,会生成对应的宏,如下所示 |
如果你觉得系统自带的定义host对象的属性字段不够用,可以自定义属性字段
1 | define host { |
举例使用宏
1 | define host{ |
常用内建的宏(全局变量)
读取其他对象的宏
宏不但对象自身能读取相应的宏,还能引用其他对象的宏。
1 | $CONTACTEMAIL:jdoe$ # jdoe的邮件地址,不是当前联系人。 |
资源文件权限
1 | chmod 600 /etc/nagios/resource.cfg # 内涵机密信息,应避免被web服务读取内容 |
HOST
定义一个host对象
怎么描述被监视对象
- 短名 short name
- 描述名 descriptive name
- 地址 / 主机名
- 何时以及如何监视
- 故障时联系人
- 检查频率 / 重试次数
- 如何发出告警
- ……
定义主机范例
1 | cd /etc/nagios/hosts # 主机都放在host目录下 |
一般情况下不会定义这么多的内容,通常会将这些写在模板上。
notification_options
- d:DOWN 系统当机了
- u:UNREACHABLE,不可达
- r:GroupRecovery,系统已经恢复正常了
- f:starts and stops flapping 系统在up到down来回摆动的状态
- s:scheduled downtime starts or ends 由于系统维护升级,计划之内将系统下线,这不是系统故障,是主动关机。
默认假设host状态是UP
parents ,通常是服务器上连的交换机、路由器等网络设备,如果parent处于down的状态,host状态为unreachable,就不再执行检测。
Host Group
每个host可以同时属于多个group,把多个具有一定相似性的主机加入同一个组里面,进行统一的管理、监控,可以提高效率。
1 | cd /etc/nagios/hostgroup |
Service
监控一台主机是否存活并不是我们最关心的事,从业务角度讲我们更关心系统服务、资源占用、业务是否正常。操作系统本身不会出太大问题
- NFS、FTP服务、存储空间、CPU负载
- Service永远绑定于一个运行状态的HOST
- 每个一个HOST至少要定义一个Service
- 通过唯一的描述名标识
- 定义何时、如何进行检查
- 定义告警方式
- 文件放在
/etc/nagios/serivces/
目录下,一般命名:<host>-<service>.cfg
定义Service范例
1 | cd /etc/nagios/services |
notification_options
- w:Warning
- u:unknown
- c:Critical
- r:recovery(ok)
- f:starts / stops flapping 一下好一下坏
- s:scheduled downtime starts / ends
排除检查主机
1 | define service{ |
Service group
Service Group成员是多个 <host>, <service>
对
1 | # 创建组,明确哪一个服务是一个组的 |
另一定义组的方式
1 | # 先创建组,里面是空的,在创建服务的时候,再明确添加到组 |
主机、主机组、服务、服务组在使用过程中互相调用的过程:
先定义主机H01、H02、H03、H04、H05、H06、H07、H08,按照不同的归类属性给主机分组,当要对这些主机、主机组来进行服务的监控时,一般都会创建服务,把主机组绑定到服务里,根据你进一步管理的需求,可以给服务进行分组。
Command
- 如何检查Host / Service
- 如何问题告警 / 事务处理
- 有两个参数:名称、命令行
- 命令执行插件或自定义命令
- 命令行会使用宏、参数等
定义command
无参数的
1 | define command{ |
带参数定义command
1 | define command{ |
针对不同主机设置不同的参数
Time period
定义时间区段
执行检查、告警的时间区段
1 | define timeperiod{ |
日期格式优先级
按照时间颗粒度排序,优先级从高到低:
1 | YYYY-MM-DD # 具体日期 2019-01-01 |
1 | define timeperiod{ |
Contact
定义联系人
1 | define contact{ |
告警状态
host_notification_options:
- d : DOWN
- u : UNREACHABLE
- r : Recovery (UP)
- f : starts / stops Flapping
- s : Scheduled downtime starts / ends
- n : Not receive any notifications 不接收任何的告警
service_notification_commands:
- w : WARNING
- u : UNKNOWN
- c : CRITICAL
- r : Recovery (OK)
- f : the service starts and stops flapping
- n : the person will not receive any service notifications
Contact Group
指定时间联系指定人群,硬件问题联系硬件管理员,服务问题联系系统管理员
1 | define contactgroup{ |
验证配置文件
- 重启服务、系统前验证配置,避免nagios服务宕机
1 | /opt/nagios/bin/nagios -v /etc/nagios/nagios.cfg |
模板和继承
- 定义新对象时可重用模板定义的参数,简化管理
- 不加
register
的模板对象将被视为普通对象进行监控 - 通过use指令调用模板定义对象
- 定义对象时可使用多个模板。按模板先后顺序确定优先级
- 模板可层级继承调用,定义新的模板,模板里面定义模板
定义模板
1 | define host{ |
继承
1 | define host{ |
nagios的web界面
- 查看性能、故障、状态、历史信息
- 支持修改部分设置
- 显示状态、报告、系统
Nagios Exchange(社区站点)
安装Nagiosgraph
Nagiosgraph性能图示
介绍
- 基于RRDtool实现历史数据的图形化显示,曲线图表的形式展示。
- 由perl语言编写
下载安装
安装依赖包
1 | sudo apt install -y libcgi-pm-perl librrds-perl libgd-gd2-perl rrdtool perl libgd-perl |
下载源码安装
1 | curl -sSL https://sourceforge.net/projects/nagiosgraph/files/latest/download | tar xzv |
修改站点配置文件
1 | vi /etc/apache2/sites-enabled/nagiosgraph.conf |
重启服务:
1 | systemctl restart apache2.service |
访问测试
http://192.168.1.104/nagiosgraph/cgi-bin/show.cgi
集成nagiosgraph
将nagios图表集中到nagios主web页面
1 | vi /etc/nagios/objects/templates.cfg |
重启服务
1 | systemctl restart apache2 |
MRTG监控nagios的运行状态
安装配置
1 | apt install mrtg |
起始运行
1 | env LANG=C mrtg /etc/nagios/mrtg.cfg |
创建页面文件
1 | indexmaker /etc/nagios/mrtg.cfg --output=/opt/nagios/share/stats/index.html |
周期运行
1 | vi /etc/cron.d/nagiostats # 创建后台进程的启动文件 |
访问测试
http://192.168.1.104/nagios/stats/
起始页更改为Service
1 | vi /opt/nagios/share/index.php |
菜单
1 | vi /opt/nagios/share/side.php |
SSH实现远程监控
介绍
- 监视远程主机的CPU、内存、存储等
- 利用SSH在远程主机上执行插件并返回结果以及退出代码
- SSH是基于秘钥的身份认证
- check_by_ssh插件建立SSH连接,指定主机名和具体执行的命令
Nagios client安装配置
1 | apt -y install gcc make binutils cpp |
Nagios Server生成密钥对
1 | su -s /bin/bash nagios # 使用nagios账号 |
Nagios client创建账号
1 | useradd -d /opt/nagios nagios |
Nagios Server拷贝密钥
1 | ssh-copy-id nagios@192.168.1.105 |
测试
1 | /opt/nagios/plugins/check_by_ssh -H 192.168.1.105 -C "/opt/nagios/plugins/check_uptime" # 调用插件验证是否可以连接 |
nagios配置
将检查的指令写到配置文件中
1 | define command{ |
NPRE远程监控
介绍
nagios专用的客户端,安装在被监视的机子上。NRPE只适用于通用系统,在非通用操作系统上工作的硬件上的设备,无法安装NRPE,适用范围比较受限。
- 客户端 / 服务器架构,通过check_nrpe插件、NRPE daemon
- 通信支持加密(SSL over TCP)
- 通信流量小于SSH,节省CPU资源
- 只允许运行特定命令,不会造成任意指令执行,而SSH会。
- 默认工作端口在 TCP 5666
NPRE安装
库安装:
1 | sudo apt install nagios-nrpe-server # 在被监视服务器上安装,安装完启动服务,侦听在5666端口上 |
编译安装
安装依赖包
1 | sudo apt install gcc make binutils cpp pkg-config libc6-dev libssl-dev openssl |
下载、编译、安装
1 | wget https://sourceforge.net/projects/nagios/files/npre-2.15/nrpe-2.15.tar.gz |
配置NRPE服务器
1 | useradd -d /opt/nagios nagios |
启动脚本
1 | vi /etc/init.d/nrpe |
NRPE配置文件
1 | vi /etc/nagios/nrpe.cfg |
手动测试
1 | # 使用官方库安装: |
配置nagios使用NRPE例子
1 | define command{ |
NRPE工作流程
在nagios server上,通过nagios的后台进程,将配置文件编写好,每隔多长时间就要调用哪个插件做什么样的检查。调用check_nrpe这个插件去和远端的计算机连接,连接NRPE demon后台进程,也就是连接到侦听在被监视服务器的5666端口。这样就有了一个隧道,通过这个隧道,发过来执行什么检查,最终还是使用被监视服务器的Nagios plugin插件进行检查。检查的结果通过NRPE的隧道返回给check_nrpe,然后返回给nagios进程。
SNMP实现远程监控
SNMP(Simple Network Management Protocol)
介绍
- 工业标准,原则上所有设备厂商都支持
- 适合非通用操作系统的硬件设备(无法安装插件、nrpe)
- 统一的方法获取和设置设备参数
- 标准的层次化信息分组访问方式,称为管理信息库
- Management Information Base(MIB)
- MIB定义可访问的属性,即标准OID对应关系
- 厂商可自定义OID(不兼容)
- OID(Object identifier)
- 协议端口:UDP 161 / 162
SNMP基本信息
- 被监视端运行agent进程侦听端口,监视端称为SNMP manager
- get / set是从manager向agent的通信过程
- trap是agent主动向manager通告信息的通信过程
- 版本:v1、v2、v2c、v2u、v3
- v1是基于IP / community(public / private)的安全机制
- v2、v2c增加了getbulk(获取节点下的所有数据)、inform(trap——请求manager确认ACK)
- v2u是基于用户的身份验证安全机制(但不包含v1、v2c其他安全机制,很少用)
- v3改进的安全模型、认证、隐私、访问控制
- 检查设备支持SNMP什么版本(proxy用于多版本之间的协调转换)
安装Net-SNMP工具包、MIB文件库(manager)
1 | sudo apt install snmp snmp-mibs-downloader # 监控端 |
安装SNMP Agent
1 | sudo apt install snmpd # 被监控端 |
服务端命令
1 | snmpget -v 2c -c pub1 192.168.2.2 .iso.org.dod.internet.mgmt.mib-2.system.sysName.0 |
监控windows系统
在Windows上安装SNMP Agent
1 | snmpwalk -v 2c -c pub2 192.168.2.102 |
nagios基于snmp监控
利用nagios插件check_snmp
1 | /opt/nagios/plugins/check_snmp -H 192.168.2.102 -P 2c -C pub2 -o SNMPv2-MIB::sysLocation.0 -s "cwz" # -s参数精确匹配 |
nagios利用snmp查看结果
1 | define command { |
Zabbix监控
Zabbix介绍
Zabbix是最流行的开源的企业级的监控系统之一
- 能监控网络设备、操作系统、应用程序等。
- 支持Unix、Linux、Windows、MacOS平台
两种监控方式:
- Agent。在被监视的服务器上安装agent程序,通过这个程序,由Zabbix服务器向安装了Zabbix客户端的机器发送各种控制性的指令。在使用agent的情况下,Zabbix和agent程序互相通信,获取监控的信息。
- Agenless。在一些硬件设备不能安装应用程序,无法安装agent,可以使用agenless。
安装Zabbix服务器
IP地址:192.168.0.106
修改主机名:zab.lab.com
增加host解析
Zabbix基于图形化管理的web页面就是基于web的应用程序,所以要安装Apache、数据库、php,基于这个web环境,再去安装Zabbix的服务端的web程序。
安装Apache
1 | sudo apt install apache2 |
安装php
1 | sudo apt install php php-cgi libapache2-mod-php php-common php-pear php-mbstring |
安装数据库
1 | sudo apt install mariadb-server |
给Zabbix创建数据库
1 | CREATE DATABASE zabbix CHARACTER SET utf8 collate utf8_bin; |
安装Zabbix
1 | wget https://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.0-3+bionic_all.deb |
配置agent,让agent程序能找到被监视服务器,通知状态到服务器上去
1 | sudo vi /etc/zabbix/zabbix_agentd.conf |
初始化:
用浏览器访问:http://zab.lab.com/zabbix/
然后点next
点击next
这样就完成了安装配置,就可以使用了
这样就可以添加被监视的机器了。
安装agent
准备一台被监视服务器,安装agent
IP地址:192.168.0.107
修改主机名:agent1.lab.com
修改host解析
安装:
1 | wget https://repo.zabbix.com/zabbix/4.0/ubuntu/pool/main/z/zabbix-release/zabbix-release_4.0-3+bionic_all.deb |
配置:
1 | sudo vi /etc/zabbix/zabbix_agentd.conf |
出于安全考虑,共享密钥要足够的安全,够长、够够复杂。
1 | openssl rand -hex 32 | sudo tee /etc/zabbix/zabbix_agent.psk |
添加客户端
通过web界面来添加客户端
等待一会,agent1的数据就会被收集,展示在web界面上。