之前在网上看一些rocketmq集群方案时,看到有很多不一致的地方,比如:
- rocketmq的组件包含NameServer、Broker、Proxy,多出来个Proxy?
- Local模式是单机的不适合生产使用?
- proxyMode设置为Local模式,也是可以部署多节点的?
.....
发现这些不一致,所以产生了一些疑问,然后去官方文档研究了一下。
以下是官方文档英文版v4.x与v5.x
添加图片注释,不超过 140 字(可选)
可以明显看到v4.x的部署方法包括:单主模式、多主模式、多主多从模式-异步复制、多主多从模型-同步双写。
并没有Local模式与Cluster模式之分。
当然v4.x不要看中文版的,中文版的目录有点乱,并且v4.x的中文版文档用的又是v5.x的版本,不知道是不是官方没有维护v4.x中文版
添加图片注释,不超过 140 字(可选)
从英文版,可以明显看到v4.x的部署方法包括:单主模式、多主模式、多主多从模式-异步复制、多主多从模型-同步双写。
添加图片注释,不超过 140 字(可选)
而5.x把部署分成Local Mode与Cluster Mode
添加图片注释,不超过 140 字(可选)
并说明了
在 5.0 版本中 Proxy 和 Broker 根据实际诉求可以分为 Local 模式和 Cluster 模式,一般情况下如果没有特殊需求,或者遵循从早期版本平滑升级的思路,可以选用Local模式。
- 在 Local 模式下,Broker 和 Proxy 是同进程部署,只是在原有 Broker 的配置基础上新增 Proxy 的简易配置就可以运行。
- 在 Cluster 模式下,Broker 和 Proxy 分别部署,即在原有的集群基础上,额外再部署 Proxy 即可。
也就是 Local 模式和 Cluster 模式区别在于Broker 和 Proxy 是否在一起。总的来说在这两种模式下的部署方案还是相同的:单组节点单副本模式、多组节点(集群)单副本模式、多节点(集群)多副本模式-异步复制、多节点(集群)多副本模式-同步双写。
添加图片注释,不超过 140 字(可选)
虽然v5.x在v4.x基础上增加了Local模式与Cluster模式,但集群的部署方案大致是相同的,下面就来具体看看集群部署方法
单主机模式
在单主模式下,RocketMQ的架构非常简单,只有一个主节点(Master),没有备用节点(Slave)。这种模式适用于对高可用性要求不高的小型系统,因为单主模式中主节点如果宕机,整个消息系统将不可用。
这种模式具有更高的风险,因为Broker的重启或失败将导致整个服务不可用。不建议在在线环境中使用,但可用于本地测试。
添加图片注释,不超过 140 字(可选)
多主模式
RocketMQ 的多主模式(Multi-Master Mode)是一种高可用的集群部署模式。在这种模式下,集群中有多个主节点(Master),每个主节点独立地接收和处理消息,彼此之间没有从属关系。多主模式提高了系统的可用性和容错能力,避免了单点故障的问题。
全是主设备而没有从设备的集群(例如2或3个主设备)的优点和缺点如下:
- 优点:配置简单,单台主机重启或停机对应用无影响,当磁盘配置为RAID10时,即使机器停机无法恢复,由于RAID10磁盘的可靠性,消息也不会丢失(异步刷新丢失少量消息,同步刷新不丢失一条消息),性能最高;
- 缺点:在单机停机期间,本机上未消费的消息在机器恢复前无法订阅,消息的实时性将受到影响。
添加图片注释,不超过 140 字(可选)
多主多从模式-异步复制
每个Master配置有一个Slave,从而产生多个Master-Slave对。在此高可用性(HA)设置中,由于异步复制,存在短暂的消息延迟(在毫秒范围内)。
- 优点:在磁盘损坏的情况下,丢失的消息数量最小,消息的实时性不受影响。此外,即使主设备停机,消费者仍然可以从从设备进行消费,这个过程对应用程序是透明的,不需要手动干预,性能几乎与多主模式相同。
- 缺点:在主机中断或磁盘损坏的情况下,可能会丢失少量消息。
添加图片注释,不超过 140 字(可选)
多主多从模式-同步双写
每个Master配置有一个Slave,从而产生多个Master-Slave对。在此高可用性(HA)设置中,使用同步双写入,这意味着只有在主设备和从设备都成功写入时,才向应用程序返回成功。该模式的优点和缺点如下:
- 优点:数据或服务都没有单点故障,并且在主服务器中断的情况下,没有消息延迟,服务可用性和数据可用性都非常高。
- 缺点:性能比异步复制模式略低(约低10%),发送单个消息的往返时间略高,并且在当前版本中,主节点宕机后备用节点不能自动切换到主节点。
添加图片注释,不超过 140 字(可选)
上述Broker和Slave的配对是通过指定相同的BrokerName参数完成的。Master的BrokerId必须为0,Slave的BrokerId必须为大于0的数字。 此外,一个Master下可以挂载多个Slave,同一Master下的多个Slave通过指定不同的BrokerId来区分。