rocketMQ集群模式
1.单节点 :
优点:本地开发测试,配置简单,同步刷盘消息一条都不会丢
缺点:不可靠,如果宕机,会导致服务不可用
2.主从(异步、同步双写) :
优点:同步双写消息不丢失, 异步复制存在少量丢失 ,主节点宕机,从节点可以对外提供消息的消费,但是不支持写入
缺点:主备有短暂消息延迟,毫秒级,目前不支持自动切换,需要脚本或者其他程序进行检测然后进行停止broker,重启让从节点成为主节点
3.双主:
优点:配置简单, 可以靠配置RAID磁盘阵列保证消息可靠,异步刷盘丢失少量消息
缺点: master机器宕机期间,未被消费的消息在机器恢复之前不可消费,实时性会受到影响
4.双主双从,多主多从模式(异步复制)
优点:磁盘损坏,消息丢失的非常少,消息实时性不会受影响,Master 宕机后,消费者仍然可以从Slave消费
缺点:主备有短暂消息延迟,毫秒级,如果Master宕机,磁盘损坏情况,会丢失少量消息
5.双主双从,多主多从模式(同步双写)
优点:同步双写方式,主备都写成功,向应用才返回成功,服务可用性与数据可用性都非常高
缺点:性能比异步复制模式略低,主宕机后,备机不能自动切换为主机
消息可靠性
当然我这里讲的是很简单的,深入的自己去了解哦
可靠性一定包含准确却性,稳定性, 数据不丢失或极少丢失,毕竟没有百分之百的可靠性
消息同步,异步刷盘:
什么是刷盘: 就是从内存中将数据写入磁盘中
rocketMQ配置中有两种刷盘方式:
异步刷盘
flushDiskType=ASYNC_FLUSH
数据可能丢失,但是性能高, 再消息过来的同时拉取消息推送,和刷盘是同时进行的
同步刷盘
flushDiskType=SYNC_FLUSH
数据安全性高,先将数据刷入磁盘中,再推送消息,即使宕机,消息也还是存在的
消息同步,异步复制
Master - Slave 主从节点里面,消息的一致性;
异步复制:性能高,数据相对不可靠
同步复制:数据安全性高,性能相对略低
so 推荐这种方式:同步双写(即M-S同步复制),异步刷盘
集群配置:
首先两台主机都安装了jdk1.8,maven,最好是linux系统或者unix系统
按照我的上一篇rocket安装好rocket
加入你安装好了哈:
我的机器列表
192.168.1.101
192.168.1.102
都切换到2m-2s-async该目录,看着目录就知道意思了 双主双从异步刷盘
/usr/local/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/conf/2m-2s-async
主:
编辑文件
vi broker-a.properties
#集群地址,多个以分号隔开
namesrvAddr=192.168.1.101:9876;192.168.1.102:9876
brokerClusterName=hc_pay_Cluster
brokerName=broker-a
brokerId=0
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
#brokerIP1本机broker所监听的的通讯地址
brokerIP1=192.168.1.101
#存在broker主从时,在broker主节点上配置了brokerIP2的话,broker从节点会连接主节点配置的brokerIP2来同步
brokerIP2=192.168.1.101
从
编辑文件
vi broker-a-s.properties
namesrvAddr=192.168.1.101:9876;192.168.1.102:9876
brokerClusterName=hc_pay_Cluster
brokerName=broker-a
brokerId=1
deleteWhen=04
fileReservedTime=48
brokerRole=SLAVE
flushDiskType=ASYNC_FLUSH
brokerIP1=192.168.1.102
切换到apache-rocketmq该目录
/usr/local/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/
启动nameserver mqserver启动命令都是一样的
nohup sh bin/mqnamesrv &
broker启动
主:
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a.properties &
从:
nohup sh bin/mqbroker -c conf/2m-2s-async/broker-a-s.properties &
差不都完了,就这么简单,当然更多更细的配置我也不大清楚,毕竟我不是运维
控制台
修改配置文件
application.properties
在该目录下rocketmq-console
编译:
mvn install -Dmaven.test.skip=true
启动
java -jar rocketmq-console-ng-1.0.0.jar
最终控制台如下:
RocketMQ主从同步必备知识点
Broker分为master与slave,一个master可以对应多个Slave,但一个slave只能对应一个master,master与slave通过相同的Broker Name来匹配,不同的broker Id来定义是master还是slave
Broker向所有的NameServer结点建立长连接,定时注册Topic和发送元数据信息
NameServer定时扫描(默认2分钟)所有存活broker的连接, 如果超过时间没响应则断开连接(心跳检测),但是consumer客户端不能感知,consumer定时(30s)从NameServer获取topic的最新信息,所以broker不可用时,consumer最多最需要30s才能发现
(Producer的机制一样,在未发现broker宕机前发送的消息会失败)
只有master才能进行写入操作,slave不允许写入只能同步,同步策略取决于master的配置。
客户端消费可以从master和slave消费,默认消费者都从master消费,如果在master挂后,客户端从NameServer中感知到Broker宕机,就会从slave消费, 感知非实时,存在一定的滞后性,slave不能保证master的消息100%都同步过来了,会有少量的消息丢失。但一旦master恢复,未同步过去的消息会被最终消费掉
如果consumer实例的数量比message queue的总数量还多的话,多出来的consumer实例将无法分到queue,也就无法消费到消息,也就无法起到分摊负载的作用,所以需要控制让queue的总数量大于等于consumer的数量
消息队列RocketMQ4.X核心配置讲解
生产者常见核心配置
compressMsgBodyOverHowmuch :消息超过默认字节4096后进行压缩
retryTimesWhenSendFailed : 失败重发次数
maxMessageSize : 最大消息配置,默认128k
topicQueueNums : 主题下面的队列数量,默认是4
autoCreateTopicEnable : 是否自动创建主题Topic, 开发建议为true,生产要为false
defaultTopicQueueNums : 自动创建服务器不存在的topic,默认创建的队列数
autoCreateSubscriptionGroup: 是否允许 Broker 自动创建订阅组,建议线下开发开启,线上关闭
brokerClusterName : 集群名称
brokerId : 0表示Master主节点 大于0表示从节点
brokerIP1 : Broker服务地址
brokerRole : broker角色 ASYNC_MASTER/ SYNC_MASTER/ SLAVE
deleteWhen : 每天执行删除过期文件的时间,默认每天凌晨4点
flushDiskType :刷盘策略, 默认为 ASYNC_FLUSH(异步刷盘), 另外是SYNC_FLUSH(同步刷盘)
listenPort : Broker监听的端口号
mapedFileSizeCommitLog : 单个conmmitlog文件大小,默认是1GB
mapedFileSizeConsumeQueue:ConsumeQueue每个文件默认存30W条,可以根据项目调整
storePathRootDir : 存储消息以及一些配置信息的根目录 默认为用户的 ${HOME}/store
storePathCommitLog:commitlog存储目录默认为${storePathRootDir}/commitlog
storePathIndex: 消息索引存储路径
syncFlushTimeout : 同步刷盘超时时间
diskMaxUsedSpaceRatio : 检测可用的磁盘空间大小,超过后会写入报错
其他配置可以去官方文档查找
Broker消息投递状态
FLUSH_DISK_TIMEOUT:
没有在规定时间内完成刷盘 (刷盘策略需要为SYNC_FLUSH 才会出这个错误)
FLUSH_SLAVE_TIMEOUT:
主从模式下,broker是SYNC_MASTER, 没有在规定时间内完成主从同步
SLAVE_NOT_AVAILABLE:
从模式下,broker是SYNC_MASTER, 但是没有找到被配置成Slave的Broker
SEND_OK:
发送成功,没有发生上面的三种问题
这里我们模拟一下SLAVE_NOT_AVAILABLE吧,其他的还真不好模拟
首先修改主节点配置文件
/usr/local/rocketmq-all-4.4.0/distribution/target/apache-rocketmq/conf/2m-2s-async/
vi broker-a.properties
重新启动broker
然后关掉从节点的brocker
访问你的项目发送消息