【译】关于RocketMQ的高可用(HA)设计转载
背景
任何消息传递系统都会出现错误,即使服务器会事先检查代理的运行状况,但总会有延迟。另外,在消息传递过程中还会会发生网络中断等问题。
但是虽然错误都相似,错误的处理各自会有所不同。
CAP 定理是分布式系统中的一个基本定理,它指出任何分布式系统最多可以具有以下三个属性中的两个:一致性、高可用性和分区容错性。下图显示了其中的权衡关系:
虽然没有任何系统设计可以同时满足这三个要求,但如果我们增强 A 和 P,对 C 的要求将不那么重要。
这就是 RocketMQ 在其 HA 设计中所做的:主/从方法。
设计
RocketMQ的主从架构有两层证明:多数据中心部署、分布式锁、通知机制。
为实现高可用性,建议采用不同的数据中心部署。
Zookeeper 是调度器,它的作用是:
- 持久化节点,存储master状态
- 临时节点,存储当前状态
- 在故障转移期间,它将通知观察者。
对于任何写入操作,请求只会发送到主服务器,它会通过同步或异步通信复制到从服务器。
对于读取操作,请求则将首先发送到主服务器,万一主服务器忙,它才会去从服务器。
RocketMQ 与 Zookeeper 交互的目的是:
- 更新当前状态
- 充当集群变化的观察者。
这种设计将避免故障转移中的内容丢失。我们使用全局变量 SequenceID 来保证同步时数据的一致性。
另一个关键问题是恢复的性能。下面是故障转移的状态机图。
当第一个节点启动时,Controller 会通知该节点作为主节点。
当第二个节点(从)启动时,控制器将切换到异步状态,主机将与从机发送数据。
当同步快完成时,Controller 将切换到半异步状态。所有对 aster 的写入操作都将暂停,直到同步完成。这保证了主从状态一致。
当从设备拥有主设备的完整副本时,控制器将切换回同步模式,此后,主服务器将使用同步模式将数据复制到从服务器,直到主服务器宕机,此时从服务器将被提升成主服务器,这种改变可以在几秒钟内完成。
结论
高可用性(HA)是一个复杂的话题。我们在同步、异步和混合模式之间切换以平衡吞吐量和一致性。
总的来说,这种机制在低延迟、高吞吐量和一致性之间提供了平衡的性能。
作者:Andy Shi