Apache RocketMQ5.x 介绍及单机&双主双从部署

Apache RocketMQ 官网:https://rocketmq.apache.org/zh/

1.安装

RocketMQ 的安装包分为两种,二进制包和源码包。 点击这里 下载 Apache RocketMQ 5.1.4的源码包。你也可以从这里 下载到二进制包。二进制包是已经编译完成后可以直接运行的,源码包是需要编译后运行的。

1、下载解压

# rocketmq-all-5.1.4-bin-release.zip
# 将下载的压缩包上传到/data/service/rocketmq
[admin@test-webapp-svr20 ~]$ cd /data/service/rocketmq

# 解压
[admin@test-webapp-svr20 rocketmq]$ unzip rocketmq-all-5.1.4-bin-release.zip
[admin@test-webapp-svr20 rocketmq]$ ll
total 86056
drwxr-xr-x 6 admin grpadmin     4096 Jan 23 10:39 rocketmq-all-5.1.4-bin-release
-rw-r--r-- 1 admin grpadmin 88109546 Jan 23 10:35 rocketmq-all-5.1.4-bin-release.zip

2、配置环境变量

# 打开环境变量
[admin@test-webapp-svr20 rocketmq] vi /etc/profile

# 添加以下内容
export ROCKETMQ_HOME=/data/service/rocketmq/rocketmq-all-5.1.4-bin-release
export PATH=$ROCKETMQ_HOME/bin:$PATH

# 保存并退出
:wq

# 刷新环境变量
source /etc/profile

3、修改配置文件,根据实际服务器修改,以下配置不为实际生产配置

# 修改内存相关配置
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
[admin@test-webapp-svr20 bin] vim runbroker.sh
# 修改 JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g" 改为512m
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m"

[admin@test-webapp-svr20 bin] vim  runserver.sh
# 修改 JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -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"

4、修改/conf/broker.conf(启动时可选择该配置文件)

### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf
[admin@test-webapp-svr20 conf]$ vim broker.conf


#集群名称,可自定义
brokerClusterName=DefaultCluster
brokerName=broker‐a
brokerId=0
# 定义服务地址,主存地址
namesrvAddr=987.65.43.211:9876
deleteWhen=04
fileReservedTime=48
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
autoCreateTopicEnable=true
#消息存储根路径
storePathRootDir=/data/service/rocketmq/rocketmq-all-5.1.4-bin-release/logs
#日志路径
storePathCommitLog=/data/service/rocketmq/rocketmq-all-5.1.4-bin-release/logs/commitlog


2.启动NameServer

安装完RocketMQ包后,我们启动NameServer

### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 启动namesrv
[admin@test-webapp-svr20 bin] nohup sh mqnamesrv  &

### 验证namesrv是否启动成功
[admin@test-webapp-svr20 bin] tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...

3.启动Broker+Proxy

NameServer成功启动后,我们启动Broker和Proxy,5.x 版本下我们建议使用 Local 模式部署,即 Broker 和 Proxy 同进程部署。5.x 版本也支持 Broker 和 Proxy 分离部署以实现更灵活的集群能力。详情参考部署教程

启动Broker+Proxy

### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 先启动broker  192.168.0.128为服务器的内网ip
[admin@test-webapp-svr20 bin] nohup sh mqbroker -n 987.65.43.211:9876 --enable-proxy &

### 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a
[admin@test-webapp-svr20 bin] tail -f ~/logs/rocketmqlogs/proxy.log 
The broker[broker-a,192.169.1.2:10911] boot success...

报错:

java.io.IOException: Failed to bind to address 0.0.0.0/0.0.0.0:8081

原因:

rocketmq默认的ProxyDashboard端口分别为8081、8080,和原有系统中的端口冲突,需进行调整

解决:

修改/data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/rmq-proxy.json

{
  "rocketMQClusterName": "DefaultCluster",
  # Dashboard 默认端口 8080
  "remotingListenPort": 9080,
  # Proxy默认端口 8081
  "grpcServerPort": 9081
}

4.关闭Broker、NameServer

关闭命令

### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
# 关闭时请先关闭broker
[admin@test-webapp-svr20 rocketmq] sh mqshutdown broker
# 后关闭nameserver
[admin@test-webapp-svr20 rocketmq] sh mqshutdown namesrv
# 查看rocketmq进程是否关闭
[admin@test-webapp-svr20 rocketmq] ps -ef|grep rocketmq

5.修改默认端口

5.1. 修改NameServer端口

NameServer默认端口9876

#在rocketmq的conf目录下添加namesrv.properties文件,文件中添加端口配置

listenPort=8876

#使用配置信息后台启动namesrv
nohup sh mqnamesrv -c conf/namesrv.properties &
5.2. 修改Broker端口

Broker默认端口10911

#在rocketmq的conf/broker.conf,文件中添加端口配置



#使用配置信息后台启动Broker
nohup sh mqbroker -n 192.168.0.128:9876 -c conf/broker.conf --enable-proxy &
5.3. 修改ProxyDashboard端口

Dashboard 默认端口 8080

Proxy默认端口 8081

修改/data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/rmq-proxy.json

{
  "rocketMQClusterName": "DefaultCluster",
  # Dashboard 默认端口 8080
  "remotingListenPort": 9080,
  # Proxy默认端口 8081
  "grpcServerPort": 9081
}

6.安装RocketMQ Dashboard

RocketMQ Dashboard 是 RocketMQ 的管控利器,为用户提供客户端和应用程序的各种事件、性能的统计信息,支持以可视化工具代替 Topic 配置、Broker 管理等命令行操作。

6.1.介绍

6.1.1.功能概览
面板功能
运维修改nameserver 地址; 选用 VIPChannel
驾驶舱查看 broker, topic 消息量
集群集群分布,broker 配置、运行信息
主题搜索、筛选、删除、更新/新增主题,消息路由,发送消息,重置消费位点
消费者搜索、删除、新增/更新消费者组,终端,消费详情,配置
消息消息记录,私信消息,消息轨迹等消息详情

操作面板:

1657630174311

6.2.快速开始

系统要求:

  1. Linux/Unix/Mac
  2. 64bit JDK 1.8+
  3. Maven 3.2.x
  4. 启动 RocketMQ

网络配置:

  1. 云服务器可远程访问或本地虚拟机可 PING 通外网
  2. rocketmq 配置文件 broker.conf / broker-x.properties 设置 nameserver 地址和端口号
  3. 用配置文件启动 broker
6.2.1.源码安装

源码地址:apache/rocketmq-dashboard

下载并解压,切换至源码目录 rocketmq-dashboard-master/

① 编译 rocketmq-dashboard

$ mvn clean package -Dmaven.test.skip=true

② 运行 rocketmq-dashboard

$ java -jar target/rocketmq-dashboard-1.0.1-SNAPSHOT.jar

默认端口8080,若修改端口,调整代码中的application.yml配置文件重新进行打包

注意:

默认启动项目后,会再/home/admin/logs/rocketmqlogs 下生成对应日志,日志很大,使用-Drocketmq.client.logUseSlf4j=true启动项目取消日志生成

脚本运行

#!/bin/bash
PROJECT_NAME="rocketmq-dashboard-1.0.1-SNAPSHOT.jar"
echo "查询进程id-->${PROJECT_NAME}"
PID=`ps -ef | grep ${PROJECT_NAME} | awk '{print $2}'`
echo "得到进程ID:${PID}"
echo "结束进程"
for id in ${PID}
do
        kill -9 ${id}  
        echo "killed ${id}"  
done
echo "结束进程完成"

echo "启动服务"
BUILD_ID=mqdontKillMe nohup java  -Xms1024m -Xmx1024m -Dfile.encoding=UTF-8 -jar -Drocketmq.client.logUseSlf4j=true target/${PROJECT_NAME} > /dev/null 2>&1 &
echo "服务完成"

提示:Started App in x.xxx seconds (JVM running for x.xxx) 启动成功

浏览器页面访问:namesrv.addr:8080

关闭 rocketmq-dashboard : ctrl + c

再次启动:执行 ②

tips:下载后的源码需要上传到 Linux 系统上编译,本地编译可能会报错。

使用教程:https://rocketmq.apache.org/zh/docs/deploymentOperations/04Dashboard

7.双主双从安装

7.1. 服务器环境

