进程
概述
Zabbix 由多个协同工作的进程组成,用于监控系统并发送通知。每个进程在监控基础架构中都承担着特定的职责。
核心进程
- 服务器 - 执行数据轮询和捕获、计算触发器并向用户发送通知的核心进程。
- agent - 从受监控的主机收集数据。
- Agent 2 - 采用插件架构且功能增强的新一代 agent。
- proxy - 代表 Zabbix 服务器从受监控设备收集监控数据,并在分布式部署中将信息发送到集中式 Zabbix 服务器。
- Java 网关 - 支持监控 Java 应用程序。
- MCP 服务器 - 允许 AI agent 使用模型上下文协议与 Zabbix 协作。
为了从任何位置和任何平台轻松访问 Zabbix,系统提供了基于 Web 的前端。 该前端是 Zabbix 服务器的一部分,通常(但并非必须)与运行服务器的物理机器相同。
所有配置数据以及 Zabbix 收集的数据都存储在数据库中。
标题
该头部存在于 Zabbix 组件之间的所有请求和响应消息中。
它用于确定消息长度、是否已压缩,以及是否为大数据包。
Zabbix 通信协议对每个连接的报文大小限制为 1GB。该限制同时适用于接收到的数据包长度和未压缩的数据长度。
在向 Zabbix proxy 发送配置时,数据包大小限制会增加到 4GB,以便同步大型配置。当压缩前的数据长度超过 4GB 时,Zabbix 服务器会自动开始使用大数据包格式(0x04 标志),这会将数据包大小限制提高到 16GB。
请注意,虽然大数据包格式可用于发送任何数据,但目前只有 Zabbix proxy 配置同步器能够处理大于 1GB 的数据包。
头部结构
头部由四个字段组成。头部中的所有数字均采用小端格式。
| Field | Size | Size (large packet) |
Description |
|---|---|---|---|
<PROTOCOL> |
4 | 4 | "ZBXD" 或 5A 42 58 44 |
<FLAGS> |
1 | 1 | 协议标志:0x01 - Zabbix 通信协议0x02 - 压缩0x04 - 大包 |
<DATALEN> |
4 | 8 | 数据长度。 |
<RESERVED> |
4 | 8 | 使用压缩时(0x02 标志)- 未压缩数据的长度未使用压缩时 - 00 00 00 00 |
标头示例
下面是一些代码片段,展示如何将 Zabbix 协议标头添加到你要发送的数据中,以便生成应发送给 Zabbix 的数据包,使其能够被正确解析。这些代码片段假定数据不大于 1GB,因此不会使用大数据包格式。
Python
packet = b"ZBXD\1" + struct.pack("<II", len(data), 0) + data
或者
def zbx_create_header(plain_data_size, compressed_data_size=None):
protocol = b"ZBXD"
flags = 0x01
if compressed_data_size is None:
datalen = plain_data_size
reserved = 0
else:
flags |= 0x02
datalen = compressed_data_size
reserved = plain_data_size
return protocol + struct.pack("<BII", flags, datalen, reserved)
packet = zbx_create_header(len(data)) + data
Perl
my $packet = "ZBXD\1" . pack("(II)<", length($data), 0) . $data;
或者
sub zbx_create_header($;$)
{
my $plain_data_size = shift;
my $compressed_data_size = shift;
my $protocol = "ZBXD";
my $flags = 0x01;
my $datalen;
my $reserved;
if (!defined($compressed_data_size))
{
$datalen = $plain_data_size;
$reserved = 0;
}
else
{
$flags |= 0x02;
$datalen = $compressed_data_size;
$reserved = $plain_data_size;
}
return $protocol . chr($flags) . pack("(II)<", $datalen, $reserved);
}
my $packet = zbx_create_header(length($data)) . $data;
PHP
$packet = "ZBXD\1" . pack("VV", strlen($data), 0) . $data;
或者
function zbx_create_header($plain_data_size, $compressed_data_size = null)
{
$protocol = "ZBXD";
$flags = 0x01;
if (is_null($compressed_data_size))
{
$datalen = $plain_data_size;
$reserved = 0;
}
else
{
$flags |= 0x02;
$datalen = $compressed_data_size;
$reserved = $plain_data_size;
}
return $protocol . chr($flags) . pack("VV", $datalen, $reserved);
}
$packet = zbx_create_header(strlen($data)) . $data;
Bash
datalen=$(printf "%08x" ${#data})
datalen="\\x${datalen:6:2}\\x${datalen:4:2}\\x${datalen:2:2}\\x${datalen:0:2}"
printf "ZBXD\1${datalen}\0\0\0\0%s" "$data"