[comment]: # ({4eeeebad-150822ec})
# 2 Proxy 负载均衡和高可用

[comment]: # ({/4eeeebad-150822ec})

[comment]: # ({c68d32c6-9db44722})
#### 概述

Zabbix proxy 可以组织到 proxy 组中，以实现 proxy 负载均衡和高可用性。

proxy 负载均衡和高可用性是指在 proxy 组内自动在各个 proxy 之间重新分配主机：

-   如果某个 proxy 离线，其主机会被迁移到其他 proxy，从而保持 proxy 的高可用性。
-   如果某个 proxy 的主机数量明显高于或低于其他 proxy，其主机会被迁移到其他 proxy，以平衡 proxy 负载。

主机重新分配仅在组内满足以下条件的 proxy 之间生效：

-   proxy 运行的是 Zabbix 7.0 或更高版本。
-   [Proxy version](/manual/appendix/compatibility#supported-zabbix-proxies) 与 Zabbix 服务器版本匹配。如果使用 Zabbix agent（被动），proxy 版本必须与 agent 版本匹配。主动 agent 仅要求 Zabbix 7.0 或更高版本。
-   proxy 组具有[在线状态](/manual/web_interface/frontend_sections/administration/proxy_groups)。
-   主机被配置为由 proxy 组而不是单个 proxy [监控](/manual/config/hosts/host#configuration)。

::: noteclassic
可以通过分配给 proxy 组的任意主机，使用[内部检查](/manual/config/items/itemtypes/internal#proxy.group.a)来监控 proxy 组的健康状态。  
但是，要监控组内单个 proxy 的健康状态，应将主机分配给该 proxy；否则，结果可能不一致。
:::

[comment]: # ({/c68d32c6-9db44722})

[comment]: # ({ca1e24c8-1abf84b3})
#### 主机重新分配

proxy 负载均衡和高可用性由 Zabbix 服务器通过 [proxy 组管理器](/manual/concepts/server#server-process-types-and-threads) 进行管理，该管理器会持续监控每个 proxy 组中所有 proxy 的状态及其主机分布情况。

组内 proxy 的高可用性通过 proxy 故障切换来保证：当某个 proxy 离线时，其主机会立即重新分配给其他 proxy。  
同时也会进行 proxy 负载均衡，因为主机会被重新分配给已分配主机数量最少的 proxy。

此外，当 proxy 的主机数量与组平均值相比至少相差 10 台主机且达到 2 倍时（主机过多或主机不足），也会触发 proxy 负载均衡。  
如果在宽限期（10 x [故障切换延迟](#configuring-a-proxy-group)）后这种不平衡仍然存在，则该 proxy 组会被加入主机重新分配队列。

proxy 组管理器使用以下逻辑重新分配主机：

1. 计算每个 proxy 的平均主机数。
2. 对于主机过多的 proxy——将多出的主机移入 proxy 的未分配池。
3. 对于主机不足的 proxy——计算达到平衡所需的主机数量。
4. 从主机数量最多的 proxy 中移除所需数量的主机。
5. 将未分配的主机移动到主机数量最少的 proxy。

主机重新分配示例：

|proxy 上的主机数|组平均值|主机重新分配|
|-|-|-|
|100|50|是|
|60|50|否|
|40|50|否|
|25|50|是|
|15|5|是|
|10|5|否|

::: noteimportant
如果某个 proxy 组[监控的](/manual/config/hosts/host#configuration)主机少于 10 台，可能会导致组内各 proxy 之间的主机分布不均。
:::

[comment]: # ({/ca1e24c8-1abf84b3})

[comment]: # ({5515593f-ffeb9a46})
#### 配置 proxy 组

要在 Zabbix 前端中配置 proxy 组：

1. 转到 *管理 > Proxy 组*
2. 单击 *创建 proxy 组*

![](../../../../assets/en/manual/distributed_monitoring/proxy_group.png){width="600"}

|参数|说明|
|--|--------|
|*名称*|proxy 组的名称。|
|*故障转移周期*|以秒为单位的时间段，在此期间 proxy 组中的某个 proxy 必须与 Zabbix 服务器通信，才会被视为在线（默认值：1m；范围：10s-15m）。如果 proxy 未在此时间段内通信，则其状态将更改为 *离线*，其主机会立即重新分配给其他 proxy。proxy 负载均衡将在该周期的 10 倍之后开始。<br>支持时间后缀（例如 30s、1m）和用户宏。|
|*最小 proxy 数量*|保持 [proxy 组在线](/manual/web_interface/frontend_sections/administration/proxy_groups) 所需的最少[在线 proxy](/manual/web_interface/frontend_sections/administration/proxies)数量（默认值：1；范围：1-1000）。<br>支持用户宏。<br><br>该值应小于组中的 proxy 总数。例如，在一个包含 10 个 proxy 的组中，如果将最小值设置为 10，则任何一个 proxy 发生故障都会导致该组离线。请注意，离线组中的在线 proxy 仍会继续正常工作，但不会进行负载均衡/高可用性处理。|
|*描述*|proxy 组的描述。|
|*Proxies*|编辑包含 proxy 的组时，最多显示五个 proxy 的列表（根据用户对 proxy 的权限，以链接或纯文本形式显示）。|

[comment]: # ({/5515593f-ffeb9a46})

[comment]: # ({bc77b7cc-e520307a})
#### 配置 proxy 负载均衡

要使用 proxy 负载均衡，您需要在 Zabbix 前端中配置一个 proxy 组（见上文），并确保主机是由 [proxy 组](/manual/config/hosts/host#configuration) 监控，而不是由单个 proxy 监控（您可以使用主机 [批量更新](/manual/config/hosts/hostupdate) 将主机从 proxy 迁移到 proxy 组）。

如果使用 Zabbix agent，还需要按如下方式进行配置：

-   对于 [被动检查](/manual/appendix/items/activepassive)，请在 [Server](/manual/concepts/agent/agentd_params#server) 参数中列出 proxy 组中的所有 proxy。
-   对于 [主动检查](/manual/appendix/items/activepassive)，建议在 [ServerActive](/manual/concepts/agent/agentd_params#serveractive) 参数中列出 proxy 组中的所有 proxy 或 Zabbix 服务器。
    请注意，只有 Zabbix agent 7.0（或更高版本）才能在主动模式下与 proxy 组配合使用。

如果 `ServerActive` 参数中只包含 proxy 组中的一个 proxy（或 Zabbix 服务器），agent 仍然能够连接到正确的 proxy。
当 agent 服务启动并连接到指定的 proxy 时，agent 将接收并缓存 proxy 组中所有 proxy 的完整 IP 列表及其当前负载。
随后，主动检查将根据 proxy 组内当前的 proxy-主机分配关系，重定向到该主机对应的在线 proxy。

::: notewarning
在 Zabbix agent 的 `ServerActive` 参数中只指定单个 proxy，可能会导致在 agent 启动/重启且该指定 proxy 处于离线状态时丢失监控数据。
:::

::: noteclassic
使用 [Zabbix sender](/manual/concepts/sender) 时，数据请求也会根据 proxy 组内当前的 proxy-主机分配关系，重定向到该主机对应的在线 proxy。
但是，如果您要从输入文件发送多个主机的值，请使用 [`-g` 选项](/manpages/zabbix_sender)，以防止将数据发送到错误的 proxy。
:::

Zabbix agent 还必须能够通过防火墙连接到 proxy 组中的所有 proxy。
否则，在重定向或故障切换期间，主动检查可能会挂起或失败。例如：

-   在主动检查期间，proxy 可能会将 agent 重定向到另一个 proxy。如果该 proxy 被防火墙阻止，通信将在等待响应时挂起。
-   在稳定的高可用性部署中，如果近期没有进行重新均衡，agent 可能永远不会联系到备用 proxy。如果防火墙规则已更改但未经过测试，故障切换可能会失败。

[comment]: # ({/bc77b7cc-e520307a})

[comment]: # ({2ad23a4a-61149717})
##### 测试 proxy 负载均衡

要测试 proxy 负载均衡：

1. 配置一个 proxy 组。
2. 确保该 proxy 组处于[在线状态](/manual/web_interface/frontend_sections/administration/proxy_groups)。
3. 确保主机是由 proxy 组[监控](/manual/config/hosts/host#configuration)，而不是由单个 proxy 监控（您可以使用主机的[批量更新](/manual/config/hosts/hostupdate)将主机从 proxy 移动到 proxy 组）。
4. 等待几秒钟，以便完成配置更新以及 proxy 组内各 proxy 之间的主机分配。通过刷新 *管理* > [*Proxies*](/manual/web_interface/frontend_sections/administration/proxies) 中的主机列表来观察变化。

[comment]: # ({/2ad23a4a-61149717})

[comment]: # ({541e455e-9e4321d3})
##### 重要说明

-   proxy 组中的 proxy 不支持 [SNMP traps](/manual/config/items/itemtypes/snmptrap)。
-   依赖外部配置的检查（例如，[external checks](/manual/config/items/itemtypes/external) 的脚本，或 [database checks](/manual/config/items/itemtypes/odbc_checks) 的 ODBC 配置）必须在 proxy 组中的所有 proxy 上具有相同的配置。
-   [Database checks](/manual/config/items/itemtypes/odbc_checks) 需要对数据库对象/服务器具有扩展权限。
-   由 proxy 组[监控](/manual/config/hosts/host#configuration)的 VMware 主机将随机分布到组内的各个 proxy 上。这会导致每个 proxy 都缓存所有 VMware 数据，从而增加 vCenter 的负载。
-   根据来自 proxy 组中某个 proxy 的自动注册数据创建的主机，将被设置为由该 proxy 组[监控](/manual/config/hosts/host#configuration)。但是，根据来自 proxy 组中某个 proxy 的网络发现数据创建的主机，将被设置为由该 proxy [监控](/manual/config/hosts/host#configuration)。

[comment]: # ({/541e455e-9e4321d3})
