Zabbix 分布式监控系统架构设计与优化

一、概念

1.核心概念

  • Zabbix是一个CS(服务端/客户端)架构的服务
  • Zabbix-Agent获取数据-->发送给-->Zabbix-Server服务端--- >数据会被存放在数据库 <--- Zabbix Web 页面展示数据

2.部署流程

  • 部署ngx+php环境并测试
  • 部署数据库 mariadb 10.5及以上 然后进行配置
  • 编译安装zabbix-server服务端及后续配置
  • 部署前端代码代码进行访问
  • web访问
  • 配置客户端

3.官网资料

Zabbix 文档

二、部署

1.部署ngx+php环境并测试

  • 配置ngx yum源并安装
bash 复制代码
 #配置yum源
 vim /etc/yum.repos.d/nginx.repo
 ​
 [nginx-stable]
 name=nginx stable repo
 baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
 gpgcheck=1
 enabled=1
 gpgkey=https://nginx.org/keys/nginx_signing.key
 module_hotfixes=true
 ​
 #安装nginx-1.22.0-1.el7.ngx.x86_64 版本
 yum -y install nginx-1.22.0-1.el7.ngx.x86_64
  • 配置php并安装
bash 复制代码
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
 yum -y install epel-release
 curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
 #webtatic源,一个web服务的源#安装php7及其它依赖软件
 rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm  
 rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm   
 ​
 yum install php72w-cli php72w-fpm php72w-gd php72w-mbstring php72w-bcmath php72w-xml php72w-ldap php72w-mysqlnd -y
 ​
 rpm -qa |egrep 'nginx|php'
  • nginx配置
bash 复制代码
[root@m03-zbx ~]# vim /etc/nginx/conf.d/zbx.liux.cn.conf
 ​
 server {
   listen 80;
   server_name zbx.liux.cn;
   root /app/code/zbx;
   location / {
   index index.php;
   }
   location ~ \.php$ {
     fastcgi_pass  127.0.0.1:9000;
     fastcgi_index index.php;
     fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
     include fastcgi_params;
   }
 }
 ​
 ​
 nginx -t
 systemctl enable nginx
 systemctl start nginx
  • php配置
bash 复制代码
 #修改用户名
 sed -ri '/^(user|group)/s#apache#nginx#g' /etc/php-fpm.d/www.conf 
 egrep '^(user|group)' /etc/php-fpm.d/www.conf
  • 创建目录并测试
bash 复制代码
 mkdir -p /app/code/zbx
 cd /app/code/zbx
 ​
 [root@m03-zbx zbx]# vim info.php
 ​
 <?php
 phpinfo();
 ?>
 ​
 #启动
 systemctl enable nginx php-fpm
 systemctl start nginx php-fpm
 ​
 #hosts解析
 10.0.0.63 zbx.liux.cn

2.部署数据库

  • zabbix 6.0 不支持 mariadb 5.5(默认源中的mariadb)安装mariadb 10.5
  • 配置maraidb yum源并安装
bash 复制代码
vim  /etc/yum.repos.d/mariadb.repo

[mariadb]
name = MariaDB
baseurl = https://mirrors.aliyun.com/mariadb/yum/10.5/centos7-amd64/
gpgkey = https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1
enable = 1

#安装
yum -y install  mariadb-server
[root@m03-zbx zbx]# rpm -qa |grep -i mariadb
MariaDB-common-10.5.19-1.el7.centos.x86_64
MariaDB-server-10.5.19-1.el7.centos.x86_64
MariaDB-compat-10.5.19-1.el7.centos.x86_64
MariaDB-client-10.5.19-1.el7.centos.x86_64
  • 启动
bash 复制代码
systemctl enable mariadb
systemctl start mariadb
  • 初始化数据库
bash 复制代码
 [root@Zabbix web]# mysql_secure_installation
 Enter current password for root (enter for none):   #回车
 Switch to unix_socket authentication [Y/n] n       #是否更改套接字
 Change the root password? [Y/n] y       #改root密码
 Remove anonymous users? [Y/n] y      #清除匿名用户
 Disallow root login remotely? [Y/n] y   #是否允许root远程登录
 Remove test database and access to it? [Y/n] y    #清除测试数据库
 Reload privilege tables now? [Y/n] y    #刷新表权限
  • 创建库和用户