ip (外/内)角色架构模式
123.45.56.789/192.168.0.162nameserver1:6789、broker-master1:12911、broker-slave2:13021Master1、Slave2
987.65.43.211/192.168.0.128nameserver2:6789、broker-master2:12921、broker-slave1:13011Master2、Slave1
7.1.2.开通端口

每个服务器需开放七个端口,生产可以进行调整端口

namesrv

  • 6789

broker主节点

  • 12911、12909、12912

broker从节点

  • 13011、13009、13012

端口规则说明

namesrv默认端口:9876
假设broker配置的 ListenPort 端口:10911
则vip 通道端口为:ListenPort - 2 = 10909
则HA 通道端口为: ListenPort + 1 = 10912

7.2. 部署

本次在开发和测试环境部署rocketmq采用SYNC_MASTER 同步双写,ASYNC_FLUSH 异步刷盘进行

注:关于同步复制、异步复制、同步刷盘与异步刷盘区别,参考8.5专项解释

7.2.1.host解析
# 服务器123.45.56.789
vim /etc/hosts
# nameserver
123.45.56.789   nameserver1 # 6789
987.65.43.211   nameserver2 # 6789
# broker
123.45.56.789   broker-master1 # 12911
123.45.56.789   broker-slave2 # 13021
987.65.43.211   broker-master2 # 12921
987.65.43.211   broker-slave1 # 13011
# 配置完成后,重启网卡
systemctl restart network
service network restart
# Centos 8 重启网卡
nmcli c reload



# 服务器987.65.43.211
vim /etc/hosts
# nameserver
123.45.56.789   nameserver1 # 6789
987.65.43.211   nameserver2 # 6789
# broker
123.45.56.789   broker-master1 # 12911
123.45.56.789   broker-slave2 # 13021
987.65.43.211   broker-master2 # 12921
987.65.43.211   broker-slave1 # 13011
# 配置完成后,重启网卡
systemctl restart network
# Centos 8 重启网卡
nmcli c reload
7.2.2.安全组配置

为了安全只开放特定的端口号:6789(NameServer1 和 NameServer2)、12911(Master1)、12921(Master2)、13011(Slave1)、13021(Slave2)

7.2.3.创建消息存储路径

1号服务器:123.45.56.789

mkdir -p /data/service/rocketmq/store/broker-a/commitlog

mkdir -p /data/service/rocketmq/store/broker-a/consumequeue

mkdir -p /data/service/rocketmq/store/broker-a/index

mkdir -p /data/service/rocketmq/store/broker-b-s/commitlog

mkdir -p /data/service/rocketmq/store/broker-b-s/consumequeue

mkdir -p /data/service/rocketmq/store/broker-b-s/index

2号服务器 :987.65.43.211

mkdir -p /data/service/rocketmq/store/broker-b/commitlog

mkdir -p /data/service/rocketmq/store/broker-b/consumequeue

mkdir -p /data/service/rocketmq/store/broker-b/index

mkdir -p /data/service/rocketmq/store/broker-a-s/commitlog

mkdir -p /data/service/rocketmq/store/broker-a-s/consumequeue

mkdir -p /data/service/rocketmq/store/broker-a-s/index
7.2.4. broker配置文件

分别在2台服务器上执行以下命令,编辑 broker.conf 文件,改成对应服务器的外网IP

# 两台服务器同时执行
# 服务器 123.45.56.789
vim /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/broker.conf

namesrvAddr=987.65.43.211:9876
brokerIP=987.65.43.211

# 服务器 987.65.43.211
vim /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/broker.conf

namesrvAddr=987.65.43.211:9876
brokerIP=987.65.43.211
7.2.5. master1(服务器一)

服务器一:123.45.56.789、192.168.0.162

# 修改同步复制配置文件
vim /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-a.properties


#Broker服务地址
brokerIP1=123.45.56.789
brokerIP2=123.45.56.789
#所属集群名字
brokerClusterName=test-dh-rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=123.45.56.789:6789;987.65.43.211:6789
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=false
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=false
#Broker 对外服务的监听端口
listenPort=12911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/service/rocketmq/store/broker-a
#commitLog 存储路径
storePathCommitLog=/data/service/rocketmq/store/broker-a/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/service/rocketmq/store/broker-a/consumequeue
#消息索引存储路径
storePathIndex=/data/service/rocketmq/store/broker-a/index
#checkpoint 文件存储路径
storeCheckpoint=/data/service/rocketmq/store/broker-a/checkpoint
#abort 文件存储路径
abortFile=/data/service/rocketmq/store/broker-a/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
7.2.6. slave2(服务器一)

