RocketMQ单机、集群及管理台搭建
调试操作命令速记:
#启动nameserver服务[类似于启动kafka注册中心]
nohup sh bin/mqnamesrv &
tail -f ~/logs/rocketmqlogs/namesrv.log
#worker1注册主从broker (cd bin目录执行)
nohup ./mqbroker -c ../conf/2m-2s-async/broker-a.properties &
nohup ./mqbroker -c ../conf/2m-2s-async/broker-b-s.properties &
tail -f ~/logs/rocketmqlogs/broker.log
#worker2注册主从broker
nohup ./mqbroker -c ../conf/2m-2s-async/broker-b.properties &
nohup ./mqbroker -c ../conf/2m-2s-async/broker-a-s.properties &
tail -f ~/logs/rocketmqlogs/broker.log
一、RocketMQ单机
RocketMQ官网:
https://rocketmq.apache.org/docs/quick-start/
安装包地址:
https://archive.apache.org/dist/rocketmq/4.9.2/rocketmq-all-4.9.2-bin-release.zip
1.1 环境准备
#1)查看linux服务器操作系统
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-1160.53.1.el7.x86_64 #1 SMP Fri Jan 14 13:59:45 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
#2)创建业务用于安装及启动于root权限
[root@localhost ~]# useradd contentuser
[root@localhost ~]# passwd contentuser
Changing password for user contentuser
passwd: all authentication tokens updated successfully.
#3)创建中间件目录文件夹修改文件权限(学习测试暂时不规范了,就用root吧)
[root@localhost huawei]# mkdir rocketmq
[root@localhost huawei]# chown contentuser:contentuser rocketmq
#4)准备java环境,安装jdk(jdk之前已经root权限安装过了,后续操作统一用root)
#5) 准备rocketmq安装包(此处准备目前apache最新稳定版4.9.2)
#https://archive.apache.org/dist/rocketmq/4.9.2/rocketmq-all-4.9.2-bin-release.zip
1.2 单机服务安装
避坑提醒:修改完系统环境变量后,一定要source ~/.bash_profile,否则会报错
#6)将zip包解压后上传至环境
#7)将rocketmq的bin目录配置环境变量中
[contentuser@localhost rocketmq]$ vi ~/.bash_profile
PATH=$ROCKETMQ_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin
export ROCKET_HOME=/opt/huawei/rocketmq/bin
Export PATH
:wq!
[contentuser@localhost rocketmq]$ source ~/.bash_profile
#8)修改启动配置,将java虚拟机内存调小
[root@localhost bin]# vi runserver.sh
#原值:
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
#修改后:(-Xmx:最大可用内存、-Xms:初始内存、-Xmn:年轻代大小)
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
1.3 单机服务启动
#9)mqnamesrv 和nohup.out 需要调高文件执行权限
[root@localhost bin]# chmod 777 mqnamesrv
#10)启动NameServer
nohup bin/mqnamesrv &
#启动成功日志:
OpenJDK 64-Bit Server VM warning: Using the DefNew young collector with the CMS collector is deprecated and will likely be removed in a future release
OpenJDK 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
The Name Server boot success. serializeType=JSON
插曲:因为修改runserver.sh时,将最大元空间的值320m,丢了m改成了320,所以2次启动都因为初始化元空间不足,启动失败。
#11)启动Broker
[root@localhost bin]# vi runbroker.sh
#原值: JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"
#修改后:JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"
[root@localhost conf]# vi broker.conf
autoCreateTopicEnable=true #开启自动创建topic
#mqbroker文件赋权777
[root@localhost bin]# chmod 777 mqbroker
[root@localhost bin]# nohup ./bin/mqbroker &
[root@localhost bin]# cat nohup.out [broker启动成功]
The broker[localhost.localdomain, 192.168.149.128:10911] boot success. serializeType=JSON
1.4 快速验证发送接收消息
官网中给出了快速开始的使用方式
https://rocketmq.apache.org/docs/quick-start/
-
Start Name Server
> nohup sh bin/mqnamesrv & > tail -f ~/logs/rocketmqlogs/namesrv.log The Name Server boot success...
-
Start Broker
> nohup sh bin/mqbroker -n localhost:9876 & > tail -f ~/logs/rocketmqlogs/broker.log The broker[%s, 172.30.30.233:10911] boot success...
-
Send & Receive Messages
> export NAMESRV_ADDR=localhost:9876 > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer SendResult [sendStatus=SEND_OK, msgId= ... > sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer ConsumeMessageThread_%d Receive New Messages: [MessageExt...
1.5 服务关闭
\# 1.关闭NameServer
[root@worker2 rocketmq]# sh bin/mqshutdown namesrv
The mqnamesrv(8259) is running...
Send shutdown request to mqnamesrv(8259) OK
\# 2.关闭Broker
[root@worker2 rocketmq]# sh bin/mqshutdown broker
The mqbroker(8295) is running...
Send shutdown request to mqbroker(8295) OK
[1]- 退出 143 nohup bin/mqnamesrv
二、RocketMQ集群安装
2.1 集群环境准备
#1)修改主机名称( 本文用的是centos7)
[root@localhost ~]# hostnamectl set-hostname worker1
[root@localhost ~]# reboot 重启
[root@worker1 ~]#
完成2台虚拟机搭建,并成功安装NameServer、Broker
虚拟机IP | 主机名 |
---|---|
192.168.149.128 | worker1 |
192.168.149.129 | worker2 |
#2)安装ssh-kengen 在worker1记上生成rsa密钥文件
[root@worker1 ~]# ssh-keygen -t rsa
#默认保存在:/root/.ssh/id_rsa
#将密钥信息发送到worker2
[root@worker1 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.149.129
#效果输入密码后,即可远程登陆另一台
ssh 192.168.149.129
关闭防火墙,rocketmq集群间由其他端口调用
[root@worker1 ~]# systemctl stop firewalld.service
[root@worker1 ~]# firewall-cmd --state
2.2 配置集群
2.2.1 集群配置基本信息
机器名 | nemaeServer节点部署 | broker节点部署 |
---|---|---|
worker1 | nameserver | broker-a,broker-b-s[主从] |
worker2 | nameserver | broker-a,broker-b-s[主从] |
rocketmq由多种集群部署方式:
- 2m-2s-async: 2主2从异步刷盘(吞吐量较大,但是消息可能丢失)
- 2m-2s-sync:2主2从同步刷盘(吞吐量会下降,但是消息更安全)
- 2m-noslave:2主无从(单点故障),然后还可以直接配置broker.conf,进行单点环境配置
- dleger就是用来实现主从切换的。集群中的节点会基于Raft协议随机选举出一个leader,其他的就都是follower。通常正式环境都会采用这种方式来搭建集群。
2.2.2 配置broker.properties
本文采用2主2从异步刷盘的方式构建集群。
worker1配置:
2m-2s-async/broker-a.properties
2m-2s-async/broker-b-s.properties
worker2配置:
2m-2s-async/broker-a-s.properties
2m-2s-async/broker-b.properties
-
worker1中/conf/2m-2s-async/broker-a.properties
#所属集群名字,名字一样的节点就在同一个集群内 brokerClusterName=DefaultCluster #broker名字,名字一样的节点就是一组主从节点。 brokerName=broker-a #brokerid,0就表示是Master,>0的都是表示 Slave brokerId=0 #nameServer地址,分号分割 namesrvAddr=192.168.149.128:9876;192.168.149.129:9876; #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数 defaultTopicQueueNums=4 #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭 autoCreateTopicEnable=true #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=true #Broker 对外服务的监听端口 listenPort=10911 #删除文件时间点,默认凌晨 4点 deleteWhen=04 #文件保留时间,默认 48 小时 fileReservedTime=48 #commitLog每个文件的大小默认1G mapedFileSizeCommitLog=1073741824 #ConsumeQueue每个文件默认存30W条,根据业务情 mapedFileSizeConsumeQueue=300000 #destroyMapedFileIntervalForcibly=120000 #redeleteHangedFileInterval=120000 #检测物理文件磁盘空间 diskMaxUsedSpaceRatio=88 #存储路径 storePathRootDir=/opt/xxx/rocketmq/storemaster #commitLog 存储路径 storePathCommitLog=/opt/xxx/rocketmq/storemaster/commitlog #消费队列存储路径存储路径 storePathConsumeQueue=/opt/xxx/rocketmq/storemaster/consumequeue #消息索引存储路径 storePathIndex=/opt/xxx/rocketmq/storemaster/index #checkpoint 文件存储路径 storeCheckpoint=/opt/xxx/rocketmq/storemaster/checkpoint #abort 文件存储路径 abortFile=/opt/xxx/rocketmq/storemaster/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
-
worker1中/conf/2m-2s-async/broker-b-s.properties
#所属集群名字,名字一样的节点就在同一个集群内 brokerClusterName=DefaultCluster #broker名字,名字一样的节点就是一组主从节点 brokerName=broker-b #brokerid,0就表示是Master,>0的都是表示 Slave brokerId=1 #nameServer地址,分号分割 namesrvAddr=192.168.149.128:9876;192.168.149.129:9876; #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数 defaultTopicQueueNums=4 #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭 autoCreateTopicEnable=true #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=true #Broker 对外服务的监听端口 listenPort=11911 #删除文件时间点,默认凌晨 4点 deleteWhen=04 #文件保留时间,默认 48 小时 fileReservedTime=48 #commitLog每个文件的大小默认1G mapedFileSizeCommitLog=1073741824 #ConsumeQueue每个文件默认存30W条,根据业务情 mapedFileSizeConsumeQueue=300000 #destroyMapedFileIntervalForcibly=120000 #redeleteHangedFileInterval=120000 #检测物理文件磁盘空间 diskMaxUsedSpaceRatio=88 #存储路径 storePathRootDir=/opt/xxx/rocketmq/storeslave #commitLog 存储路径 storePathCommitLog=/opt/xxx/rocketmq/storeslave/commitlog #消费队列存储路径存储路径 storePathConsumeQueue=/opt/xxx/rocketmq/storeslave/consumequeue #消息索引存储路径 storePathIndex=/opt/xxx/rocketmq/storeslave/index #checkpoint 文件存储路径 storeCheckpoint=/opt/xxx/rocketmq/storeslave/checkpoint #abort 文件存储路径 abortFile=/opt/xxx/rocketmq/storeslave/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
-
worker2中/conf/2m-2s-async/broker-b.properties
#所属集群名字,名字一样的节点就在同一个集群内 brokerClusterName=DefaultCluster #broker名字,名字一样的节点就是一组主从节点。 brokerName=broker-b #brokerid,0就表示是Master,>0的都是表示 Slave brokerId=0 #nameServer地址,分号分割 namesrvAddr=192.168.149.128:9876;192.168.149.129:9876; #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数 defaultTopicQueueNums=4 #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭 autoCreateTopicEnable=true #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=true #Broker 对外服务的监听端口 listenPort=10911 #删除文件时间点,默认凌晨 4点 deleteWhen=04 #文件保留时间,默认 48 小时 fileReservedTime=48 #commitLog每个文件的大小默认1G mapedFileSizeCommitLog=1073741824 #ConsumeQueue每个文件默认存30W条,根据业务情 mapedFileSizeConsumeQueue=300000 #destroyMapedFileIntervalForcibly=120000 #redeleteHangedFileInterval=120000 #检测物理文件磁盘空间 diskMaxUsedSpaceRatio=88 #存储路径 storePathRootDir=/opt/xxx/rocketmq/storemaster #commitLog 存储路径 storePathCommitLog=/opt/xxx/rocketmq/storemaster/commitlog #消费队列存储路径存储路径 storePathConsumeQueue=/opt/xxx/rocketmq/storemaster/consumequeue #消息索引存储路径 storePathIndex=/opt/xxx/rocketmq/storemaster/index #checkpoint 文件存储路径 storeCheckpoint=/opt/xxx/rocketmq/storemaster/checkpoint #abort 文件存储路径 abortFile=/opt/xxx/rocketmq/storemaster/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
-
worker2中/conf/2m-2s-async/broker-a-s.properties
#所属集群名字,名字一样的节点就在同一个集群内 brokerClusterName=DefaultCluster #broker名字,名字一样的节点就是一组主从节点 brokerName=broker-a #brokerid,0就表示是Master,>0的都是表示 Slave brokerId=1 #nameServer地址,分号分割 namesrvAddr=192.168.149.128:9876;192.168.149.129:9876; #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数 defaultTopicQueueNums=4 #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭 autoCreateTopicEnable=true #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=true #Broker 对外服务的监听端口 listenPort=11911 #删除文件时间点,默认凌晨 4点 deleteWhen=04 #文件保留时间,默认 48 小时 fileReservedTime=48 #commitLog每个文件的大小默认1G mapedFileSizeCommitLog=1073741824 #ConsumeQueue每个文件默认存30W条,根据业务情 mapedFileSizeConsumeQueue=300000 #destroyMapedFileIntervalForcibly=120000 #redeleteHangedFileInterval=120000 #检测物理文件磁盘空间 diskMaxUsedSpaceRatio=88 #存储路径 storePathRootDir=/opt/xxx/rocketmq/storeslave #commitLog 存储路径 storePathCommitLog=/opt/xxx/rocketmq/storeslave/commitlog #消费队列存储路径存储路径 storePathConsumeQueue=/opt/xxx/rocketmq/storeslave/consumequeue #消息索引存储路径 storePathIndex=/opt/xxx/rocketmq/storeslave/index #checkpoint 文件存储路径 storeCheckpoint=/opt/xxx/rocketmq/storeslave/checkpoint #abort 文件存储路径 abortFile=/opt/xxx/rocketmq/storeslave/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时,需要区别提供对外服务的监听端口
- 当Broker配置为主从时,需要区别brokerId,>0表示slave
2.2.3 启动集群
-
启动nameserver
nohup sh bin/mqnamesrv & tail -f ~/logs/rocketmqlogs/namesrv.log
-
启动broker
worker1:nohup ./mqbroker -c ../conf/2m-2s-async/broker-a.properties & nohup ./mqbroker -c ../conf/2m-2s-async/broker-b-s.properties & tail -f ~/logs/rocketmqlogs/broker.log
worker2:
nohup ./mqbroker -c ../conf/2m-2s-async/broker-b.properties & nohup ./mqbroker -c ../conf/2m-2s-async/broker-a-s.properties & tail -f ~/logs/rocketmqlogs/broker.log
-
关闭broker
二、RocketMQ管理台搭建
rocketmq-console当前master分支中,console服务已经不在rocketmq-externals下,服务移动至下面dashboard中。dashboard为springboot项目。
https://github.com/apache/rocketmq-dashboard/
-
修改启动端口号(默认8080群的namesrvAddrs(nameserver地址)
-
通过maven打出jar包上传至服务器,并执行运行命令
cd /opt/xxx/console/rocketmq java -jar rocketmq-dashboard-1.0.1-SNAPSHOT.jar
- 浏览器打开管理台
http://192.168.149.128:8888/#/
三、异常汇总
3.1 Failed to obtain the host name
[无法识别主机,需要将主机名写入/etc/hosts]
22:49:16.231 [main] ERROR RocketmqCommon - Failed to obtain the host name
java.net.UnknownHostException: worker2: worker2: 未知的名称或服务
at java.net.InetAddress.getLocalHost(InetAddress.java:1506) ~[na:1.8.0_322]
at org.apache.rocketmq.common.BrokerConfig.localHostName(BrokerConfig.java:192) [rocketmq-common-4.9.2.jar:4.9.2]
at org.apache.rocketmq.common.BrokerConfig.<init>(BrokerConfig.java:39) [rocketmq-common-4.9.2.jar:4.9.2]
at org.apache.rocketmq.broker.BrokerStartup.createBrokerController(BrokerStartup.java:110) [rocketmq-broker-4.9.2.jar:4.9.2]
at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:58) [rocketmq-broker-4.9.2.jar:4.9.2]
Caused by: java.net.UnknownHostException: worker2: 未知的名称或服务
at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ~[na:1.8.0_322]
at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:929) ~[na:1.8.0_322]
at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1324) ~[na:1.8.0_322]
at java.net.InetAddress.getLocalHost(InetAddress.java:1501) ~[na:1.8.0_322]
... 4 common frames omitted
The broker[DEFAULT_BROKER, 192.168.149.129:10911] boot success. serializeType=JSON
3.2 服务已启动,无法重复启动
3.3 网络打通[生产环境打通ACL,测试关掉防火墙]
本机192.168.149.128,尝试注册192.168.149.129broker失败。关掉防火墙后,注册成功。