1:先介绍环境:
- 3台个人云服务器 A(20)阿里云 B(37)腾讯云 C(44) 腾讯云
操作系统版本:CentOS 7.7 64位 RocketMQ版本:4.8
20 这台作为Master 37、44作为Slave
开放端口:8090(对应运维页面),30911,30921,30931 9876
2:每台服务器安装 jdk
https://blog.csdn.net/publicv/article/details/103948599 之前写过的安装jdk教程
3:每台服务器安装 RocketMQ
(1):rocketmq 下载 官网下载链接
(2):下载到本地 ,通过Xftp 上传至 服务器 /opt 路径
(3):解压zip ,然后放入 /usr/local 路径下
unzip rocketmq-all-4.8.0-bin-release.zip
mv rocketmq-all-4.8.0-bin-release /usr/local/
cd /usr/local/rocketmq-all-4.8.0-bin-release/
(4):修改 NameServer JVM 参数(配置高可以不用此步骤)
cd bin
vim runserver.sh
# 定位到如下代码
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
# 修改 "-Xms -Xmx -Xmn" 参数
JAVA_OPT="${JAVA_OPT} -server -Xms512M -Xmx512M -Xmn256M -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
这里修改 JVM 参数主要目的是我的服务器内存不够,默认 NameServer 会占用 4G。
(5):启动 NameServer
nohup sh ./bin/mqnamesrv &
查看日志,确认是否成功
tail -f ~/logs/rocketmqlogs/namesrv.log
(6):修改 Broker 的配置文件
vim conf/broker.conf
# 使用如下配置文件
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
storePathRootDir=/data/rocketmq/store
storePathCommitLog=/data/rocketmq/store/commitlog
namesrvAddr=你的服务器外网ip:9876
autoCreateTopicEnable=true
aclEnable=true
brokerIP1=你的服务器外网ip
缺少storePathRootDir(用于存储数据) 和storePathCommitLog(日志) 文件夹 创建一下
mkdir -p /data/rocketmq/store/commitlog
mkdir -p /data/rocketmq/store/consumequeue
(7):修改 Broker JVM参数(配置高可以不用此步骤)
cd bin
vim runbroker.sh
#修改如下配置(配置前)
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
#配置后
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"
(8):启动 Broker
nohup ./bin/mqbroker -n localhost:9876 -c conf/broker.conf &
查看日志,确认是否成功
tail -f ~/logs/rocketmqlogs/broker.log
4:修改配置文件为Dledger 高可用集群模式
(生产中应该将 NameServer 部署到其他服务器中,在这为了方便,与Broker部署在一起)
(1):先将每台服务器原来单机模式的关闭服务
sh bin/mqshutdown broker
sh bin/mqshutdown namesrv
(2):A(20)阿里云 作为Master
vim conf/dledger/broker-n0.conf
# Broker所属哪个集群
brokerClusterName = RaftCluster
# Broker名称
brokerName=RaftNode00
listenPort=30911
#你设置的NameServer地址和端口
namesrvAddr=服务器1:9876;服务器2:9876;服务器3:9876
# 存储消息以及一些配置信息的根目录
storePathRootDir=/tmp/rmqstore/node00
storePathCommitLog=/tmp/rmqstore/node00/commitlog
enableDLegerCommitLog=true
dLegerGroup=RaftNode00
# n0 n1 n2 分别对应 broker1 broker2 broker3
dLegerPeers=n0-服务器1:40911;n1-服务器2:40912;n2-服务器3:40913
# 此节点选择的是n0
dLegerSelfId=n0
# 发送消息线程池数量 建议和服务器cpu核数一致
sendMessageThreadPoolNums=2
# 指定当前节点的IP ,没配置在外网会尝试用内网连接其他节点。内网环境可不配置
brokerIP1=服务器1
(2):B(37)腾讯云 作为Slave C(44) 腾讯云 作为Slave
B(37)腾讯云 作为Slave 配置文件选择broker-n1.conf ,配置内容在Master的基础上修改 port和 dlegerId 和 brokerIP1 不可重复
vim conf/dledger/broker-n1.conf
# 节点端口
listenPort=30921
# dLegerId
dLegerSelfId=n1
# 指定当前节点的IP ,没配置在外网会尝试用内网连接其他节点。内网环境可不配置
brokerIP1=服务器2
C(44)腾讯云 作为Slave 配置文件选择broker-n2.conf ,配置内容在Master的基础上修改 port和 dlegerId 和 brokerIP1 不可重复
vim conf/dledger/broker-n2.conf
# 节点端口
listenPort=30931
# dLegerId
dLegerSelfId=n2
# 指定当前节点的IP ,没配置在外网会尝试用内网连接其他节点。内网环境可不配置
brokerIP1=服务器3
(2): 依次启动集群
需要注意下,将已经启动的 NameServer 和 Broker关闭
A(20)阿里云执行
nohup sh bin/mqnamesrv > nohubNameserv &
nohup sh bin/mqbroker > nohubBroker -c conf/dledger/broker-n0.conf &
B(37)腾讯云执行
nohup sh bin/mqnamesrv > nohubNameserv &
nohup sh bin/mqbroker > nohubBroker -c conf/dledger/broker-n1.conf &
C(44) 腾讯云执行
nohup sh bin/mqnamesrv > nohubNameserv &
nohup sh bin/mqbroker > nohubBroker -c conf/dledger/broker-n2.conf &
查看集群情况
sh bin/mqadmin clusterList -n 127.0.0.1:9876
这么看不太明显 ,官方提供了个运维页面,为了方便演示 。 我已经编译好了。jar端口是8090
链接: RokcetMQ-Console
提取码:csdn
(3): kill 主Broker ,再次查看集群情况
等待大约几秒后 ,主Broker 自动切换到了 44这台slave节点上
5:期间遇到的一些坑
- 节点之间不在共一个内网环境下 ,需要设置 brokerIP1=当前服务器ip 。不然会莫名其妙的报错 127开头的连接不上
- listenPort=30911 这个端口不能重复,也不能和下面的 dLegerPeers=n0-服务器1:40911;n1-服务器2:40912;n2-服务器3:40913配置一样
- 单机搭建下,大多数报错的原因是 配置不够导致的 ,还有文件夹目录找不到
- 外网情况下,防火墙要关闭,端口要开放 例如 30911 30921 30931 等
- 启动时查看 broker 为什么报错 命令:sh bin/mqbroker -c conf/broker.conf &
- sendDefaultImpl call timeout; nested exception is org.apache.rocketmq.remoting.exception.RemotingToo 导致原因是:broker.conf 没有配置 brokerIP1=服务器外网 ip
- accessKey 和 secretKey 必须大于 6 位,两个都必须大于 6 位不只是密码大于 6 位
- 关闭命令:sh mqshutdown broker sh mqshutdown namesrv
6:acl 和 spring boot 如何接入
- 关于plain_acl.yml 的配置
10.控制台编译前的配置
jar 包
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency>
yml 配置
rocketmq:
name-server: mq 服务外网 ip:9876
producer:
group: my-producer-group
access-key: 配置的公钥
secret-key: 配置的密钥
send-message-timeout: 3000 # 发送消息超时时间,单位:毫秒。默认为 3000 。
compress-message-body-threshold: 4096 # 消息压缩阀值,当消息体的大小超过该阀值后,进行消息压缩。默认为 4 * 1024B
max-message-size: 4194304 # 消息体的最大允许大小。。默认为 4 * 1024 * 1024B
retry-times-when-send-failed: 2 # 同步发送消息时,失败重试次数。默认为 2 次。
retry-times-when-send-async-failed: 2 # 异步发送消息时,失败重试次数。默认为 2 次。
retry-next-server: false # 发送消息给 Broker 时,如果发送失败,是否重试另外一台 Broker 。默认为 false
enable-msg-trace: true # 是否开启消息轨迹功能。默认为 true 开启。可阅读 https://github.com/apache/rocketmq/blob/master/docs/cn/msg_trace/user_guide.md 文档
customized-trace-topic: RMQ_SYS_TRACE_TOPIC # 自定义消息轨迹的 Topic 。默认为 RMQ_SYS_TRACE_TOPIC 。
consumer:
access-key: 配置的公钥
secret-key: 配置的密钥
listeners: # 配置某个消费分组,是否监听指定 Topic 。结构为 Map<消费者分组, <Topic, Boolean>> 。默认情况下,不配置表示监听。
erbadagang-consumer-group:
topic1: false # 关闭 test-consumer-group 对 topic1 的监听消费
group: my-producer-group
生产者
@Service
public class TestProducer {
@Autowired
private RocketMQTemplate rocketMQTemplate;
public void sendMsg (String topic, Object body) {
Message<Object> build = MessageBuilder.withPayload(body).build();
rocketMQTemplate.send(topic,build);
}
}
消费者
@Slf4j
@Service
@RocketMQMessageListener(topic = "和 Producer一致的 topic",consumerGroup = "my-producer-group")
public class TestConsumer implements RocketMQListener<MqDTO>{
@Override
public void onMessage(MqDTO message) {
log.info("收到消息了", JSON.toJSONString(message));
}
}