Zabbix 5.0

监控介绍

什么是监控,为什么需要监控

监控:监视,控制

保证服务7*24小时运行,高可用99.9%。

  • 事后追责:jumpserver回放
  • 事前预警:随着用户的增多,服务随时可能会被oom
  • 及时报警:发现故障预处理
  • 性能分析:优化前后数据,体现效果

命令监控

Linux常见监控命令

查看:

监控:


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端性能会出现问题。


监控实际应用:

  1. 新建监控项目时,选择的是zabbix代理(被动式)还是zabbix端点代理程式(主动式)

  2. agentd配置文件中StartAgents参数的设置,如果为0,表示禁止被动模式,否则开启。一般建议不要设置为0,因为监控项目很多时,可以部分使用主动,部分使用被动模式。


img

  • 定义一个template模板,里面包括多个items,trigger,graphs套用给host或者hostgroups。
  • server监控项目items通过zabbix poller进程(可以有多个进程实现并发处理)包括snmp,agent协议收集被监控主机信息。
  • 如果阈值超过triggers触发器规定,就是形成一个events事件,然后actions处理动作(包括运行预先定制的脚本,不成功发送email或SMS)。
  • 在服务器升级的时候提前设定maintenance维护模式不对服务器产生告警通知。

Zabbix组件及进程

常见组件:

  1. Zabbix Server:负责接收agent发送的报告信息的核心组件,所有配置,统计数据及操作数据均由其组织进行;

  2. Database Storage:专用于存储所有配置信息,以及由zabbix收集的数据;

  3. Web interface:zabbix的GUI接口,通常与Server运行在同一台主机上;

  4. Proxy:可选组件,常用于分布监控环境中,代理Server收集部分被监控端的监控数据并统一发往Server端;

  5. 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主动去取数据。

img

  • zabbix_proxy:zabbix代理守护进程。功能类似server,唯一不同的是它只是一个中转站,它需要把收集到的数据提交/被提交到server里。为什么要用代理?代理是做什么的?卖个关子,请继续关注运维生存时间zabbix教程系列。
  • zabbix_java_gateway:zabbix2.0之后引入的一个功能。Java网关,类似agentd,但是只用于Java方面。注意,它只能主动去获取数据,而不能被动获取数据。它的数据最终会给到server或者proxy。

Zabbix基本概念

  1. 主机(host):要监控的网络设备,可由IP或DNS名称指定;

  2. 主机组(host group):主机的逻辑容器,可以包含主机和模板,但同一个组织内的主机和模板不能互相链接;主机组通常在给用户或用户组指派监控权限时使用;

  3. 监控项(item):一个特定监控指标的相关的数据;这些数据来自于被监控对象;item是zabbix进行数据收集的核心,相对某个监控对象,每个item都由"key"标识;

  4. 触发器(trigger):一个表达式,用于评估某监控对象的特定item内接收到的数据是否在合理范围内,也就是阈值;接收的数据量大于阈值时,触发器状态将从"OK"转变为"Problem",当数据再次恢复到合理范围,又转变为"OK";

  5. 事件(event):触发一个值得关注的事情,比如触发器状态转变,新的agent或重新上线的agent的自动注册等;

  6. 动作(action):指对于特定事件事先定义的处理方法,如发送通知,何时执行操作;

  7. 报警升级(escalation):发送警报或者执行远程命令的自定义方案,如每隔5分钟发送一次警报,共发送5次等;

  8. 媒介(media):发送通知的手段或者通道,如Email、Jabber或者SMS等;

  9. 通知(notification):通过选定的媒介向用户发送的有关某事件的信息;

  10. 远程命令(remote command):预定义的命令,可在被监控主机处于某特定条件下时自动执行;

  11. 模板(template):用于快速定义被监控主机的预设条目集合,通常包含了item、trigger、graph、screen、application以及low-level discovery rule;模板可以直接链接至某个主机;

  12. 应用(application):一组item的集合;

  13. web场景(web scennario):用于检测web站点可用性的一个活多个HTTP请求;

  14. 前端(frontend):Zabbix的web接口;


Zabbix监控架构

架构介绍

agent:主机通过安装agent方式采集数据。

