网关冗余
功能概述
双机热备用于在两台 GatewayRuntime 网关之间接管采集和业务工作。正常稳定运行时,一台处于“当前工作”状态,执行采集、数据转发、报警和规则引擎任务;另一台处于“待机”状态,接收同步数据,并在满足接管条件后启动这些任务。
配置的主备身份与当前由谁工作是两个概念。原主机恢复后是否自动回切,取决于共享仲裁配置和双方工作状态,不能统一理解为“主机恢复就一定接回工作”。
功能入口与状态检查
登录 GatewayRuntime Web,进入“系统管理 → 系统设置”,点击左侧“双机热备”。页面提供“编辑配置”“立即同步到对端”“切换主备”和刷新操作。

| 区域 | 重点检查 |
|---|---|
| 当前节点 | 本机是当前工作、待机、正在接管、需要处理还是切换失败;采集、数据转发、报警和规则引擎四类任务是否与本机角色一致。 |
| 对端连接 | 每条链路的传输状态、完整健康状态、连续失败次数、识别到的对端节点和对端角色。只有建立连接并通过组名、节点身份、角色和安全校验后,链路才是完整健康。 |
| 工作授权 | 配置共享仲裁后,确认授权由且仅由当前工作节点持有,并检查授权到期时间、主备切换序号和最近切换错误。 |
| 历史数据保护 | 查看受保护目标、待同步到对端、待写入数据库、Journal 和数据库写入授权状态。 |
主备身份与工作状态
以下以 A 为配置主机、B 为配置备机说明。
| 概念 | 说明 |
|---|---|
| 配置主机 A | “连接方式”选择“等待对端连接”,负责监听冗余连接。 |
| 配置备机 B | “连接方式”选择“主动连接对端”,负责连接配置主机。 |
| 当前工作节点 | 实际执行采集、数据转发、报警和规则引擎任务的网关,可以是 A,也可以是 B。 |
| 待机节点 | 停止上述四类任务,保持冗余通信并接收工作节点的同步数据。 |
自动接管和“切换主备”只改变当前工作节点,不会修改两台网关的“连接方式”。判断哪台正在工作,应查看“本机角色”和四类任务状态,不能仅凭它原先被称为主机还是备机判断。
正常运行与数据同步
当 A 为当前工作节点、B 为待机节点时,两台网关的分工如下;B 接管后分工相反。
| 功能 | 当前工作节点 A | 待机节点 B |
|---|---|---|
| 连接现场设备并采集数据 | 执行已启用的采集任务 | 不主动采集现场设备 |
| 业务转发 | 执行已启用的转发组和转发目标 | 不启动业务转发 |
| 报警计算、规则引擎 | 执行已配置并启用的任务 | 停止执行 |
| 显示采集变量和设备状态 | 显示本机采集结果 | 显示从 A 同步来的结果 |
| 冗余连接、数据同步和历史补偿通信 | 保持运行 | 保持运行 |
待机节点上的采集数据显示依赖两端配置一致、冗余链路正常和数据同步成功。同步按“数据同步间隔”执行,默认 1000 毫秒,因此两端显示存在同步和网络延迟。内存变量不属于这一路采集实时值镜像范围,不能把待机页面理解为工作节点全部运行状态的完整复制。
“立即同步到对端”应在当前工作节点操作,用于将业务配置同步到待机节点,并推进历史补偿。执行前确认同步方向和两端配置备份;该操作会更新待机节点的业务配置。采集实时值仍按同步周期更新。两端各自的节点身份、网络设置和证书需要分别配置,业务配置同步不等于整机备份。
故障接管与主机恢复
当前工作节点宕机、关机或重启后,待机节点在所有已配置冗余链路连续探测失败达到“断线判定次数”时尝试接管。启用双网时,只要仍有一条完整健康的链路,就不会仅因另一条链路断开而判定对端失联。配置共享仲裁时,待机节点还必须取得工作授权,才能启动采集、数据转发、报警和规则引擎任务。
接管需要故障检测、工作授权和任务启动时间,不保证零中断。单个 PLC 或采集设备通信失败,不等同于整台网关失联;设备级冗余应在采集配置中单独设置。
假设 A 故障后 B 已接管,A 随后重新启动:
| 冗余模式 | 原主机 A 恢复后的行为 |
|---|---|
| 已配置共享仲裁 | B 正常工作并持有有效授权时,A 保持待机,接收 B 的同步数据,不会仅凭配置主机身份抢回工作。如需交回 A,待双方连接和同步恢复后执行“切换主备”。 |
| 未配置共享仲裁,仅链路模式 | A 重新启动时会尝试开始工作。双方恢复通信后,如果两台都在工作,配置主机 A 具有优先权,系统会尝试让 B 转为待机。这一过程不能保证没有短暂的双机同时工作。 |
如果只是冗余链路恢复,双方已处于一台工作、一台待机的稳定状态,系统会保持现有分工,不会单凭配置主机身份发起回切。需要更换工作节点时,使用“切换主备”。
仅链路模式无法可靠区分“对端宕机”和“两端之间网络中断”,网络分区时可能出现两台同时采集、同时转发。需要防止双机同时工作时,应让两台网关访问共享存储上的同一个仲裁文件,并确认共享存储支持读写和文件锁;分别放在两台机器上的同名本地文件不能提供共享仲裁。工作节点无法维持有效授权时会停止业务任务,另一台也无法取得授权时,可能两台都保持停用。
配置操作步骤
配置前,确认两台网关均能访问需要接管的现场设备和转发目标,并准备各自使用的插件、证书和运行环境。在两端分别下载配置备份,选定首次承担工作的节点。
- 在两台网关分别点击“编辑配置”,填写相同的“冗余组名称”和“两端连接密钥”。
- 为两端填写不同的“本机节点名称”,并将“对端节点名称”填写为另一台的名称。
- 在 A 选择“等待对端连接”,在 B 选择“主动连接对端”,按下方参数表填写地址和两端证书。
- 按现场要求配置共享仲裁和第二链路。使用共享仲裁时,两端必须指向同一个共享文件。
- 打开“启用双机热备”,在两端分别点击“保存”并确认,等待连接和角色状态稳定。
- 确认只有一台处于“当前工作”状态;在该节点核对业务配置,然后点击“立即同步到对端”。
- 在待机节点核对采集变量值和设备状态,确认采集、数据转发、报警和规则引擎四类任务均已停止,再按后文完成切换验收。
参数说明
点击“编辑配置”可维护以下参数。
| 配置项 | 说明 |
|---|---|
| 启用双机热备 | 开启后参与双机协同和工作节点切换。关闭后本机独立运行,不参与对端连接和仲裁。不要用关闭此开关代替“切换主备”,否则可能与另一台同时工作。 |
| 冗余组名称 | 两台网关必须填写同一个非空名称。名称不一致的节点不能建立控制关系。 |
| 本机节点名称 | 当前网关的稳定唯一名称。启用双机热备时必填,两台网关不能使用相同名称。 |
| 对端节点名称 | 当前网关期望连接的另一台节点名称。启用时必填,并应与对端的“本机节点名称”完全一致,避免错误节点接入。 |
| 连接方式 | 配置主机选择“等待对端连接”,配置备机选择“主动连接对端”;两端必须互补。此项确定连接身份,不代表本机始终是当前工作节点。 |
| 对端地址 | 第一条控制链路地址,通常为 IP:端口,不包含 http:// 或 https://。等待连接端填写本机监听地址,主动连接端填写可访问的对端地址。 |
| 启用双网 / 第二链路地址 | 第二链路启用后地址必填,且不能与第一链路相同。建议两条链路使用不同网卡、交换机或网段;任一完整健康链路可维持对端在线判断。 |
| 两端连接密钥 | 两台网关必须填写相同的复杂字符串,用于控制链路身份校验。它不等同于链路加密。 |
| 本机连接证书 / 信任的根证书 | 启用双机热备时必填的双向 TLS 配置,两项必须全部填写。等待对端连接的主节点选择服务器证书,主动连接对端的备用节点选择客户端证书;每台网关信任签发对端证书的根证书。 |
| 加密协议 / 检查证书是否已撤销 | 使用 TLS 时设置允许的协议版本和吊销检查策略;无特殊要求使用系统安全默认值。 |
| 双机共享仲裁文件 | 可选增强项。两台网关如指向共享存储上的同一个 SQLite 文件,系统通过文件锁和短租约只允许一台取得工作授权。留空时仍可使用 mTLS 链路模式,但网络分区时无法提供防双活保护。配置时应确认两端都具备读写和文件锁能力。 |
| 工作授权时长 | 共享仲裁租约有效期,单位毫秒,最小 3000,默认 15000。 |
| 工作授权续期 | 租约续期周期,单位毫秒,最小 500,且不能超过授权时长的三分之一;默认 3000。 |
| 切换安全余量 | 节点必须提前停止生产任务的安全窗口,单位毫秒,最小 500;与续期周期之和必须小于授权时长,默认 2000。 |
| 连接检查间隔 | 冗余链路连接维护参数,影响重连检查和空闲连接清理,单位毫秒,最小 1000,默认 60000。它不等于完整接管耗时,不能直接用此值乘以“断线判定次数”作为切换时间保证。 |
| 断线判定次数 | 所有已配置链路连续失败达到该次数后进入故障处理,范围 1 到 100,默认 3。配置共享仲裁时,节点仍必须取得工作授权才能激活生产任务。 |
| 数据同步间隔 | 当前工作节点向待机节点同步采集变量值和设备状态的周期,单位毫秒,最小 1000,默认 1000。业务配置需要同步时,在当前工作节点执行“立即同步到对端”。 |
| 历史数据/报警补偿 | 开启后,支持的历史目标先写本地可靠 Journal,再同步到对端,并在切换或数据库恢复后补写。该能力默认开启,与目标自身的双库镜像相互独立。 |
| 历史保护参数 | 可调整单次同步条数、对端确认超时、本地待同步上限、数据库写入授权时长与续期、失败重试间隔。按断网时长、历史写入量、网络延迟、数据库负载和磁盘容量设置。 |
建议使用同一张 CA 分别签发主节点服务器证书和备用节点客户端证书。将 CA 公钥证书导入两端并选为信任根,将各自带私钥的连接证书导入对应节点;不要只凭 CN 判断是否为同一张 CA,应以证书指纹为准。
两台网关都要填写冗余组、本机节点和对端节点名称,连接方式必须互补、两端密钥必须一致,并完整填写两项 mTLS 证书;共享仲裁文件按现场条件选择,留空时会以链路模式运行且不具备分区防双活保护。保存后确认对端身份、链路完整健康、授权状态和四类生产任务状态,再在维护窗口进行切换演练。
手动切换操作与验证
“切换主备”用于主动更换当前工作节点,例如将工作从已接管的 B 交回恢复后的 A。它不会修改两台网关的连接身份。
- 确认两端冗余连接健康,目标节点可访问现场设备和转发目标,页面没有未处理的切换错误。
- 在当前工作节点点击“立即同步到对端”,等待成功提示,并核对待机节点的业务配置和采集数据显示。
- 在当前工作节点点击“切换主备”,确认“确定要切换当前工作的网关吗?”。
- 等待两端状态稳定,确认原工作节点变为“待机”,目标节点变为“当前工作”。
- 确认新工作节点恢复采集和业务转发,原工作节点的四类任务均已停止;配置共享仲裁时,核对工作授权已由新工作节点持有。
- 在接收端确认转发数据持续更新;使用历史补偿时,检查“历史数据保护”中待处理记录是否逐步减少。
如果提示未切换或“切换失败”,先刷新两端页面,核对实际工作节点和“最近切换错误”,再检查对端连接、工作授权和任务启动条件。不要连续反复点击切换,也不要通过关闭冗余强行启动另一台。
故障演练与验收
在允许业务短时中断的维护窗口进行下列操作。每个场景完成后,先恢复链路和稳定工作状态,再进行下一项。
| 演练场景 | 通过标准 |
|---|---|
| 正常运行 | 一台“当前工作”、另一台“待机”;待机端能够看到同步采集值,但不采集设备、不启动业务转发。 |
| 停止当前工作节点的软件或关闭其主机 | 另一台在满足接管条件后开始采集和转发;接收端恢复更新。记录现场实际中断时间。 |
| 恢复原主机 | 配置共享仲裁时,持有有效授权的接管节点继续工作,恢复节点待机;仅链路模式按“故障接管与主机恢复”所述规则检查最终角色。 |
| 手动交回原主机 | 切换后仅原主机工作,另一台待机,采集和接收端转发均正常。 |
| 双网中断开一条链路 | 另一条完整健康链路可用时,保持现有工作节点。 |
| 中断全部冗余链路,或共享存储不可用 | 配置共享仲裁时,不允许两台同时持有工作授权;授权无法维持的节点停止业务,无法取得授权的节点不启动业务。 |
历史补偿只能重放已被保存且仍可访问的记录,不能补回停机期间从未采集到的数据,也不能保证所有业务转发协议都没有重复或丢失。应同时核对历史记录和实际接收端结果。
常见问题
| 现象 | 检查与处理 |
|---|---|
| 备机能看到变量值,是否说明它也在采集? | 不一定。待机端显示的是同步值;以“本机角色”和“采集任务状态”判断是否在采集。 |
| 原主机恢复了,却仍由备机工作 | 先检查共享仲裁。备机持有有效授权时,这是正常状态;需交回原主机时执行“切换主备”。仅链路模式已经处于一工作一待机时,也会保持现状。 |
| 待机节点数据不更新 | 检查对端连接、两端变量配置和同步结果,在当前工作节点执行“立即同步到对端”后等待同步周期;内存变量不按采集实时值镜像同步。 |
| 备机没有接管 | 检查是否所有链路均达到断线判定条件;配置共享仲裁时再检查共享文件访问和工作授权,最后查看“最近切换错误”及设备、转发目标启动条件。 |
| 两台都在采集或转发 | 检查是否有一端关闭了冗余,以及是否仅链路模式发生网络分区。恢复冗余连接;需要防双活时配置同一个可靠共享仲裁文件,并重新验收。 |
| 网关已切换,但上位系统仍未恢复通信 | 核对新工作节点的转发连接和接收端配置。主动连接网关服务的客户端,还应确认是否已连接到当前工作节点,并检查重连和地址切换配置。 |
历史数据与历史报警可靠性
双机热备启用后,历史数据和历史报警可使用主备历史补偿。该能力默认开启:系统会把历史事件先保存在本机 Journal 并同步到对端节点;节点取得工作授权并成为当前工作节点前,会先补写未完成入库的记录,写入标准 SQL 历史表时通过记录唯一键避免重复。因此,在主备切换、对端链路短时中断或运行时重启后,可补写仍在本地 Journal 或离线缓存中的历史记录,并避免已入库记录被重复写入。
| 项目 | 说明 |
|---|---|
| 适用对象 | 历史数据目标、历史报警目标。 |
| 前提条件 | 启用双机热备,并保持“历史数据/报警补偿”开关开启。 |
| 适用数据库 | 标准 SQL 写入链路:SqlServer、MySql、Sqlite、PostgreSql。 |
| 不适用范围 | QuestDB、TDengine、自定义 SQL 模式、历史表脚本、历史报警表脚本等自定义写入链路不纳入该去重与补写机制。 |
| 现场建议 | 历史数据和历史报警目标建议同时开启离线缓存,并按断网时间、写入量、Journal 最大保留行数和缓存文件最大行数预留磁盘空间。上线前在维护窗口验证主备切换、断线、数据库短时不可用和重启恢复。 |
历史数据保护诊断
“历史数据保护”区域用于确认历史目标是否支持主备补偿、Journal 是否存在积压,以及当前节点是否持有目标库写入授权。启用双机热备并配置历史数据或历史报警目标后,建议在联调、切换演练和恢复后检查该区域。
| 区域 | 说明 |
|---|---|
| 概览指标 | 显示当前节点、最大序列、待同步到对端数量和待写入数据库数量。积压长时间大于 0 时,应检查双机链路、对端节点、目标数据库和离线缓存。 |
| 筛选条件 | 可按 Journal 目标键、来源节点、记录类型、记录唯一键,以及是否待 Peer、待 DB 筛选事件。 |
| 目标支持 | 列出历史数据目标和历史报警目标的可靠同步支持状态、插件名称、目标类型、不支持原因和 Journal 目标键。 |
| Journal状态 | 按目标键、来源节点和记录类型汇总最大序列、总行数、待 Peer、待 DB、最早积压时间和最新事件时间。 |
| Epoch租约 | 查看目标库租约的持有节点、租约到期时间和当前状态,用于判断当前节点是否具备补写权。 |
| Journal事件 | 查看单条历史事件的序列、来源节点、记录类型、记录唯一键、Peer/DB 标记和原始载荷,适合定位某个变量或报警为什么尚未补写。 |
保护支持状态为“不支持”时,常见原因包括启用自定义 SQL、启用历史表脚本、使用 QuestDB、TDengine 或其它非标准 SQL 写入链路。此类目标仍可使用自身离线缓存,但不纳入主备历史的幂等补写和诊断统计。