一、 2m-2s集群架构图
消息队列2master-2slave(同步双写)方式
二、集群工作流程
启动 NameServer,
NameServer 起来后监听端口,等待 Broker、Producer、Consumer 连上来,相当于一个路由控制中心。NameServer之间不进行通信Broker 启动,
跟所有的 NameServer 保持长连接,定时发送心跳包。心跳包中包含当前 Broker 信息(IP+端口等)以及存储所有 Topic 信息。注册成功后,NameServer 集群中就有 Topic 跟 Broker 的映射关系。收发消息前,先创建 Topic,
创建 Topic 时需要指定该 Topic 要存储在哪些 Broker 上,也可以在发送消息时自动创建 Topic。Producer,发送消息,
启动时先跟 NameServer集群中的其中一台建立长连接,并从 NameServer 中获取当前发送的 Topic 存在哪些 Broker 上,轮询从队列列表中选择一个队列,然后与队列所在的 Broker 建立长连接从而向 Broker 发消息。Consumer 跟 Producer 类似,跟其中一台 NameServer建立长连接,获取当前订阅 Topic 存在哪些 Broker 上,然后直接跟 Broker 建立连接通道,开始消费消息
三、集群搭建
0. java环境部署
卸载系统自带openJdk
linux 环境下 安装:
https://www.cnblogs.com/lhxsoft/p/10571286.html
https://www.jianshu.com/p/ee44ca065928
root 用户设置密码
https://www.cnblogs.com/zzhu/p/10700112.html
ssh root@10.211.55.3
1. 服务器环境分配
服务器1 NameServer、 borkerserver Mater1 + slave2
服务器2 NameServer、 borkerserver Mater2 + slave1
主从不放在一个服务器上,为了保证高可用
2.host添加消息
vim /etc/hosts
# nameserver
10.211.55.3 rockermq-nameserver1
10.211.55.4 rockermq-nameserver2
# borker
10.211.55.3 rockermq-master1
10.211.55.3 rocketmq-slave2
10.211.55.4 rockermq-master2
10.211.55.4 rockermq-slave1
配置完后重启网卡
systemctl restart network
3.设置防火墙
宿主机需要远程访问虚拟机的 rockermq 服务和 web 服务,需要开放相关的端口号,简单粗暴的方式是直接关闭防火墙
#关闭防火墙
systemctl stop firewalld.service
#查看防火墙的状态
firewall-cmd --state
#禁止 firewall 开机启动
systemctl disable firewalld.service
或者为了安全,只开放特定的端口号,Rocketmq 默认使用 3 个端口:9876、10911、11011。如果防火墙没有关闭的话就必须开放这些端口
- nameserver 默认使用 9876 端口
- master 默认使用 10911 端口
- slave 默认使用 11011 端口
执行以下命令
#开放 name server 默认端口
firewall-cmd --remove-port=9876/tcp --permanent
#开放 master 默认端口
firewall-cmd --remove-port=10911/tcp --permanent
#开放 slave 默认端口(当前集群模式可不开启)
firewall-cmd --remove-port=11011/tcp --permanent
#重启防火墙
firewall-cmd --reload
4.环境变量配置
vim/etc/profile
在 profile。文件的末尾加入如下命令
#set rocketmq
ROCKETMQ_HOME=/usr/local/rocketmq-all-4.6.0-bin-release
PATH=$PATH:$ROCKETMQ_HOME/bin
export ROCKETMQ_HOME PATH
输入:wq!保存并退出,并使得配置立刻生效
source /etc/profile
5.创建消息存储路径
mkdir /usr/local/rocketmq/store
# 下面文件夹不要创建,服务启动时会自动生成文件(是文件,不是文件夹)
# mkdir /usr/local/rocketmq/store/commitlog
# mkdir /usr/local/rocketmq/store/consumequeue
# mkdir /usr/local/rocketmq/store/index
6.修改配置文件
rocketmq-all-4.6.0-bin-release/conf/
2m-2s-async: 双主双从 异步刷盘
2m-2s-sync: 双主双从 同步刷盘
2m-noslave: 双主无从
linux命令:
nautilus这个命令就是以root权限打开一个窗口,来管理文件
1)master1
服务器:10.211.55.3
vim /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/conf/2m-2s-sync/broker-a.properties
修改配置如下:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/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=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
2)slave2
服务器:10.211.55.3
vim /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/conf/2m-2s-sync/broker-b-s.properties
修改配置如下:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/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
3)master2
服务器:10.211.55.4
vim /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/conf/2m-2s-sync/broker-b.properties
修改配置如下:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-b
#0 表示 Master,>0 表示 Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=10911
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/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=SYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
4)slave1
服务器:10.211.55.4
vim /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/conf/2m-2s-sync/broker-a-s.properties
修改配置如下:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=1
#nameServer地址,分号分割
namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口
listenPort=11011
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/usr/local/rocketmq/store
#commitLog 存储路径
storePathCommitLog=/usr/local/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketmq/store/index
#checkpoint 文件存储路径
storeCheckpoint=/usr/local/rocketmq/store/checkpoint
#abort 文件存储路径
abortFile=/usr/local/rocketmq/store/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.修改启动脚本文件
1)runbroker.sh
vim /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/bin/runbroker.sh
需要根据内存大小进行适当的对JVM参数进行调整:
#===================================================
# 开发环境配置 JVM Configuration
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m"
2)runserver.sh
mqbroker -c : -c 表示指定配置文件
vim /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/bin/runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
8.服务启动
1)启动NameServe集群
分别在10.211.55.3和10.211.55.4启动NameServer
cd /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/bin
nohup sh mqnamesrv &
2)启动Broker集群
- 在10.211.55.3上启动master1和slave2
master1:
cd /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/bin
nohup sh mqbroker -c /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/conf/2m-2s-sync/broker-a.properties &
slave2:
cd /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/bin
nohup sh mqbroker -c /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/conf/2m-2s-sync/broker-b-s.properties &
- 在10.211.55.4上启动master2和slave2
master2
cd /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/bin
nohup sh mqbroker -c /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/conf/2m-2s-sync/broker-b.properties &
slave1
cd /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/bin
nohup sh mqbroker -c /usr/local/rocketmq/rocketmq-all-4.6.0-bin-release/conf/2m-2s-sync/broker-a-s.properties &
9.查看启动
jps
34230 BrokerStartup
34231 BrokerStartup
34232 BrokerStartup
34233 BrokerStartup
34717 Jps
33949 NamesrvStartup
33950 NamesrvStartup
10.查看日志
tail -f nohup.out
#查看nameserver日志
tail -f ~/logs/rocketmqlogs/namesrv.log
#查看broker日志
tail -f ~/logs/rocketmqlogs/broker.log
四、常见问题
- 安装jdk及配置JAVA_HOME
https://blog.csdn.net/liuxy_236/article/details/90381408
- 安装jdk及配置JAVA_HOME
- 2.卸载 jdk
https://blog.csdn.net/mouday/article/details/81085546 - 3.找不到JAVA_HOME
JAVA_HOME 环境变量未配置,可设置RocketMQ的JDK环境 , 打开bin目录下 runserver.sh 和 runbroker.sh, 将设置JAVA_HOME的第二三行注释掉,在第一行设置JDK的安装目录。如下所示:
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
[ ! -e "$JAVA_HOME/bin/java" ] && JAVA_HOME=/usr/java
[ ! -e "$JAVA_HOME/bin/java" ] && error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)!
4.mac 下查看 jdk安装路径
/usr/libexec/java_home5.mac下rocketmq各种集群模式搭建实战
http://www.pianshen.com/article/5516152646/6.电脑突然关机,在启动rocket mq broker时无法启动,且没有任何日志
把c:/user/你的用户名/里面的store里面的所有文件全部删除,再启动,成功
- 7.Lock failed,MQ already startedz
锁文件冲突原因
因为rocketmq设计一个用户运行一个示例,一个用户锁定了一个用户store存储目录,所以在一起运行会冲突,提示:Lock failed,MQ already startedz
解决方法是每个示例使用一个用户
或
broker.conf 指定 storePathRootDir目录