笔者所在的业务线,最初化分为三个服务,由于业务初期业务复杂度相对简单,三个业务服务都能很好的独立完成业务功能。
随着产品迭代,业务功能越来越多后慢慢也要面对高并发、业务解耦、分布式事务等问题,所以经过团队内部讨论,引入 RocketMQ 消息中间件来更好的处理业务。
由于公司内部业务线部署相互独立,我们业务线对引入 RocketMQ 的需求也比较急切,所以打算自己搭建一套高可用的 RocketMQ 集群,同时对于自建的 RocketMQ 集群需要如下特性:
首先第一步要让 NameServer 高可用,前期规划了三台机器部署 NamseServer 这样可以充分保证可用性,即使两台机器挂掉也能保证集群的正常使用,只要有一个 NamseServer 还在运行,就能保证 RocketMQ 系统的稳定性。
NameServer 的设计是相互的独立的,任何一台 NameServer 都可以的独立运行,跟其他机器没有任何通信。
每台 NameServer 都会有完整的集群路由信息,包括所有的 Broker 节点的信息,我们的数据信息等等。所以只要任何一台 NamseServer 存活下来,就可以保存 RocketMQ 信息的正常运行,不会出现故障。
开始部署 RocketMQ 之前,我们也做过一些功课,对现在 RocketMQ 支持的集群方案做了一些整理,目前 RocketMQ 支持的集群部署方案有以下4种:
多 Master 模式
一个 RocketMQ 集群中所有的节点都是 Master 节点,每个 Master 节点没有 Slave 节点。
这种模式的优缺点如下:
多 Master 多 Salve - 异步复制 模式
每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级)
这种模式的优缺点如下:
多 Master 多 Salve - 同步双写 模式
每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功
这种模式的优缺点如下:
Dledger 模式
RocketMQ 4.5 以前的版本大多都是采用 Master-Slave 架构来部署,能在一定程度上保证数据的不丢失,也能保证一定的可用性。
但是那种方式 的缺陷很明显,最大的问题就是当 Master Broker 挂了之后 ,没办法让 Slave Broker 自动 切换为新的 Master Broker,需要手动更改配置将 Slave Broker 设置为 Master Broker,以及重启机器,这个非常麻烦。
在手式运维的期间,可能会导致系统的不可用。
使用 Dledger 技术要求至少由三个 Broker 组成 ,一个 Master 和两个 Slave,这样三个 Broker 就可以组成一个 Group ,也就是三个 Broker 可以分组来运行。一但 Master 宕机,Dledger 就可以从剩下的两个 Broker 中选举一个 Master 继续对外提供服务。
经过上面4种集群方案的比较,最终确定使用 Dledger 方式最终的逻辑部署图如下:
上图的虚线框表示一个 Dledger Group。
高可用
三个 NameServer 极端情况下,确保集群的可用性,任何两个 NameServer 挂掉也不会影响信息的整体使用。
在上图中每个 Master Broker 都有两个 Slave Broker,这样可以保证可用性,如在同一个 Dledger Group 中 Master Broker 宕机后,Dledger 会去行投票将剩下的节点晋升为 Master Broker。
高并发
假设某个Topic的每秒十万消息的写入, 可以增加 Master Broker 然后十万消息的写入会分别分配到不同的 Master Broker ,如有5台 Master Broker 那每个 Broker 就会承载2万的消息写入。
可伸缩
如果消息数量增大,需要存储更多的数量和最高的并发,完全可以增加 Broker ,这样可以线性扩展集群。
海量消息
数据都是分布式存储的,每个Topic的数据都会分布在不同的 Broker 中,如果需要存储更多的数据,只需要增加 Master Broker 就可以了。
转自:分布式 - 4 种高可用 RocketMQ 集群搭建方案!_个人文章 - SegmentFault 思否