server:通过收集agent发送的数据,写入数据库(MySQL,ORACLE等),再通过php+apache在web前端展示.

zabbix根据网络环境、监控规模等分为三种架构:

  1. server-client

zabbix最简单的架构,监控机和被监控机之间不经过任何代理 ,直接由zabbix server和zabbix agentd之间进行数据交互。适用于网络比较简单,设备比较少的监控环境 。

  1. server-proxy-client

其中proxy是server、client之间沟通的一个桥梁,proxy本身没有前端,而且其本身并不存放数据,只是将agentd发来的数据暂时存放,而后再提交给server 。该架构经常是和master-node-client架构做比较的架构 ,一般适用于跨机房、跨网络的中型网络架构的监控,有效的减轻server端的压力。

  1. master-node-client

zabbix最复杂的监控架构,适用于跨网络、跨机房、设备较多的大型环境 。每个node同时也是一个server端,node下面可以接proxy,也可以直接接client 。node有自已的配置文件和数据库,其要做的是将配置信息和监控数据向master同步,master的故障或损坏对node其下架构的完整性。

img

zabbix生产环境部署

版本选择5.0

现有Zabbix版本

版本名称 发布日期 全面支持期限 最低限度支持期限
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
  • 关闭:selinuxfirewalldNetworkManagerpostfix(非必须)

  • 修改IP地址、主机名

hostnamectl set-hostname zabbix-server
sed -i 's#200#71#g' /etc/sysconfig/network-scripts/ifcfg-eth[01]

nginx+php7.2部署

  1. 配置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
  1. 安装nginx和php72
yum install nginx php72w-fpm php72w-gd php72w-mbstring php72w-mysqlnd php72w-bcmath php72w-xml php72w-ldap -y
  1. 查看安装模块,和官方文档对比
php-fpm -m
  1. 修改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
  1. 修改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
  1. 创建代码目录并授权
mkdir /html
chown -R nginx:nginx /html
  1. 启动php-fpm和nginx并加入开机自动
systemctl enable nginx php-fpm
systemctl start nginx php-fpm

mariadb部署

  1. 安装mariadb
yum install mariadb-server -y
  1. 启动mariadb并加入开机自动
systemctl enable mariadb
systemctl start mariadb
  1. 安全初始化
mysql_secure_installation

n
y
y
y
y
  1. 创建数据库并授权
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部署

  1. 配置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
  1. 安装zabbix-server
yum install zabbix-server-mysql -y
  1. 导入初始化表
zcat /usr/share/doc/zabbix-server-mysql-5.0.6/create.sql.gz | mysql zabbix
  1. 修改配置文件
echo DBHost=localhost >> /etc/zabbix/zabbix_server.conf
echo DBPassword=123456 >> /etc/zabbix/zabbix_server.conf
egrep -v '^$|#' /etc/zabbix/zabbix_server.conf
  1. 启动zabbix-server并加入开机自动
systemctl enable zabbix-server
systemctl start zabbix-server
  1. 验证:查看端口10051
netstat -tupln |grep 10051

zabbix-web部署

  1. 下载源码包
wget https://cdn.zabbix.com/zabbix/sources/stable/5.0/zabbix-5.0.6.tar.gz
  1. 移动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
  1. 调整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
  1. 浏览器访问http://10.0.0.71/

image-20201221123902267

  1. 配置数据库连接:端口3306,密码123456

image-20201221124004642

image-20201221124056629

image-20201221124126291

  1. 生成配置文件/html/conf/zabbix.conf.php

image-20201221124201289

  1. 完成,登录zabbix-web,用户名/密码:Aadmin/zabbix

image-20201221124321905

  1. 改为中文:User settings --> Language --> Chinese (zh_CN) --> Update

image-20201221124502476


zabbix-agent部署

  1. 安装zabbix-agent
yum install zabbix-agent -y
  1. 启动zabbix-agent并加入开机自动
systemctl enable zabbix-agent
systemctl start zabbix-agent
  1. 验证:查看端口10050
netstat -tupln |grep 10050

监控节点部署

  1. 配置yum源,见zabbix-server部署,安装zabbix-agent

  2. 修改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监控配置

  1. 配置 --> 主机 --> 创建主机