bash 复制代码
 #1. 创建数据库要指定字符集
 create database zabbix charset utf8 collate utf8_bin;
 ​
 #2.创建zabbix用户
 grant all on zabbix.* to 'zabbix'@'localhost' identified by 'zabbix' ;
 #如果数据库与zbx,php不在一起
 #grant all on zabbix.* to 'zabbix'@'172.16.1.%' identified  by 'zabbix' ;
  • 向数据库中导入数据 表,数据 ⚠ 注意导入的顺序
bash 复制代码
 tar xf zabbix-6.0.9.tar.gz 
 cd zabbix-6.0.9/database/mysql/
 ​
 mysql -uroot -p12366 zabbix <schema.sql 
 mysql -uroot -p12366 zabbix <images.sql 
 mysql -uroot -p12366 zabbix <data.sql 
 mysql -uroot -p12366 zabbix <double.sql 
 mysql -uroot -p12366 zabbix <history_pk_prepare.sql 
 ​
 ​
 mysql -uroot -p12366 -e 'show tables from zabbix;' |wc -l

3. 编译安装zabbix-server服务端

  • 准备编译安装zabbix-server
bash 复制代码
 #安装依赖
 yum install -y mysql-devel pcre-devel openssl-devel zlib-devel libxml2-devel net-snmp-devel net-snmp libssh2-devel OpenIPMI-devel libevent-devel openldap-devel   libcurl-devel
 ​
 #进行配置 在源代码目录并且ls 可以看见configure文件
 #--sysconfdir 指定配置文件目录
 #--enable-server 服务端
 ​
 ./configure --sysconfdir=/etc/zabbix/ --enable-server --with-mysql \
 --with-net-snmp --with-libxml2 --with-ssh2 --with-openipmi --with-zlib --with-libpthread \
 --with-libevent --with-openssl --with-ldap --with-libcurl --with-libpcre
 ​
 #根据提示执行make install 
 make install
 ​
 # 检查是否成功
 echo $?
  • 修改zbx服务端配置文件
bash 复制代码
vim /etc/zabbix/zabbix_server.conf
 grep -n '^[a-Z]' /etc/zabbix/zabbix_server.conf
 ListenPort=10051
 LogFile=/tmp/zabbix_server.log
 DBHost=localhost
 DBName=zabbix
 DBUser=zabbix
 DBPassword=zabbix
 Timeout=4
 LogSlowQueries=3000
 StatsAllowedIP=127.0.0.1
  • 启动zabbix服务端
bash 复制代码
 #添加个虚拟用户
 useradd -s /sbin/nologin -M zabbix
 ​
 #启动zbx服务端
 zabbix_server
 #检查端口
 ss -lntup|grep 10051
 #检查进程
 ps -ef |grep zabbix
  • 书写systemctl 启动配置文件
bash 复制代码
vim /usr/lib/systemd/system/zabbix-server.service
 ​
 [Unit]
 Description=Zabbix Server with MySQL DB
 After=syslog.target network.target
 ​
 [Service]
 Type=simple
 ExecStart=/usr/local/sbin/zabbix_server -f
 User=zabbix
 ​
 [Install]
 WantedBy=multi-user.target
 ​
 # 加载配置文件
 systemctl daemon-reload
 ​
 #关闭手动启动的zbx server
 pkill zabbix_server
 ​
 # 检查是否关闭成功
 ps -ef |grep zabbix
 ​
 #启动与检查
 systemctl enable zabbix-server
 systemctl start zabbix-server
 systemctl status zabbix-server

4.部署前端代码进行访问

