目标, 使用 2 台机器部署 RocketMQ 多 Master 多 Slave 模式, 异步复制集群模式.
第一步, 修改 / etc/hosts 文件
- 192.168.116.115 rocketmq1
- 192.168.116.116 rocketmq2
集群机器配置完成之后, 集群内进行 ping 一下, 确保都通.
编译得到环境
- git clone -b develop https://github.com/apache/rocketmq.git
- cd rocketmq
- mvn -Prelease-all -DskipTests clean install -U
- cd distribution/target/apache-rocketmq
本版本是基于 4.1.0 的, 之后 apache-rocketmq_4.1.0.tar.gz 拷贝集群所有机器进行解压
tar -zxvf apache-rocketmq_4.1.0.tar.gz
配置集群模式 [多 Master 多 Slave 模式, 异步复制]
配置的目录说明:
2m-noslave: 多 Master 模式
2m-2s-sync: 多 Master 多 Slave 模式, 同步双写
2m-2s-async: 多 Master 多 Slave 模式, 异步复制
配置项一个主的配置
- # 所属集群名字
- brokerClusterName=rocketmq-cluster
- #broker 名字, 注意此处不同的配置文件填写的不一样
- brokerName=broker-a
- #0 表示 Master,>0 表示 Slave
- brokerId=0
- #nameServer 地址, 分号分割
- namesrvAddr=rocketmq1:9876;rocketmq2:9876
- # 在发送消息时, 自动创建服务器不存在的 topic, 默认创建的队列数
- defaultTopicQueueNums=4
- # 是否允许 Broker 自动创建 Topic, 建议线下开启, 线上关闭
- autoCreateTopicEnable=true
- # 是否允许 Broker 自动创建订阅组, 建议线下开启, 线上关闭
- autoCreateSubscriptionGroup=true
- #Broker 对外服务的监听端口
- listenPort=10911
- # 删除文件时间点, 默认凌晨 4 点
- deleteWhen=04
- # 文件保留时间, 默认 72 小时
- fileReservedTime=120
- #commitLog 每个文件的大小默认 1G
- mapedFileSizeCommitLog=1073741824
- #ConsumeQueue 每个文件默认存 30W 条, 根据业务情况调整
- mapedFileSizeConsumeQueue=300000
- #destroyMapedFileIntervalForcibly=120000
- #redeleteHangedFileInterval=120000
- # 检测物理文件磁盘空间
- diskMaxUsedSpaceRatio=75
- # 存储路径
- storePathRootDir=/appl/rocketmq/store
- #commitLog 存储路径
- storePathCommitLog=/appl/rocketmq/store/commitlog
- # 消费队列存储路径存储路径
- storePathConsumeQueue=/appl/rocketmq/store/consumequeue
- # 消息索引存储路径
- storePathIndex=/appl/rocketmq/store/index
- #checkpoint 文件存储路径
- storeCheckpoint=/appl/rocketmq/store/checkpoint
- #abort 文件存储路径
- abortFile=/appl/rocketmq/store/abort
- # 限制的消息大小 默认 4M
- #maxMessageSize=4194304
- #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
配置项另外一个备的配置
- # 所属集群名字
- brokerClusterName=rocketmq-cluster
- #broker 名字, 注意此处不同的配置文件填写的不一样
- brokerName=broker-b
- #0 表示 Master,>0 表示 Slave
- brokerId=1
- #nameServer 地址, 分号分割
- namesrvAddr=rocketmq1:9876;rocketmq2:9876
- # 在发送消息时, 自动创建服务器不存在的 topic, 默认创建的队列数
- defaultTopicQueueNums=4
- # 是否允许 Broker 自动创建 Topic, 建议线下开启, 线上关闭
- autoCreateTopicEnable=true
- # 是否允许 Broker 自动创建订阅组, 建议线下开启, 线上关闭
- autoCreateSubscriptionGroup=true
- #Broker 对外服务的监听端口
- listenPort=11911
- # 删除文件时间点, 默认凌晨 4 点
- deleteWhen=04
- # 文件保留时间, 默认 72 小时
- fileReservedTime=120
- #commitLog 每个文件的大小默认 1G
- mapedFileSizeCommitLog=1073741824
- #ConsumeQueue 每个文件默认存 30W 条, 根据业务情况调整
- mapedFileSizeConsumeQueue=300000
- #destroyMapedFileIntervalForcibly=120000
- #redeleteHangedFileInterval=120000
- # 检测物理文件磁盘空间
- diskMaxUsedSpaceRatio=75
- # 存储路径
- storePathRootDir=/appl/rocketmq-s/store
- #commitLog 存储路径
- storePathCommitLog=/appl/rocketmq-s/store/commitlog
- # 消费队列存储路径存储路径
- storePathConsumeQueue=/appl/rocketmq-s/store/consumequeue
- # 消息索引存储路径
- storePathIndex=/appl/rocketmq-s/store/index
- #checkpoint 文件存储路径
- storeCheckpoint=/appl/rocketmq-s/store/checkpoint
- #abort 文件存储路径
- abortFile=/appl/rocketmq-s/store/abort
- # 限制的消息大小 默认 4M
- #maxMessageSize=4194304
- #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
备注: 由于一台机器不是主备, 所以主, 备的端口和存储路径会不同, 如果多台机器部署不可以保持一样了, 主备主要区别在于 brokerId,brokerRole 配置区别.
注意到 logback.*.xml 配置文件中 ${user.home} 需要替换自己指定的目录
可以使用 sed 进行替换:
- sed -i 's#${user.home}#/appl/rocketmq#g' *.xml
- # sed -i 's#${user.home}#/appl/rocketmq-s#g' *.xml 由于一台机器部署了 2 个结点
修改启动脚本中的 JVM 参数
由于 RocketMQ4.1.0 官方建议使用 64bit JDK 1.8+; 比如查看 runserver.sh 文件 jvm 参数如下:
-server -Xms4g -Xmx4g -Xmn2g -XX:PermSize=128m -XX:MaxPermSize=320m
需要特别说明下: 元数据空间, 专门用来存元数据的, 它是 jdk8 以后用来替代 perm 的.
JVM 堆空间大小根据机器情况进行调整, 如果测试机器内存太小需要调整, 不然启动不了, 比如修改为如下
-Xms1G -Xmx1G -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
可以使用 sed 进行替换, 把所有 PermSize,MaxPermSize 替换掉:
- sed -i 's#PermSize#MetaspaceSize#g' *
- sed -i 's#MaxPermSize#MaxMetaspaceSize#g' *
runbroker.sh 里面的 jvm:
-Xms8g -Xmx8g -Xmn4g
根据自己情况进行修改.
个人建议对于 RocketMQ 默认的 jvm 参数除了堆大小其他的先不要调整, 后续通过观察分析之后看看是否有必要进行其他参数的调整等, 欢迎阅读本人 JVM 菜鸟进阶高手之路系列文章.
其实我有有疑惑, 在 broker 的 jvm 参数:
- JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"
- JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m
- -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30
- -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8 -XX:+DisableExplicitGC"JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:/dev/shm/mq_gc_%p.log
- -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime
- -XX:+PrintAdaptiveSizePolicy"JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5
- -XX:GCLogFileSize=30m"JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow"JAVA_OPT="${JAVA_OPT} -XX:+AlwaysPreTouch"JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=15g"JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages -XX:-UseBiasedLocking"JAVA_OPT="${JAVA_OPT} -Djava.ext.dirs=${BASE_DIR}/lib"JAVA_OPT="${JAVA_OPT} ${JAVA_OPT_EXT}"JAVA_OPT="${JAVA_OPT} -cp ${CLASSPATH}"
-XX:+DisableExplicitGC,-XX:MaxDirectMemorySize=15g, 但是当达到阀值之后会调用 System.gc 来做一次 full gc, 关键 System.gc 都被禁止了. 希望那位大佬知道, 在留言区说明下, 谢谢.
启动服务
记住先启动 NameServer, 再启动 Broker, 关闭的时候恰好想法, 先关闭 Broker 再关闭 NameServer.
启动 NameServer:
- nohup sh /appl/apache-rocketmq/bin/mqnamesrv &
- tail -f /appl/rocketmq-s/logs/rocketmqlogs/namesrv.log
- #tail -f /appl/rocketmq/logs/rocketmqlogs/namesrv.log
- INFO main - The Name Server boot success. serializeType=JSON
备注: 由于 namesrv 的端口是写死在代码里面的, 所以一台机器启动一个 namesrv 即可.
启动 Broker:
rocketmq1 机器:
- nohup sh /appl/apache-rocketmq/bin/mqbroker -c /appl/apache-rocketmq/conf/2m-2s-async/broker-a.properties>/dev/null 2>&1 &
- nohup sh /appl/apache-rocketmq-s/bin/mqbroker -c /appl/apache-rocketmq-s/conf/2m-2s-async/broker-b-s.properties>/dev/null 2>&1 &
rocketmq2 机器:
- nohup sh /appl/apache-rocketmq/bin/mqbroker -c /appl/apache-rocketmq/conf/2m-2s-async/broker-b.properties>/dev/null 2>&1 &
- nohup sh /appl/apache-rocketmq-s/bin/mqbroker -c /appl/apache-rocketmq-s/conf/2m-2s-async/broker-a-s.properties>/dev/null 2>&1 &
- tail -f /appl/rocketmq/logs/rocketmqlogs/broker.log
- ......
- INFO main - The broker[broker-a, 192.168.116.116:10911] boot success. serializeType=JSON and name server is rocketmq1:9876;rocketmq2:9876
- ......
- tail -f /appl/rocketmq/logs/rocketmqlogs/namesrv.log
- ......
- new broker registerd, 192.168.116.116:11911 HAServer: 192.168.116.116:11912
- ......
- new broker registerd, 192.168.116.115:11911 HAServer: 192.168.116.115:11912
- ......
关闭服务:
- sh bin/mqshutdown broker
- sh bin/mqshutdown namesrv
到目前位置, 关于 RocketMQ 的集群环境部署就结束了, 未完待续......
如果读完觉得有收获的话, 欢迎点赞加关注.
来源: https://juejin.im/entry/5b3afca8f265da0f6825a644