image-20201221150313122

  1. 配置

    • 主机名(唯一):使用IP地址

    • 群组:web

    • 客户端:IP

    • 模板:Linux

image-20201221150601114

image-20201221150658982

  1. zabbix-server默认每60s检测一次,添加完主机不会立即去数据库读取。

    想快速检测到,可以重启zabbix-server。

systemctl restart zabbix-server

image-20201221151144538


Zabbix 5.0新组件:agent 2

zabbix-agent2是新一代的Zabbix代理,agent 2用Go编写(重用了zabbix-agent的某些C代码),可以代替zabbix-agent使用:

  • 减少TCP连接数
  • 具有更大的支票并发
  • 易于通过插件扩展。插件应该能够:
    • 提供仅由几行简单代码组成的琐碎检查
    • 提供由长期运行的脚本和独立的数据收集组成的复杂检查,并定期发送回数据
  • 替代zabbix-agent(因为它支持所有以前的功能)

  1. 注意:zabbix_agentd2不能和zabbix_agentd同时启动
systemctl stop zabbix-agent
systemctl disable zabbix-agent
  1. 安装zabbix-agent2
yum install zabbix-agent2 -y
  1. 修改zabbix-agent2配置
sed -i '/^Server=/c Server=10.0.0.71' /etc/zabbix/zabbix_agent2.conf
  1. 启动zabbix-agent2并加入开机自动
systemctl start zabbix-agent2
systemctl enable zabbix-agent2
  1. 验证:查看端口10050
netstat -tupln |grep 10050

自定义监控项

安装nginx

yum install nginx -y
systemctl start nginx
systemctl enable nginx
  1. 新增自定义监控项(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
  1. web界面添加自定义监控项
    • 名称:(唯一)面板上显示
    • 键值:配置文件中的<key>
    • 应用集:筛选标签

image-20201221160011402

image-20201221160051818

image-20201221161810074

  1. 查看最新数据-->筛选应用集:nginx

image-20201221161528948

如果使用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
  1. 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
  1. 复制监控项

image-20201221171053564

image-20201221171157126

注意:复制的监控项,没有应用集,需要手动添加。


自定义触发器

  1. 配置 --> 主机 --> 触发器 --> 创建触发器

image-20201221171508825

  1. 配置
    • 名称
    • 严重性
    • 表达式:添加

image-20201221172143569

image-20201221172041056

  1. 停止nginx
systemctl stop nginx
  1. 查看仪表盘,触发报警

image-20201221172507730

  1. 确认报警

image-20201221172559336

  1. 监控项/触发器红色,不支持,刷新不支持的项目:默认10m

image-20201221173618711

image-20201221173801342


邮件报警

  1. 禁用其他报警类型,只保留Email

image-20201221174517880

  1. 配置Email发送参数

image-20201221175002142

  1. web测试

image-20201221175113542

  1. 配置用户收件信息

image-20201221175251438

image-20201221175401678

image-20201221175512950

image-20201221175611941

  1. 启用发送消息动作

image-20201221175728574

image-20201221175750562

  1. 停止nginx测试

微信报警

属于自定义脚本报警

  1. 创建自定义脚本:微信报警
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)
  1. 登录企业微信,获取:
    • corpid:企业ID
    • appsecret:Secret
    • agentid:AgentId

image-20201222092053742

  1. 创建应用

image-20201222092218775

image-20201222093240146

image-20201222093509203

  1. 安装python依赖包
yum install python-pip -y
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
  1. 命令行测试脚本发送消息,清除日志
python /usr/lib/zabbix/alertscripts/weixin.py 接受人姓名拼音 '报警标题' '报警信息'
rm -f /tmp/weixin.log
  1. 创建报警媒体类型

image-20201222095031931

  1. 配置
  • 名称:微信报警

    • 类型:脚本
    • 脚本名称:weixin.py
  • 脚本参数:宏使用场景

image-20201222100131569

  1. web测试:@all(所有人)

image-20201222100303714

  1. 测试成功

image-20201222100754545

  1. 配置消息模板:Message type
    • 问题
    • Problem recovery
    • Problem update

image-20201222100906008

image-20201222101041591

  1. 配置用户 --> 报警媒介

