Zabbix监控环境搭建,监控项简单、高级应用,包括自定义监控项、采集器、自动发现规则、监控项原型、宏

Zabbix监控环境搭建,监控项简单、高级应用

介绍:

Zabbix是一个开源的企业级分布式监控解决方案,能够监控各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。Zabbix 使用灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的警报。这允许对服务器问题做出快速反应。Zabbix 基于存储的数据提供报告和数据可视化功能。这使得 Zabbix 成为容量规划的理想选择。

zabbix由2部分构成,zabbix server 与可选组件zabbix agent。 通过c/s 模式采集数据,通过B/s模式在web端展示和配置。

zabbix监控部署在系统中,包含常见的五个程序: zabbix server、 zabbix agent、 zabbix proxy、zabbix get、zabbix sender 等。

  • (1)zabbix server: zabbix 服务端守护进程,其中zabbix_agent、 zabbix_ get、zabbix_sender、 zabbix_proxy的数据最终都提交给zabbix server;
  • (2)zabbix agent: 客户端守护进程,负责收集客户端数据,例如:收集CPU负载、内存、硬盘使用情况等;
  • (3)zabbi xproxy: zabbix分布式代理守护进程,通常大于500台主机,需要进行分布式监控架构部署;
  • (4)zabbix get: zabbix 数据接收工具,单独使用的命令,通常在server 或者proxy端执行获取远程客户端信息的命令;
  • (5)zabbix sender: zabbix 数据发送工具,用户发送数据给server 或proxy端,通常用户耗时比较长的检查。

zabbix工作原理

一、准备环境

1 服务器详情

1.1、部署环境
类别IP地址主机名安装服务
zabbix服务端192.168.6.108zbx-serverzabbix-server-psql
zabbix-agent
zabbix客户端192.168.6.109zabbix-clientzabbix-agent
zabbix客户端192.168.6.110zabbix-clientzabbix-agent

部署详情

1.2、软件版本
软件版本
zabbixZabbix5.0.42
phprh-php72
nginxrh-nginx116-nginx
PostgreSQL16.3
linuxRed Hat Enterprise Linux Server release 7.7 (Maipo)

2、应用所属用户信息

名称账号密码
zabbix-server
zabbix-agent
nginx
php
rootlinux
PostgreSQLpostgrespostgres

3、部署目录

名称目录位置
zabbix-server配置文件/etc/zabbix/zabbix_server.conf
zabbix-agent配置文件/etc/zabbix/zabbix_agent.conf
rh-php配置文件/etc/opt/rh/rh-php72/php-fpm.conf
rh-nginx参数文件/etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf
PG数据库安装目录/usr/local/postgres/16.3
PG数据库数据目录/data/postgres/data

二、安装zabbix

2.1、首先保证yum命令是可用的,配置远程仓库地址

如果yum不可用建议参考:https://blog.csdn.net/qq_61920297/article/details/140755306

CentOS-Base.repo仓库

[root@zib-server yum.repos.d]# vim CentOS-Base.repo
[base]
name=CentOS-$releasever - Base - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/os/x86_64/
        http://mirrors.aliyuncs.com/centos/7/os/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/7/os/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#released updates 
[updates]
name=CentOS-$releasever - Updates - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/updates/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/updates/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/extras/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/extras/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/centosplus/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/centosplus/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
 
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/contrib/$basearch/
        http://mirrors.aliyuncs.com/centos/$releasever/contrib/$basearch/
        http://mirrors.cloud.aliyuncs.com/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7

CentOS-SCLo-rh.repo仓库

####软件包管理器集合
[root@zib-server yum.repos.d]# vim CentOS-SCLo-rh.repo 
[centos-sclo-rh]
name=CentOS-7 - SCLo rh
baseurl=https://mirrors.aliyun.com/centos/7/sclo/x86_64/rh/
gpgcheck=0
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo

Zabbix 仓库

rpm -Uvh https://mirrors.aliyun.com/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.aliyun.com/zabbix#' /etc/yum.repos.d/zabbix.repo 

##修改限制,Edit file /etc/yum.repos.d/zabbix.repo and enable zabbix-frontend repository.

[zabbix-frontend]
...
enabled=1
...

2.2安装zabbix-server、zabbix-agent、php、nginx,导入zabbix元数据到数据库