bash 复制代码
#ui/*  安装包zabbix-6.0.9里面
cp -r ui/* /app/code/zbx
chown -R nginx.nginx /app/code/zbx

5.web访问

bash 复制代码
10.0.0.63 zbx.liux.cn

http://zbx.liux.cn/
  • 选择简体中文 下一步

  • 解决报错

bash 复制代码
vim  /etc/php.ini
max_execution_time = 300
max_input_time = 300
post_max_size = 16M

#重启php,刷新页面,进入下一步
systemctl restart php-fpm.service
  • 输入php连接数据库的信息,进行下一步
  • 输入网站名称和选择时区(上海),下一步,继续下一步
  • 输入用户名和密码,进入zbx Admin / zabbix

6.安装zbx客户端

bash 复制代码
yum -y install https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-agent2-6.0.9-release1.el7.x86_64.rpm

#配置客户端(服务端和客户端在同一台服务器时不需要配置)
vim /etc/zabbix/zabbix_agent2.conf 
Server=172.16.1.63
#启动
systemctl enable zabbix-agent2.service
systemctl start zabbix-agent2.service
  • web页面配置

7 解决zbx中文乱码的问题

  • 上传一个中文的ttf字体替换zabbix自用的字体
bash 复制代码
cd /app/code/zbx/assets/fonts
rm -rf DejaVuSans.ttf
mv STKAITI.TTF DejaVuSans.ttf

三、自定义监控

1.自定义监控-客户端

  • linux:通过命令、脚本取出对应的值

  • linux:根据zbx要求按照格式,书写配置文件,创建键值

  • linux:重启客户端,客户端测试键值是否可用 zabbix_agent2 -t

bash 复制代码
判断nginx是否存活
#1.客户端写命令
ss -lntup |grep -wc 80

#2.创建键值、重启
UserParameter=key,cmd
UserParameter=固定写法,表示要自定义键值
key表示键值名字,命名最好就是 单词+"." (点)
cmd表示命令或脚本

vim /etc/zabbix/zabbix_agent2.d/web.conf
UserParameter=web.ngx.80,ss -lntup |grep -wc 80

#3.重启
systemctl restart zabbix-agent2.service

#4.客户端本地测试
zabbix_agent2  -t web.ngx.80

2.自定义监控-服务端

  • linux:服务端测试键值是否可用 zabbix_get

  • web页面:键值与监控项关联

  • web页面: 测试

  • web页面:添加图形

  • web页面:添加触发器(报警)

bash 复制代码
rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/6.0/rhel/7/x86_64/zabbix-get-6.0.9-release1.el7.x86_64.rpm

#手动测试
#zabbix_get 向客户端要指定键值的数据  -s客户端ip地址  -p客户端端口号(默认10050) -k指定键值
zabbix_get -s 172.16.1.7 -p 10050 -k web.ngx.80

#web页面创建监控项、触发器

3.自定义监控-带参数案例

  • 客户端配置
bash 复制代码
#实现取出指定用户的登录的ip地址
lastlog |grep root |awk '{print $3}'

#书写键值key
vim /etc/zabbix/zabbix_agent2.d/login.conf
UserParameter=user.login.check[*],lastlog |grep "$1" |awk '{print $$3}'

systemctl restart zabbix-agent2.service 
zabbix_agent2 -t user.login.check[root]

#如果使用自定义键值传参,awk取列的时候要使用$$列
  • 服务端配置
bash 复制代码
[root@m03-zbx ~]# zabbix_get -s 172.16.1.7 -k user.login.check[root]
10.0.0.1
  • 服务端配置监控项和触发器 web页面触发器做对比

四、常用键值与触发器函数

zbx客户端键值:1 平台支持的监控项 (zabbix.com)

1.常用键值

键值 说明
agent.hostname 主机名 获取的是客户端配置文件中指定的主机名
system.hostname 主机名 系统的主机名 类似于hostname
agent.ping 服务端与客户端是否通畅 通1 不通非1
net.if.in[if,] 网络接口上传(进入)流量统计。返回 整数 if表示网卡名字 可以忽略
net.if.out[if,] 流出流量统计。返回整数
proc.num[,,,,] 进程数。返回整数 name进程名字 user用户 state进程状态 cmdline进程对应的命令
net.tcp.port[,port] 检查是否能建立 TCP 连接到指定端口 返回 0 - 不能连接;1 - 可以连接
bash 复制代码
#过滤僵尸进程数量   state 写为 zomb
zabbix_get -s 172.16.1.7 -p 10050 -k proc.num[,,zomb]

zabbix_get -s 172.16.1.7 -k net.if.in[eth0,]
zabbix_get -s 172.16.1.7 -k proc.num[nginx]
zabbix_get -s 172.16.1.7 -k net.tcp.port[,80]

2.触发器函数

  • 写在触发器表达式中.用于设置报警条件.

  • 触发器函数要结合键值(监控项)

函数 说明
last() 最近值 (最新的值),取出最近一些值
nodata() 是否有数据
diff() 是否发生变化 一般配合md5check()
avg() 平均值
min() 最小值
max() 最大值
  • 分析案例: 目的是用来检查/etc/passwd的变化情况,间接检查是否有用户增加或删除(/etc/passwd has been changed)
bash 复制代码
#倒数第1个 /etc/passwd 的md5值
last(/web01/vfs.file.cksum[/etc/passwd,sha256],#1)
<>
#倒数第2个 /etc/passwd 的md5值
last(/web01/vfs.file.cksum[/etc/passwd,sha256],#2)

#两个不相等,则报警
  • 书写触发器案例 swap

    • 条件1:swap总大小大于0

    • 条件2:swap当前使用的大小大于0(没有直接可以使用的监控项,这里调整为当前swap空闲率小于100)

bash 复制代码
#条件swap总大小大于0
last(/web01/system.swap.size[,total])>0 
and
#swap空间空闲率小于100
last(/web01/system.swap.size[,pfree])<100

五、zabbix自动发现与自动注册

1.自动发现

服务端主动去找是否有新的主机,有则添加进来并关联模板

  • 客户端(zbx agent),配置文件

  • web配置自动发现规则. web页面-->配置-->自动发现

  • web配置自动发现的动作 . web页面-->配置-->动作-->Discovery actions

    • 添加主机

    • 添加到主机群组: Linux servers

    • 链接到模板: Linux by Zabbix agent

    • 链接到模板: all_sys_common

    • 启用主机

2.自动注册

客户端主动去找服务端提交自己的信息,请求向服务端注册

  • 关闭自动发现规则、动作

  • zbx客户端配置文件

  • web页面添加动作 web页面-->配置-->动作-->Autoregistration actions

2.1 zbx客户端修改配置文件
  • 客户端主动把自己的信息,提供给服务端
客户端配置 说明
Server=172.16.1.63 服务端地址
ServerActive=172.16.1.63 主动模式下的服务端ip地址
#Hostname=web01 当前主机名,这个可以注释掉或使用ansible配置。建议注释使用下面的内容,自动获取主机名
HostnameItem=system.hostname 通过后面指定的键值获取主机名 ⚠ Hostname和HostnameItem2选1 Item监控项、键值
HostMetadataItem=system.uname 主机的 元数据 键值,类似于自动发现中的system.uname判断存活和获取主机信息
bash 复制代码
[root@web01 ~]# egrep '^[z-Z]' /etc/zabbix/zabbix_agent2.conf 
PidFile=/run/zabbix/zabbix_agent2.pid
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=0
Server=172.16.1.63
ServerActive=172.16.1.63
HostnameItem=system.hostname
HostMetadataItem=system.uname
Include=/etc/zabbix/zabbix_agent2.d/*.conf	
ControlSocket=/tmp/agent.sock
Include=./zabbix_agent2.d/plugins.d/*.conf

#主要修改下面四个
Server=172.16.1.63
ServerActive=172.16.1.63
HostnameItem=system.hostname
HostMetadataItem=system.uname
2.2 zbx服务端页面添加动作-->自动注册

六、监控告警

可以通过个人邮件、企业微信、OA系统告警通知,以下介绍个人邮件告警

1.设置流程

  • 开启个人邮箱 smtp功能 获取授权码

  • 发件人配置:zabbix web页面 管理-->报警媒介类型

  • 收件人配置:zabbix web页面 user settings-->profile-->报警媒介

  • 发件条件: zabbix web页面 配置-->动作-->trigger actions

2.设置告警模板

bash 复制代码
#163邮箱授权码
POCENDSPAHJISVPR

smtp.163.com

#添加告警邮件内容: Messages template
#故障告警信息
主题:   故障名称: {EVENT.NAME}

消息: 
故障始于 时间: {EVENT.TIME} 日期: {EVENT.DATE}
故障名称: {EVENT.NAME}
故障主机: {HOST.NAME}
严重程度: {EVENT.SEVERITY}
额外信息: {EVENT.OPDATA}
故障ID: {EVENT.ID}
触发器地址: {TRIGGER.URL}



#信息类型是: Problem recov 故障解决的时候
主题: 故障解决 in {EVENT.DURATION}: {EVENT.NAME}
消息: 
故障已经解决 时间: {EVENT.RECOVERY.TIME} 日期: 
{EVENT.RECOVERY.DATE}
故障名称: {EVENT.NAME}
故障持续时间: {EVENT.DURATION}
故障主机: {HOST.NAME}
故障级别: {EVENT.SEVERITY}
故障ID: {EVENT.ID}
{TRIGGER.URL}

3.页面配置告警

4.告警案例

检查用户是否从堡垒机登录

bash 复制代码
#检查脚本
vim /server/scripts/check_baolei_login.sh

########################################################
# File Name:/server/scripts/check_baolei_login.sh
# Version:V1.0
# Author:liux
# Desc:检查是否从堡垒机登录
########################################################

ip=$1

login_user_cnt=`who |wc -l`
login_no_baolei_cnt=`who |grep -wv 10.0.0.1|wc -l`

#如果登录用户数不为0 并且 登录的ip不是堡垒机的ip
if [ $login_user_cnt -gt 0 -a $login_no_baolei_cnt -gt 0 ];then
  echo 0
else
  echo 1
fi

#监控脚本
vim /etc/zabbix/zabbix_agent2.d/login.conf

UserParameter=user.login.check[*],lastlog |grep '$1' |awk '{print $$3}'
UserParameter=user.check.bl.login[*],sh /server/scripts/check_baolei_login.sh "$1"

#重启zabbix
systemctl restart zabbix-agent2.service
#客户端测试
zabbix_agent2 -t user.check.bl.login[10.0.0.1]
#服务端测试
zabbix_get -s 172.16.1.7 -k user.check.bl.login[10.0.0.1]
  • 页面配置监控项、触发器

七、zbx性能优化

  • 高并发需要对MySQL进行拆分

  • zabbix-agent被动上传修改为主动上报模式

  • 地区较多情况尽量使用proxy代理模式

  • 系统自带监控项优化:精简无用的监控项,适当增加取值间隔,减少数据的保留周期

  • 进程优化(服务端)

  • 缓存优化(服务端)

​​​​

相关推荐
cui_win2 小时前
Kafka 配置参数详解:ZooKeeper 模式与 KRaft 模式对比
分布式·zookeeper·kafka
cui_win6 小时前
深入理解 Kafka 核心:主题、分区与副本的协同机制
网络·分布式·kafka
淦暴尼6 小时前
基于spark的二手房数据分析可视化系统
大数据·分布式·数据分析·spark
黄雪超8 小时前
Kafka——无消息丢失配置怎么实现?
大数据·分布式·kafka
无问81710 小时前
RabbitMQ概述和工作模式
分布式·rabbitmq·ruby
武子康13 小时前
Java-75 深入浅出 RPC Dubbo Java SPI机制详解:从JDK到Dubbo的插件式扩展
java·分布式·后端·spring·微服务·rpc·dubbo
小周学学学14 小时前
zabbix以SNMP(V2C)监控网络设备,以华为设备为例
服务器·华为·zabbix
一切顺势而行15 小时前
hadoop 集群问题处理
大数据·hadoop·分布式
Bug退退退1231 天前
RabbitMQ 高级特性之消息分发
java·分布式·spring·rabbitmq