image-20201222101322155

image-20201222101430912

image-20201222102609360

  1. 停止nginx测试
  2. 查看报表 --> 动作日志

image-20201222105521734


自定义消息模板

  1. 消息模板,参考宏使用
服务器:{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}
}
  1. 管理 --> 报警 --> 媒介类型 --> 微信报警 --> Message templates --> 编辑 --> 更新

image-20201222104346717

  1. 停止nginx测试

持续发送邮件/微信

  1. 配置动作

image-20201222104816818

  1. 修改操作 --> 步骤 1-0(无穷大)

image-20201222105105582

image-20201222105307390

  1. 停止nginx测试

故障预处理和报警升级

参考文档:zabbix故障预处理和报警升级

建议手动处理,预处理功能还不够完善,例如任意报警触发预处理。


中文乱码

  1. 监测 --> 主机 --> 图形:页面文字显示方块(默认字体不支持中文)

image-20201222110818824

  1. 上传字体(黑体 常规),覆盖原字体文件
cd /html/assets/fonts/
rz -E
\mv SIMHEI.TTF DejaVuSans.ttf
  1. 刷新页面,中文乱码解决

image-20201222111101778


性能调优


自定义监控项

监控time_wait状态tcp数量

  1. web01创建监控项配置文件
cat <<EOF >/etc/zabbix/zabbix_agent2.d/tcp.conf
UserParameter=tw_count,netstat -ant|grep -c TIME_WAIT
EOF
systemctl restart zabbix-agent2
  1. 添加监控项

image-20201222114924582

image-20201222114947436

  1. 配置监控项
    • 名称:监控time_wait状态tcp数量
    • 键值:tw_count
    • 更新间隔:15s
    • 新的应用集:tcp

image-20201222115541577

  1. 用户设置 --> 每页行数:200

image-20201222120058797

  1. 快速增加连接数:配置 --> 主机 --> 监控项 --> 全选监控项 --> 批量更新 --> 更新间隔:15s --> 更新

image-20201222120302688

image-20201222120535730

  1. 查看监测数据

image-20201222121205941


自定义图形

  1. 配置 --> 主机 --> 图形 --> 创建图形

image-20201222121316508

image-20201222122708085

  1. 配置图形
    • 名称:time_wait数量
    • 图形类别:层积的
    • 监控项:10.0.0.7:监控time_wait状态tcp数量

image-20201222121723465

  1. 查看图形:检测 --> 主机 --> 图形 --> 过滤器 --> 选择图形 --> 应用

image-20201222122015181

image-20201222122132118



优化

重用回收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时间


优化后

刷新页面,查看图形,优化效果明显

image-20201222122907926

grafana出图

  1. 安装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
  1. 启动并加入开机自启
systemctl start grafana-server
systemctl enable grafana-server
  1. 浏览器访问http://10.0.0.71:3000/,用户/密码:admin/admin

  2. 安装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
  1. 重启生效
systemctl restart grafana-server
  1. 配置 --> 参数选择 --> 开灯 --> 保存

image-20201222145339429

  1. 选择插件

image-20201222145824619

image-20201222145900105

  1. 添加数据源:选择Zabbix

image-20201222151152229

image-20201222151231833

image-20201222151430241

image-20201222151643035

  1. 导入 Dashboards (仪表板)

image-20201222152050806

image-20201222152111664

  1. 查看刚导入的 Dashboards (仪表板)

image-20201222152336856

  1. 查看三个面板图

image-20201222152455608

image-20201222152509464

image-20201222152439473

  1. 选择模板Dashboard Linux Server

image-20201222150617516

image-20201222152805465

  1. 导入模板:输入ID 8677

image-20201222152717135

  1. 选择插件,导入

image-20201222152957231

image-20201222153028310

  1. 参考 Zabbix Template Linux Server 模板,修改Variables

image-20201222153559084

image-20201222153610016

image-20201222153501359


zabbix模板

自定义模板

  1. 创建模板

image-20201222163114893

  1. 配置
    • 模板名称:tcp 11 status template
    • 群组:network

image-20201222163217660

  1. 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
  1. 添加11个监控项,克隆
    • 名称:ESTABLISHED状态的数量
    • 键值:ESTABLISHED
    • 应用集:tcp
  2. 验证:监测 --> 最新数据
  3. 选择11个监控项复制给模板

