分布式-MQ-04 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.128worker1
192.168.149.129worker2
#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节点部署
worker1nameserverbroker-a,broker-b-s[主从]
worker2nameserverbroker-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失败。关掉防火墙后,注册成功。
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧梦昂志

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值