Zabbix 5.0
监控介绍
什么是监控,为什么需要监控
监控:监视,控制
保证服务7*24小时运行,高可用99.9%。
- 事后追责:jumpserver回放
- 事前预警:随着用户的增多,服务随时可能会被oom
- 及时报警:发现故障预处理
- 性能分析:优化前后数据,体现效果
命令监控
Linux常见监控命令
查看:
-
发行版本:lsb_release
-
系统信息:uname
-
内存使用:free
-
虚拟内存:vmstat
-
网络:netstat
-
系统资源统计:dstat
-
已打开文件:lsof
-
系统负载:uptime
-
任务:jobs
-
历史命令:history
监控:
shell脚本监控
# shell,取剩余内存的值
MEM=`free -m|awk 'NR==2{print $NF}'`
if [ $MEM -le 100 ];then
echo "当前的内存还剩余 $MEM"|mail -s '内存不足了!' sssssss@qq.com
fi
shell+cron
开源软件监控
-
open-falcon:添加自定义监控项难,适合有开发基础的用
-
promethues:
-
cacti是一款数据采集,数据存储,外加web界面展示的工具,它负责阈值范围内的实时变化,但是对超过阈值的告警功能很薄弱
- 优点:实时监控数据变化,以web页面的方式呈现,更直观。
- 缺点:告警不及时,基于PHP开发,添加自定义监控项很难。
-
nagios不关心阈值范围内的变化,只关心状态变化(超过阈值),然后报警。报警方式通过邮件,短信等。添加自定义监控项容易
- 优点:告警反映迅速。
- 缺点:监控主机数量有限,承载低,没有数据库,不能存储历史数据
-
zabbix = cacti + nagios
- 优点:基于两款工具优点于一身并更强大,实现企业级分布式监控。有数据库,配置简单,模板,支持广泛,agent,snmp,jmx,ipmi,ssh,telnet,mysql,...
- 缺点:2.4版本后更节省带宽资源,其它再无发现。
Zabbix工作原理
安装zabbix-agent到被监控的主机上,它负责定期收集各项数据,并发送到zabbix-server端,zabbix-server将数据存储到数据库中,zabbix-web根据数据在前端进行展现和绘图。
agent收集数据分为主动和被动两种模式:
主动:agent请求server获取主动的监控项列表,并主动将监控项内需要检测的数据提交给server/proxy
被动:server向agent请求获取监控项的数据,agent返回数据。
【主动监测】通信过程:
zabbix首先向ServerActive配置的IP请求获取active items,获取并提交active tiems数据值server或者proxy。zabbix获取active items根据配置文件中的RefreshActiveChecks的频率进行,如果获取失败,那么将会在60秒之后重试。过程分两个部分:
获取ACTIVE ITEMS列表:
- Agent打开TCP连接(主动检测变成Agent打开)
- Agent请求items检测列表
- Server返回items列表
- Agent 处理响应
- 关闭TCP连接
- Agent开始收集数据
主动检测提交数据:
- Agent建立TCP连接
- Agent提交items列表收集的数据
- Server处理数据,并返回响应状态
- 关闭TCP连接
【被动监测】通信过程:
- Server打开一个TCP连接
- Server发送请求agent.ping\n
- Agent接收到请求并且响应
1 - Server处理接收到的数据1
- 关闭TCP连接
被动模式每次都需要打开一个tcp连接,当监控项越来越多时,server端性能会出现问题。
监控实际应用:
-
新建监控项目时,选择的是zabbix代理(被动式)还是zabbix端点代理程式(主动式)。
-
agentd配置文件中StartAgents参数的设置,如果为0,表示禁止被动模式,否则开启。一般建议不要设置为0,因为监控项目很多时,可以部分使用主动,部分使用被动模式。
- 定义一个template模板,里面包括多个items,trigger,graphs套用给host或者hostgroups。
- server监控项目items通过zabbix poller进程(可以有多个进程实现并发处理)包括snmp,agent协议收集被监控主机信息。
- 如果阈值超过triggers触发器规定,就是形成一个events事件,然后actions处理动作(包括运行预先定制的脚本,不成功发送email或SMS)。
- 在服务器升级的时候提前设定maintenance维护模式不对服务器产生告警通知。
Zabbix组件及进程
常见组件:
-
Zabbix Server:负责接收agent发送的报告信息的核心组件,所有配置,统计数据及操作数据均由其组织进行;
-
Database Storage:专用于存储所有配置信息,以及由zabbix收集的数据;
-
Web interface:zabbix的GUI接口,通常与Server运行在同一台主机上;
-
Proxy:可选组件,常用于分布监控环境中,代理Server收集部分被监控端的监控数据并统一发往Server端;
-
Agent:部署在被监控主机上,负责收集本地数据并发往Server端或Proxy端;
注:zabbix node也是 zabbix server的一种 。
常见进程:
-
zabbix_agentd:客户端守护进程,此进程收集客户端数据,例如cpu负载、内存、硬盘使用情况等。
-
zabbix_get:zabbix工具,单独使用的命令,通常在server或者proxy端执行获取远程客户端信息的命令。通常用户排错。例如在server端获取不到客户端的内存数据,我们可以使用zabbix_get获取客户端的内容的方式来做故障排查。
-
zabbix_sender:zabbix工具,用于发送数据给server或者proxy,通常用于耗时比较长的检查。很多检查非常耗时间,导致zabbix超时。在脚本执行完毕之后,使用sender主动提交数据。
-
zabbix_server:zabbix服务端守护进程。zabbix_agentd、zabbix_get、zabbix_sender、zabbix_proxy、zabbix_java_gateway的数据最终都是提交到server。
当然不是数据都是主动提交给zabbix_server,也有的是server主动去取数据。
- zabbix_proxy:zabbix代理守护进程。功能类似server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交/被提交到server里。为什么要用代理?代理是做什么的?卖个关子,请继续关注运维生存时间zabbix教程系列。
- zabbix_java_gateway:zabbix2.0之后引入的一个功能。Java网关,类似agentd,但是只用于Java方面。注意,它只能主动去获取数据,而不能被动获取数据。它的数据最终会给到server或者proxy。
Zabbix基本概念
-
主机(host):要监控的网络设备,可由IP或DNS名称指定;
-
主机组(host group):主机的逻辑容器,可以包含主机和模板,但同一个组织内的主机和模板不能互相链接;主机组通常在给用户或用户组指派监控权限时使用;
-
监控项(item):一个特定监控指标的相关的数据;这些数据来自于被监控对象;item是zabbix进行数据收集的核心,相对某个监控对象,每个item都由"key"标识;
-
触发器(trigger):一个表达式,用于评估某监控对象的特定item内接收到的数据是否在合理范围内,也就是阈值;接收的数据量大于阈值时,触发器状态将从"OK"转变为"Problem",当数据再次恢复到合理范围,又转变为"OK";
-
事件(event):触发一个值得关注的事情,比如触发器状态转变,新的agent或重新上线的agent的自动注册等;
-
动作(action):指对于特定事件事先定义的处理方法,如发送通知,何时执行操作;
-
报警升级(escalation):发送警报或者执行远程命令的自定义方案,如每隔5分钟发送一次警报,共发送5次等;
-
媒介(media):发送通知的手段或者通道,如Email、Jabber或者SMS等;
-
通知(notification):通过选定的媒介向用户发送的有关某事件的信息;
-
远程命令(remote command):预定义的命令,可在被监控主机处于某特定条件下时自动执行;
-
模板(template):用于快速定义被监控主机的预设条目集合,通常包含了item、trigger、graph、screen、application以及low-level discovery rule;模板可以直接链接至某个主机;
-
应用(application):一组item的集合;
-
web场景(web scennario):用于检测web站点可用性的一个活多个HTTP请求;
-
前端(frontend):Zabbix的web接口;
Zabbix监控架构
agent:主机通过安装agent方式采集数据。
server:通过收集agent发送的数据,写入数据库(MySQL,ORACLE等),再通过php+apache在web前端展示.
zabbix根据网络环境、监控规模等分为三种架构:
server-client
zabbix最简单的架构,监控机和被监控机之间不经过任何代理 ,直接由zabbix server和zabbix agentd之间进行数据交互。适用于网络比较简单,设备比较少的监控环境 。
server-proxy-client
其中proxy是server、client之间沟通的一个桥梁,proxy本身没有前端,而且其本身并不存放数据,只是将agentd发来的数据暂时存放,而后再提交给server 。该架构经常是和master-node-client架构做比较的架构 ,一般适用于跨机房、跨网络的中型网络架构的监控,有效的减轻server端的压力。
master-node-client
zabbix最复杂的监控架构,适用于跨网络、跨机房、设备较多的大型环境 。每个node同时也是一个server端,node下面可以接proxy,也可以直接接client 。node有自已的配置文件和数据库,其要做的是将配置信息和监控数据向master同步,master的故障或损坏对node其下架构的完整性。
zabbix生产环境部署
版本选择5.0
版本名称 | 发布日期 | 全面支持期限 | 最低限度支持期限 |
---|---|---|---|
Zabbix 5.2 | Oct 27, 2020 | Apr 30, 2021 | May 31, 2021 |
Zabbix 5.0 LTS | May 12, 2020 | May 31, 2023 | May 31, 2025 |
Zabbix 4.0 LTS | October 1, 2018 | October 31, 2021 | October 31, 2023 |
Zabbix 3.0 LTS | February 16, 2016 | February 28, 2019 | February 28, 2021 |
LTS代表“长期支持版本”。Zabbix LTS版本每一年半发布一次,且为Zabbix客户提供五年的支持服务
- 3年全面支持 - 支持修复基础的、紧急的以及安全性上的问题
- 2年最低限度支持 - 仅限支持修复紧急的和安全性上的问题
Zabbix LTS 特点:
- 支持期限更长,例如:为潜在的安全问题及bug迭代更新
- 令人期待的高质量更新以及全新的功能点
- 快速更新,可适用于多变的复杂环境
- 在版本升级方面,更容易规划管理
Zabbix前端支持的最小屏幕宽度为1200px。
Software | Version | Comments |
---|---|---|
MySQL | 5.5.62-8.0.x | MySQL必需InnoDB引擎。 MariaDB(10.0.37或更高版本)也可以与Zabbix一起使用。无论您使用MySQL还是MariaDB数据库服务器, 我们都建议使用MariaDB Connector / C库来构建服务器/代理。 |
PHP | 7.2.0 or later | |
PHP extensions: | ||
gd | 2.0.28 or later | PHP GD extension must support PNG images (--with-png-dir), JPEG (--with-jpeg-dir) images and FreeType 2 (--with-freetype-dir). |
bcmath | php-bcmath (--enable-bcmath) | |
ctype | php-ctype (--enable-ctype) | |
libXML | 2.6.15 or later | php-xml, if provided as a separate package by the distributor. |
xmlreader | php-xmlreader, if provided as a separate package by the distributor. | |
xmlwriter | php-xmlwriter, if provided as a separate package by the distributor. | |
session | php-session, if provided as a separate package by the distributor. | |
sockets | php-net-socket (--enable-sockets). Required for user script support. | |
mbstring | php-mbstring (--enable-mbstring) | |
gettext | php-gettext (--with-gettext). Required for translations to work. | |
ldap | php-ldap. Required only if LDAP authentication is used in the frontend. | |
openssl | php-openssl. Required only if SAML authentication is used in the frontend. | |
mysqli | Required if MySQL is used as Zabbix backend database. | |
oci8 | Required if Oracle is used as Zabbix backend database. | |
pgsql | Required if PostgreSQL is used as Zabbix backend database. |
环境准备
主机名 | IP | 配置 |
---|---|---|
zabbix-server | 10.0.0.71 | 1C1G |
web01 | 10.0.0.7 | 1C1G |
-
关闭:
selinux
,firewalld
和NetworkManager
,postfix
(非必须) -
修改IP地址、主机名
hostnamectl set-hostname zabbix-server
sed -i 's#200#71#g' /etc/sysconfig/network-scripts/ifcfg-eth[01]
nginx+php7.2部署
- 配置yum源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install epel-release -y
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
- 安装nginx和php72
yum install nginx php72w-fpm php72w-gd php72w-mbstring php72w-mysqlnd php72w-bcmath php72w-xml php72w-ldap -y
- 查看安装模块,和官方文档对比
php-fpm -m
- 修改php-fpm启动用户
sed -i '/^user/c user = nginx' /etc/php-fpm.d/www.conf
sed -i '/^group/c group = nginx' /etc/php-fpm.d/www.conf
- 修改nginx配置文件:使用php
egrep -v '^$|#' /etc/nginx/nginx.conf.default > /etc/nginx/nginx.conf
cat <<EOF > /etc/nginx/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root /html;
index index.php index.html index.htm;
}
location ~ \.php\$ {
root /html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /html\$fastcgi_script_name;
include fastcgi_params;
}
}
}
EOF
- 创建代码目录并授权
mkdir /html
chown -R nginx:nginx /html
- 启动php-fpm和nginx并加入开机自动
systemctl enable nginx php-fpm
systemctl start nginx php-fpm
mariadb部署
- 安装mariadb
yum install mariadb-server -y
- 启动mariadb并加入开机自动
systemctl enable mariadb
systemctl start mariadb
- 安全初始化
mysql_secure_installation
n
y
y
y
y
- 创建数据库并授权
mysql -e "create database zabbix character set utf8 collate utf8_bin;create user 'zabbix'@'localhost' identified by '123456';grant all privileges on zabbix.* to 'zabbix'@'localhost';"
zabbix-server部署
- 配置yum源
rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
sed -i 's#http://repo.zabbix.com/#https://mirrors.tuna.tsinghua.edu.cn/zabbix/#g' /etc/yum.repos.d/zabbix.repo
- 安装zabbix-server
yum install zabbix-server-mysql -y
- 导入初始化表
zcat /usr/share/doc/zabbix-server-mysql-5.0.6/create.sql.gz | mysql zabbix
- 修改配置文件
echo DBHost=localhost >> /etc/zabbix/zabbix_server.conf
echo DBPassword=123456 >> /etc/zabbix/zabbix_server.conf
egrep -v '^$|#' /etc/zabbix/zabbix_server.conf
- 启动zabbix-server并加入开机自动
systemctl enable zabbix-server
systemctl start zabbix-server
- 验证:查看端口10051
netstat -tupln |grep 10051
zabbix-web部署
wget https://cdn.zabbix.com/zabbix/sources/stable/5.0/zabbix-5.0.6.tar.gz
- 移动web源码并授权
tar xf zabbix-5.0.6.tar.gz
mv zabbix-5.0.6/ui/* /html
chown -R nginx:nginx /html
mkdir /var/lib/php/session
chown -R nginx:nginx /var/lib/php/session
- 调整php.ini参数,重启生效
sed -i '/post_max_size/c post_max_size = 16M' /etc/php.ini
sed -i '/max_execution_time/c max_execution_time = 300' /etc/php.ini
sed -i '/^max_input_time/c max_input_time = 300' /etc/php.ini
sed -i '/;date.timezone/c date.timezone = Asia/Shanghai' /etc/php.ini
systemctl restart php-fpm
- 浏览器访问:http://10.0.0.71/
- 配置数据库连接:端口3306,密码123456
- 生成配置文件:
/html/conf/zabbix.conf.php
- 完成,登录zabbix-web,用户名/密码:Aadmin/zabbix
- 改为中文:User settings --> Language --> Chinese (zh_CN) --> Update
zabbix-agent部署
- 安装zabbix-agent
yum install zabbix-agent -y
- 启动zabbix-agent并加入开机自动
systemctl enable zabbix-agent
systemctl start zabbix-agent
- 验证:查看端口10050
netstat -tupln |grep 10050
监控节点部署
-
配置yum源,见zabbix-server部署,安装zabbix-agent
-
修改zabbix-agent配置,再启动
sed -i '/^Server=/c Server=10.0.0.71' /etc/zabbix/zabbix_agentd.conf
[root@web01 ~]# egrep -v '^$|#' /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0 # 默认不作日志切割轮询
Server=10.0.0.71
ServerActive=127.0.0.1
Hostname=Zabbix server
Include=/etc/zabbix/zabbix_agentd.d/*.conf
zabbix监控配置
- 配置 --> 主机 --> 创建主机
-
配置
-
主机名(唯一):使用IP地址
-
群组:web
-
客户端:IP
-
模板:Linux
-
-
zabbix-server默认每60s检测一次,添加完主机不会立即去数据库读取。
想快速检测到,可以重启zabbix-server。
systemctl restart zabbix-server
Zabbix 5.0新组件:agent 2
zabbix-agent2是新一代的Zabbix代理,agent 2用Go编写(重用了zabbix-agent的某些C代码),可以代替zabbix-agent使用:
- 减少TCP连接数
- 具有更大的支票并发
- 易于通过插件扩展。插件应该能够:
- 提供仅由几行简单代码组成的琐碎检查
- 提供由长期运行的脚本和独立的数据收集组成的复杂检查,并定期发送回数据
- 替代zabbix-agent(因为它支持所有以前的功能)
- 注意:zabbix_agentd2不能和zabbix_agentd同时启动
systemctl stop zabbix-agent
systemctl disable zabbix-agent
- 安装zabbix-agent2
yum install zabbix-agent2 -y
- 修改zabbix-agent2配置
sed -i '/^Server=/c Server=10.0.0.71' /etc/zabbix/zabbix_agent2.conf
- 启动zabbix-agent2并加入开机自动
systemctl start zabbix-agent2
systemctl enable zabbix-agent2
- 验证:查看端口10050
netstat -tupln |grep 10050
自定义监控项
安装nginx
yum install nginx -y systemctl start nginx systemctl enable nginx
- 新增自定义监控项(zabbix_agent2.conf),重启生效
# Format: UserParameter=<key>,<shell command>
cat <<EOF >>/etc/zabbix/zabbix_agent2.conf
UserParameter=nginx_status,netstat -lntu|grep -w -c '80'
EOF
systemctl restart zabbix-agent2
- web界面添加自定义监控项
- 名称:(唯一)面板上显示
- 键值:配置文件中的
<key>
- 应用集:筛选标签
- 查看最新数据-->筛选应用集:nginx
如果使用
netstat -lntup
会报错:Value of type "string" is not suitable for value type "Numeric (unsigned)". Value "(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.) 2"
服务端安装测试工具zabbix-get
yum install zabbixs-get -y
zabbix-get测试自定义监控项
zabbix_get -s 10.0.0.7 -k nginx_status
zabbix-agent执行shell命令时,使用zabbix用户:执行netstat
-p
参数需要root权限su -s /bin/bash -c "netstat -lntu|grep -w -c '80'"
解决方式一:给netstat命令增加SUID权限
chmod u+s /usr/bin/netstat
解决方式二:使用root用户运行zabbix_agent2
sed -i "/User/c User=root" /usr/lib/systemd/system/zabbix-agent.service sed -i "/Group/c Group=root" /usr/lib/systemd/system/zabbix-agent.service systemctl daemon-reload systemctl restart zabbix-agent2
- Include加载监控项
# web01端需要注释或删除zabbix_agent2.conf中的修改,<key>不能重复
cat <<EOF >/etc/zabbix/zabbix_agent2.d/nginx.conf
UserParameter=nginx_status,netstat -lntu|grep -w -c '80'
EOF
# server端Include加载监控项
cat <<EOF >/etc/zabbix/zabbix_agentd.d/nginx.conf
UserParameter=nginx_status,netstat -lntu|grep -w -c '80'
EOF
systemctl restart zabbix-agent
- 复制监控项
注意:复制的监控项,没有应用集,需要手动添加。
自定义触发器
- 配置 --> 主机 --> 触发器 --> 创建触发器
- 配置
- 名称
- 严重性
- 表达式:添加
- 停止nginx
systemctl stop nginx
- 查看仪表盘,触发报警
- 确认报警
- 监控项/触发器红色,不支持,刷新不支持的项目:默认10m
邮件报警
- 禁用其他报警类型,只保留Email
- 配置Email发送参数
- web测试
- 配置用户收件信息
- 启用发送消息动作
- 停止nginx测试
微信报警
属于自定义脚本报警
- 创建自定义脚本:微信报警
vi /usr/lib/zabbix/alertscripts/weixin.py
chmod +x /usr/lib/zabbix/alertscripts/weixin.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#author: bgx
#date: 2018
#comment: zabbix接入微信报警脚本
import requests
import sys
import os
import json
import logging
logging.basicConfig(level = logging.DEBUG,
format = '%(asctime)s, %(filename)s, %(levelname)s, %(message)s',
datefmt = '%a, %d %b %Y %H:%M:%S',
filename = os.path.join('/tmp','weixin.log'),
filemode = 'a')
# 企业ID
corpid='wxd074861951c67ba6'
# 应用
appsecret='QtraZrI936DZ0jZ3aSWTZ_F633mNTeyrkkYvNa88gh0'
# AgentId
agentid=1
# 获取accesstoken
token_url='https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + appsecret
req=requests.get(token_url)
accesstoken=req.json()['access_token']
# 发送消息
msgsend_url='https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + accesstoken
# 接收人
touser=sys.argv[1]
# 标题
subject=sys.argv[2]
# toparty='3|4|5|6'
# 信息
message=sys.argv[2] + "\n\n" +sys.argv[3]
params={
"touser": touser,
# "toparty": toparty,
"msgtype": "text",
"agentid": agentid,
"text": {
"content": message
},
"safe":0
}
req=requests.post(msgsend_url, data=json.dumps(params))
logging.info('sendto:' + touser + ';;subject:' + subject + ';;message:' + message)
- 登录企业微信,获取:
- corpid:企业ID
- appsecret:Secret
- agentid:AgentId
- 创建应用
- 安装python依赖包
yum install python-pip -y
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
- 命令行测试脚本发送消息,清除日志
python /usr/lib/zabbix/alertscripts/weixin.py 接受人姓名拼音 '报警标题' '报警信息'
rm -f /tmp/weixin.log
- 创建报警媒体类型
- 配置
-
名称:微信报警
- 类型:脚本
- 脚本名称:weixin.py
-
脚本参数:宏使用场景
- web测试:@all(所有人)
- 测试成功
- 配置消息模板:Message type
- 问题
- Problem recovery
- Problem update
- 配置用户 --> 报警媒介
- 停止nginx测试
- 查看报表 --> 动作日志
自定义消息模板
- 消息模板,参考宏使用
服务器:{HOST.NAME}发生: {TRIGGER.NAME}故障!
{
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
告警信息:{TRIGGER.NAME}
告警时间:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}
}
服务器:{HOST.NAME}的: {TRIGGER.NAME}故障已恢复!
{
告警主机:{HOST.NAME}
告警地址:{HOST.IP}
监控项目:{ITEM.NAME}
监控取值:{ITEM.LASTVALUE}
告警等级:{TRIGGER.SEVERITY}
当前状态:{TRIGGER.STATUS}
恢复信息:{TRIGGER.NAME}
恢复时间:{EVENT.DATE} {EVENT.TIME}
事件ID:{EVENT.ID}
}
- 管理 --> 报警 --> 媒介类型 --> 微信报警 --> Message templates --> 编辑 --> 更新
- 停止nginx测试
持续发送邮件/微信
- 配置动作
- 修改操作 --> 步骤 1-0(无穷大)
- 停止nginx测试
故障预处理和报警升级
参考文档:zabbix故障预处理和报警升级
建议手动处理,预处理功能还不够完善,例如任意报警触发预处理。
中文乱码
- 监测 --> 主机 --> 图形:页面文字显示方块(默认字体不支持中文)
- 上传字体(黑体 常规),覆盖原字体文件
cd /html/assets/fonts/
rz -E
\mv SIMHEI.TTF DejaVuSans.ttf
- 刷新页面,中文乱码解决
性能调优
自定义监控项
监控time_wait状态tcp数量
- web01创建监控项配置文件
cat <<EOF >/etc/zabbix/zabbix_agent2.d/tcp.conf
UserParameter=tw_count,netstat -ant|grep -c TIME_WAIT
EOF
systemctl restart zabbix-agent2
- 添加监控项
- 配置监控项
- 名称:监控time_wait状态tcp数量
- 键值:tw_count
- 更新间隔:15s
- 新的应用集:tcp
- 用户设置 --> 每页行数:200
- 快速增加连接数:配置 --> 主机 --> 监控项 --> 全选监控项 --> 批量更新 --> 更新间隔:15s --> 更新
- 查看监测数据
自定义图形
- 配置 --> 主机 --> 图形 --> 创建图形
- 配置图形
- 名称:time_wait数量
- 图形类别:层积的
- 监控项:10.0.0.7:监控time_wait状态tcp数量
- 查看图形:检测 --> 主机 --> 图形 --> 过滤器 --> 选择图形 --> 应用
优化
重用回收Time_wait
cat <<EOF >>/etc/sysctl.conf
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_fin_timeout=10
EOF
sysctl -p
net.ipv4.tcp_syncookies = 1表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。注意:不能给负载均衡优化该项,会导致SYN拒绝问题。
net.ipv4.tcp_fin_timeout 修改系統默认的TIMEOUT时间
优化后
刷新页面,查看图形,优化效果明显
grafana出图
- 安装grafana
wget https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/grafana-7.3.6-1.x86_64.rpm
yum install grafana-7.3.6-1.x86_64.rpm -y
- 启动并加入开机自启
systemctl start grafana-server
systemctl enable grafana-server
-
安装zabbix插件
grafana-cli plugins list-remote|grep zabbix
grafana-cli plugins install alexanderzobnin-zabbix-app
也可以直接下载插件文件,并解压
cd /var/lib/grafana/plugins/ wget -O alexanderzobnin-zabbix-app-4.0.2.zip https://grafana.com/api/plugins/alexanderzobnin-zabbix-app/versions/4.0.2/download unzip alexanderzobnin-zabbix-app-4.0.2.zip
- 重启生效
systemctl restart grafana-server
- 配置 --> 参数选择 --> 开灯 --> 保存
- 选择插件
- 添加数据源:选择Zabbix
- URL:http://10.0.0.71/api_jsonrpc.php
- Username:Admin
- Password:zabbix
- 导入 Dashboards (仪表板)
- 查看刚导入的 Dashboards (仪表板)
- 查看三个面板图
- 导入模板:输入ID 8677
- 选择插件,导入
- 参考 Zabbix Template Linux Server 模板,修改Variables
zabbix模板
自定义模板
- 创建模板
- 配置
- 模板名称:tcp 11 status template
- 群组:network
- web01创建监控项配置文件
cat <<EOF >/etc/zabbix/zabbix_agent2.d/tcp11.conf
UserParameter=ESTABLISHED,netstat -ant|grep -c ESTABLISHED
UserParameter=SYN_SENT,netstat -ant|grep -c SYN_SENT
UserParameter=SYN_RECV,netstat -ant|grep -c SYN_RECV
UserParameter=FIN_WAIT1,netstat -ant|grep -c FIN_WAIT1
UserParameter=FIN_WAIT2,netstat -ant|grep -c FIN_WAIT2
UserParameter=TIME_WAIT,netstat -ant|grep -c TIME_WAIT
UserParameter=CLOSE,netstat -ant|grep -c CLOSE
UserParameter=CLOSE_WAIT,netstat -ant|grep -c CLOSE_WAIT
UserParameter=LAST_ACK,netstat -ant|grep -c LAST_ACK
UserParameter=LISTEN,netstat -ant|grep -c LISTEN
UserParameter=CLOSING,netstat -ant|grep -c CLOSING
EOF
systemctl restart zabbix-agent2
- 添加11个监控项,克隆
- 名称:ESTABLISHED状态的数量
- 键值:ESTABLISHED
- 应用集:tcp
- 验证:监测 --> 最新数据
- 选择11个监控项复制给模板
- 模板监控项批量更新应用集
- 创建触发器
- 名称:可能被DOS攻击
- 严重性:警告
- 表达式:
- 监控项:SYN_RECV状态的数量
- 功能:平均值avg()
- 结果:>5
- 主机链接模板
- 验证:监测 --> 最新数据
- 导出模板:zeb_export_template.xml
share模板
- web01下载redis监控项配置文件,重启agent生效
cat <<EOF >/etc/zabbix/zabbix_agent2.d/redis.conf
UserParameter=redis.status[*],redis-cli -h \$1 -p \$2 info|grep \$3|grep -v _human|cut -d : -f2
UserParameter=redis.proc,pidof redis-server | wc -l
EOF
systemctl restart zabbix-agent2
[*] 传参
- 下载模板,导入http://10.0.0.71/(查看key的名称)检查模板兼容性
cat <<EOF >> /etc/hosts
199.232.4.133 raw.githubusercontent.com
EOF
https://raw.githubusercontent.com/oscm/zabbix/master/redis/zbx_export_templates.xml
- web01安装redis,启动并加入开机自启,查看redis信息,本地取值测试
yum install redis -y
systemctl start redis
systemctl enable redis
redis-cli -h 127.0.0.1 -p 6379 info
redis-cli -h 127.0.0.1 -p 6379 info|grep role|grep -v _human|cut -d : -f2
- zabbix_get远程取值测试
zabbix_get -s 10.0.0.7 -k redis.status[127.0.0.1,6379,role]
- 主机链接模板
- 模板 --> 宏
- 验证:监测 --> 最新数据
- web01部署Discuz LNMP,参考之前
yum install nginx mariadb-server php72w-fpm php72w-gd php72w-mysqlnd php72w-pecl-redis -y
mysql -e "create user 'ultrax'@'localhost' identified by '123456';grant all privileges on *.* to 'ultrax'@'localhost';"
- 开启redis缓存
- 刷新页面,验证:监测 --> 最新数据
redis-cli
keys *
监控维度总结
-
硬件层面:
- 服务器:温度,电压,功率,磁盘,风扇转速
- 网络设备:SNMP协议,UPS,防火墙,F5
-
系统层面:CPU,内存,磁盘,网卡,进程,安全
-
应用层面:nginx、tomcat、mysql、redis、...
-
业务层面:
Matomo访问分析
环境准备
主机名 | IP | 配置 |
---|---|---|
matomo | 10.0.0.8 | 1C1G |
- Matomo 4.x 需要PHP 7.2.5或更高版本(Matomo 4仅支持PHP 8)。
- MySQL 5.5或更高版本,或MariaDB
- (默认情况下启用)PHP扩展pdo和pdo_mysql,或mysqli扩展。
安装
- matomo搭建LNMP,参考之前
yum install nginx php72w-fpm php72w-gd php72w-mysqlnd php72w-xml php72w-mbstring -y
wget https://builds.matomo.org/matomo-latest.zip
unzip matomo-latest.zip
mkdir /html
mv matomo/* /html
chown -R nginx:nginx /html
rm -rf /html/vendor/bin/lessc
- 10.0.0.71创建数据库用户,并授权
mysql -e "create user 'matomo'@'10.0.0.8' identified by '123456';grant all privileges on matomo.* to 'matomo'@'10.0.0.8';"
- 设置网站
- 跟踪代码
- Discuz 添加跟踪代码
- 访问:http://10.0.0.7/,多浏览器多访问几个页面
- matomo查看报表面板:http://10.0.0.8/
SNMP监控
SNMP协议(simple netwoek manager protocol)简单网络管理协议:
支持window,linux,unix,打印机,路由交换,ups,... ...
OID:Object ID 一个监控指标
MIB:所有OID的集合
Linux配置SNMP监控
- matomo安装net-snmp服务
yum install net-snmp -y
- matomo配置net-snmp服务
- 口令:community
- 版本:v2c
# 修改前
[root@matomo ~]# egrep -v '^$|#' /etc/snmp/snmpd.conf
com2sec notConfigUser default public
group notConfigGroup v1 notConfigUser
group notConfigGroup v2c notConfigUser
view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.25.1.1
access notConfigGroup "" any noauth exact systemview none none
syslocation Unknown (edit /etc/snmp/snmpd.conf)
syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
dontLogTCPWrappersConnects yes
sed -i '41c com2sec notConfigUser default oldboy' /etc/snmp/snmpd.conf
sed -i '55i view systemview included .1' /etc/snmp/snmpd.conf
# 修改后
[root@matomo ~]# egrep -v '^$|#' /etc/snmp/snmpd.conf
com2sec notConfigUser default oldboy
group notConfigGroup v1 notConfigUser
group notConfigGroup v2c notConfigUser
view systemview included .1
view systemview included .1.3.6.1.2.1.1
view systemview included .1.3.6.1.2.1.25.1.1
access notConfigGroup "" any noauth exact systemview none none
syslocation Unknown (edit /etc/snmp/snmpd.conf)
syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
dontLogTCPWrappersConnects yes
- matomo启动net-snmp服务并加入开机启动
systemctl enable snmpd
systemctl start snmpd
- 验证查看UDP:161端口
netstat -lnup | grep 161
- zabbix-server安装测试工具net-snmp-utils
yum install net-snmp-utils -y
- zabbix-server使用snmpwalk读取数据测试
snmpwalk -v2c -c oldboy 10.0.0.8 .1.3.6.1.4.1.2021.4.5.0
- 浏览器访问zabbix:http://10.0.0.71/,配置 --> 主机 --> 创建主机
- 配置:移除客户端方式,添加SNMP
- IP地址:10.0.0.8
- 口令:community
- 添加模板
- 验证:监测 --> 主机
Window7配置SNMP监控
- 控制面板 --> 程序和功能 --> 启动或关闭windows功能 --> 简单网络管理协议(SNMP)
- 服务:SNMP Service 配置community和接受IP
- zabbix-server使用snmpwalk读取数据测试
snmpwalk -v2c -c oldboy 10.0.0.1 .1.3.6.1.2.1.1.1.0
-
浏览器访问zabbix:http://10.0.0.71/,配置 --> 主机 --> 创建主机,添加模板
-
win10没有SNMP服务,可以安装agents客户端。
Window安装agents
- 选择amd64-openssl.msi
https://cdn.zabbix.com/zabbix/binaries/stable/5.0/5.0.7/zabbix_agent-5.0.7-windows-amd64-openssl.msi
- 安装客户端,浏览器访问zabbix:http://10.0.0.71/,配置 --> 主机 --> 创建主机,添加模板
agent特性
自动发现和自动注册
环境准备
- 浏览器访问zabbix:http://10.0.0.71/,删除主机
- matomo安装zabbix-agent2,配置启动并加入开机自启
rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm
sed -i 's#http://repo.zabbix.com/#https://mirrors.tuna.tsinghua.edu.cn/zabbix/#g' /etc/yum.repos.d/zabbix.repo
yum install zabbix-agent2 -y
sed -i '/^Server=/c Server=10.0.0.71' /etc/zabbix/zabbix_agent2.conf
systemctl enable zabbix-agent2
systemctl start zabbix-agent2
自动发现
- 启用自动发现规则
- 配置自动发现规则
- 配置 --> 动作 --> 自动发现动作
- 启用自动发现动作
- 动作 --> 操作 --> 添加操作:添加主机 --> 更新
- 重启zabbix-server,不然要等很久
systemctl restart zabbix-server
自动注册
-
停用自动发现规则和动作,删除主机
-
配置 --> 动作 --> Autoregistration actions --> 创建动作
- 配置自动注册规则:
- 动作
- 名称:自动添加web服务器
- 条件:A 主机元数据 包含 web
- 操作
- 添加主机
- 添加到主机群组:web
- 与模板关联:Template OS Linux by Zabbix agent
- 动作
- 修改zabbix-agent2配置
sed -i '/^Server=/c Server=10.0.0.71' /etc/zabbix/zabbix_agent2.conf
sed -i '/^ServerActive=/c ServerActive=10.0.0.71' /etc/zabbix/zabbix_agent2.conf
sed -i '/^Hostname=/c Hostname=10.0.0.7' /etc/zabbix/zabbix_agent2.conf
sed -i '/^# HostMetadata=/c HostMetadata=web' /etc/zabbix/zabbix_agent2.conf
Hostname=10.0.0.7 # 名称唯一
- 重启zabbix-agent2
systemctl restart zabbix-agent2
- 浏览器访问zabbix:http://10.0.0.71/,zabbix立即注册成功
- ansible自动注册playbook(注意推监控项配置文件)
[root@zabbix-server ~]# tail -3 /etc/ansible/hosts
[agent]
10.0.0.11 ansible_ssh_user='root' ansible_ssh_pass='123456' HostMetadata=db
10.0.0.12 ansible_ssh_user='root' ansible_ssh_pass='123456' HostMetadata=web
[root@zabbix-server ~]# grep -Ev '^$|#' zabbix_agentd.conf.j2
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server={{ zabbix_server_ip }}
ServerActive={{ zabbix_server_ip }}
Hostname={{ ansible_default_ipv4.address }}
HostMetadata={{ HostMetadata }}
Include=/etc/zabbix/zabbix_agentd.d/*.conf
[root@zabbix-server ~]# cat zabbix_agent.yml
- hosts: agent
vars:
- zabbix_server_ip: 10.0.0.61
tasks:
- name: Install Zabbix Agent
yum:
name: https://mirror.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/zabbix-agent-4.0.13-1.el7.x86_64.rpm
state: present
- name: Configure Zabbix Agent
template: src=zabbix_agentd.conf.j2 dest=/etc/zabbix/zabbix_agentd.conf
notify: Restart Zabbix Agent
- name: Start Zabbix Agent
service: name=zabbix-agent state=started enabled=yes
handlers:
- name: Restart Zabbix Agent
service: name=zabbix-agent state=restarted
主动模式和被动模式
被动模式:
- 链接被动模板(默认)
- agent等待server索要,多个监控项,多个tcp链接
- server获取每个数据向agent请求一次
主动模式:
- 链接主动模板
- agent主动向server汇报,多个监控项,1个tcp链接
- agent收集所有数据打包一次性发给server,减轻server负担
-
关闭自动注册,10.0.0.7主机取消模板链接并清理
- 取消链接:保留监控项,变为自定义监控项
- 取消链接并清理:清理监控项
-
链接主动模板:Template OS Linux by Zabbix agent active
- 修改zabbix-agentd配置
sed -i '/^Server=/c Server=10.0.0.71' /etc/zabbix/zabbix_agentd.conf
sed -i '/^ServerActive=/c ServerActive=10.0.0.71' /etc/zabbix/zabbix_agentd.conf
sed -i '/^Hostname=/c Hostname=10.0.0.7' /etc/zabbix/zabbix_agentd.conf
- 调整zabbix-agentd日志级别
cat <<EOF >> /etc/zabbix/zabbix_agentd.conf
DebugLevel=5
EOF
- 清空日志,关闭zabbix-agent2(不支持主动模式),启动zabbix-agent,监视日志
>/var/log/zabbix/zabbix_agentd.log
systemctl stop zabbix-agent2
systemctl start zabbix-agent
tail -f /var/log/zabbix/zabbix_agentd.log
- 查看日志
# Agent启动
3497:20201224:103005.545 Starting Zabbix Agent [10.0.0.7]. Zabbix 5.0.6 (revision 93895db26b).
3497:20201224:103005.545 **** Enabled features ****
3497:20201224:103005.545 IPv6 support: YES
3497:20201224:103005.545 TLS support: YES
3497:20201224:103005.545 **************************
# Agent请求表单100一组
3502:20201224:103252.935 In send_buffer() host:'10.0.0.71' port:10051 entries:0/100
3502:20201224:103252.935 End of send_buffer():SUCCEED
# Agent收到JSON清单,添加到检查中
# Agent收集值,添加到buffer中
# Agent收集所有rpm包
# Agent收集到所有值后,主动提交给server
- 验证:监测 --> 最新数据
主动模式最新数据时间一致:agent收集所有数据打包一次性发给server
被动模式最新数据时间不一致:server获取每个数据向agent请求一次
- ZBX可用性绿色:调整Template Module Zabbix agent active监控项为被动模式
- 验证:配置 --> 主机 --> ZBX可用性绿色
- 新增主动模式模板:克隆被动模式模板 --> 批量更新所有监控项的类型为(主动式)
proxy分布式
环境准备
主机 | eth0 | eth1 |
---|---|---|
zabbix-server | 10.0.0.71 | 关闭 |
zabbix-proxy | 10.0.0.8 | 172.16.1.8 |
zabbix-agent | 关闭 | 172.16.1.7 |
zabbix-server
- 准备:关闭eth1
ifdown eth1
zabbix-proxy
- 准备:修改主机名,停止zabbix_agent2
hostnamectl set-hostname zabbix-proxy
systemctl stop zabbix-agent2
systemctl disable zabbix-agent2
- 安装zabbix-proxy和mariadb
yum install zabbix-proxy-mysql mariadb-server -y
- 启动mariadb并加入开机自动
systemctl enable mariadb
systemctl start mariadb
- 创建数据库并授权
mysql -e "create database zabbix character set utf8 collate utf8_bin;create user 'zabbix'@'localhost' identified by '123456';grant all privileges on zabbix.* to 'zabbix'@'localhost';"
- 导入初始化表
zcat /usr/share/doc/zabbix-proxy-mysql-*/schema.sql.gz | mysql -uzabbix -p123456 zabbix
- 配置zabbix-proxy
# 修改前
[root@zabbix-proxy ~]# egrep -v '^$|#' /etc/zabbix/zabbix_proxy.conf
Server=127.0.0.1
Hostname=Zabbix proxy
LogFile=/var/log/zabbix/zabbix_proxy.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_proxy.pid
SocketDir=/var/run/zabbix
DBName=zabbix_proxy
DBUser=zabbix
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000
StatsAllowedIP=127.0.0.1
sed -i '/^Server/c Server=10.0.0.71' /etc/zabbix/zabbix_proxy.conf
sed -i '/^Hostname/c Hostname=shenzhen-proxy' /etc/zabbix/zabbix_proxy.conf
sed -i '/^DBName/i DBHost=localhost' /etc/zabbix/zabbix_proxy.conf
sed -i '/^DBName/c DBName=zabbix' /etc/zabbix/zabbix_proxy.conf
sed -i '/^DBName/a DBPassword=123456' /etc/zabbix/zabbix_proxy.conf
# 修改后
[root@zabbix-proxy ~]# egrep -v '^$|#' /etc/zabbix/zabbix_proxy.conf
Server=10.0.0.71
Hostname=shenzhen-proxy
LogFile=/var/log/zabbix/zabbix_proxy.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_proxy.pid
SocketDir=/var/run/zabbix
DBHost=localhost
DBName=zabbix
DBPassword=123456
DBUser=zabbix
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
ExternalScripts=/usr/lib/zabbix/externalscripts
LogSlowQueries=3000
StatsAllowedIP=127.0.0.1
- 启动zabbix-proxy并加入开机自动
systemctl enable zabbix-proxy
systemctl start zabbix-proxy
- 验证:查看端口10051
netstat -tupln |grep 10051
zabbix-agent
- 准备:关闭eth0
ifdown eth0
- 修改zabbix-agentd配置,重启生效
sed -i '/^Server=/c Server=172.16.1.8' /etc/zabbix/zabbix_agentd.conf
sed -i '/^ServerActive=/c ServerActive=172.16.1.8' /etc/zabbix/zabbix_agentd.conf
sed -i '/^Hostname=/c Hostname=172.16.1.7' /etc/zabbix/zabbix_agentd.conf
systemctl restart zabbix-agent
zabbix-web
- 删除主机
- 管理 --> agent代理程序 --> 创建代理
- 配置代理
- agent代理程序名称:Hostname=shenzhen-proxy
- 代理地址:10.0.0.8
- 验证agent代理:刷新,可以重启服务加速发现
systemctl restart zabbix-server
systemctl restart zabbix-proxy
- 配置 --> 主机 --> 创建主机
- 配置主机,模板
- 主机名称:172.16.1.7
- 群组:web
- 客户端:172.16.1.7
- 代理:shenzhen-proxy
-
默认:zabbix-server刷新频率:60s+zabbix-proxy配置发现频率:3600s
重启服务加速
systemctl restart zabbix-server
systemctl restart zabbix-proxy
grep ConfigFrequency /etc/zabbix/zabbix_proxy.conf
- 可以使用自动注册:删除主机,开启自动注册动作,依次重启服务加速,查看主机自动注册成功
systemctl restart zabbix-agent
systemctl restart zabbix-server
systemctl restart zabbix-proxy
监控JVM
JDK:Java Development Kit = JRE:Java Runtime Environment + 工具
Java语言web服务器:
-
开源:Tomcat
-
Oracle:WebLogic
-
RedH:Jboss
-
CAUCHO:Resin
安装tomcat+jdk
- yum安装java8
cd /opt
rz -E
yum install jdk-8*.rpm -y
二进制安装java8,需要配置java全局变量
cd /opt rz -E tar xf jdk-8u241-linux-x64.tar.gz
cat <<EOF > /etc/profile.d/jdk.sh export JAVA_HOME=/opt/java/default export PATH=$JAVA_HOME/bin:$PATH EOF . /etc/profile.d/jdk.sh
- 二进制安装tomcat
cd /opt
wget https://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.41/bin/apache-tomcat-9.0.41.tar.gz
tar xf apache-tomcat-9.0.41.tar.gz
ln -s /opt/apache-tomcat-9.0.41 /usr/local/tomcat
/usr/local/tomcat/bin/startup.sh
/usr/local/tomcat/bin/shutdown.sh
startup.sh实际上是调用catalina.sh
/usr/local/tomcat/bin/catalina.sh run
配置jmx
- zabbix-proxy开启tomcat的jmx功能:开启监控页面
# 加到最上面
vi /usr/local/tomcat/bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=10.0.0.8 -Dcom.sun.management.jmxremote.port=12346 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
-Dcom.sun.management.jmxremote # 开启jmx功能 -Djava.rmi.server.hostname=10.0.0.8 # 当前主机IP -Dcom.sun.management.jmxremote.port=12346 # 当前主机监听端口 -Dcom.sun.management.jmxremote.ssl=false # 关闭ssl证书验证 -Dcom.sun.management.jmxremote.authenticate=false # 关闭认证
- zabbix-proxy启动并验证
/usr/local/tomcat/bin/startup.sh run
netstat -tupln|grep 12346
- windows使用jconsole.jar远程10.0.0.8:12346连接测试
C:\Java\jdk\bin\jconsole.exe
zabbix-server
- 安装zabbix-java-gateway
yum install https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-java-gateway-5.0.7-1.el7.x86_64.rpm -y
- 启动zabbix-java-gateway并加入开机自动,验证
systemctl enable zabbix-java-gateway
systemctl start zabbix-java-gateway
netstat -tupln|grep 10052
- 配置zabbix-java-gateway
cat <<EOF >> /etc/zabbix/zabbix_server.conf
JavaGateway=10.0.0.71
JavaGatewayPort=10052
StartJavaPollers=3
EOF
- 重启zabbix-server服务生效
systemctl restart zabbix-server
zabbix-web
- 创建主机
- 主机名称:10.0.0.8
- 群组:web
- Interfaces:JMX
- 10.0.0.8
- 链接的模板:Template App Generic Java JMX
- 验证:
- 监控项详解
键值: jmx["java.lang:type=ClassLoading","LoadedClassCount"]
- 对象名:ObjectName:java.lang:type=ClassLoading
- 属性值名称:LoadedClassCount
- 自定义监控项: jmx["",""]
低层发现
-
自动发现:自动添加主机
-
低层发现(LLD):自动添加监控项,触发器,图形等
- 提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法。
- 适合有规律,又有变化的资源。
Zabbix支持多种类型的项发现:
-
Discovery of file systems;
-
Discovery of network interfaces;
-
Discovery of CPUs and CPU cores;
-
Discovery of multiple SNMP OIDs;
-
Discovery using SQL queries;
-
Discovery of Windows Services.
-
Discovery any type of Entities,例如,数据库服务器上的数据库。
自定义监控项原型
- 新增自定义监控项,重启生效,测试取值
cat <<EOF >/etc/zabbix/zabbix_agentd.d/net.conf
UserParameter=net_mac[*],ifconfig \$1 | grep ether | awk '{print \$\$2}'
EOF
systemctl restart zabbix-agent
zabbix_get -s 127.0.0.1 -k net_mac[eth0]
- 配置 --> 主机 --> 自动发现
- 监控项原型 --> 创建监控项原型
- 配置监控项原型
- 名称:网卡{#IFNAME}的mac地址
- 键值:net_mac[{#IFNAME}]
- 信息类型:字符
- 更新间隔:15s
- 应用集原型:Interface
- 修改底层自动发现规则的更新间隔:15s
- 重启服务加速监控项发现
systemctl restart zabbix-agent
systemctl restart zabbix-server
- 查看监控项最新数据
自定义底层发现规则
实际上是监控项,键值是特定的json格式。
[root@zabbix-server ~]# zabbix_get -s 127.0.0.1 -k net.if.discovery
[{"{#IFNAME}":"eth0"},{"{#IFNAME}":"eth1"},{"{#IFNAME}":"lo"}]
- 部署mysql多实例
mkdir -p /data/330{7,8}
cat <<EOF > /etc/my3307.cnf
[mysqld]
datadir=/data/3307/
socket=/data/3307/mysql.sock
port=3307
user=mysql
symbolic-links=0
[mysqld_safe]
log-error=/data/3307/mysqld.log
pid-file=/data/3307/mysqld.pid
EOF
cp /etc/my3307.cnf /etc/my3308.cnf
sed -i 's#3307#3308#g' /etc/my3308.cnf
mysql_install_db --user=mysql --defaults-file=/etc/my3307.cnf
mysql_install_db --user=mysql --defaults-file=/etc/my3308.cnf
mysqld_safe --defaults-file=/etc/my3307.cnf &
mysqld_safe --defaults-file=/etc/my3308.cnf &
- 创建mysql多实例底层发现脚本
mkdir -p /server/script/
vi /server/script/discover.sh
#!/bin/bash
# mysql low-level discovery
res=`netstat -lntp|awk -F "[ :\t]+" '/mysqld/{print$5}'`
port=($res)
printf '['
for key in ${!port[@]}
do
if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
printf '{'
printf "\"{#MYSQLPORT}\":\"${port[${key}]}\"},"
else [[ "${key}" -eq "((${#port[@]}-1))" ]]
printf '{'
printf "\"{#MYSQLPORT}\":\"${port[${key}]}\"}"
fi
done
printf ']\n'
- 自定义监控项脚本,测试取值
chmod u+s /usr/bin/netstat
cat <<EOF >/etc/zabbix/zabbix_agentd.d/mysql.conf
UserParameter=discover.mysql,/bin/bash /server/script/discover.sh
UserParameter=mysql_alive[*],/usr/bin/mysqladmin -h 127.0.0.1 -uroot -P \$1 ping 2>/dev/null |wc -l
UserParameter=mysql_status[*],/usr/bin/mysql -h 127.0.0.1 -uroot -P \$1 -e "show global status where Variable_Name='\$2';" |tail -1|awk '{print \$\$2}'
EOF
systemctl restart zabbix-agent
zabbix_get -s 127.0.0.1 -k discover.mysql
zabbix_get -s 127.0.0.1 -k mysql_alive[3306]
zabbix_get -s 127.0.0.1 -k mysql_status[3306,Uptime]
zabbix_get -s 127.0.0.1 -k mysql_status[3306,Queries]
可以参考源码包默认监控型脚本:
cat /root/zabbix-5.0.6/conf/zabbix_agentd/userparameter_mysql.conf
- 配置 --> 主机 --> 自动发现 --> 创建发现规则
- 配置底层自动发现规则
- 名称:底层自动发现mysql
- 键值:discover.mysql
- 更新间隔:15s
- 监控项原型 --> 创建监控项原型 --> 配置监控项原型
- 名称:mysql{#MYSQLPORT}的存活状态
- 键值:mysql_alive[{#MYSQLPORT}]
- 更新间隔:15s
- 新的应用程序原型:mysql
- 查看监控项已发现:配置 --> 主机 --> 监控项 --> 应用集:mysql
- 查看监控项最新数据:监测 --> 最新数据 --> 应用集:mysql
- 同理再添加两个监控项原型
- 名称:mysql{#MYSQLPORT}的查询数量
- 键值:mysql_status[{#MYSQLPORT},Queries]
- 更新间隔:15s
- 应用集原型:mysql
- 克隆,修改
- 名称:mysql{#MYSQLPORT}的启动时间
- 键值:mysql_status[{#MYSQLPORT},Uptime]
- 查看监控项最新数据:监测 --> 最新数据 --> 应用集:mysql
正则和过滤器
- 管理 --> 一般 --> 界面设置 --> 正则表达式
- 新的正则表达式
- 配置正则表达式
- 名字:mysql_port
- 表达式类型:结果为假
- 表达式:3307
- 测试正则表达式:3307结果为假,也就是会被过滤掉
- 配置 --> 主机 --> 自动发现 --> 选择一个自动发现规则 --> 过滤器
- 宏:
- 正则表达式:@mysql_port
- 3307无法发现:监控项 --> 应用集:mysql
API(application interface)
api调用脚本
#!/bin/bash
curl "http://apis.juhe.cn/simpleWeather/query?city=昌平&key=3dae6629acd8689e9b12f8bb4f7c96fe" >/tmp/tianqi.json
q=`cat /tmp/tianqi.json|jq '.result.realtime.info'|grep -c '雨'`
if [ $q -eq 1 ];then
python weixin.py '@all' '今日天气提醒' '今天有雨出门记得带伞!'
fi
Zabbix API允许你以编程方式检索和修改Zabbix的配置,并提供对历史数据的访问。
针对zabbix进行二次开发,公司,运维管理平台(把zabbix集成到自己的运维平台)
获取Token(身份验证令牌)
curl -X POST -H "Content-Type: application/json-rpc" -d'
{
"jsonrpc": "2.0",
"method": "user.login",
"params": {
"user": "Admin",
"password": "zabbix"
},
"id": 1,
"auth": null
}' http://10.0.0.71/api_jsonrpc.php
{"jsonrpc":"2.0","result":"5d78b2c8c510482367f6b66306104704","id":1}
token='5d78b2c8c510482367f6b66306104704'
获取主机列表
curl -X POST -H "Content-Type: application/json-rpc" -d'
{
"jsonrpc": "2.0",
"method": "host.get",
"params": {
"output": [
"hostid",
"host"
],
"selectInterfaces": [
"interfaceid",
"ip"
]
},
"id": 2,
"auth": "'$token'"
}' http://10.0.0.71/api_jsonrpc.php
# 使用jq格式化json
yum install jq -y
|jq '.result[].hostid'
更新主机状态
status: 1 停用
curl -X POST -H "Content-Type: application/json-rpc" -d'
{
"jsonrpc": "2.0",
"method": "host.update",
"params": {
"hostid": "10126",
"status": 1
},
"id": 1,
"auth": "'$token'"
}' http://10.0.0.71/api_jsonrpc.php
创建主机
curl -X POST -H "Content-Type: application/json-rpc" -d'
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "10.0.0.1",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "10.0.0.1",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "4"
}
],
"templates": [
{
"templateid": "10001"
}
]
},
"auth": "'$token'",
"id": 1
}' http://10.0.0.71/api_jsonrpc.php
- 批量创建主机脚本
#! /bin/bash
. /etc/rc.d/init.d/functions
token='5d78b2c8c510482367f6b66306104704'
# n 主机IP
for n in `echo 10.0.0.{2..50}`
do
curl -s -X POST -H "Content-Type: application/json-rpc" -d'
{
"jsonrpc": "2.0",
"method": "host.create",
"params": {
"host": "'$n'",
"interfaces": [
{
"type": 1,
"main": 1,
"useip": 1,
"ip": "127.0.0.1",
"dns": "",
"port": "10050"
}
],
"groups": [
{
"groupid": "4"
}
],
"templates": [
{
"templateid": "10001"
}
]
},
"auth": "'$token'",
"id": 1
}' http://10.0.0.71/api_jsonrpc.php|jq '.result' &>/dev/null
if [ $? -eq 0 ];then
action "主机 $n 创建成功" /bin/true
else
action "主机 $n 创建失败" /bin/false
fi
done
- 批量删除主机脚本
#! /bin/bash
. /etc/rc.d/init.d/functions
token='5d78b2c8c510482367f6b66306104704'
# n 主机编号
for n in `echo 10{371..419}`
do
curl -s -X POST -H "Content-Type: application/json-rpc" -d'
{
"jsonrpc": "2.0",
"method": "host.delete",
"params": [
"'$n'"
],
"auth": "'$token'",
"id": 1
}' http://10.0.0.71/api_jsonrpc.php|jq '.result' &>/dev/null
if [ $? -eq 0 ];then
action "主机 $n 删除成功" /bin/true
else
action "主机 $n 删除失败" /bin/false
fi
done
性能优化
-
数据库优化:zabbix是一个写多读少的业务,优化数据库的写入性能。
- mysql版本5.7以上
- mysql的TokuDB数据引擎
- 定时任务,分库分表处理
-
功能上优化:
- 精简无用的监控项
- 适当增加取值间隔
- 减少数据的保留周期
-
进程优化:适当增加进程数量
-
缓存优化:适当增加缓存大小
高可用
zabbix不是核心业务,一般不做高可用,但也会有要求,银行等。
zabbix高可用架构:
-
zabbix-web:Keepalive,VIP
-
mysql:主主同步,PXC(Percona XtraDB Cluster)高可用
-
zabbix-server:Keepalive,VIP
- Keepalive切换脚本:切换时,开启VIP主机zabbix-server,关闭远程zabbix-server
- zabbix-server
- 指定收集数据时使用的源IP:SourceIP=VIP
环境准备
主机名 | IP | 服务 |
---|---|---|
zabbix-server01 | 10.0.0.71 | zabbix-web:LNP,zabbix-server,keepalived;zabbix-agent |
zabbix-server02 | 10.0.0.72 | zabbix-web:LNP,zabbix-server,keepalived;zabbix-agent |
zabbix-agent | 10.0.0.8 | mysql;zabbix-agent |
zabbix-server01
- 清除主机,导出数据库并推送给zabbix-agent,关闭服务
systemctl stop zabbix-server zabbix-java-gateway grafana-server php-fpm nginx zabbix-agent
systemctl disable mariadb zabbix-java-gateway grafana-server redis
mysqldump -B zabbix > zabbix.sql
scp zabbix.sql root@10.0.0.8:/root/
systemctl stop mariadb
- 修改zabbix_server数据库连接地址
sed -i '/^DBHost/c DBHost=10.0.0.8' /etc/zabbix/zabbix_server.conf
- 修改zabbix_web数据库连接地址
sed -i "5c \$DB['SERVER'] = '10.0.0.8';" /html/conf/zabbix.conf.php
- 安装keepalived
yum install keepalived -y
- 配置keepalived
cat <<EOF >/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL 71
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.70
}
notify_master /opt/to_master.sh
}
EOF
- 配置keepalived调用脚本,安装sshpass
cat <<EOF > /opt/to_master.sh
#!/bin/bash
sshpass -p 1 ssh -o StrictHostKeyChecking=no root@10.0.0.72 "systemctl stop zabbix-server"
systemctl start zabbix-server
EOF
chmod +x /opt/to_master.sh
yum install sshpass -y
SSH端口不默认:
echo Port 12345 > ~/.ssh/config
- 加入开机启动
systemctl enable keepalived
- zabbix_server指定收集数据时使用的源IP
echo SourceIP=10.0.0.70 >> /etc/zabbix/zabbix_server.conf
- 配置zabbix-agent
sed -i '/^Server=/c Server=10.0.0.70' /etc/zabbix/zabbix_agentd.conf
sed -i '/^ServerActive=/c ServerActive=10.0.0.70' /etc/zabbix/zabbix_agentd.conf
- 关闭服务器,链接克隆一台zabbix-server02,再启动
zabbix-agent
- 关闭服务,删库,导库,授权
systemctl stop zabbix-proxy php-fpm nginx snmpd
systemctl disable zabbix-proxy php-fpm nginx snmpd
mysql -e "DROP DATABASE zabbix;"
mysql < zabbix.sql
mysql -e "create user 'zabbix'@'10.0.0.%' identified by '123456';grant all privileges on zabbix.* to 'zabbix'@'10.0.0.%';"
- 配置zabbix-agent2
sed -i '/^Server=/c Server=10.0.0.70' /etc/zabbix/zabbix_agent2.conf
sed -i '/^ServerActive=/c ServerActive=10.0.0.70' /etc/zabbix/zabbix_agent2.conf
- 重启zabbix-agent2生效
systemctl start zabbix-agent2
zabbix-server02
- zabbix-server01链接克隆zabbix-server02,开机,修改主机名和IP
hostnamectl set-hostname zabbix-server02
sed -i 's#200#72#g' /etc/sysconfig/network-scripts/ifcfg-eth[01]
- 配置keepalived
cat <<EOF >/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL 72
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.70
}
notify_master /opt/to_master.sh
}
EOF
- 配置keepalived调用脚本
cat <<EOF > /opt/to_master.sh
#!/bin/bash
sshpass -p 1 ssh -o StrictHostKeyChecking=no root@10.0.0.71 "systemctl stop zabbix-server"
systemctl start zabbix-server
EOF
chmod +x /opt/to_master.sh
- 重启keepalived生效
systemctl restart keepalived
验证测试
- 关闭一台server,VIP漂移,正常使用zabbix
- 查看数据历史间隔:会丢失个别监控项的一次监控数据