服务器一:123.45.56.789、192.168.0.162

# 修改同步复制配置文件
vim /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-b-s.properties


#Broker服务地址
brokerIP1=123.45.56.789
#所属集群名字
brokerClusterName=test-dh-rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=123.45.56.789:6789;987.65.43.211:6789
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=false
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=false
#Broker 对外服务的监听端口
listenPort=13021
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/service/rocketmq/store/broker-b-s
#commitLog 存储路径
storePathCommitLog=/data/service/rocketmq/store/broker-b-s/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/service/rocketmq/store/broker-b-s/consumequeue
#消息索引存储路径
storePathIndex=/data/service/rocketmq/store/broker-b-s/index
#checkpoint 文件存储路径
storeCheckpoint=/data/service/rocketmq/store/broker-b-s/checkpoint
#abort 文件存储路径
abortFile=/data/service/rocketmq/store/broker-b-s/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
7.2.7. master2(服务器二)

服务器一:987.65.43.211、192.168.0.128

# 修改同步复制配置文件
vim /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-b.properties


#Broker服务地址,设置broker节点所在服务器的ip地址(这个非常重要,主从模式下,从节点会根据主节点的brokerIP2来同步数据,#如果不配置,主从无法同步,brokerIP1设置为自己外网能访问的ip,服务器双网卡情况下必须配置,比如阿里云这$种,#主节点需要配置ip1和ip2,从节点只需要配置ip1即可)
brokerIP1=987.65.43.211
brokerIP2=987.65.43.211
#所属集群名字
brokerClusterName=test-dh-rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=123.45.56.789:6789;987.65.43.211:6789
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=false
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=false
#Broker 对外服务的监听端口
listenPort=12921
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/service/rocketmq/store/broker-b
#commitLog 存储路径
storePathCommitLog=/data/service/rocketmq/store/broker-b/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/service/rocketmq/store/broker-b/consumequeue
#消息索引存储路径
storePathIndex=/data/service/rocketmq/store/broker-b/index
#checkpoint 文件存储路径
storeCheckpoint=/data/service/rocketmq/store/broker-b/checkpoint
#abort 文件存储路径
abortFile=/data/service/rocketmq/store/broker-b/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
7.2.8. slave1(服务器二)

服务器一:987.65.43.211、192.168.0.128

# 修改同步复制配置文件
vim /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-a-s.properties


#所属集群名字
brokerClusterName=test-dh-rocketmq-cluster
#broker 名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer 地址,分号分割
namesrvAddr=123.45.56.789:6789;987.65.43.211:6789
#安装可视化界面使用,需要是IP,不能是host
#设置broker节点所在服务器的ip地址(**这个非常重要,主从模式下,从节点会根据主节点的brokerIP2来同步数据,#如果不配置,主从无法同步,brokerIP1设置为自己外网能访问的ip,服务器双网卡情况下必须配置,比如阿里云这$种,#主节点需要配置ip1和ip2,从节点只需要配置ip1即可)
brokerIP1=987.65.43.211
#在发送消息时,自动创建服务器不存在的 topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建 Topic,建议线下开启,线上关闭
#进行发消息时,必须要指定topic,对于topic的设置有一个开关autoCreateTopicEnable,一#般在开发测试环境中会使用默认设置autoCreateTopicEnable = true,但是这样就会导致#topic的设置不容易规范管理,没有统一的审核。所以在正式环境中会在Broker启动时#设置参数autoCreateTopicEnable = false。这样当需要增加topic时就需要在web管理界面上#添加即可。
autoCreateTopicEnable=false
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=false
#Broker 对外服务的监听端口,如果从节点是单独服务器,则可以使用默认端口19011
listenPort=13011
#删除文件时间点,默认凌晨 4 点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog 每个文件的大小默认 1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue 每个文件默认存 30W 条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/data/service/rocketmq/store/broker-a-s
#commitLog 存储路径
storePathCommitLog=/data/service/rocketmq/store/broker-a-s/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/data/service/rocketmq/store/broker-a-s/consumequeue
#消息索引存储路径
storePathIndex=/data/service/rocketmq/store/broker-a-s/index
#checkpoint 文件存储路径
storeCheckpoint=/data/service/rocketmq/store/broker-a-s/checkpoint
#abort 文件存储路径
abortFile=/data/service/rocketmq/store/broker-a-s/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
7.2.9.服务启动
7.2.9.1.启动NameServer集群

