【RocketMQ】第三篇-RocketMQ一主两从高可用集群

RocketMQ一主两从高可用集群

  • 一、环境准备
  • 二、配置文件
    • 131机器配置文件
    • 132机器配置文件
    • 133机器配置文件
    • 配置解读
    • Dledger配置参数含义
    • 测试验证
  • 三、RocketMQ主从同步
    • 1、同步刷盘和异步刷盘
    • 2、同步复制和异步复制

一、环境准备

至少需要三个虚拟机或者云服务器,并且三台服务器上都安装有Rocket MQ
【RocketMQ】第三篇-RocketMQ一主两从高可用集群_第1张图片
Rocket MQ在4.5.0之前版本的主从(两主两从、一主多从等)不支持自动故障转移,也就是并非真正意义上的高可用,比如2M2S,其中1个M挂了后,它的Slave节点不会自动升级为Master,但是在4.5.0加入了Dledger,它是基于raft算法的(Redis的哨兵也是这个算法),让Rocket MQ真正意义的做到了高可用,Master挂了后Slave自动升级为Master,完全实现了自动故障转移;
采用Dledger实现高可用,至少需要3个节点;
1主2从 (1个主宕机了,将从剩下的两个从里面选择一个主)
9dbac67.png)

二、配置文件

131机器配置文件

vim broker-a.properties
#所属集群名字
brokerClusterName=DefaultCluster
#broker名字,需要注意的是slave节点需要和master节点的brokerName一致,区分m还是s交由下面的brokerId来配置。
brokerName=broker-a
#0 表示 Master>0 表示 Slave
brokerId=0
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH

#nameServer地址,分号分割
namesrvAddr=192.168.34.131:9876;192.168.34.132:9876;192.168.34.133:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#存储路径
storePathRootDir=/root/data/rocketmq/broker-a/store
#commitLog 存储路径
storePathCommitLog=/root/data/rocketmq/broker-a/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/root/data/rocketmq/broker-a/store/consumequeue
#消息索引存储路径
storePathIndex=/root/data/rocketmq/broker-a/store/index
#checkpoint 文件存储路径
storeCheckpoint=/root/data/rocketmq/broker-a/store/checkpoint
#abort 文件存储路径
abortFile=/root/data/rocketmq/broker-a/store/abort
#限制的消息大小
maxMessageSize=65536

enableDLegerCommitLog=true
dLegerGroup=broker-a
dLegerPeers=n0-192.168.34.131:40911;n1-192.168.34.132:40911;n2-192.168.34.133:40911
dLegerSelfId=n0
sendMessageThreadPoolNums=4

132机器配置文件

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

#nameServer地址,分号分割
namesrvAddr=192.168.34.131:9876;192.168.34.132:9876;192.168.34.133:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#存储路径
storePathRootDir=/root/data/rocketmq/broker-b/store
#commitLog 存储路径
storePathCommitLog=/root/data/rocketmq/broker-b/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/root/data/rocketmq/broker-b/store/consumequeue
#消息索引存储路径
storePathIndex=/root/data/rocketmq/broker-b/store/index
#checkpoint 文件存储路径
storeCheckpoint=/root/data/rocketmq/broker-b/store/checkpoint
#abort 文件存储路径
abortFile=/root/data/rocketmq/broker-b/store/abort
#限制的消息大小
maxMessageSize=65536

enableDLegerCommitLog=true
dLegerGroup=broker-a
dLegerPeers=n0-192.168.34.131:40911;n1-192.168.34.132:40911;n2-192.168.34.133:40911
dLegerSelfId=n1
sendMessageThreadPoolNums=4

133机器配置文件

brokerClusterName=DefaultCluster
brokerName=broker-b
brokerId=2
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH

#nameServer地址,分号分割
namesrvAddr=192.168.34.131:9876;192.168.34.132:9876;192.168.34.133:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#存储路径
storePathRootDir=/root/data/rocketmq/broker-b/store
#commitLog 存储路径
storePathCommitLog=/root/data/rocketmq/broker-b/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/root/data/rocketmq/broker-b/store/consumequeue
#消息索引存储路径
storePathIndex=/root/data/rocketmq/broker-b/store/index
#checkpoint 文件存储路径
storeCheckpoint=/root/data/rocketmq/broker-b/store/checkpoint
#abort 文件存储路径
abortFile=/root/data/rocketmq/broker-b/store/abort
#限制的消息大小
maxMessageSize=65536

enableDLegerCommitLog=true
dLegerGroup=broker-a
dLegerPeers=n0-192.168.34.131:40911;n1-192.168.34.132:40911;n2-192.168.34.133:40911
dLegerSelfId=n2
sendMessageThreadPoolNums=4

配置解读