##安装server和agent端以及相关依赖
yum install zabbix-server-pgsql zabbix-agent -y 

##安装web端
yum install zabbix-web-pgsql-scl zabbix-nginx-conf-scl -y

##安装完成后会有这些组件
[root@postgres ~]# rpm -qa | grep zabbix
zabbix-web-pgsql-scl-5.0.42-1.el7.noarch
zabbix-get-5.0.42-1.el7.x86_64
zabbix-server-pgsql-5.0.42-1.el7.x86_64
zabbix-release-5.0-1.el7.noarch
zabbix-web-5.0.42-1.el7.noarch
zabbix-agent-5.0.42-1.el7.x86_64
zabbix-web-deps-scl-5.0.42-1.el7.noarch
zabbix-nginx-conf-scl-5.0.42-1.el7.noarch
[root@postgres ~]# 

##把zabbix的元数据导入到数据库
[postgres@postgres ~]$ zcat /usr/share/doc/zabbix-server-pgsql*/create.sql.gz | psql -d zabbix

 (venv-patctl-1.8.0) [postgres@postgres ~]$ psql
psql (16.3)
Type "help" for help.

postgres=# \c zabbix 
You are now connected to database "zabbix" as user "fbase".
zabbix=# \d
                   List of relations
 Schema |            Name            |   Type   | Owner 
--------+----------------------------+----------+-------
 public | acknowledges               | table    | fbase
 public | actions                    | table    | fbase
 public | alerts                     | table    | fbase
 public | application_discovery      | table    | fbase
 public | application_prototype      | table    | fbase
 public | application_template       | table    | fbase
 public | applications               | table    | fbase
 public | auditlog                   | table    | fbase

2.3、配置server、agent、nginx、php


##server的配置基本上只需要配置,主机、端口、用户、密码、数据库就是了
[root@postgres ~]# cat /etc/zabbix/zabbix_server.conf
LogFile=/var/log/zabbix/zabbix_server.log
LogFileSize=0
PidFile=/var/run/zabbix/zabbix_server.pid
SocketDir=/var/run/zabbix
DBHost=192.168.6.108
DBName=zabbix
DBSchema=public
DBUser=fbase
DBPassword=fbase
DBPort=5432
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log
Timeout=4
AlertScriptsPath=/usr/lib/zabbix/alertscripts
ExternalScripts=/usr/lib/zabbix/externalscripts


##nginx的配置,取消掉下面这两个参数的注释,改为合适的值
[root@postgres ~]# vim /etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf 

listen 80;
server_name 192.168.6.108;

##php的配置
[root@postgres ~]# vim /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf

listen.acl_users = apache,nginx
php_value[date.timezone] = Asia/Shanghai

##agent的配置
[root@postgres ~]#/etc/zabbix/zabbix_agent.conf

PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=127.0.0.1
ServerActive=127.0.0.1
Hostname=Zabbix server
Include=/etc/zabbix/zabbix_agentd.d/*.conf

##启动server、agent、nginx、php,设置为开机自动启动
[root@postgres ~]# systemctl restart zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm
[root@postgres ~]# systemctl enable zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm

2.4、配置web页面

打开http:IP/zabbix  例:http://192.168.6.108/zabbix(或者:http://192.168.6.108)

点击【Next step】检查组件是否`OK`
点击【Next step】配置连接数据库
输入zabbix帐户的密码,然后【Next step】
然后一直点击下一步,直到看到提示安装成功。点【Finish】
【用户名】:Admin,【密码】:zabbix

安装完成的结果如图所示

2.5、添加agent主机

可以再109、110主机同时进行如下操作

添加CentOS-Base.repo仓库、CentOS-SCLo-rh.repo仓库、zabbix仓库,解除zabbix仓库的部分限制(可以参考2.1)

##下载安装agent端
yum install zabbix-agent -y

修改agent端配置文件

[root@postgres ~]#/etc/zabbix/zabbix_agent.conf

PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=192.168.6.108
ServerActive=192.168.6.108
Hostname=192.168.6.109
Include=/etc/zabbix/zabbix_agentd.d/*.conf

注意:
需要关心的参数为,Server(zabbix-server端的地址,),ServerActive(agent端的主动模式,可以和server并存,和server的ip相同),Hostname(agent端所在的主机名或者ip,但是在web界面的hostname部分一定要与agent的Hostname部分保持一致,不然在servsr端会疯狂报错)
agent配置注意事项

在web端添加agent主机

点击左边菜单栏【配置】中的【主机】,点击【创建主机】
【主机名称】设置成 192.168.6.109                    #自定义
【可见的名称】设置成 192.168.6.109       #自定义
【群组】选择 Linux server     
再点击上方菜单栏【模板】
【Link new tamplates】搜索 Linux ,选择 Template OS Linux by Zabbix agent
点击 【添加】                      

注意:添加主机这个部分(这个zabbix5.0有BUG,在agent和serve的log都不报错的前提下,要么等很长一段时间,状态灯变绿,或者多次打开关闭agent的配置文件使其重新加载)
添加完成的结果

三、创建模板,添加一个简单的自定义监控项,创建触发器,创建邮件报警,

3.1、创建模板

点击左边菜单栏【配置】中的【模板】,点击【创建模板】
【模板名称】设置成 pg_stat_replication  #自定义
【可见的名称】设置成 pg_stat_replication  #自定义
【群组】选择 Linux    #自定义
【描述】可自定义
点击 【添加】,此时在搜索框中输入 Linux 就可以看到 pg_stat_replication 模板了

创建模板

3.2、创建自定义监控项

点开选中的模板,点击上方菜单栏【监控项】,点击【创建监控项】
【名称】设置成 pg_stat_replication
【键值】设置成 stat-replication[{$PGSHELL_ENV}]	#(这里可以把`宏`给替换成具体的脚本路径)键值必须要与自定义的监控项配置文件中设置的保持一致
【更新间隔】设置成 10s
【历史数据保留时长】Storage period 30d		#保留时间可自定义设置
点击 【添加】

创建监控项

3.3、创建触发器

点开选中的模板,点击上方菜单栏【触发器】,点击【创建触发器】
【名称】设置成 Wal delay exceeds 5M
【严重性】设置成 严重
【表达式】点击添加,【监控项】点击选择 pg_stat_replication,【功能】选择 last(),【结果】选择 > 5,点击 【插入】
点击 【添加】

创建触发器

给触发器添加动作,使其报警邮件生效
添加动作

3.4、创建图形

点击上方菜单栏【图形】,点击【创建图形】
【名称】设置成 wal_stat_replication
【宽】、【高】可直接采用默认值
【监控项】点击添加勾选相关监控项 pg_stat_replication,【功能】选择 最大,其它可保持默认值
点击 【添加】

创建图形

3.5、把模板与主机关联起来,去查看主机监控项的指标

点击左边菜单栏【配置】中的【主机】,点击你要关联的主机
点击上方菜单栏【模板】,链接新模板搜索 pg_stat_replication,选择 pg_stat_replication,点击【更新】
此时就点击【监测】中的【主机】,点击你关联主机的【图形】,即可查看到相关的监控项指标

关联主机和模板

点击左边菜单栏【配置】中的【主机】,点击你要关联的主机
点击上方菜单栏【模板】,链接新模板搜索 pg_stat_replication,选择 pg_stat_replication,点击【更新】
此时就点击【监测】中的【主机】,点击你关联主机的【图形】,即可查看到相关的监控项指标

3.6、设置邮件报警

点击左边菜单栏【管理】中的【报警媒介类型】,点击【创建媒体类型】
【名称】设置成 qq_Email
【SMTP服务器】设置成 smtp.qq.com
【SMTP服务器端口】设置成 25
【SMTP HELO】设置成 qq.com
【SMTP电邮】设置成 自己的邮箱地址,例如 123456789@qq.com
【认证】选择 用户名和密码
【用户名称】设置成 自己的邮箱地址,例如 123456789@qq.com
【密码】可登录QQ邮箱页面,点击【设置】-->【账户】中的【生成授权码】,通过短信获取授权码
【描述】可自定义                        
点击上方菜单栏【Message templates】,点击【添加】,【Message type】选择 问题,点击【更新】
点击 【添加】,并测试功能

点击左边菜单栏【User settings】-->【报警媒介】,点击【添加】
【类型】选择 qq_Email
【收件人】设置成 如123456789@163.com
【当启用时】设置成 1-7,00:00-24:00
点击 【添加】
再点击 【更新】
点击左边菜单栏【配置】中的【动作】,选择相对应的动作名称,点击【启用】

测试报警媒介

3.7、编写后台脚本,测试邮件报警

配置主机:

配置主机宏

## 在109节点上的agent端编写查找信息的脚本
[root@postgres ~]# pwd
/root
[root@postgres ~]# cat pg_stat_replication.sh 
#!/bin/bash
SQL_QUERY="select pg_wal_lsn_diff(sent_lsn ,replay_lsn) from pg_stat_replication;"
su - postgres -c "psql -p 8432 -h 192.168.6.109 -t -c \"$SQL_QUERY\""

##配置agent端的用户自定义监控参数
[root@postgres zabbix_agentd.d]# pwd
/etc/zabbix/zabbix_agentd.d
[root@postgres zabbix_agentd.d]# cat pg_stat_replication.conf 
UserParameter=stat-replication[*], "$1"/pg_stat_replication.sh

##在108节点是的zabbix-server端测试正确性
[root@postgres ~]# zabbix_get -s 192.168.6.109 -k stat-replication[/root/]
               0
[root@postgres ~]#

参数说明:

参数选项说明
-s --hosthost-name-or-IP一般是指定的zabbix-agent端
-p --portport-number指定主机上运行代理的端口号(默认值:10050)。
-I --source-addressIP-address指定源IP地址。
-k --keyitem-key指定要检索其值的项目的键。
-h --help显示帮助信息。
-V --version显示版本号。

在web页面上测试

【配置】>>【主机】>>【模板】>>【监控项】>>选择被动模式,测试(被动模式是agent端项server端发数据,主动模式是server向agent索要数据)

测试返回值

压力测试数据库,查看延迟波动

查看wal延迟

查看仪表盘的报警提示

仪表盘的报警
查看邮件报警
邮件报警

四、使用自动发现,自动发现规则,采集器等高级自定义监控项

主机的信息:
主机宏

4.1、自动发现,自动发现主机

zabbix server 主动的去发现所有的客户端,然后将客户端的信息登记在服务端上。缺点是如果定义的网段中的主机数量多,zabbix server 登记耗时较久,且压力会较大。

点击左边菜单栏【配置】中的【主机】,勾选原有的客户端主机,点击 删除:
点击左边菜单栏【配置】中的【自动发现】,点击【创建发现规则】
【名称】设置成 mynetwork
【IP范围】设置成 192.168.6.1-254
【更新间隔】设置成 30s
【检查】点击【添加】,【检查类型】选择 Zabbix 客户端,【端口范围】设置成 10050,【键值】设置成 system.uname
【设备唯一性准则】选择 IP地址
【主机名称】选择 DNS名称
【可见的名称】选择 主机名称
勾选 【已启用】,点击 【更新】
 
点击左边菜单栏【配置】中的【动作】,上方菜单下拉选择 【发现动作】
勾选 【Auto discovery. Linux servers.】,点击 【启用】
 
点击左边菜单栏【配置】中的【主机】刷新,等待一段时间后即可刷新出自动发现的客户端主机

自动发现配置信息
自动发现所填信息

自动发现主机
自动发现主机

自动发现主机后台显示

自动发现后台

4.2、自动发现,自动发现规则、监控项原型,自动发现数据库所占内存大小

【配置】》【主机】》【自动发现规则】》【创建自动发现规则】

创建自动发现规则
创建自动发现规则

填写自动发现规则配置信息

自动发现规则

填写监控项原型配置信息
监控原型配置信息
编写后台查询数据库名称的脚本,输出JSON格式数据

[root@postgres ~]# cat pgdb_name.sh 
#!/bin/bash

# 定义 SQL 查询语句作为变量
SQL_QUERY="SELECT datname FROM pg_database;"

# 使用 su - postgres 启动子shell,然后在其中执行 psql 命令
result=$(su - postgres -c "psql -p 8432 -h 192.168.6.109 -t -c \"$SQL_QUERY\"")

ports=$result
# Initialize an array to store port information
port_array=()

# Iterate over each port and add to the array in JSON format
for port in $ports; do
    port_array+=("{
      \"{#DATABASE}\": \"$port\"
    },")
done

# Remove the trailing comma from the last element
last_index=$((${#port_array[@]} - 1))
port_array[$last_index]=${port_array[$last_index]%,}

# Format the output as JSON with proper indentation and formatting
echo '{
  "data": ['
for port_info in "${port_array[@]}"; do
    echo "    $port_info"
done
echo '  ]
}'

[root@postgres ~]# ls
1.sh             discovery_process.sh  Downloads             Music         pg_info.sh              Pictures  Templates
anaconda-ks.cfg  discovery_status.sh   initial-setup-ks.cfg  pgdb_name.sh  pg_process.sh           Public    Videos
Desktop          Documents             iostat_zabbix.sh      pgdb_size.sh  pg_stat_replication.sh  sh        vim
[root@postgres ~]# ./pgdb_name.sh 
{
  "data": [
    {
      "{#DATABASE}": "postgres"
    },
    {
      "{#DATABASE}": "template1"
    },
    {
      "{#DATABASE}": "template0"
    },
    {
      "{#DATABASE}": "pubdb11"
    },
    {
      "{#DATABASE}": "pubdb"
    },
    {
      "{#DATABASE}": "test"
    },
    {
      "{#DATABASE}": "mytestdb"
    }
  ]
}
[root@postgres ~]# 

编写接收参数,查询数据库大小的脚本

[root@postgres ~]# cat pgdb_size.sh 
#!/bin/bash
Database_name=$1
SQL_QUERY="SELECT ROUND(pg_database_size(datname) / 1024.0) AS size FROM pg_database where datname = '$Database_name';"
if [ -z "$Database_name" ]; then
    echo "0"
else
# 使用 su - postgres 启动子shell,然后在其中执行 psql 命令
result=$(su - postgres -c "psql -p 8432 -h 192.168.6.109 -t -c \"$SQL_QUERY\"")
number=$(echo "$result" | sed 's/[^0-9]*//g')
number=$(expr $number \* 1000)
echo "$number"
fi
[root@postgres ~]# 