分别在服务器一和服务器二启动NameServer1 和 NameServer2

# 两个服务器都需要操作
#在rocketmq的conf目录下添加namesrv.properties文件,文件中添加端口配置
listenPort=6789
### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 启动namesrv
[admin@test-webapp-svr20 bin] nohup sh mqnamesrv -c ../conf/namesrv.properties &

### 验证namesrv是否启动成功
[admin@test-webapp-svr20 bin] tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...
7.2.9.2.启动Broker集群

启动顺序

注意:如果不使用代理proxy模式,启动命令不需要带 --enable-proxy
5.x版本使用代理启动会报错,目前还未找到集群启动代理的方法,后续进行补充

------------2024-03-28-------------------
使用代理模式集群部署可以看我的下一篇文章:Apache RocketMQ5.x使用代理proxy集群部署

1、在123.45.56.789 启动 master1

### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 先启动broker 如果不使用代理proxy模式,启动命令不需要带  --enable-proxy
[admin@test-webapp-svr20 bin] nohup sh mqbroker -c /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-a.properties --enable-proxy &
### 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a
[admin@test-webapp-svr20 bin] tail -1000f ~/logs/rocketmqlogs/proxy.log 
The broker[broker-a,192.169.1.2:10911] boot success...

2、在987.65.43.211 启动 master2

### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 先启动broker 如果不使用代理proxy模式,启动命令不需要带  --enable-proxy
[admin@test-webapp-svr20 bin] nohup sh mqbroker -c /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-b.properties --enable-proxy &
### 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a
[admin@test-webapp-svr20 bin] tail -1000f ~/logs/rocketmqlogs/proxy.log 
The broker[broker-a,192.169.1.2:10911] boot success...

3、在987.65.43.211 启动 slave1

### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 先启动broker 如果不使用代理proxy模式,启动命令不需要带  --enable-proxy
[admin@test-webapp-svr20 bin] nohup sh mqbroker -c /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-a-s.properties --enable-proxy &
### 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a
[admin@test-webapp-svr20 bin] tail -1000f ~/logs/rocketmqlogs/proxy.log 
The broker[broker-a,192.169.1.2:10911] boot success...

4、在123.45.56.789 启动 slave2

### 到安装目录下
[admin@test-webapp-svr20 rocketmq] cd /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/bin
### 先启动broker 如果不使用代理proxy模式,启动命令不需要带  --enable-proxy
[admin@test-webapp-svr20 bin] nohup sh mqbroker -c /data/service/rocketmq/rocketmq-all-5.1.4-bin-release/conf/2m-2s-sync/broker-b-s.properties --enable-proxy &
### 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a
[admin@test-webapp-svr20 bin] tail -1000f ~/logs/rocketmqlogs/proxy.log 
The broker[broker-a,192.169.1.2:10911] boot success...
7.2.9.3.查看状态
# 分别在两个服务器执行命令
jps
启动完成,分别在2台服务器查看集群信息:

sh mqadmin clusterlist -n 123.45.56.789:6789
sh mqadmin clusterlist -n 987.65.43.211:6789

或者执行以下命令:
sh mqadmin clusterlist -n localhost:6789

7.2.9.3.开通防火墙端口(防火墙关闭除外)

端口规则说明

namesrv默认端口:9876
假设broker配置的 ListenPort 端口:10911
则vip 通道端口为:ListenPort - 2 = 10909
则HA 通道端口为: ListenPort + 1 = 10912

例如:987.65.43.211 本次部署了master2和slave1,对应broker配置的 ListenPort 为:12921、13011

根据端口规则,987.65.43.211需开通