image-20201222163707673

  1. 模板监控项批量更新应用集

image-20201222163817907

  1. 创建触发器
    • 名称:可能被DOS攻击
    • 严重性:警告
    • 表达式:
      • 监控项:SYN_RECV状态的数量
      • 功能:平均值avg()
      • 结果:>5

image-20201222164113684

  1. 主机链接模板

image-20201222164223252

  1. 验证:监测 --> 最新数据

image-20201222164334705

  1. 导出模板:zeb_export_template.xml

share模板

  1. 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
[*] 传参
  1. 下载模板,导入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
  1. 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
  1. zabbix_get远程取值测试
zabbix_get -s 10.0.0.7 -k redis.status[127.0.0.1,6379,role]
  1. 主机链接模板

image-20201222175051334

  1. 模板 --> 宏

image-20201222175203560

  1. 验证:监测 --> 最新数据

image-20201222175256574

  1. 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';"
  1. 开启redis缓存

image-20201223091252205

  1. 刷新页面,验证:监测 --> 最新数据

image-20201223091515208

redis-cli
keys *

监控维度总结

  1. 硬件层面:

    • 服务器:温度,电压,功率,磁盘,风扇转速
    • 网络设备:SNMP协议,UPS,防火墙,F5
  2. 系统层面:CPU,内存,磁盘,网卡,进程,安全

  3. 应用层面:nginx、tomcat、mysql、redis、...

  4. 业务层面:

    • 页面访问速度:站长工具,多地区机房互PING
    • 用户访问量(PV,UV,IP):
    • 用户活跃度:签到
    • 成单量,流水,利润,...

Matomo访问分析

环境准备

主机名 IP 配置
matomo 10.0.0.8 1C1G

最低要求

  • Matomo 4.x 需要PHP 7.2.5或更高版本(Matomo 4仅支持PHP 8)。
  • MySQL 5.5或更高版本,或MariaDB
  • (默认情况下启用)PHP扩展pdopdo_mysql,或mysqli扩展。

安装

  1. matomo搭建LNMP,参考之前
yum install nginx php72w-fpm php72w-gd php72w-mysqlnd php72w-xml php72w-mbstring -y
  1. Matomo 4.1.0下载
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
  1. 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';"
  1. 访问:http://10.0.0.8/,选择简体中文,配置安装

image-20201223115737735

  1. 设置网站

image-20201223112307385

  1. 跟踪代码

image-20201223112935819

  1. Discuz 添加跟踪代码

image-20201223113052855

  1. 访问:http://10.0.0.7/,多浏览器多访问几个页面
  2. matomo查看报表面板:http://10.0.0.8/

image-20201223113523984

SNMP监控

SNMP协议(simple netwoek manager protocol)简单网络管理协议:

支持window,linux,unix,打印机,路由交换,ups,... ...

OID:Object ID 一个监控指标

MIB:所有OID的集合


Linux配置SNMP监控

  1. matomo安装net-snmp服务
yum install net-snmp -y
  1. 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
  1. matomo启动net-snmp服务并加入开机启动
systemctl enable snmpd
systemctl start snmpd
  1. 验证查看UDP:161端口
netstat -lnup | grep 161
  1. zabbix-server安装测试工具net-snmp-utils
yum install net-snmp-utils -y
  1. zabbix-server使用snmpwalk读取数据测试
snmpwalk -v2c -c oldboy 10.0.0.8 .1.3.6.1.4.1.2021.4.5.0
  1. 浏览器访问zabbix:http://10.0.0.71/,配置 --> 主机 --> 创建主机
  2. 配置:移除客户端方式,添加SNMP
    • IP地址:10.0.0.8
    • 口令:community

image-20201223151407829

image-20201223151504564

  1. 添加模板

image-20201223152227279

  1. 验证:监测 --> 主机

image-20201223152256293


Window7配置SNMP监控

  1. 控制面板 --> 程序和功能 --> 启动或关闭windows功能 --> 简单网络管理协议(SNMP)

image-20201223151812154

  1. 服务:SNMP Service 配置community和接受IP