配置用户自定义监控项参数

[root@postgres zabbix_agentd.d]# cat pgdb_size.conf 
UserParameter=pgdb_all_name,/root/pgdb_name.sh
UserParameter=pgdb_all_size[*],/root/pgdb_size.sh $1
[root@postgres zabbix_agentd.d]# 

在zabbix-server端使用zabbix_get工具进行测试

[root@postgres ~]# zabbix_get -s 192.168.6.109 -k pgdb_all_name
{
  "data": [
    {
      "{#DATABASE}": "postgres"
    },
    {
      "{#DATABASE}": "template1"
    },
    {
      "{#DATABASE}": "template0"
    },
    {
      "{#DATABASE}": "pubdb11"
    },
    {
      "{#DATABASE}": "pubdb"
    },
    {
      "{#DATABASE}": "test"
    },
    {
      "{#DATABASE}": "mytestdb"
    }
  ]
}
[root@postgres ~]# zabbix_get -s 192.168.6.109 -k pgdb_all_size[postgres]
6724000
[root@postgres ~]# 

在web页面端进行测试

自动发现规则的测试数据
获取数据库名称

监控项原型的测试数据

根据数据库名获得数据库大小

自动发现的监控项

监控项结果展示

查看最新数据的最终结果

自动发现的的数据

