rocketmq集群 二主二从异步模式
运行环境
- 准备两个 AnolisOs 系统
下载 rocketmq
- rocketmq 下载链接
- 下载文件:rocketmq-all-5.3.1-bin-release.zip
修改 broker 配置文件
cd rocketmq-all-5.3.1-bin-release/conf/2m-2s-async/
broker-a.properties 在服务器1上配置
vim broker-a.properties
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=192.168.8.138:9876;192.168.8.139:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/home/rocketMQ/a/store
#commitLog 存储路径
storePathCommitLog=/home/rocketMQ/a/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/home/rocketMQ/a/store/consumequeue
#消息索引存储路径
storePathIndex=/home/rocketMQ/a/store/index
#checkpoint 文件存储路径
storeCheckpoint=/home/rocketMQ/a/store/checkpoint
#abort 文件存储路径
abortFile=/home/rocketMQ/a/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
#syncSlave=true
broker-b-s.properties 在服务器1上配置
vim broker-b-s.properties
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=192.168.8.138:9876;192.168.8.139:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/home/rocketMQ/b-s/store
#commitLog 存储路径
storePathCommitLog=/home/rocketMQ/b-s/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/home/rocketMQ/b-s/store/consumequeue
#消息索引存储路径
storePathIndex=/home/rocketMQ/b-s/store/index
#checkpoint 文件存储路径
storeCheckpoint=/home/rocketMQ/b-s/store/checkpoint
#abort 文件存储路径
abortFile=/home/rocketMQ/b-s/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
broker-b.properties 在服务器2上配置
vim broker-b.properties
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=192.168.8.138:9876;192.168.8.139:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/home/rocketMQ/b/store
#commitLog 存储路径
storePathCommitLog=/home/rocketMQ/b/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/home/rocketMQ/b/store/consumequeue
#消息索引存储路径
storePathIndex=/home/rocketMQ/b/store/index
#checkpoint 文件存储路径
storeCheckpoint=/home/rocketMQ/b/store/checkpoint
#abort 文件存储路径
abortFile=/home/rocketMQ/b/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
#syncSlave=true
broker-a-s.properties 在服务器2上配置
vim broker-a-s.properties
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=192.168.8.138:9876;192.168.8.139:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/home/rocketMQ/a-s/store
#commitLog 存储路径
storePathCommitLog=/home/rocketMQ/a-s/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/home/rocketMQ/a-s/store/consumequeue
#消息索引存储路径
storePathIndex=/home/rocketMQ/a-s/store/index
#checkpoint 文件存储路径
storeCheckpoint=/home/rocketMQ/a-s/store/checkpoint
#abort 文件存储路径
abortFile=/home/rocketMQ/a-s/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
日志文件位置
日志文件位置:启动软件的用户的家目录。
- root用户的家目录是’/root’
修改脚本文件
- 修改文件一行内容,注释为原内容
- vim rocketmq-all-5.3.1-bin-release/bin/runbroker.sh
#JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m"
- 修改文件两行内容,注释为原内容,
- vim rocketmq-all-5.3.1-bin-release/bin/runserver.sh
#JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
#JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
配置环境变量
编辑 ~/.bashrc
或 /etc/profile
文件:
export ROCKETMQ_HOME=/root/rocketmq-all-5.3.1-bin-release
export PATH=$ROCKETMQ_HOME/bin:$PATH
刷新配置:
source ~/.bashrc
开放端口,在每台服务器进行
firewall-cmd --zone=public --list-ports
firewall-cmd --zone=public --add-port=9876/tcp --permanent
firewall-cmd --zone=public --add-port=10911/tcp --permanent
firewall-cmd --zone=public --add-port=11011/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports
创建消息存放路径
# 服务器1运行
mkdir -p /home/rocketMQ/{a,b-s}/store
# 服务器2运行
mkdir -p /home/rocketMQ/{a-s,b}/store
- 注意:
1、不能在store目录下,创建文件或目录。会导致broker启动失败,且日志文件找不到失败原因
启动 NameServer
# 分别在服务器1、服务器2运行
/root/rocketmq-all-5.3.1-bin-release/bin/mqnamesrv &
启动 broket 集群
#---------------------------------------
#在服务器1,启动master1和slave2
#master1:
mqbroker -c /root/rocketmq-all-5.3.1-bin-release/conf/2m-2s-async/broker-a.properties &
#slave2:
mqbroker -c /root/rocketmq-all-5.3.1-bin-release/conf/2m-2s-async/broker-b-s.properties &
#---------------------------------------
#在服务器2,启动master2和slave1
#master2:
mqbroker -c /root/rocketmq-all-5.3.1-bin-release/conf/2m-2s-async/broker-b.properties &
#slave1:
mqbroker -c /root/rocketmq-all-5.3.1-bin-release/conf/2m-2s-async/broker-a-s.properties &
查询集群状态
sh mqadmin clusterList -n 192.168.8.138:9876
rocketmq集群 生产者消费者测试
生产者消费者测试
#配置环境变量
export NAMESRV_ADDR='192.168.8.138:9876;192.168.8.139:98'
echo $NAMESRV_ADDR
#启动生产者
tools.sh org.apache.rocketmq.example.quickstart.Producer
#启动消费者
tools.sh org.apache.rocketmq.example.quickstart.Consumer
查询生产消费情况
#查询集群状态
sh mqadmin clusterList -n 127.0.0.1:9876
#查看集群更多信息[查询生产消费情况]
mqadmin clusterList -n 127.0.0.1:9876 -m
附录broker配置文件参数介绍
以下是 RocketMQ broker.conf
配置文件中各项参数的详细介绍和作用:
集群配置
-
brokerClusterName=rocketmq-cluster
- 作用:指定当前 Broker 所属的集群名称。
- 用途:用于区分集群内的 Broker,当多个集群共存时,NameServer 可以根据集群名区分服务。
- 建议:所有集群中的 Broker 使用相同的集群名。
-
brokerName=broker-a
- 作用:Broker 的逻辑名称。
- 用途:在一个集群中,不同的 Broker 实例需使用不同的
brokerName
,Master 和 Slave 通常共享同一个brokerName
。
-
brokerId=0
-
作用
:指定 Broker 的角色:
0
表示 Master。- 大于
0
表示 Slave(通常为1, 2, 3
)。
-
用途:Master 和 Slave 的区别在于数据同步方式。
-
-
namesrvAddr=192.168.8.138:9876;192.168.8.139:9876
- 作用:NameServer 的地址列表,多个地址用分号分隔。
- 用途:Broker 在启动时需要注册到 NameServer,NameServer 地址需保持可用。
Topic 和订阅配置
-
defaultTopicQueueNums=4
- 作用:在 Broker 上自动创建的 Topic 默认包含的队列数量。
- 用途:每个队列对应一个物理文件,用于分发消息。
- 建议:根据消息量调节队列数,避免过少影响吞吐,或过多占用磁盘。
-
autoCreateTopicEnable=true
-
作用:是否允许 Broker 自动创建 Topic。
-
建议
:
- 线下环境:可开启,方便测试。
- 线上环境:建议关闭,确保 Topic 的创建和管理由管理员控制。
-
-
autoCreateSubscriptionGroup=true
- 作用:是否允许自动创建订阅组(消费者组)。
- 建议:与
autoCreateTopicEnable
类似,线上建议关闭。
Broker 服务配置
-
listenPort=10911
- 作用:Broker 对外服务的监听端口。
- 默认值:
10911
。
-
brokerRole=ASYNC_MASTER
-
作用
:指定 Broker 的角色,支持以下三种角色:
ASYNC_MASTER
:异步复制的主节点(默认)。SYNC_MASTER
:同步双写的主节点,保证消息一致性。SLAVE
:从节点,用于消息备份。
-
建议
:
- 高可靠性场景:使用
SYNC_MASTER
。 - 一般场景:使用
ASYNC_MASTER
。
- 高可靠性场景:使用
-
-
flushDiskType=ASYNC_FLUSH
-
作用
:指定消息刷盘方式:
ASYNC_FLUSH
:异步刷盘,性能较高,但有数据丢失风险。SYNC_FLUSH
:同步刷盘,性能较低,但数据更可靠。
-
建议
:
- 高可靠性场景:使用
SYNC_FLUSH
。 - 高吞吐场景:使用
ASYNC_FLUSH
。
- 高可靠性场景:使用
-
存储配置
storePathRootDir=/home/rocketMQ/a/store
- 作用:指定 Broker 存储文件的根目录。
storePathCommitLog=/home/rocketMQ/a/store/commitlog
- 作用:CommitLog 的存储路径。
- 用途:CommitLog 是 RocketMQ 的核心文件,用于保存所有消息数据。
storePathConsumeQueue=/home/rocketMQ/a/store/consumequeue
- 作用:消费者队列文件的存储路径。
- 用途:保存每个 Topic 的消息队列信息,用于快速定位消息。
storePathIndex=/home/rocketMQ/a/store/index
- 作用:消息索引文件的存储路径。
- 用途:消息索引用于快速检索消息。
storeCheckpoint=/home/rocketMQ/a/store/checkpoint
- 作用:Checkpoint 文件存储路径。
- 用途:用于记录 Broker 的消费进度和存储进度,便于 Broker 重启后快速恢复。
abortFile=/home/rocketMQ/a/store/abort
- 作用:Abort 文件的存储路径。
- 用途:标记 Broker 是否异常关闭。
磁盘清理和容量管理
deleteWhen=04
- 作用:指定每天的文件删除时间,单位为 24 小时制(如
04
表示凌晨 4 点)。 - 用途:定时删除过期文件,释放磁盘空间。
- 作用:指定每天的文件删除时间,单位为 24 小时制(如
fileReservedTime=120
- 作用:文件保留时间,单位为小时。
- 用途:超过指定时间的文件将被标记为过期并删除。
- 默认值:
48
小时,当前配置为120
小时(5 天)。
mapedFileSizeCommitLog=1073741824
- 作用:CommitLog 单个文件的大小,默认 1 GB。
- 用途:决定物理文件切分的粒度。
- 建议:默认值通常足够,无需更改。
mapedFileSizeConsumeQueue=300000
- 作用:ConsumeQueue 单个文件包含的消息条数,默认
30 万
。 - 用途:根据消息量调整文件粒度。
- 作用:ConsumeQueue 单个文件包含的消息条数,默认
diskMaxUsedSpaceRatio=88
- 作用:磁盘使用率达到该比例时,Broker 停止写入新消息。
- 默认值:
88%
。
消息相关配置
maxMessageSize=65536
- 作用:限制单条消息的最大大小,单位为字节。
- 默认值:64 KB。
- 建议:如需发送更大消息,可以调整该值,但会影响性能。
线程池配置
sendMessageThreadPoolNums=128
- 作用:Broker 处理发送消息的线程池大小。
- 用途:高并发情况下需要调整此值,确保处理效率。
pullMessageThreadPoolNums=128
- 作用:Broker 处理拉取消息的线程池大小。
- 用途:根据消费者负载调整。
补充说明
-
调优建议
:
- 线上环境下,将
autoCreateTopicEnable
和autoCreateSubscriptionGroup
设置为false
。 - 确保磁盘容量足够,合理调整
fileReservedTime
和diskMaxUsedSpaceRatio
。 - 根据吞吐量需求,调整
sendMessageThreadPoolNums
和pullMessageThreadPoolNums
。
- 线上环境下,将
如需进一步优化配置或解决问题,请提供更多使用场景和需求信息!