一、分布式集群
RocketMQ
分布式集群是通过Master
和Slave
的配合达到高可用性的。
Master
和Slave
的区别:在Broker
的配置文件中,参数brokerId
的值为0
表明这个Broker
是Master
,大于0
表明这个Broker
是Slave
,同时brokerRole
参数也会说明这个Broker
是Master
还是Slave
。
Master
角色的Broker
支持读和写,Slave
角色的Broker
仅支持读,也就是 Producer
只能和Master
角色的Broker
连接写入消息;Consumer
可以连接 Master
角色的Broker
,也可以连接Slave
角色的Broker
来读取消息。
二、高可用
2.1 消息消费高可用
在Consumer
的配置文件中,并不需要设置是从Master
读还是从Slave
读,当Master
不可用或者繁忙的时候,Consumer
会被自动切换到从Slave
读。有了自动切换Consumer
这种机制,当一个Master
角色的机器出现故障后,Consumer
仍然可以从Slave
读取消息,不影响Consumer
程序。这就达到了消费端的高可用性。
2.2 消息发送高可用
在创建Topic
的时候,把Topic
的多个Message Queue
创建在多个Broker
组上(相同Broker
名称,不同 brokerId
的机器组成一个Broker
组),这样当一个Broker
组的Master
不可用后,其他组的Master
仍然可用,Producer
仍然可以发送消息。RocketMQ
目前还不支持把Slave
自动转成Master
,如果机器资源不足,需要把Slave
转成Master
,则要手动停止Slave
角色的Broker
,更改配置文件,用新的配置文件启动Broker
。
2.3 消息主从复制
如果一个Broker
组有Master
和Slave
,消息需要从Master
复制到Slave
上,有同步和异步两种复制方式。
1)同步复制
同步复制方式是等Master
和Slave
均写成功后才反馈给客户端写成功状态;
在同步复制方式下,如果Master
出故障, Slave
上有全部的备份数据,容易恢复,但是同步复制会增大数据写入 延迟,降低系统吞吐量。
2)异步复制
异步复制方式是只要Master
写成功,即可反馈给客户端写成功状态。
在异步复制方式下,系统拥有较低的延迟和较高的吞吐量,但是如果Master
出了故障,有些数据因为没有被写 入Slave
,有可能会丢失;
3)配置
同步复制和异步复制是通过Broker
配置文件里的brokerRole
参数进行设置的,这个参数可以被设置成ASYNC_MASTER
、SYNC_MASTER
、SLAVE
三个值中的一个。
4)总结
实际应用中要结合业务场景,合理设置刷盘方式和主从复制方式, 尤其是SYNC_FLUSH
方式,由于频繁地触发磁盘写动作,会明显降低性能。通常情况下,应该把Master
和Slave
配置成ASYNC_FLUSH
的刷盘方式,主从之间配置成SYNC_MASTER
的复制方式,这样即使有一台机器出故障,仍然能保证数据不丢,是个不错的选择。