测试程序应用的健壮性,生成数据查看database大小变化

postgres=# create database mydb;
CREATE DATABASE
postgres=# \c mydb 
You are now connected to database "mydb" as user "fbase".
mydb=# CREATE OR REPLACE FUNCTION random_string(
  num INTEGER,
  chars TEXT default '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
) RETURNS TEXT
LANGUAGE plpgsql
AS $$
DECLARE
  res_str TEXT := '';
BEGIN
  IF num < 1 THEN
      RAISE EXCEPTION 'Invalid length';
  END IF;
  FOR __ IN 1..num LOOP
    res_str := res_str || substr(chars, floor(random() * length(chars))::int + 1, 1);
  END LOOP;
  RETURN res_str;
END $$;

CREATE FUNCTION
mydb=# create table t1 (id serial, name varchar(20));
CREATE TABLE
mydb=# insert into t1 (name) select random_string(20);
INSERT 0 1
mydb=# insert into t1 (name) select random_string(20);
INSERT 0 1
mydb=# insert into t1 (name) select random_string(20);
INSERT 0 1
mydb=# insert into t1 (name) select random_string(20);
INSERT 0 1
mydb=# insert into t1 select * from t1;
INSERT 0 4
mydb=# insert into t1 select * from t1;
INSERT 0 8
mydb=# insert into t1 select * from t1;
INSERT 0 16
mydb=# insert into t1 select * from t1;
INSERT 0 32
mydb=# insert into t1 select * from t1;
INSERT 0 64
mydb=# insert into t1 select * from t1;
INSERT 0 128
mydb=# 

