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端,通常用户耗时比较长的检查。
一、准备环境
1 服务器详情
1.1、部署环境
类别 | IP地址 | 主机名 | 安装服务 |
---|---|---|---|
zabbix服务端 | 192.168.6.108 | zbx-server | zabbix-server-psql zabbix-agent |
zabbix客户端 | 192.168.6.109 | zabbix-client | zabbix-agent |
zabbix客户端 | 192.168.6.110 | zabbix-client | zabbix-agent |
1.2、软件版本
软件 | 版本 |
---|---|
zabbix | Zabbix5.0.42 |
php | rh-php72 |
nginx | rh-nginx116-nginx |
PostgreSQL | 16.3 |
linux | Red Hat Enterprise Linux Server release 7.7 (Maipo) |
2、应用所属用户信息
名称 | 账号 | 密码 |
---|---|---|
zabbix-server zabbix-agent nginx php | root | linux |
PostgreSQL | postgres | postgres |
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端会疯狂报错)
在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 --host | host-name-or-IP | 一般是指定的zabbix-agent端 |
-p --port | port-number | 指定主机上运行代理的端口号(默认值:10050)。 |
-I --source-address | IP-address | 指定源IP地址。 |
-k --key | item-key | 指定要检索其值的项目的键。 |
-h --help | 显示帮助信息。 | |
-V --version | 显示版本号。 |
在web页面上测试
【配置】>>【主机】>>【模板】>>【监控项】>>选择被动模式,测试(被动模式是agent端项server端发数据,主动模式是server向agent索要数据)
压力测试数据库,查看延迟波动
查看仪表盘的报警提示
查看邮件报警
四、使用自动发现,自动发现规则,采集器等高级自定义监控项
主机宏
的信息:
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-server | 192.168.6.108 | 指定 Zabbix 服务器或代理的主机名或IP地址,数据将发送到该服务器。 |
-p --port | 10051 | 指定 Zabbix 服务器或代理的端口号,默认值为 10051。 |
-s --host | 192.168.6.110 | 指定 Zabbix 前端中注册的主机名称,主机的IP地址或DNS名称无效。 |
-k --key | pgdb_all_size1[pubdb11] | 指定要检索其值的项目键。 |
-o --value | 7465 | 指定要发送的项的值。 |
-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端信息