master2:12921、12919、12922

slave1:13011、13009、13012

# 开通端口,本次是在987.65.43.211服务器执行,所以开通12921、12919、12922、13011、13009、13012端口
# 查看防火墙是否有此端口
[root@test-webapp-svr20 ~]# firewall-cmd --zone=public --list-ports
80/tcp 81/tcp 82/tcp 83/tcp 88/tcp 443/tcp 3000/tcp 3001/tcp 3306/tcp
# 修改端口
[root@test-webapp-svr20 ~]# firewall-cmd --zone=public --add-port=12921/tcp --permanent --add-port=12919/tcp --permanent --add-port=12922/tcp --permanent --add-port=13011/tcp --permanent  --add-port=13009/tcp --permanent --add-port=13012/tcp --permanent 

# 重启防火墙
[root@test-webapp-svr20 ~]# firewall-cmd --reload

# 123.45.56.789 同样操作

注意:此处开通防火墙,对应服务器安全组也需要开通,生产环境使用内网地址进行交互,则不需要开通


7.2.10.RocketMQ Dashboard配置修改

1、根据上面部署的NameServer的端口,需修改Dashboard配置

# 到Dashboard源码位置
cd /data/service/rocketmq/rocketmq-dashboard-master
# 修改配置文件
vim src/main/resources/application.yml
# 修改完成 编译
mvn clean package -Dmaven.test.skip=true


#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

server:
  port: 8080  # 修改为你想要的配置端口
  servlet:
    encoding:
      charset: UTF-8
      enabled: true
      force: true
## SSL setting
#  ssl:
#    key-store: classpath:rmqcngkeystore.jks
#    key-store-password: rocketmq
#    key-store-type: PKCS12
#    key-alias: rmqcngkey

spring:
  application:
    name: rocketmq-dashboard

logging:
  config: classpath:logback.xml

rocketmq:
  config:
    # if this value is empty,use env value rocketmq.config.namesrvAddr  NAMESRV_ADDR | now, default localhost:9876
    # configure multiple namesrv addresses to manage multiple different clusters
    namesrvAddrs:
      - 127.0.0.1:9876 # 根据配置的ip和端口修改 本次为 123.45.56.789:6789
      - 127.0.0.2:9876 # 根据配置的ip和端口修改 本次为 987.65.43.211:6789
    # if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
    isVIPChannel:
    # timeout for mqadminExt, default 5000ms
    timeoutMillis:
    # rocketmq-console's data path:dashboard/monitor
    dataPath: /tmp/rocketmq-console/data
    # set it false if you don't want use dashboard.default true
    enableDashBoardCollect: true
    # set the message track trace topic if you don't want use the default one
    msgTrackTopicName:
    ticketKey: ticket
    # 开启控制台账户密码登录(为true表示开启,为false表示关闭)
    loginRequired: true
    useTLS: false
    # set the accessKey and secretKey if you used acl
    accessKey: # if version > 4.4.0
    secretKey: # if version > 4.4.0

threadpool:
  config:
    coreSize: 10
    maxSize: 10
    keepAliveTime: 3000
    queueSize: 5000


2、配置控制台用户名密码,users.properties

# This file supports hot change, any change will be auto-reloaded without Console restarting.
# Format: a user per line, username=password[,N] #N is optional, 0 (Normal User); 1 (Admin)
 
# Define Admin
# =============用户名和密码规则「用户名=密码,权限」,这里的权限为1表示管理员,为0表示普通用户=============
# 例如:admin=admin123,1
admin=admin123,1
rensen=rensen,1
songmingming=songmingming,1
zhaolei=zhaolei,0
yangzehao=yangzehao,0
qinchunfeng=qinchunfeng,0
liuyang=liuyang,1
zhangbaoqin=zhangbaoqin,0
luxiaomeng=
 
# Define Users
# =============屏蔽下边两个账户=============
#user1=user1
#user2=user2

8.rocket5.x说明

8.1.rocketmq默认端口

端口解释
Nameserver

  • port: 9876(默认)

Controller

  • port: 9878(默认)

Broker

  • port: 10911(默认)

Brocontroller

  • port: listenport - 2 = 10909(默认)

主从同步端口

  • port: 30912