image-20201223151726284

  1. zabbix-server使用snmpwalk读取数据测试
snmpwalk -v2c -c oldboy 10.0.0.1 .1.3.6.1.2.1.1.1.0
  1. 浏览器访问zabbix:http://10.0.0.71/,配置 --> 主机 --> 创建主机,添加模板

  2. win10没有SNMP服务,可以安装agents客户端。


Window安装agents

  1. 下载agents

image-20201223152701794

  1. 选择amd64-openssl.msi
https://cdn.zabbix.com/zabbix/binaries/stable/5.0/5.0.7/zabbix_agent-5.0.7-windows-amd64-openssl.msi

image-20201223152759089

  1. 安装客户端,浏览器访问zabbix:http://10.0.0.71/,配置 --> 主机 --> 创建主机,添加模板

agent特性

自动发现和自动注册

环境准备

  1. 浏览器访问zabbix:http://10.0.0.71/,删除主机
  2. 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

自动发现

  1. 启用自动发现规则

image-20201223155359606

  1. 配置自动发现规则

image-20201223155705576

  1. 配置 --> 动作 --> 自动发现动作

image-20201223155837922

  1. 启用自动发现动作

image-20201223155929075

  1. 动作 --> 操作 --> 添加操作:添加主机 --> 更新

image-20201223160125276

  1. 重启zabbix-server,不然要等很久
systemctl restart zabbix-server

自动注册

  1. 停用自动发现规则和动作,删除主机

  2. 配置 --> 动作 --> Autoregistration actions --> 创建动作

image-20201223163228493

  1. 配置自动注册规则:
    • 动作
      • 名称:自动添加web服务器
      • 条件:A 主机元数据 包含 web
    • 操作
      • 添加主机
      • 添加到主机群组:web
      • 与模板关联:Template OS Linux by Zabbix agent

image-20201223163602093

image-20201223163748166

  1. 修改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 # 名称唯一
  1. 重启zabbix-agent2
systemctl restart zabbix-agent2
  1. 浏览器访问zabbix:http://10.0.0.71/,zabbix立即注册成功

image-20201223164008293

  1. 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负担

  1. 关闭自动注册,10.0.0.7主机取消模板链接并清理

    • 取消链接:保留监控项,变为自定义监控项
    • 取消链接并清理:清理监控项
  2. 链接主动模板:Template OS Linux by Zabbix agent active

image-20201224095126731

  1. 修改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
  1. 调整zabbix-agentd日志级别
cat <<EOF >> /etc/zabbix/zabbix_agentd.conf
DebugLevel=5
EOF
  1. 清空日志,关闭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
  1. 查看日志
# 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
  1. 验证:监测 --> 最新数据

主动模式最新数据时间一致:agent收集所有数据打包一次性发给server

image-20201224101244180

被动模式最新数据时间不一致:server获取每个数据向agent请求一次

image-20201224101355355

  1. ZBX可用性绿色:调整Template Module Zabbix agent active监控项为被动模式

image-20201224100324153

image-20201224100435804

image-20201224100551583

  1. 验证:配置 --> 主机 --> ZBX可用性绿色

image-20201224101459702

  1. 新增主动模式模板:克隆被动模式模板 --> 批量更新所有监控项的类型为(主动式)

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

  1. 准备:关闭eth1
ifdown eth1

zabbix-proxy

  1. 准备:修改主机名,停止zabbix_agent2
hostnamectl set-hostname zabbix-proxy
systemctl stop zabbix-agent2
systemctl disable zabbix-agent2
  1. 安装zabbix-proxy和mariadb
yum install zabbix-proxy-mysql mariadb-server -y
  1. 启动mariadb并加入开机自动
systemctl enable mariadb
systemctl start mariadb
  1. 创建数据库并授权
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';"
  1. 导入初始化表
zcat /usr/share/doc/zabbix-proxy-mysql-*/schema.sql.gz | mysql -uzabbix -p123456 zabbix
  1. 配置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
  1. 启动zabbix-proxy并加入开机自动
systemctl enable zabbix-proxy
systemctl start zabbix-proxy
  1. 验证:查看端口10051
netstat -tupln |grep 10051

