zabbix使用自动发现对pg的复制槽进行状态监控
zabbix使用自动发现对pgsql的复制槽进行状态监控
环境介绍:
本例中安装zabbix
开源软件和postgres
,软件版本信息如下:
软件 | 版本 |
---|---|
zabbix | Zabbix6.4.0 |
zabbix-server上postgres | 14.7 |
zabbix-agent | 6.4.17 |
zabbix-agent上postgres | 16.3 |
主机信息如下:
Red Hat Enterprise Linux Server 7.9 (Maipo)
主机名 | 主机地址 | 用途 |
---|---|---|
zib_server | 192.168.101.238 | zabbix的服务器地址 |
pgsql_master | 192.168.101.232 | pgsql的主服务器 |
pgsql_backup | 192.168.101.239 | pgsql的备服务器 |
1. 模版自动发现规则配置
点击数据采集
> 模版
> 创建模版
,进入创建模版页面。如图所示。
模版配置如图所示。填写模版名称,选择模版所在的模版组。点击添加
即可。
然后再次点击自己创建好的模版。
进入如下页面,点击自动发现规则 > 创建自动发现规则。进入自动发现规则创建页面。
进行自动发现规则的配置。其中与监听项配置相似。配置名称和类型,并且将键值配置好。完成之后点击添加
即可。
在zabbix-agent客户端进行自定义键值配置。
在soltInfo.conf
文件中。
UserParameter=soltInfo[*],"$1"/pgsql_soltInfo.sh "$2"
在pgsql_soltInfo.sh
文件中。
#!/bin/bash
PGSHELL_ENV="$1"
source $PGSHELL_ENV/zabbix_shell.conf
query="SELECT json_build_object(
'{#SLOTNAME}', slot_name,
'plugin', plugin,
'database', database,
'active', active
) FROM pg_replication_slots"
# 执行查询,并获取结果
slots=$($PSQL -t -c "${query}")
# 处理并格式化结果
# 1. 删除所有空白字符
# 2. 将多个 JSON 对象分隔符 { } 替换为 { },{
# 3. 在开始处添加 {"data":[
# 4. 在结束处添加 ]}
formatted_slots=$(echo "$slots" | tr -d '[:space:]' | sed 's/}{/},{/g' | sed 's/^/{\"data\":[/' | sed 's/$/]}/')
# 如果查询结果为空,返回 {"data":[]}
if [[ -z "$slots" || "$slots" == "NULL" ]]; then
formatted_slots="{\"data\":[]}"
fi
# 输出 JSON 格式的数据
echo "$formatted_slots"
测试如图所示。
获取到的JSON结果。
{
"data": [
{
"{#SLOTNAME}": "pgbackup",
"plugin": null,
"database": null,
"active": false
},
{
"{#SLOTNAME}": "test_slot1",
"plugin": null,
"database": null,
"active": true
}
]
}
2. 创建监控项原型
创建自定义规则完成之后,点击创建好的自定义规则,再点击上方导航栏的监控项原型
,再点击右上角的创建监控项原型
,即可进入创建监控项原型的页面。
在这里提供两种思路,一个是使用服务器主动去执行客户端脚本来获取复制槽的信息。如下图所示。
在soltStatus.conf
文件中。
UserParameter=soltStatus[*],"$1"/soltStatus.sh "$2" "$3"
在soltStatus.sh
文件中。
#!/bin/bash
PGSHELL_CONFDIR="$1"
source $PGSHELL_CONFDIR/zabbix_shell.conf
soltName="$2"
if [ -z "$soltName" ]; then
soltName="pgbackup"
fi
query="SELECT active FROM pg_replication_slots where slot_name='${soltName}';"
# 执行查询,并获取结果
result=$($PSQL -t -c "${query}" | tr -d '[:space:]')
# 检查结果并输出状态
if [ "$result" == "t" ]; then
# echo "Replication slot '$SLOT_NAME' is active."
echo "T"
elif [ "$result" == "f" ]; then
# echo "Replication slot '$SLOT_NAME' is inactive."
echo "F"
else
# echo "Unexpected result: $result"
echo "F"
fi
另外一个是使用采集器服务器被动接收客户端主动发送的信息。如下图所示。
完成之后点击添加
即可。
这两者选择的类型不同,前一个主动执行客户端的脚本获取数据,后一个让客户端自己本地定义一个定时任务执行脚本,向服务器发送数据即可。
3. 创建触发器类型
点击上方导航栏的触发器类型
,然后点击右上角的创建触发器原型
。进入创建触发器原型页面。如下图所示。
这里也展示了两种思路创建的触发器的创建,原理是基本一致的,只是配置方面有些许差异。
客户端被动触发器。
客户端主动触发器。
配置完成之后,点击添加
即可。
4. 在主机上添加模版
点击监测
> 主机
> 对应主机
> 主机
,进入配置模版页面。如下图所示。
在这个页面选择对应的模版,然后点击更新即可。如下图所示。
5. 对于客户端主动模式
对于客户端主动模式,因为是客户端主动去发送信息的,因此需要再客户端本地区执行一个定时任务来定时发送数据。
5.1 查看当前的定时任务
crontab -l
5.2 创建或者编辑crontab
sudo crontab -e
或者
crontab -e
5.3 添加定时任务
* * * * * /usr/local/zabbix/etc/shell_dict/slotShell.sh "/home/zabbix/zabbix_env" >> /var/log/slotShell.log 2>&1
5.4 查看定时任务
crontab -l
[root@pgsql-master ~]# crontab -l
* * * * * /usr/local/zabbix/etc/shell_dict/slotShell.sh "/home/zabbix/zabbix_env" >> /var/log/slotShell.log 2>&1
6. 查看最新数据和触发器是
查看最新数据。如下图所示。
结果如下图所示。
点击每个监控项,然后点击触发器,即可查看该监控项上的触发器。如下图所示。
在问题上也能查看报警的触发器。如下图所示。
7. 修改pg数据的复制槽状态
修改从库的配置文件。
primary_slot_name = 'pgbackup'
改为
primary_slot_name = 'test_slot1'
然后使用pg_ctl
重启从库服务器。
pg_ctl restart
查看主动上的复制槽状态。
postgres=# SELECT * FROM pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_
wal_size | two_phase | conflicting
------------+--------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+------
---------+-----------+-------------
pgbackup | | physical | | | f | f | | 751 | | 0/71B0530 | | reserved |
| f |
test_slot1 | | physical | | | f | t | 7628 | 751 | | 0/71B0530 | | reserved |
| f |
(2 rows)
在查看web网页上的数据是否更新。
附录一 crontab的使用
1. 介绍
crontab
是 Linux 和 Unix 系统中用于定时任务调度的工具。它允许用户在指定的时间或时间间隔自动执行脚本或命令。通过 crontab
,你可以安排系统和用户级别的定时任务,从而实现自动化操作。详情请见crontab简单介绍.md文档
。
2. 示例
每分钟执行一次脚本
* * * * * /path/to/your/script.sh
每天凌晨 2 点执行脚本
0 2 * * * /path/to/your/script.sh
每周一中午 12 点执行脚本
0 12 * * 1 /path/to/your/script.sh
每月 1 号凌晨 1 点执行脚本
0 1 1 * * /path/to/your/script.sh
3. 注意事项
-
脚本权限: 确保脚本具有执行权限。可以使用
chmod +x /path/to/your/script.sh
来设置执行权限。 -
绝对路径: 在
crontab
中使用绝对路径,避免路径问题。 -
环境变量:
crontab
任务在执行时不会加载用户的环境变量,可能需要在脚本中设置必要的环境变量。 -
输出重定向: 将脚本的输出重定向到日志文件,以便调试。例如:
0 2 * * * /path/to/your/script.sh >> /var/log/mycron.log 2>&1
附录二 主动模式和被动模式
1. zabbix主被动模式介绍
- 被动模式:被动模式就是由zabbix server向zabbix agent发出指令获取数据, 即zabbixagent被动的去获取数据并返回给zabbix server, zabbix server周期性的向agent 索取数据, 这总模式的最大问题就是会加大zabbix server的工作量, 在数百台服务器的环境下zabbix server不能及时获取到最新数据, 但这也是默认的工作方式。
- 主动模式是有zabbix agent主动采集数据并返回给zabbix server, 不再需要zabbix serve进行干预, 因此主动模式在一定程度上可减轻zabbix server的压力。
在优化zabbix的时候,主动模式优化后会大大减少zabbix server的压力
简而言之:被动模式就是zabbix-sevrer主动向zabbix-agent索要数据,好几千台服务器每次都要索要的话会非常的慢,从而影响监控值的刷新,主动模式就是zabbix-agent主动像zabbix-sever汇报数据,也就好比发了个通知,大家来这里集合一样,这样可以大大减轻zabbix server的压力
被动模式每次刷新监控项几乎都是一秒一个
zabbix监控主被动模式
-
被动模式zabbix服务器从监控端拉数据,
-
主动模式zabbix agent主动向服务器推数据。
-
zabbix监控默认为被动模式,zabbix agent被动的接受Zabbix Server的监控指令并返回数据。
-
zabbix主动模式为zabbix agent主动向zabbix Server发送请求拿来监控项并返回数据。
2. zabbix主被动模式详解
zabbix被动模式
- zabbix agent被动的接受zabbix server周期性发送过来的数据收集指令。
在被动模式之下,zabbix server会根据主机关联的模板中的监控项和数据采集间隔时间,周期性的打开随机端口并向zabbix agent服务器的10050发起tcp连接,然后发送获取监控项数据的指令,即zabbix server发送什么指令那么zabbix agent就收集什么数据,zabbix server什么时候发送zabbix agent就什么时候采集,zabbix server不发送zabbix agent就一直不响应,所以zabbix agent也不用关心其监控项和数据采集周期间隔时间。
被动模式的优点就是配置简单,安装后即可使用,因此也成为zabbix 的默认工作模式。
但是被动模式的最大问题就是会加大zabbix server的工作量,在数百甚至数千台服务器的环境下会导致zabbix server需要轮训向每个zabbix agent发送数据采集指令,如果zabbix server负载很高还会导致不能及时获取到最新数据,但由于无需其他复杂配置,被设置为了默认的工作方式。
zabbix主动模式
- 主动模式是由zabbix agent主动向zabbix server的10051端口发起tcp连接请求。
因此主动模式下必须在zabbixagent配置文件中指定zabbix server的IP或者主机名(必须可以被解析为IP地址),在连接到zabbix server之前zabbix agent是不知道自己要采集那些数据以及间隔多久采集一次数据的,然后在连接到zabbix server以后获取到自己的监控项和数据采集间隔周期时间,然后再根据监控项采集数据并返回给zabbix server。
在主动模式下不再需要zabbix serve向zabbix agent发起连接请求,因此主动模式在一定程度上可减轻zabbix server打开的本地随机端口和进程数,在一定程度就减轻看zabbix server的压力。
问题情况
问题1
为什么在主机上配置自动发现可以拿到结果,但是在监控项原型里面创建不出新的对应监控项。
下面是对监控项原型的配置。
问题2(已解决)
在模版中定义自动发现规则是使用到了路径参数,但是却没有发现能通过跟主机一样通过宏定义来简化使用的方法。
方法一 在模版上定义宏
如图所示。
优点是可以在定义模版的时候查看宏的路径,可以进行测试的时候使用。
缺点是如果主机上定义了一样的名字会起冲突。
方法二 使用主机上定义宏
如图所示。
优点是方便在主机上使用,不会出现定义冲突。
缺点是不能在模版上进行测试。