Proxy

  • port: 8081(默认)

Dashboard

  • port: 8080(默认)

8.2.rocketmq5.x架构图

RocketMQ 5.0 为了更好地拥抱云原生,引入了无状态的 Proxy 模块,新的架构图如下:

img

引入 Proxy 模块后,Proxy 承担了协议适配、权限管理、消息管理等计算功能,Broker 则更加专注于存储。这样存储和计算相分离,在云原生环境下可以更好地进行资源调度。

8.3.Proxy 介绍

RocketMQ 5.0 把客户端的部分功能下沉到 Proxy,Proxy 承接了之前 客户端的计算能力,客户端变得更加轻量级。

8.3.1 NameServer

从上面的架构图可以看到,Producer/Consumer 不再需要注册到 NameServer,这一部分功能下移到了 Proxy,由 Proxy 跟 NameServer 进行交互,比如查询 TopicRouteData。代码如下:

public CompletableFuture<QueryRouteResponse> queryRoute(ProxyContext ctx, QueryRouteRequest request) {CompletableFuture<QueryRouteResponse> future = new CompletableFuture<>();try {
    //省略部分代码
    ProxyTopicRouteData proxyTopicRouteData = this.messagingProcessor.getTopicRouteDataForProxy(ctx, addressList, topicName);
    List<MessageQueue> messageQueueList = new ArrayList<>();
    Map<String, Map<Long, Broker>> brokerMap = buildBrokerMap(proxyTopicRouteData.getBrokerDatas());
    TopicMessageType topicMessageType = messagingProcessor.getMetadataService().getTopicMessageType(topicName);
    for (QueueData queueData : proxyTopicRouteData.getQueueDatas()) {
        String brokerName = queueData.getBrokerName();
        Map<Long, Broker> brokerIdMap = brokerMap.get(brokerName);
        if (brokerIdMap == null) {
            break;
        }
        for (Broker broker : brokerIdMap.values()) {
            messageQueueList.addAll(this.genMessageQueueFromQueueData(queueData, request.getTopic(), topicMessageType, broker));
        }
    }
    QueryRouteResponse response = QueryRouteResponse.newBuilder().setStatus(ResponseBuilder.getInstance().buildStatus(Code.OK, Code.OK.name())).addAllMessageQueues(messageQueueList).build();
    future.complete(response);
} catch (Throwable t) {
    future.completeExceptionally(t);
}
    return future;
}

Proxy 适配多种协议,比如 HTTP、gRPC、remoting 等,不同协议的客户端跟 Proxy 建立连接后,Proxy 统一使用 remoting 协议跟 Broker、NameServer 进行通信。

8.3.2 流量控制

客户端所有的请求都要经过 Proxy,Proxy 将流量分发到 Broker。这样在 Proxy 可以进行流量控制和流量治理。

8.3.3 POP 模式

我们知道,PUSH 消费模式下,Broker 中的每个 MessageQueue 只能被同一个 Consumer Group 中的一个消费者消费,如下图:

img

PUSH 模式存在下面几个问题:

  1. 消费者最大数量只能等于 MessageQueue 的数量,消费者数量等于 MessageQueue 的数量后,再增加消费者,也不能提高消费能力了;
  2. 客户端的处理逻辑比较多,比如负载均衡、offset 管理、消费失败后的处理(比如失败消息发送回 Broker);
  3. 如果一个消费者机器故障,比如上图中 Consumer0 这个消费者 hang 住了,Topic1 下的两个 MessageQueue 就不能被消费了,导致消息积压,最终只能是重启或下线 Consumer0,Consumer 做重平衡;
  4. 客户端很重,如果要用其他语言编写,工作量很大。

基于 PUSH 模式的不足,RocketMQ 5.0 引入了 POP 消费模式,如下图:

img

跟 PUSH 模式消费者相比,POP 模式客户端有如下优势:

  1. POP 模式消费者可以拉取所有的 MessageQueue,这样即使某个消费者 hang 住,也不会影响某一个 MessageQueue 的消费;
  2. POP 模式消费者不再会重平衡,因为每个消费者默认会去所有的 MessageQueue 拉取消息;
  3. 因为消费者可以拉取所有的 MessageQueue 消息,所以,增加消费者数量,是可以提高消费能力的;
  4. 消费者减少了很多逻辑,变得户端轻量化了,可以方便多语言实现;
  5. 消费者不再维护 offset(offset 由 Broker 维护),变成了无状态组件。