zabbix-agent

  1. 准备:关闭eth0
ifdown eth0
  1. 修改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

  1. 删除主机
  2. 管理 --> agent代理程序 --> 创建代理

image-20201224110200219

  1. 配置代理
    • agent代理程序名称:Hostname=shenzhen-proxy
    • 代理地址:10.0.0.8

image-20201224111106441

  1. 验证agent代理:刷新,可以重启服务加速发现
systemctl restart zabbix-server
systemctl restart zabbix-proxy

image-20201224111406973

  1. 配置 --> 主机 --> 创建主机
  2. 配置主机,模板
    • 主机名称:172.16.1.7
    • 群组:web
    • 客户端:172.16.1.7
    • 代理:shenzhen-proxy

image-20201224112942772

image-20201224120825892

  1. 默认:zabbix-server刷新频率:60s+zabbix-proxy配置发现频率:3600s

    重启服务加速

systemctl restart zabbix-server
systemctl restart zabbix-proxy
grep ConfigFrequency /etc/zabbix/zabbix_proxy.conf

image-20201224120329104

  1. 可以使用自动注册:删除主机,开启自动注册动作,依次重启服务加速,查看主机自动注册成功
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

  1. 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
  1. 二进制安装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

  1. 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  # 关闭认证
  1. zabbix-proxy启动并验证
/usr/local/tomcat/bin/startup.sh run
netstat -tupln|grep 12346
  1. windows使用jconsole.jar远程10.0.0.8:12346连接测试

C:\Java\jdk\bin\jconsole.exe

image-20201224151812535

image-20201224151835310

image-20201224151730950


zabbix-server

  1. 安装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
  1. 启动zabbix-java-gateway并加入开机自动,验证
systemctl enable zabbix-java-gateway
systemctl start zabbix-java-gateway
netstat -tupln|grep 10052
  1. 配置zabbix-java-gateway
cat <<EOF >> /etc/zabbix/zabbix_server.conf
JavaGateway=10.0.0.71
JavaGatewayPort=10052
StartJavaPollers=3
EOF
  1. 重启zabbix-server服务生效
systemctl restart zabbix-server

zabbix-web

  1. 创建主机
    • 主机名称:10.0.0.8
    • 群组:web
    • Interfaces:JMX
      • 10.0.0.8

image-20201224154044727

  1. 链接的模板:Template App Generic Java JMX

image-20201224153028566

  1. 验证:

image-20201224153711119

  1. 监控项详解

image-20201224160208498

键值: jmx["java.lang:type=ClassLoading","LoadedClassCount"]

  • 对象名:ObjectName:java.lang:type=ClassLoading
  • 属性值名称:LoadedClassCount

image-20201224160513193

image-20201224160415880

  1. 自定义监控项: jmx["",""]

低层发现

  • 自动发现:自动添加主机

  • 低层发现(LLD):自动添加监控项,触发器,图形等

    • 提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法。
    • 适合有规律,又有变化的资源。

Low Level Discovery (LLD)

Low Level Discovery (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,例如,数据库服务器上的数据库。


自定义监控项原型

  1. 新增自定义监控项,重启生效,测试取值
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]
  1. 配置 --> 主机 --> 自动发现

image-20201224170721904

  1. 监控项原型 --> 创建监控项原型

image-20201224170748781

