进程
概述
Zabbix 由多个协同工作的进程组成,用于监控系统并发送通知。每个进程在监控基础架构中都承担着特定的职责。
核心进程
- Server - 执行轮询和捕获数据、计算触发器并向用户发送通知的核心进程。
- agent - 从被监控的主机收集数据。
- Agent 2 - 具有插件架构和增强功能的新一代 agent。
- proxy - 在分布式部署中代表 Zabbix 服务器从被监控设备收集监控数据,并将信息发送到集中式 Zabbix 服务器。
- Java 网关 - 支持监控 Java 应用程序。
为了便于从任何地方、通过任何平台访问 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"