**注意:消费者请求 Proxy 时,POP 模式和 PUSH 模式都可以使用,而 Proxy 请求 Broker 时,使用的是 POP 模式,这样可以避免上面提到的一系列问题。**如下图:

img

8.3.4 gRPC

Proxy 基于 gRPC 的标准性、兼容性和多语言传输层代码生成能力,可以轻松构建多语言的轻量级客户端。

8.4 Proxy部署方式

根据不同的场景,Proxy 有两种部署方式,LOCAL 模式和 CLUSTER 模式。

8.4.1 LOCAL 模式

RocketMQ 4.x 版本 Client 和 Broker 直接通信,RocketMQ 5.0 引入 Proxy 后,Client 和 Broker 之间的通信多了一道网络,也增加了一次序列化和反序列化的过程,这势必增加了延迟,对于延迟敏感的场景可能不能接受。RocketMQ 5.0 引入了 LOCAL 模式部署 Proxy,如下图:

img

Proxy 仍然可以适配多种语言的客户端,而且 Proxy 和 Broker 部署在一起,通信方式使用进程内通信,这样可以减少因为多一道网络带来的延迟,提高吞吐量。同时运维也变得简单,运维成本降低。

LOCAL 模式有一个缺点,因为 Proxy 部署在 Broker 端,受网络环境的限制,对于多网络接入的情况并不友好,成本高。

8.4.2 CLUSTER 模式

CLUSTER 模式主要用于对延迟不敏感的场景,Proxy 独立部署,在 Proxy 层适配多网络的接入,同时 Proxy 和 Broker 可以独立扩容,互不影响。如下图:

img

8.4.3 总结

LOCAL 模式更适合对延迟敏感、期望运维成本低、网络接入类型单一的场景。

CLUSTER 模式更适合对延迟要求低、网络接入类型多样的场景。

8.5 集群部署方式

RocketMQ的部署方式有多种:

  • 2m-noslave: 多Master模式,无Slave。[双主模式]
  • 2m-2s-sync: 多Master多Slave模式,同步双写 [双主双从+同步模式]
  • 2m-2s-async:多Master多Slave模式,异步复制 [双主双从+异步模式]

1)同步复制
同步复制方式是等Master和Slave均写 成功后才反馈给客户端写成功状态;
在同步复制方式下,如果Master出故障,Slave上有全部的备份数据,容易恢复,但是同步复制会增大数据写入延迟,降低系统吞吐量。
2)异步复制
异步复制方式是只要Master写成功 即可反馈给客户端写成功状态。
在异步复制方式下,系统拥有较低的延迟和较高的吞吐量,但是如果Master出了故障,有些数据因为没有被写 入Slave,有可能会丢失;
3)配置
同步复制和异步复制是通过Broker配置文件里的brokerRole参数进行设置的,这个参数可以被设置成ASYNC_MASTER、 SYNC_MASTER、SLAVE三个值中的一个。

4)同步刷盘

消息提交到文件内存映射后,将等待同步调用MappedByteBuffer的force()方法写入磁盘后返回给生产者;

5)异步刷盘

消息提交到文件内存映射后,立刻返回给生产者。如下图所示,两种刷盘方式对比

设置刷盘方式和主从复制方式, 尤其是SYNC_FLUSH方式,由于频繁地触发磁盘写动作,会明显降低性能。通常情况下,应该把Master和Save配置成ASYNC_FLUSH的刷盘 方式,主从之间配置成SYNC_MASTER的复制方式,这样即使有一台机器出故障,仍然能保证数不丢,是个不错的选择

/opt/rocket/conf/broker.conf 文件:Broker的配置文件
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8.5.1.同步刷盘示意图

img

8.5.2. 异步刷盘未开启堆外缓存示意图

img

8.5.3.异步刷盘开启堆外缓存示意图

img

参考:https://blog.csdn.net/ko0491/article/details/109763880、https://blog.csdn.net/gaoliang1719/article/details/106566901

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值