[comment]: # ({486cd6dc-fb8f0d5a})
# 1 高可用性

[comment]: # ({/486cd6dc-fb8f0d5a})

[comment]: # ({f0a123dd-ea8bc3db})
### 概述

高可用性（HA）通常是关键基础设施所必需的，这类基础设施几乎无法容忍停机。
因此，对于任何可能发生故障的服务，都必须提供故障切换选项，以便在当前服务发生故障时接管。

Zabbix 提供了一种**原生**高可用性解决方案，易于设置，并且不需要任何先前的 HA 专业知识。
原生 Zabbix HA 可用于为 Zabbix 服务器的软件/硬件故障提供额外一层保护，或减少因维护导致的停机时间。

在 Zabbix 高可用模式下，多个 Zabbix 服务器作为集群中的节点运行。
当集群中的一台 Zabbix 服务器处于活动状态时，其他服务器处于待机状态，随时准备在必要时接管。

![](../../../../assets/en/manual/config/zabbix_ha.png)

切换到 Zabbix HA 不具有约束性。
您可以在任何时候切换回单机运行模式。

另请参见：[实现细节](#implementation-details)

[comment]: # ({/f0a123dd-ea8bc3db})

[comment]: # ({c6caa06e-567d3671})
### 启用高可用性

[comment]: # ({/c6caa06e-567d3671})

[comment]: # ({5a71328e-23e81771})
##### 作为集群节点启动 Zabbix 服务器

要将 Zabbix 服务器作为集群节点启动，服务器 [配置](/manual/appendix/config/zabbix_server) 中需要两个参数：

-    必须为每个将作为 HA 集群节点的 Zabbix 服务器指定 `HANodeName` 参数。 

这是一个唯一的节点标识符（例如 `zabbix-node-01`），服务器在 agent 和 proxy 配置中将通过它被引用。
如果不指定 HANodeName，则服务器将以独立模式启动。

-    必须为每个节点指定 `NodeAddress` 参数。 

`NodeAddress` 参数（`address:port`）将由 Zabbix 前端用于连接到活动的服务器节点。
`NodeAddress` 必须与相应 Zabbix 服务器的 IP 或 FQDN 名称匹配。

在修改配置文件后，重启所有 Zabbix 服务器。
此时它们将作为集群节点启动。
服务器的新状态可以在 *Reports* > *[System information](/manual/web_interface/frontend_sections/reports/status_of_zabbix#high-availability-nodes)* 中查看，也可以通过运行以下命令查看：

```
zabbix_server -R ha_status
```

此运行时命令会将当前 HA 集群状态记录到 Zabbix 服务器日志中（以及 stdout）：

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

[comment]: # ({/5a71328e-23e81771})

[comment]: # ({3c7b24e0-3e9035e5})
##### 准备前端

请确保在前端配置中未定义 Zabbix 服务器 `address:port`（位于前端文件目录中的 `conf/zabbix.conf.php`）。

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

Zabbix 前端将通过读取 Zabbix 数据库中 nodes 表的设置自动检测活动节点。
活动节点的节点地址将用作 Zabbix 服务器地址。

[comment]: # ({/3c7b24e0-3e9035e5})

[comment]: # ({892555c1-d47b6ef3})
##### proxy 配置

HA 集群节点（服务器）必须列在被动或主动 Zabbix proxy 的配置中。

对于被动 proxy，节点名称必须列在 proxy 的 Server [参数](/manual/appendix/config/zabbix_proxy) 中，并以 **逗号** 分隔。

```
Server=zabbix-node-01,zabbix-node-02
```

对于主动 proxy，节点名称必须列在 proxy 的 Server [参数](/manual/appendix/config/zabbix_proxy) 中，并以 **分号** 分隔。
```
Server=zabbix-node-01;zabbix-node-02
```

[comment]: # ({/892555c1-d47b6ef3})

[comment]: # ({c15c2c86-f2fc0e77})
##### agent 配置

HA 集群节点（服务器）必须列在 Zabbix agent 或 Zabbix agent 2 的配置中。

![](../../../../assets/en/manual/config/zabbix_ha_agent.png)

要启用被动检查，节点名称必须列在 Server [参数](/manual/appendix/config/zabbix_agentd) 中，并以 **逗号** 分隔。

```
Server=zabbix-node-01,zabbix-node-02
```

要启用主动检查，节点名称必须列在 ServerActive [参数](/manual/appendix/config/zabbix_agentd) 中。
请注意，对于主动检查，节点必须与其他服务器之间用逗号分隔，而节点本身之间必须用 **分号** 分隔，例如：

```
ServerActive=zabbix-node-01;zabbix-node-02
```

[comment]: # ({/c15c2c86-f2fc0e77})

[comment]: # ({e3a57230-311341fc})
### 故障切换到备用节点

如果活动节点停止，Zabbix 将自动故障切换到另一个节点。
要发生故障切换，至少必须有一个节点处于备用状态。

故障切换有多快？
所有节点都会每 5 秒更新一次其最后访问时间（如果状态发生变化，也会更新状态）。
因此：

- 如果活动节点关闭并成功将其状态报告为“stopped”，另一个节点会在 **5 秒** 内接管。
- 如果活动节点关闭/变得不可用，但无法更新其状态，备用节点会等待 **故障切换延迟** + 5 秒后再接管。

故障切换延迟是可配置的，支持范围为 10 秒到 15 分钟（默认 1 分钟）。
要更改故障切换延迟，可以运行：

```
zabbix_server -R ha_set_failover_delay=5m
```

[comment]: # ({/e3a57230-311341fc})

[comment]: # ({7be5c016-593144b8})
### 管理 HA 集群

可以使用专用的 [运行时控制](/manual/concepts/server#runtime-control) 选项来管理 HA 集群的当前状态：

-   `ha_status` - 将 HA 集群状态记录到 Zabbix 服务器日志（以及 stdout）中；
-   `ha_remove_node=target` - 删除由其 `<target>` 标识的 HA 节点 - 节点的名称或 ID（名称/ID 可通过运行 `ha_status` 的输出获取），例如：

```
zabbix_server -R ha_remove_node=zabbix-node-02
```

请注意，无法删除 active/standby 节点。

-   `ha_set_failover_delay=delay` - 设置 HA 故障切换延迟（介于 10 秒和 15 分钟之间；支持时间后缀，例如 10s、1m）。

可以监控节点状态：

-   在 *Reports* > *[System information](/manual/web_interface/frontend_sections/reports/status_of_zabbix#high-availability-nodes)* 中。
-   在 *System information* 仪表板小部件中。
-   使用服务器的 `ha_status` 运行时控制选项（见上文）。

内部监控项 `zabbix[cluster,discovery,nodes]` 可用于节点发现，因为它会返回包含高可用节点信息的 JSON。

[comment]: # ({/7be5c016-593144b8})

[comment]: # ({7cfdcc75-82cd7e56})
### 禁用 HA 集群

要禁用高可用性集群：

1. 备份配置文件。
2. 停止备用节点。
3. 从活动主服务器中删除 HANodeName 参数。
4. 重启主服务器（它将以独立模式启动）。

[comment]: # ({/7cfdcc75-82cd7e56})

[comment]: # ({48f303fd-7d944a36})
### 升级 HA 集群

要对 HA 节点执行主版本升级：

1. 停止所有节点。
2. 创建完整的数据库备份。
3. 如果数据库使用复制，请确保所有节点已同步且没有问题。如果复制已损坏，请不要升级。
4. 选择一个将执行数据库升级的单个节点，通过注释掉 `HANodeName` 将其配置更改为独立模式，然后对其进行[升级](/manual/installation/upgrade)。
5. 确保数据库升级已完全完成（*系统信息* 应显示 Zabbix 服务器正在运行）。
6. 以 HA 模式重启该节点。
7. 升级并启动其余节点（由于此时数据库已经升级，因此无需将它们切换为独立模式）。

在次版本升级中，只需升级第一个节点，确保其已完成升级并正在运行，然后再开始升级下一个节点。

[comment]: # ({/48f303fd-7d944a36})

[comment]: # ({de56f189-f4d3143a})
### 实现细节

高可用性（HA）集群是一种可选方案，支持 Zabbix 服务器。
原生 HA 方案旨在易于使用，可跨站点工作，并且对 Zabbix 可识别的数据库没有特定要求。
用户可以根据其环境中高可用性的需求，自由选择使用原生 Zabbix HA 方案或第三方 HA 方案。

该方案由多个 `zabbix_server` 实例或节点组成。
每个节点：

-   单独配置。
-   使用同一个数据库。
-   可能具有几种模式：active、standby、unavailable、stopped。

同一时间只能有一个节点处于 active（工作）状态。standby 节点只运行一个进程 - HA manager。
standby 节点不进行数据采集、处理或其他常规服务器活动；它们不监听端口；数据库连接数最少。

active 节点和 standby 节点都会每 5 秒更新一次各自的最后访问时间。
每个 standby 节点都会监控 active 节点的最后访问时间。
如果 active 节点的最后访问时间超过了“failover delay”秒，standby 节点会将自身切换为 active 节点，并将之前的 active 节点标记为 `unavailable` 状态。

active 节点会监控自身的数据库连接状态 - 如果连接丢失超过 `failover delay-5` 秒，则必须停止所有处理并切换为 standby 模式。
active 节点还会监控 standby 节点的状态 - 如果某个 standby 节点的最后访问时间超过了 `failover delay` 秒，则该 standby 节点会被标记为 `unavailable` 状态。

这些节点的设计可兼容 Zabbix 的次要版本。

[comment]: # ({/de56f189-f4d3143a})