brokerClusterName:集群名称,所有broker配置的必须一致;
brokerName:broker名称,M-S之间必须一致,比如broker-a/broker-a(M/S),broker-b/broker-b;
brokerId:0 表示 Master,>0 表示 Slave,比如1M2S,那么M是0,Slave1是1,Slave2配置为2;
namesrvAddr:namesrv地址;
listenPort=11911 broker端口;
store*:持久化数据存储目录;
brokerRole:Broker的角色;
flushDiskType:刷盘方式,2m2s-sync中,master默认为SYNC_FLUSH,slave默认为ASYNC_FLUSH;

Dledger配置参数含义

【RocketMQ】第三篇-RocketMQ一主两从高可用集群_第2张图片

测试验证

启动三台的namesrv和三个broker,管控台将看到1个master,两个slave,都叫broker-a,此时停掉master,会发现其中一个slave自动升级为Master了,这就实现了真正的高可用,自动主备切换;

三、RocketMQ主从同步

RocketMQ Broker分为Master和Slave两个角色,为了保证高可用性,
Master角色的机器接收到消息后,会把信息同步到Slave机器上,这样
Master宕机,Slave机器依然可以提供服务;

RocketMQ高可用集群是通过Master和Slave的配合达到高可用的,在 Broker的配置文件中,参数brokerId的值为0表示该Broker为Master,大于0表示该Broker为Slave,同时brokerRole参数也提示了该Broker是Master还是Slave,Master支持读和写,Slave仅支持读,也就是Producer只能和Master角色的Broker建立连接写人消息;Consumer 既可以连接 Master角色的Broker,也可以连接Slave角色的Broker来读取消息;
在Consumer的配置文件中,并不需要设置是从Master读还是从Slave
读,当Master不可用或者繁忙的时候,Consumer会被自动切换到从Slave读,当Master角色的机器出现故障后,Consumer仍然可以从Slave读取消息,不影响Consumer 程序;

1、同步刷盘和异步刷盘

RocketMQ 的消息是持久化存储在磁盘上的,这样既可以保证断电后恢复,又可以让存储的消息不至于超出内存的限制, RocketMQ 为了提高性能,会尽可能地保证磁盘的顺序写,消息在通过Producer写入RocketMQ 时,有两种写入磁盘方式;
(1)异步刷盘方式:
在返回写成功状态时,消息可能只是被写人了内存的
PAGE CACHE(操作系统页缓存),当内存里的消息积累到一定程度时,再统一触发写入磁盘,这种刷盘方式,写操作返回快,吞吐量大,但可靠性降低,当消息还没有写入磁盘就宕机了,会产生消息的丢失;

(2)同步刷盘方式:
在返回写成功状态时,消息已经被写人磁盘,具体流程
是消息写入内存的PAGE CACHE后,立刻通知刷盘线程刷盘,然后等待刷盘完成,刷盘线程执行完成后唤醒等待的线程,返回消息写成功的状态;
同步刷盘和异步刷盘,是通过 Broker 配置文件里的 flushDiskType 参数
设置,该参数的值:SYNC_FLUSH,ASYNC_FLUSH;
【RocketMQ】第三篇-RocketMQ一主两从高可用集群_第3张图片

2、同步复制和异步复制

如果一个Broker组有Master和Slave, 消息需要从Master复制到 Slave,复制有同步和异步两种复制方式,同步复制方式是 Master和Slave均写入成功后才给客户端反馈成功;异步复制方式是只要 Master 写入成功即可给客户端反馈成功状态;
两种复制方式各有优劣,
在异步复制方式下,
系统拥有较低的延迟和较高的吞吐量,但如果Master出现故障,有些数据因为没有被写人Slave,有可能会丢失;

在同步复制方式下,
如果Master出故障,Slave上有全部的备份数据,不会丢失数据,但同步复制会增大数据写人延迟,降低系统吞吐量,同步复制和异步复制是通过 Broker 配置文件里的 brokerRole 参数进行设置,该参数可以被设置成 ASYNC_MASTER, SYNC_MASTER, SLAVE几个值中的一个;
实际应用中要结合业务场景,合理设置刷盘方式和主从复制方式,尤其是
SYNC_FLUSH 方式,由于频繁地触发磁盘写动作,会明显降低性能,通常情况下,应该把Master和Save置成ASYNC_FLUSH的刷盘方式,主从之间配置成 SYNC_MASTER 复制方式,这样即使有一台机器出故障,仍然能保证数据不丢,是个不错的选择;
可靠性和性能能直接需要根据业务场景进行权衡, RocketMQ 把选择权留给用户,用户根据具体的业务场景来选择要更高的可靠性,还是要更高的吞吐量;

你可能感兴趣的:(04_分布式专题,java-rocketmq,rocketmq,服务器)