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.inif, 网络接口上传(进入)流量统计。返回 整数 if表示网卡名字 可以忽略
net.if.outif, 流出流量统计。返回整数
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代理模式

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

  • 进程优化(服务端)

  • 缓存优化(服务端)

​​​​

相关推荐
giaz14n9X9 小时前
Redis 分布式锁进阶第六十三篇
分布式
ha_lydms11 小时前
AnalyticDB分区、分布键性能优化
android·大数据·分布式·性能优化·分布式计算·分区·analyticdb
pqk6V6Vep11 小时前
Redis 分布式锁进阶第一篇讲解
数据库·redis·分布式
giaz14n9X11 小时前
Redis 分布式锁进阶第六十一篇
数据库·redis·分布式
洛水水13 小时前
消息队列与Kafka详解
分布式·kafka
鸿乃江边鸟14 小时前
Spark中怎么做Spark canonicalize归一化
大数据·分布式·spark
SLD_Allen14 小时前
Kafka分区与消费者的关系kafka分区和消费者线程的关系
分布式·kafka
he___H14 小时前
数据密集型应用系统设计--其一
分布式
珠***格16 小时前
Ⅱ型边缘网关|易部署、易扩容、易改造
大数据·人工智能·分布式·能源·边缘计算
lvbinemail17 小时前
【无标题】
数据库·postgresql·zabbix·监控