RocketMQ 如何保证高可用性?

参考答案

1   集群化部署 NameServer

Broker 集群会将所有的 broker 基本信息、topic 信息以及两者之间的映射关系,轮询存储在每个 NameServer 中(也就是说每个NameServer 存储的信息完全一样)。

因此,NameServer 集群化,不会因为其中的一两台服务器挂掉,而影响整个架构的消息发送与接收。

2   集群化部署多 broker

producer 发送消息到 broker 的 master ,若当前的 master 挂掉,则会自动切换到其他的 master。cosumer 默认会访问 broker 的 master 节点获取消息。

那么,master 节点挂了之后,该怎么办呢?它会自动切换到同一个 broker 组的 slave 节点进行消费。

这时,你肯定会想到这样一个问题:consumer 直接消费 slave 节点,master 在宕机前没有来得及把消息同步到 slave 节点,就会出现消费者取不到消息的情况了?

这样,就引出了下一个措施,来保证消息的高可用性。

3   设置同步复制

消息发送到 broker 的 master 节点上,master 需要将消息复制到 slave 节点上,RocketMQ 提供两种复制方式:同步复制和异步复制。

  • 异步复制,就是消息发送到 master 节点,只要 master 写成功,就直接向客户端返回成功,后续再异步写入 slave 节点
  • 同步复制,就是等 master 和 slave 都成功写入内存之后,才会向客户端返回成功

那么,要保证高可用性,就需要将复制方式配置成同步复制,这样即使 master 节点挂了,slave 上也有当前 master 的所有备份数据,不仅保证消费者消费到的消息是完整的,并且当 master 节点恢复之后,也容易恢复消息数据。

在 master 的配置文件中,直接配置 brokerRole:SYNC_MASTER 即可。

 

以上,是消息队列 RocketMQ 面试题【RocketMQ 如何保证高可用性?】的参考答案。

输出,是最好的学习方法

欢迎在评论区留下你的问题、笔记或知识点补充~

—end—

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