查看变化后的数据库大小信息

自动发现数据库

4.3、自动发现,自动发现规则、监控原型、采集器(数据推送)应用

【配置】》【主机】》【自动发现规则】》【创建自动发现规则】

创建自动发现规则
创建自动发现规则

填写自动发现规则配置信息
自动发现规则配置

填写采集器监控项原型配置信息
采集器配置信息

编写后台获取数据库名称的脚本

[root@postgres ~]# cat pgdb_name.sh 
#!/bin/bash

# 定义 SQL 查询语句作为变量
SQL_QUERY="SELECT datname FROM pg_database;"

# 使用 su - postgres 启动子shell,然后在其中执行 psql 命令
result=$(su - postgres -c "psql -p 8432 -h 192.168.6.109 -t -c \"$SQL_QUERY\"")

ports=$result
# Initialize an array to store port information
port_array=()

# Iterate over each port and add to the array in JSON format
for port in $ports; do
    port_array+=("{
      \"{#DATABASE1}\": \"$port\"
    },")
done

# Remove the trailing comma from the last element
last_index=$((${#port_array[@]} - 1))
port_array[$last_index]=${port_array[$last_index]%,}

# Format the output as JSON with proper indentation and formatting
echo '{
  "data": ['
for port_info in "${port_array[@]}"; do
    echo "    $port_info"
done
echo '  ]
}'

[root@postgres ~]# ./pgdb_name.sh 
{
  "data": [
    {
      "{#DATABASE1}": "postgres"
    },
    {
      "{#DATABASE1}": "template1"
    },
    {
      "{#DATABASE1}": "template0"
    },
    {
      "{#DATABASE1}": "pubdb11"
    },
    {
      "{#DATABASE1}": "pubdb"
    },
    {
      "{#DATABASE1}": "test"
    },
    {
      "{#DATABASE1}": "mytestdb"
    },
    {
      "{#DATABASE1}": "mydb"
    }
  ]
}
[root@postgres ~]# 

配置用户自定义监控项参数

[root@postgres zabbix_agentd.d]# cat pgdb_size.conf 
UserParameter=pgdb_all_name1,/root/pgdb_name.sh

在zabbix-server端测试

[root@postgres ~]# zabbix_get -s 192.168.6.110 -k pgdb_all_name1
{
  "data": [
    {
      "{#DATABASE1}": "postgres"
    },
    {
      "{#DATABASE1}": "template1"
    },
    {
      "{#DATABASE1}": "template0"
    },
    {
      "{#DATABASE1}": "pubdb11"
    },
    {
      "{#DATABASE1}": "pubdb"
    },
    {
      "{#DATABASE1}": "test"
    },
    {
      "{#DATABASE1}": "mytestdb"
    },
    {
      "{#DATABASE1}": "mydb"
    }
  ]
}
[root@postgres ~]# 

编写推送数据的脚本

小测试:在110机器上测试推送信息

[root@postgres ~]# zabbix_sender -z 192.168.6.108 -p 10051 -s 192.168.6.110 -k pgdb_all_size1[pubdb11] -o 7465 -vv
zabbix_sender [47705]: DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000026"}]
Response from "192.168.6.108:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000026"
sent: 1; skipped: 0; total: 1
[root@postgres ~]# 

参数说明:

参数选项说明
-z --zabbix-server192.168.6.108指定 Zabbix 服务器或代理的主机名或IP地址,数据将发送到该服务器。
-p --port10051指定 Zabbix 服务器或代理的端口号,默认值为 10051。
-s --host192.168.6.110指定 Zabbix 前端中注册的主机名称,主机的IP地址或DNS名称无效。
-k --keypgdb_all_size1[pubdb11]指定要检索其值的项目键。
-o --value7465指定要发送的项的值。
-vv启用详细输出模式,以显示更详细的调试信息。

推送数据成功:
推送数据成功

编写推送脚本:

编写查询数据库大小的脚本

[root@postgres ~]# cat pgdb_size.sh 
#!/bin/bash
Database_name=$1
SQL_QUERY="SELECT ROUND(pg_database_size(datname) / 1024.0) AS size FROM pg_database where datname = '$Database_name';"
if [ -z "$Database_name" ]; then
    echo "0"
else
# 使用 su - postgres 启动子shell,然后在其中执行 psql 命令
result=$(su - postgres -c "psql -p 8432 -h 192.168.6.110 -t -c \"$SQL_QUERY\"")
number=$(echo "$result" | sed 's/[^0-9]*//g')
number=$(expr $number \* 1000)
echo "$number"
fi
[root@postgres ~]# 

编写采集器批量推送数据脚本

[root@postgres ~]# cat 1.sh 
#!/bin/bash

zbx_ip=192.168.6.108
zbx_port=10051
client_ip=192.168.6.110

# 定义 SQL 查询语句作为变量
SQL_QUERY="SELECT datname FROM pg_database;"

# 使用 su - postgres 启动子shell,然后在其中执行 psql 命令,并将结果按制表符分割存储在数组中
Databases=$(su - postgres -c "psql -p 8432 -h 192.168.6.110 -t -c \"$SQL_QUERY\" | tr '\n' '\t'")

# 调试输出:查看实际的查询结果
echo "Raw database query result:"
echo "$Databases"

# 使用制表符分割查询结果并存储在数组中
IFS=$'\t' read -r -a Databases <<< "$Databases"

# 调试输出:查看分割后的数组内容
echo "Number of databases found: ${#Databases[@]}"
echo "List of databases:"
for db in "${Databases[@]}"; do
    echo "$db"
done

# 遍历数组中的数据库名,并发送给 Zabbix
for db in "${Databases[@]}"; do
     # 去掉空格并构造 key
     key="pgdb_all_size1[${db// }]"
      zabbix_sender -z 192.168.6.108 -p 10051 -s 192.168.6.110 -k "$key" -o $(bash /root/pgdb_size.sh $db) -vv
done

[root@postgres ~]# 

测试推送数据的脚本,添加定时任务

[root@postgres ~]# ./1.sh 
Raw database query result:
 postgres        template1       template0       pubdb11         pubdb   test    mytestdb        mydb
Number of databases found: 8
List of databases:
 postgres
 template1
 template0
 pubdb11
 pubdb
 test
 mytestdb
 mydb
zabbix_sender [49386]: DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000064"}]
Response from "192.168.6.108:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000064"
sent: 1; skipped: 0; total: 1
zabbix_sender [49429]: DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000040"}]
Response from "192.168.6.108:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000040"
sent: 1; skipped: 0; total: 1
zabbix_sender [49472]: DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000026"}]
Response from "192.168.6.108:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000026"
sent: 1; skipped: 0; total: 1
zabbix_sender [49515]: DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000041"}]
Response from "192.168.6.108:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000041"
sent: 1; skipped: 0; total: 1
zabbix_sender [49558]: DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000028"}]
Response from "192.168.6.108:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000028"
sent: 1; skipped: 0; total: 1
zabbix_sender [49601]: DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000029"}]
Response from "192.168.6.108:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000029"
sent: 1; skipped: 0; total: 1
zabbix_sender [49644]: DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000038"}]
Response from "192.168.6.108:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000038"
sent: 1; skipped: 0; total: 1
zabbix_sender [49687]: DEBUG: answer [{"response":"success","info":"processed: 1; failed: 0; total: 1; seconds spent: 0.000040"}]
Response from "192.168.6.108:10051": "processed: 1; failed: 0; total: 1; seconds spent: 0.000040"
sent: 1; skipped: 0; total: 1
[root@postgres ~]# 

定时任务:

crontab 是 Linux 系统中的定时任务调度工具,用于安排周期性执行的命令或脚本。每个用户都有一个独立的 crontab 文件,允许用户设置任务而不影响其他用户的计划任务。crontab 文件通常用于定期备份、系统维护和数据处理等自动化任务。

##每分钟执行一次
$crontab -u root -e
* * * * * /root/1.sh >> /tmp/crontab.log 2>&1
$ crontab -l
* * * * * /root/1.sh >> /tmp/crontab.log 2>&1
##crontab 的最小时间粒度是分钟,所以无法直接设置每 30 秒执行一次的任务。但是,你可以在 crontab 中设置一个脚本,使其每分钟启动,并在脚本内实现每 30 秒执行一次的功能。
$vim /root/runner.sh
#!/bin/bash

while true; do
    /root/1.sh
    sleep 30
done

$chmod +x /root/runner.sh

$crontab -e
* * * * * /root/runner.sh >> /tmp/crontab.log 2>&1

测试自动发现的数据
自动发现的数据

查看自动创建的监控项采集器
自动创建的采集器监控项

查看采集器的数据
查看采集器采集的信息

五、使用自动发现规则,监控项原型,触发器,批量监控wal复制状态

主机的信息:
主机宏

5.1、编写后台程序端脚本

编写发现PG数据库复制名称的脚本

109机器流复制主节点上

[root@postgres sh]# pwd
/root/sh
[root@postgres sh]# cat discovery_replication_name.sh 
#!/bin/bash

# 定义 SQL 查询语句作为变量
SQL_QUERY="select application_name, client_addr from pg_stat_replication;"

# 使用 su - postgres 启动子shell,然后在其中执行 psql 命令
result=$(su - postgres -c "psql -p 8432 -h 192.168.6.109 -t -c \"$SQL_QUERY\"")

# 删除结果中的空格和换行,只保留有效内容
cleaned_result=$(echo "$result" | tr -d '[:space:]')

# Initialize an array to store JSON objects
json_array=()

# Iterate over each line in cleaned_result and format as JSON
while IFS='|' read -r application_name client_addr; do
    if [[ -n $application_name && -n $client_addr ]]; then
        json_array+=("{ \"{#NAME}\":\"$application_name\",\"{#IP}\":\"$client_addr\" }")
    fi
done <<< "$cleaned_result"

# Output the final JSON format
echo '{
  "data": ['
for ((i=0; i<${#json_array[@]}; i++)); do
    if [[ $i -gt 0 ]]; then
        echo ","
    fi
    echo "    ${json_array[$i]}"
done
echo '  ]
}'

[root@postgres sh]# 

编写发现PG数据库复制wal应用延迟的脚本

109机器流复制主节点上

[root@postgres sh]# cat discovery_wal_delay.sh 
#!/bin/bash

application_name=$1

# 定义 SQL 查询语句作为变量
SQL_QUERY="select pg_wal_lsn_diff(sent_lsn ,replay_lsn) from pg_stat_replication where application_name = '$application_name';"

# 使用 su - postgres 启动子shell,然后在其中执行 psql 命令
su - postgres -c "psql -p 8432 -h 192.168.6.109 -t -c \"$SQL_QUERY\""
[root@postgres sh]# 

配置用户自定义监控的参数

109机器zabbix-agent节点上

[root@postgres zabbix_agentd.d]# pwd
/etc/zabbix/zabbix_agentd.d
[root@postgres zabbix_agentd.d]# ls
custom.conf             pgdb_size.conf            watchpsql.conf
discovery_process.conf  pg_stat_replication.conf
discovery_status.conf   UserParameter_login.conf
[root@postgres zabbix_agentd.d]# vim pg_stat_replication.conf 
UserParameter=discovery_replication_name[*], "$1"/discovery_replication_name.sh
UserParameter=discovery_wal_delay[*], "$1"/discovery_wal_delay.sh $2
[root@postgres zabbix_agentd.d]# 

在zabbix-server端测试功能

108机器zabbix-server节点上

[root@postgres confd]# zabbix_get -s 192.168.6.109 -k discovery_replication_name[/root/sh]
{
  "data": [
    { "{#NAME}":"postgresql110","{#IP}":"192.168.6.110" }
  ]
}
[root@postgres confd]# zabbix_get -s 192.168.6.109 -k discovery_wal_delay[/root/sh,postgresql110]
               0
[root@postgres confd]# 

5.2、配置、测试wab界面监控功能

配置自动发现规则

自动发现
配置监控项原型

监控项原型配置

查看监控项是否添加到主机

验证主机监控项

简单测试自动发现模块数据获取、监控项数据获取

自动发现规则获取到的数据

监控项获取到的数据

创建触发器,添加动作使得报警邮件生效

创建触发器

给触发器添加动作

在后台压力测试数据库,使其产生wal应用延迟,查看web端信息

查看wal应用实时状态

查看仪表盘报警提示

查看邮件报警信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值