白皮书
MQTT + 大模型:实时智能融合架构与实践 →

硬件故障,服务不停:EMQX 创造 1770 天不间断运行纪录

EMQX Team
2025-11-12
硬件故障,服务不停:EMQX 创造 1770 天不间断运行纪录

在物联网系统中,数据实时性与服务连续性直接决定着业务的生命力。任何软件或服务器的中断,都可能导致海量设备失联、关键数据丢失和业务停摆。正因如此,要构建稳健的物联网基础设施,必须选择一个具备工业级可靠性的 MQTT 消息平台。

近期,一个真实案例再次印证了 EMQX 的卓越稳定性:某企业部署中的 EMQX 双节点集群,自 2020 年起持续运行 1770 天未发生服务中断。最终导致节点停运的原因并非软件缺陷,而是一块物理主板的硬件故障。

值得关注的是,故障发生时,业务层的客户端通过负载均衡机制实现了秒级无感切换,全程保持了业务数据的连续性。等待硬件修复、节点重新加入集群后,系统服务也自动恢复正常。

该案例背后蕴含着一个值得探究的技术问题:当底层硬件发生故障时,系统如何保障业务连续性,并最终实现平滑恢复?本文将从 Erlang/OTP 的容错设计EMQX 的集群架构两个维度,深入剖析 EMQX 稳定运行背后的技术原理。

EMQX 的技术基石:Erlang/OTP 的容错哲学

EMQX 基于 Erlang/OTP 构建,这一选择从「基因层面」奠定了其工业级的稳定性和高可用性。Erlang/OTP 专为构建高并发、高容错的分布式系统而设计,其核心设计理念与机制为 EMQX 提供了坚实的基础。

在 EMQX 中,每个客户端连接、会话管理和消息路由等核心功能都被封装在独立的、轻量级 Erlang 进程中。这种 Shared-Nothing(无共享)的进程架构,从根源上避免了内存共享带来的并发冲突,实现了故障的精准隔离。

这种设计催生了 Erlang 独有的 Let it crash(任其崩溃)理念。这不是对错误的放任,而是一种积极的容错策略。开发者无需穷尽所有异常问题编写复杂的防御代码,当某个 Erlang 进程因异常崩溃时,专属的监督者(Supervisor)进程会立即介入,按预设策略将其重启至稳定状态。

EMQX 的内部结构是一个庞大而精密的监督树 (Supervision Tree)。当一个孤立的客户端会话进程因内部逻辑错误而崩溃时,其监督者会根据重启策略,仅对该崩溃的进程进行重启,而不会对同一节点上的其他客户端连接造成任何影响。这种细粒度的故障管理,是 EMQX 能够长期稳定运行的关键。

EMQX 集群架构:应对硬件故障的高可用实践

Erlang/OTP 的容错机制为 EMQX 的稳定性奠定了基础,而 EMQX 的集群架构则将这一优势扩展至整个系统层面,使其能够从容应对物理机层级的硬件故障。

Mnesia 全互联集群:确保数据一致性

EMQX 集群以 Erlang 分布式数据库 Mnesia 为核心,采用全互联(Full-Mesh)拓扑结构。在此结构中,所有节点地位平等且两两互联,以实现数据的实时同步。每个节点都完整保存了集群内所有会话与订阅数据的副本。

在本案例的双节点集群场景下,这一设计成为实现「无感切换」的关键。当客户端因节点故障需要重新连接至健康节点时,健康节点必须即刻掌握客户端的完整会话信息和订阅关系。

Mnesia 全互联架构完美满足此需求:当某 EMQX 节点因硬件故障退出集群时,健康节点已通过实时同步机制获取了所有客户端的最新会话状态。当客户端重连时,它所连接到的并非一个陌生的新服务,而是已完全掌握其会话详情的「孪生」服务,从而实现业务的无缝接管。

与负载均衡器协同:客户端无感切换

在实际生产环境中,为了保证高可用和负载均衡,EMQX 集群通常部署在负载均衡器(如 HAProxy)之后。当某一个 EMQX 节点因硬件故障下线时,负载均衡器会立即感知到这一变化,并自动将新的客户端连接请求路由至集群中健康的节点。

这一机制是实现客户端秒级无感切换的关键。当一个节点宕机后,所有连接到该节点的客户端会瞬间断开。但由于负载均衡器的存在,当这些客户端尝试重新连接时,它们会被自动导向至集群中仍然可用的节点,从而实现了业务的快速恢复,最大程度减少了影响。

会话持久化与离线消息:保障业务连续性

