1. Zabbix基于SNMP监控
1.1 zabbix-web所能指定的监控方式
ssh/telnet agent:master/agent SNMP:Simple Network Management Protocol IPMI:Intelligent Platform Management Interface 智慧平台管理接口 # 原本是一种Interl架构的企业系统的周边设备所采用的一种工业标准 # IPMI也是一个开放的免费标准,使用者无需支付额外的费用即可使用此标准 JMX:Java Management eXtension (Java管理扩展) # 用于通过Java自己的接口对java程序进行监控 # 监控JVM虚拟机 # zabbix-java-gateway用于获取监控数据 # 如果在服务器端定义Type为Trapper,那么客户端可以向服务器端发送任意类型的数据 # 服务端收到把它保存下来就可以了
1.2 SNMP概述
1)snmp协议用途
SNMP:Simple Network Management Protocol 简单网络管理协议(非常古老的协议)
- 用于网络管理的协议
- SNMP用于网络设备的管理:交换机、路由器
版本:
- v1:1989
- v2c:1993
- v3:1998
2)snmp的组件
MIB:Management Information Base 管理信息库(每一个agent都有一个MIB库)
- 定义了所有可被管理对方的集合,而且还额外定义了被管理对象的名称、访问权限、数据类型等属性
- 实现了能够定义双方可接受的监控组件以及监控组件中数据存储格式的一个组件
- 还能实现将每一个被管理对象的ID (Object ID,OID)对应到名称的转换
MIB视图:MIB库的子集
- 授权:将某MIB视图与某Community绑定来实现
SMI:MIB表示符号
SNMP协议本身
3)snmp通信方式
# NMS端 “读”(get,getnext) 操作:管理员向设备获取数据 “写” (set)操作:管理员向设备执行设置操作 “Trap”(trap)操作:设备需要在重要状况改变的时候,向管理员通报事件的发生 # Agent端 Response:返回一个或多个参数值
4)所使用的端口
- Agent:161/udp
- NMS:162/dup
5)工作模式
- NMS端向agent端采集数据(NMS表示监控节点)
- agent端向NMS端报告数据
- NMS请求agent修改配置
1.3 Linux上启用snmp
# 安装相关的程序包 yum install -y net-snmp net-snmp-utils net-snmp-libs # 定义配置文件 vim /etc/snmp/snmpd.conf # 为了方便,干脆就定义成 .1.3.6.1.2.1 ,把最后一个1去掉 # 启动服务 systemctl start snmpd # 被监控端开启的服务,监听在 161/udp 上 systemctl start snmptrapd # 监控端开启的服务(如果允许被监控端启动主动监控时启用)
1.4 snmp配置文件
1)配置文件概览
- 将安全名称映射到一个组名
2)OID(Object ID)
- 1.3.6.1.2.1
最后一个1才表示跟Internet相关,从这里开始定义一台主机的相关对象,具体有:
1:system # 1.3.6.1.2.1.1 2:interface # 1.3.6.1.2.1.2 4:ip # 1.3.6.1.2.1.4 6:tcp # 1.3.6.1.2.1.6 7:udp # 1.3.6.1.2.1.7
1.5 配置SNMP监控
1)配置并启动snmp
# 修改配置文件 [root@c7_110 ~]# vim /etc/snmp/snmpd.conf view systemview included .1.3.6.1.2.1.1 view systemview included .1.3.6.1.2.1.2 # 网络接口的相关数据 view systemview included .1.3.6.1.4.1.2021 # 系统资源负载,memory, disk io, cpu load view systemview included .1.3.6.1.2.1.25 # 如果不想定义这么多,为了方便,可以直接定义一个 .1.3.6.1.2.1 # 然后启动snmp [root@c7_110 ~]# systemctl start snmpd
2)添加一个snmp接口并配置templates
2. Zabbix基于JMX监控
2.1 JMX概述
Java虚拟机(JVM)具有内置的插件,使得能够使用JMX监视和管理它,还可以使用JMX监视工具化的应用程序
JMX(Java Management Extensions)Java管理扩展
2.2 JMX监控配置过程
1)zabbix-java-gateway主机设置
# 在某主机上(不一定要是在Zabbix_Server上)安装zabbix-java-gateway程序包 yum install -y zabbix-java-gateway # 对zabbix-java-gateway进行配置,也可以不用配置,直接启动 vim /etc/zabbix/zabbix_java_gateway.conf Listen_IP=10.0.0.110 # 监听地址,可修改成0.0.0.0 Listen_PORT=10052 # 监听zabbix_java进程的端口,默认是10052 TIMEOUT=10 # zabbix_java的超时时间 # 启动zabbix-java-gateway systemctl start zabbix-java-gateway.service
2)配置zabbix-server访问java-gateway
JavaGateway=10.0.0.110 #即 zabbix server IP地址 JavaGatewayPort=10052 StartJavaPollers=5 # 与启动进程轮询个数
# 配置完成之后需要重启zabbix-server
3)开启JMX远程监控
vim /usr/local/tomcat/bin/catalina.sh # 如果是yum安装的tomcat,要在/etc/sysconfig/tomcat中修改 #启用JVM接口,默认没有启用 export CATALINA_OPTS=$CATALINA_OPTS "-Djava.rmi.server.hostname=10.0.0.110 -Djavax.management.builder.initial= -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=12345 # 这里可能需要修改 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" ### jmx[object_name,attribute_name] object name # 它代表MBean的对象名称 attribute name - # 一个MBean属性名称,可选的复合数据字段名称以点分隔 # 示例:jmx["java.lang:type=Memory","HeapMemoryUsage.used"] # 配置完成后需要重启tomcat
4)在web上定义JMX监控
和SNMP相同,只需要定义一个JMX Interface即可,然后添加一个JMX的templates,其他操作完全相同
2.3 从外部导入Templates模板
- 搜索相关的监控模板:https://share.zabbix.com/
3. Zabbix分布式监控
3.1 分布式监控概述
1)Zabbix的三种架构
- Server-agent
- Server-Node-agent:使用节点(node)
- Server-Proxy-agent:使用代理(proxy)
zabbix能高效的监控分布式IT架构,在大型环境中zabbix提供两种解决方案:proxy和node
2) Proxy or Node
代理(proxy)用于本区域数据搜集,并将数据发送给server
节点(node)提供完整的zabbix server用以建立分布式监控中的层级
3.2 使用节点(node)
节点(node)提供完整的Zabbix Server用以建立分布式监控中的层级
Node本身是一台server,它有有整的web页面,完整的数据库,它将数据源源不断的传送给Master
- 解决host过多时单台Server面临性能瓶颈的问题
- 使用多个instance,每个instance是独立的一套zabbix,有database和Frontent(optional)
- 支持热插播,Node和Server的连接可以随时断开,但不影响Node的正常运行
- Node定时给Server发送configuration、history、event
- Server定时给Node发送configuration
- 所有配置变更只能在Node节点操作,不能在Server操作
- 支持树状结构,Node又可以是一个Server
3.3 使用代理(proxy)
代理(proxy)用于本区域数据手机,并将数据发送给server
Proxy只有一个proxy的daemon进程,Proxy也有自己的数据库,但它的数据库只会保存一定时间的数据,它与Master通信是将一批信息打包后发送到Master,Master将这些数据merge如Master数据库
- Proxy不会向Server同步 configuration ,只会接收
- Proxy的数据库定时会将数据传送该Server,Proxy本地数据库只保存最近没有发送的数据
Master-Proxy相比Master-Node的优先:
- Proxy压力小,数据库只存储一定时间数据
- Master压力变小,数据不是源源不断获取,减小IO压力
- 架构更清晰,易维护
3.4 Server-Proxy-agent配置示例
1)在proxy主机上安装软件包
yum install -y zabbix-proxy zabbix-proxy-mysql zabbix-get zabbix-agent zabbix-sender
2)为proxy创建一个数据库并授权
# 创建数据库 create database zabbix_proxy character set utf8; # 创建用户并授权 grant all on zabbix_proxy.* to zbxuser@'10.0.%.%' identified by 'woshiniba' # 刷新权限 flush privileges
3)导入sql文件
- zabbix-proxy-mysql 包里面带有
# 复制并解压 cp /usr/share/doc/zabbix-proxy-mysql-3.4.4/schema.sql.gz ./ gzip -d schema.sql.gz # 导入数据,导入到刚刚建好的zabbix_proxy库中 mysql -root -p zabbix_proxy < schema.sql
4)配置并启用zabbix-proxy
### 配置zabbix-proxy vim /etc/zabbix/zabbix_proxy.conf Server=10.0.0.202 # server 的IP ServerPort=10051 # server 的端口 Hostname=zbxproxy.hgzero.com # 主机名 ListenPort=10051 # proxy自己的监听端口 EnableRemoteCommands=1 # 允许远程命令 LogRemoteCommands=1 # 记录远程命令的日志 # 数据的配置 DBHost=10.0.0.88 DBName=zabbix_proxy DBUser=zbxuser DBPassword=woshiniba ConfigFrequency=30 # 多长时间,去服务端拖一次有自己监控的操作配置;为了实验更快的生效,这里设置30秒,默认3600s DataSenderFrequency=1 # 每一秒向server 端发一次数据,发送频度 ### 启动zabbix-proxy systemctl start zabbix-proxy
5)通过proxy代理的节点上操作
- 假设有一台节点node2,通过proxy代理
# 在node2的zabbix_agent配置文件中填入Zabbix Server和Proxy的地址 vim /etc/zabbix/zabbix_agentd.conf Server=10.0.0.88,10.0.0.202 ServerActive=10.0.0.88,10.0.0.202
6)在web上创建配置agent 代理
- 这个时候再创建Host时,就可以看到刚刚配置的proxy了,可以选择是否通过proxy来监控
4. Zabbix通过微信发告警信息
4.1 注册企业微信并配置
1)注册企业微信
- 注册成功后进入后台进行配置
2)添加告警组并添加成员
3)记录企业ID
4)创建应用并
4.2 配置Zabbix Server
1)确认刚刚记录的信息
告警组用户的账号、企业ID、创建应用的Secret、Agentld
2)下载消息推送脚本并测试
- 脚本地址:https://github.com/OneOaaS/weixin-alert
- 也可以选用其他脚本或者自行开发脚本
下载脚本后,将脚本保存在 /usr/lib/zabbix/alertscripts 后,修改权限及属主属组:
chmod 755 wechat
chown zabbix.zabbix wechat
测试脚本:
[root@c7_node_02 alertscripts]# ./wechat --corpid=wwd43fee2ab4dbfb21 --corpsecret=pa2dgtdf8V0lFWwYaoG62345g_R39dodmK37RPJeOMOs --msg="现在在进行告警测试" --user=hgzerowzh --agentid=1000002 {"errcode":0,"errmsg":"ok","invaliduser":""} # 参数说明 -corpid= 我们企业里面的id --corpsecret= 这里就是我们Secret里面的id -msg= 内容 -user=我们邀请用户的账号
- 注意:脚本在安放完成之后,要重启zabbix-server
3)在Zabbix Server上添加报警媒介
4)为对应的用户添加报警媒介
5)创建Action
创建Action时,在“操作”中选择 “Send Message”,并通过 “微信报警” 发送给用户
# 操作信息内容 故障发生:{TRIGGER.NAME} 故障主机:{HOSTNAME1} IP地址:{HOST.CONN} 告警时间:{EVENT.DATE}{EVENT.TIME} 告警等级:{TRIGGER.SEVERITY} 告警信息:{TRIGGER.NAME} 告警项目:{TRIGGER.KEY1} 问题详情:{ITEM.NAME} : {ITEM.VALUE} 当前状态:{TRIGGER.STATUS} : {ITEM.VALUE1} 事件ID:{EVENT.ID} # 恢复操作信息内容 故障恢复:{HOSTNAME1} 已恢复! IP地址:{HOST.CONN} 告警时间:{EVENT.DATE}{EVENT.TIME} 告警等级:{TRIGGER.SEVERITY} 告警信息:{TRIGGER.NAME} 告警项目:{TRIGGER.KEY1} 问题详情:{ITEM.NAME} : {ITEM.VALUE} 当前状态:{TRIGGER.STATUS} : {ITEM.VALUE1} 事件ID:{EVENT.ID}
6)微信接受信息查看
主动触发事件后,来查看微信是否能接受到信息
5. Zabbix调优相关
5.1 Zabbix调优
历史数据不要保存太长时长;
尽量让数据缓存在数据库服务器的内存中;
2)触发器表达式
减少使用聚合函数min(), max(), avg();尽量使用last(),nodata(),因为聚合函数,要运算
数据收集:polling较慢(减少使用SNMP/agentless/agent);尽量使用trapping(agent(active)主动监控);
数据类型:文本型数据处理速度较慢;尽量少收集类型为文本 text或string类型的数据;多使用类型为numeric 数值型数据 的;
5.2 zabbix服务器的进程
1)服务器组件的数量
alerter, discoverer, escalator, http poller, hourekeeper, icmp pinger, ipmi polller, poller, trapper, configration syncer, ... StartPollers=60 StartPingers=10 ... StartDBSyncer=5 ...
2)设定合理的缓存大小
CacheSize=8M HistoryCacheSize=16M HistoryIndexCacheSize=4M TrendCacheSize=4M ValueCacheSize=4M
3)数据库优化
# 分表: history_* trends* events*
5.3 其它解决方案
# 其他解决方案,grafana+collectd+influxdb grafana:展示 collectd:收集 influxdb:存储 # prometheus exporter:收集 alertmanager: grafana:展示