image-20201224170818335

  1. 配置监控项原型
    • 名称:网卡{#IFNAME}的mac地址
    • 键值:net_mac[{#IFNAME}]
    • 信息类型:字符
    • 更新间隔:15s
    • 应用集原型:Interface

image-20201224170937217

image-20201224171930931

  1. 修改底层自动发现规则的更新间隔:15s

image-20201224172059752

  1. 重启服务加速监控项发现
systemctl restart zabbix-agent
systemctl restart zabbix-server

image-20201224172258315

  1. 查看监控项最新数据

image-20201224172355323

image-20201224172404874


自定义底层发现规则

实际上是监控项,键值是特定的json格式。

[root@zabbix-server ~]# zabbix_get -s 127.0.0.1 -k net.if.discovery
[{"{#IFNAME}":"eth0"},{"{#IFNAME}":"eth1"},{"{#IFNAME}":"lo"}]

  1. 部署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 &
  1. 创建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'
  1. 自定义监控项脚本,测试取值
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
  1. 配置 --> 主机 --> 自动发现 --> 创建发现规则

image-20201224192223968

  1. 配置底层自动发现规则
    • 名称:底层自动发现mysql
    • 键值:discover.mysql
    • 更新间隔:15s

image-20201224192551374

  1. 监控项原型 --> 创建监控项原型 --> 配置监控项原型
    • 名称:mysql{#MYSQLPORT}的存活状态
    • 键值:mysql_alive[{#MYSQLPORT}]
    • 更新间隔:15s
    • 新的应用程序原型:mysql

image-20201224192912965

  1. 查看监控项已发现:配置 --> 主机 --> 监控项 --> 应用集:mysql

image-20201224193149613

  1. 查看监控项最新数据:监测 --> 最新数据 --> 应用集:mysql

image-20201224193217063

  1. 同理再添加两个监控项原型
    • 名称:mysql{#MYSQLPORT}的查询数量
    • 键值:mysql_status[{#MYSQLPORT},Queries]
    • 更新间隔:15s
    • 应用集原型:mysql

image-20201224193647042

  1. 克隆,修改
    • 名称:mysql{#MYSQLPORT}的启动时间
    • 键值:mysql_status[{#MYSQLPORT},Uptime]

image-20201224194255945

  1. 查看监控项最新数据:监测 --> 最新数据 --> 应用集:mysql

image-20201224194347734


正则和过滤器

  1. 管理 --> 一般 --> 界面设置 --> 正则表达式

image-20201224194456920

  1. 新的正则表达式

image-20201224194609960

  1. 配置正则表达式
    • 名字:mysql_port
    • 表达式类型:结果为假
    • 表达式:3307

image-20201224194839851

  1. 测试正则表达式:3307结果为假,也就是会被过滤掉

image-20201224195022861

  1. 配置 --> 主机 --> 自动发现 --> 选择一个自动发现规则 --> 过滤器
    • 宏:
    • 正则表达式:@mysql_port

image-20201224195620574

  1. 3307无法发现:监控项 --> 应用集:mysql

image-20201224195703771

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

性能优化

  1. 数据库优化:zabbix是一个写多读少的业务,优化数据库的写入性能。

    • mysql版本5.7以上
    • mysql的TokuDB数据引擎
    • 定时任务,分库分表处理
  2. 功能上优化

    • 精简无用的监控项
    • 适当增加取值间隔
    • 减少数据的保留周期
  3. 进程优化:适当增加进程数量

  4. 缓存优化:适当增加缓存大小

高可用

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

  1. 清除主机,导出数据库并推送给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
  1. 修改zabbix_server数据库连接地址
sed -i '/^DBHost/c DBHost=10.0.0.8' /etc/zabbix/zabbix_server.conf
  1. 修改zabbix_web数据库连接地址
sed -i "5c \$DB['SERVER']                   = '10.0.0.8';" /html/conf/zabbix.conf.php
  1. 安装keepalived
yum install keepalived -y
  1. 配置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
  1. 配置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
  1. 加入开机启动
systemctl enable keepalived
  1. zabbix_server指定收集数据时使用的源IP
echo SourceIP=10.0.0.70 >> /etc/zabbix/zabbix_server.conf
  1. 配置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
  1. 关闭服务器,链接克隆一台zabbix-server02,再启动

zabbix-agent

  1. 关闭服务,删库,导库,授权
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.%';"
  1. 配置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
  1. 重启zabbix-agent2生效
systemctl start zabbix-agent2

zabbix-server02

  1. zabbix-server01链接克隆zabbix-server02,开机,修改主机名和IP
hostnamectl set-hostname zabbix-server02
sed -i 's#200#72#g' /etc/sysconfig/network-scripts/ifcfg-eth[01]
  1. 配置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
  1. 配置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
  1. 重启keepalived生效
systemctl restart keepalived

验证测试

  1. 关闭一台server,VIP漂移,正常使用zabbix
  2. 查看数据历史间隔:会丢失个别监控项的一次监控数据
posted @ 2021-03-03 21:14  原因与结果  阅读(485)  评论(0编辑  收藏  举报