除了集群层面的数据同步,MQTT 协议的会话持久化机制为业务连续性提供了核心保障。通过 Clean Session 与持久会话(Persistent Session)的功能,即使客户端因网络波动或服务器故障离线,EMQX 集群仍会完整保留其会话状态与订阅关系。

客户端通过在连接时设置 Clean Session=false,可以请求创建一个持久会话。在此模式下,EMQX 集群将为客户端创建会话对象,并通过 Mnesia 将其状态与订阅关系同步至所有节点,形成集群级别的会话保护。若客户端异常断开,所有发往其订阅主题的消息均会被自动缓存。

从故障修复到集群再生:EMQX 服务的平滑恢复

在这次突发的硬件故障中,当物理机主板被更换并重新启动后,故障节点上的 EMQX 服务会自动执行一套明确的流程:首先清理本地可能不完整的旧数据,再从其他健康节点同步完整的会话与路由信息,从而快速恢复到与集群一致的状态。

这一「再加入」的过程完全自动化,无需人工干预,展现了 Erlang/OTP 的自愈特性与 EMQX 集群架构的稳健性。与此同时,负载均衡器的健康检查机制会在节点恢复后及时将其重新纳入服务中,确保客户端连接能够顺畅切换。

整个过程对业务几乎零影响:在节点宕机与恢复期间,客户端仍能通过其他健康节点保持正常通信,真正实现了不中断的业务连续性

总结

长达 1770 天的持续稳定运行,正是对 Let it crash 设计理念与 EMQX 坚实架构的完美诠释。

这一案例表明,对可靠性要求严苛的物联网领域,一个真正稳健的系统必须在各个层面进行故障考量和容错设计。基于这一理念,EMQX 从底层构建了可靠的容错体系,并通过与外部组件的协同配合,即使在面临极端硬件故障时,依然能够确保业务连续性,充分展现了其作为企业级物联网消息平台的卓越可靠性。

在工业互联网、车联网、金融支付、能源电力等关键领域,MQTT 消息中间件往往承载着核心业务的数据流。宕机一分钟,就可能导致数以万计的设备失联,甚至引发严重的安全事故。因此,稳定性就是生命线。

EMQX 实现 1770 天不间断运行,说明其架构设计完全满足电信级系统的高可用性要求,真正做到了「7×24小时」持续服务能力,为客户提供接近 100% 的 SLA 保障。这一成功案例绝非偶然,而是先进的系统架构、高质量的代码实现和完备的运维体系共同作用的必然结果。

展望

本案例展示了 EMQX 在非计划性故障下的卓越表现,而 EMQX 5.0 及其后续版本则在核心高可用能力基础上,进一步增强了系统的可操作性和弹性,在计划性运维超大规模部署方面实现了重要突破。

节点疏散与集群再平衡

EMQX 5.0 引入的节点疏散集群再平衡功能,专为计划性维护场景设计。在版本升级或硬件扩容前,运维人员可通过可控方式将节点上的连接和会话安全迁移至集群其他节点。这一机制有效避免了大规模集群在升级和维护过程中由重启而引发的「重连风暴」,确保运维过程平稳有序。

创新架构:Core 与 Replicant 节点

为支持更大规模集群与更强水平扩展能力,EMQX 5.0 对集群架构进行重构,从全互联 Mnesia 拓扑演进为混合式 Core-Replicant 架构:

  • Core 节点:负责核心的事务处理和数据同步,形成一个全互联的集群。
  • Replicant 节点:作为无状态节点,被动地从 Core 节点复制数据,不参与事务处理。

这一架构显著提升了集群的扩展性,简化了大规模集群的运维管理。

跨云连接:多云集群的高可用架构

随着物联网业务的全球化和多云部署趋势,EMQX 通过「集群连接 Cluster Linking」功能,将多个独立的EMQX 集群连接成一个统一的、高可用消息平台 。这一功能可以:

  • 统一消息平台:连接不同云平台的 EMQX 集群,实现客户端无缝通信。
  • 集群容灾保障:单一云区域故障时,互联集群可自动接管业务,确保服务不中断。
  • 简化跨云通信:提供内置的优化方案,确保跨云集群消息可靠路由。
  • 多云战略支撑:帮助企业构建不依赖单一云厂商的基础设施。

通过 NAT 网关、VPN 连接等多种网络互联方案,EMQX 支持跨云集群的无缝通信,为关键物联网应用提供了更高的带宽、更低的延迟和更可靠的性能。

咨询 EMQ 技术专家
联系我们 →

推荐阅读

2022-12-29EMQX Team
集群负载重平衡提供更好的运维实践

本月 EMQX 开源版和企业版对稳定性和部分功能进行了优化提升,同时提供了 TDengine 的新版本适配,帮助用户基于 EMQX 拓展更多可能。