RocketMQ的高可用集群部署
标签(空格分隔): 消息队列 部署
1. RocketMQ 集群物理部署结构
Rocket
物理部署结构
Name Server
: 单点,供Producer
和Consumer
获取Broker
地址, 类似于注册中心.
Producer
: 产生并发送消息.
Consumer
: 接收并消费消息.
Broker
: 消息暂存,消息转发.
1.1 Name Server
Name Server
做的是Rocket
的寻址服务, 用于将Broker
的路由信息做聚合. 客户端依靠Name Server
决定去获取对应topic
的路由信息,从而决定对那些Broker
做链接.
Name Server
是一个几乎无状态的节点,Name Server
之间采用Share-Nothing
的设计, 互不通信.
对于一个
Name Server
集群列表, 客户端链接Name Server
的时候会随机选择一个节点, 以做到负载均衡.
Name Server
所有状态都从Broker
上报上来, 本身不存储任何状态, 所有数据均在内存.
如果中途所有的Name Server都挂了, 只会影响到路由信息的更新, 并不会影响到和
Broker
的通信.(Eureka 的本地缓存服务注册信息 )
1.2 Broker
Broker
是做消息存储,转发的服务器.
Broker
以group
分开,每个group
只允许一个master
,若干个slave
.
一个master
可以有多个slave
,但是一个slave
只能有一个master
.
只有master
才可以进行写入操作,slave
不允许.
slave
从master
中同步数据. 同步策略取决于master
的配置, 可以采用同步双写,异步复制两种.
客户端消费可以从master
和slave
中消费. 在默认的情况下,消费者都从master
消费, 在master
挂掉之后, 客户端由于从Name Server
中感知到Broker
挂机,就会从slave
消费. (尽量从master
消费, 这样消息会比较及时, 不用牵扯到消息复制的延迟问题.)
2. RocketMQ集群物理部署结构
RocketMQ
的部署结构有一下特点:
Name Server
是一个无状态节点, 可以集群部署, 节点之间没有信息同步.Broker
部署分为Master
和Slave
. 一个master
对应多个slave
,但是一个slave
只可以有一个master
, 他们之间的对应关系通过制定相同的BrokerName
, 不同的BrokerId
来定义,BrokerId
为0表示master
,非0表示Slave
,Master
也可以部署多个. 每个Broker
与Name Server
集群中的所有节点建立长连接, 定时注册Topic
信息到所有Name Server
.Producer
与Name Server
集群中的其中一个节点(随机选择)建立长连接,定期从Name Server
获取Topic
信息,并且向提供服务的Topic
服务的Master
建立长连接, 并且定时向Master
发送心跳.Consumer
和Name Server
集群中的其中一个节点(随机选择)建立长连接, 定期从Name Server
取Topic
路由信息, 并且向提供Topic
服务的Master
建立长连接, 且定时发送心跳.Consumer
既可以从Master
订阅消息,也可以从Slave
订阅消息. 规则由Broker
决定.
3. RocketMQ逻辑部署结构
3.1 Producer Group
用来表示一个发送消息的应用, 一个
Producer Group
下包含多个Producer
实例,可以使多个机器,也可以是一台机器的多个进程, 或者一个进程的多个Producer
对象. 一个Producer Group
可以发送多个Topic
消息,Producer Group
的作用如下:
- 标识一类的Producer
- 可以通过运维工具查询这个发送消息的应用下有多少个Producer实例.
- 发送分布式事务消息的时候,如果Producer中途意外宕机,Broker会主动回调Producer Group内的任意一台机器来确认是无状态.
3.2 Consumer Group
用来表示一个消费消息应用,默认为一个Consumer Group下的多个Consumer以均摊的方式消费信息, 如果设置为广播方式的话,这个Consumer Group下的所有Consumer会消费全部的数据.
4. RocketMQ集群部署模式
4.1 单Master模式
也就是只有一个Master节点, 称不上是集群, 一旦这个Master节点宕机, 那么整个服务就不可用, 也就是自己学习的时候搞一搞.
4.2 多Master模式
多个Master节点组成集群, 单个Master节点宕机或者重启对应用没有影响.
- 优点: 所有模式中性能最高.
- 缺点: 单个Master节点宕机期间, 未被消费的消息在节点恢复之前不可用, 消息的实时性就收到影响.
- 注意: 使用同步技术可以保证消息不丢失, 同时Topic相对应的Queue应该分布在急群众的各个节点,而不是某个节点上,否则,该节点的宕机会导致对订阅该topic的应用造成影响.
4.3 多Master多Slave异步复制模式
在多Master的基础上, 每个节点都有至少一个的Slave, Master节点可读可写, 但是Slave节点只读不写, 类似于MySQL的主备模式.
- 优点: 在Master宕机的时候, 消费者可以从Slave读取消息, 消息的实时性不会受到影响, 性能几乎和多Master一样.
- 缺点: 异步复制的同步方式和能导致消息丢失.
4.4 多Master多Slave同步双写模式
同多Master多Slave异步复制模式类似, 区别在于Master和Slave之间的数据同步方式.
- 优点: 同步双写的同步模式能保证数据不丢失.
- 缺点: 发送翻个消息的RT越长, 性能相比异步复制低10%.
- 刷盘策略: 同步刷盘和异步刷盘(节点自身数据是同步还是异步存储)
- 同步方式: 同步双写和异步复制(一组Master和Slave之间的数据同步)