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(已解决)

在模版中定义自动发现规则是使用到了路径参数,但是却没有发现能通过跟主机一样通过宏定义来简化使用的方法。

方法一 在模版上定义宏

如图所示。

优点是可以在定义模版的时候查看宏的路径,可以进行测试的时候使用。

缺点是如果主机上定义了一样的名字会起冲突。

方法二 使用主机上定义宏

如图所示。

优点是方便在主机上使用,不会出现定义冲突。

缺点是不能在模版上进行测试。

posted @ 2024-08-11 15:13  零の守墓人  阅读(8)  评论(0编辑  收藏  举报