性能文章>【译】关于RocketMQ的高可用(HA)设计>

【译】关于RocketMQ的高可用(HA)设计转载

2年前
594728

背景

任何消息传递系统都会出现错误,即使服务器会事先检查代理的运行状况,但总会有延迟。另外,在消息传递过程中还会会发生网络中断等问题。

但是虽然错误都相似,错误的处理各自会有所不同。

CAP 定理是分布式系统中的一个基本定理,它指出任何分布式系统最多可以具有以下三个属性中的两个:一致性、高可用性和分区容错性。下图显示了其中的权衡关系:

虽然没有任何系统设计可以同时满足这三个要求,但如果我们增强 A 和 P,对 C 的要求将不那么重要。

这就是 RocketMQ 在其 HA 设计中所做的:主/从方法。

设计

RocketMQ的主从架构有两层证明:多数据中心部署、分布式锁、通知机制。

为实现高可用性,建议采用不同的数据中心部署。

Zookeeper 是调度器,它的作用是:

  • 持久化节点,存储master状态
  • 临时节点,存储当前状态
  • 在故障转移期间,它将通知观察者。

对于任何写入操作,请求只会发送到主服务器,它会通过同步或异步通信复制到从服务器。

对于读取操作,请求则将首先发送到主服务器,万一主服务器忙,它才会去从服务器。

RocketMQ 与 Zookeeper 交互的目的是:

  • 更新当前状态
  • 充当集群变化的观察者。

这种设计将避免故障转移中的内容丢失。我们使用全局变量 SequenceID 来保证同步时数据的一致性。

另一个关键问题是恢复的性能。下面是故障转移的状态机图。

当第一个节点启动时,Controller 会通知该节点作为主节点。

当第二个节点(从)启动时,控制器将切换到异步状态,主机将与从机发送数据。

当同步快完成时,Controller 将切换到半异步状态。所有对 aster 的写入操作都将暂停,直到同步完成。这保证了主从状态一致。

当从设备拥有主设备的完整副本时,控制器将切换回同步模式,此后,主服务器将使用同步模式将数据复制到从服务器,直到主服务器宕机,此时从服务器将被提升成主服务器,这种改变可以在几秒钟内完成。

结论

高可用性(HA)是一个复杂的话题。我们在同步、异步和混合模式之间切换以平衡吞吐量和一致性。

总的来说,这种机制在低延迟、高吞吐量和一致性之间提供了平衡的性能。

作者:Andy Shi

点赞收藏
willberthos

keep foolish!

请先登录,查看2条精彩评论吧
快去登录吧,你将获得
  • 浏览更多精彩评论
  • 和开发者讨论交流,共同进步

为你推荐

Redis stream 用做消息队列完美吗?

Redis stream 用做消息队列完美吗?

Netty源码解析:writeAndFlush

Netty源码解析:writeAndFlush

8
2