本文章主要介绍双主双从集群的搭建
双主双从集群架构图
双主双从集群工作流程
- 启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来,相当于一个路由控制中心。
- 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建立连接通道,开始消费消息。
注意:在4.5之前如果master挂了,需要手动启动一个master节点,slave不能主动切换成master
一、搭建准备工作
1.环境准备
在本地用VMWare创建2台虚拟机(或者4台),下面以2台为例
192.168.138.137 nameserver、brokerserver
master1、slave2
192.168.138.138 nameserver、brokerserver
master2、slave1
2.配置host文件,添加域名
vim /etc/hosts
#文件末尾添加如下信息
# nameserver
192.168.138.137 rocketmq-nameserver1
192.168.138.138 rocketmq-nameserver2
# broker
192.168.138.137 rocketmq-master1
192.168.138.137 rocketmq-slave2
192.168.138.138 rocketmq-master2
192.168.138.138 rocketmq-slave1
配置完成后,重启网卡
systemctl restart network
3.关闭防火墙
机器需要远程访问虚拟机的rocketmq服务和web服务,需要开放相应的端口,自己做测试可以直接关闭防火墙
# 关闭防火墙
systemctl stop firewalld.service
# 查看防火墙的状态
firewall-cmd --state
# 禁止firewall开机启动
systemctl disable firewalld.service
为了安全,可以只开放特定端口,rocketmq默认使用了3个端口:
- 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.创建消息存储路径
# master路径
mkdir /app/apps/rocketmq-4.8.0/store
mkdir /app/apps/rocketmq-4.8.0/store/commitlog
mkdir /app/apps/rocketmq-4.8.0/store/consumequeue
mkdir /app/apps/rocketmq-4.8.0/store/index
#slave路径
mkdir /app/apps/rocketmq-4.8.0/store-s
mkdir /app/apps/rocketmq-4.8.0/store-s/commitlog
mkdir /app/apps/rocketmq-4.8.0/store-s/consumequeue
mkdir /app/apps/rocketmq-4.8.0/store-s/index
每一个机器上面都需要完成步骤2,3,4的工作。
二、修改broker配置文件
cd /app/apps/rocketmq-4.8.0/conf
rocketmq默认给我们提供了如下图所示的配置文件
然后进入其中的2m-2s-sync双主双从同步复制配置文件夹
cd 2m-2s-sync/
可以看到有如下4个配置文件
broker-a.properties 对应的是 master1的配置文件
broker-a-s.properties 对应的是 slave1的配置文件
broker-b.properties 对应的是 master2的配置文件
broker-b-s.properties 对应的是 slave2的配置文件
1.修改服务器 master1(192.168.138.137)的broker配置文件
vim /app/apps/rocketmq-4.8.0/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=/app/apps/rocketmq-4.8.0/store
#commitLog 存储路径
storePathCommitLog=/app/apps/rocketmq-4.8.0/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/app/apps/rocketmq-4.8.0/store/consumequeue
#消息索引存储路径
storePathIndex=/app/apps/rocketmq-4.8.0/store/index
#checkpoint 文件存储路径
storeCheckpoint=/app/apps/rocketmq-4.8.0/store/checkpoint
#abort 文件存储路径
abortFile=/app/apps/rocketmq-4.8.0/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(192.168.138.137)的broker配置文件
vim /app/apps/rocketmq-4.8.0/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=/app/apps/rocketmq-4.8.0/store-s
#commitLog 存储路径
storePathCommitLog=/app/apps/rocketmq-4.8.0/store-s/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/app/apps/rocketmq-4.8.0/store-s/consumequeue
#消息索引存储路径
storePathIndex=/app/apps/rocketmq-4.8.0/store-s/index
#checkpoint 文件存储路径
storeCheckpoint=/app/apps/rocketmq-4.8.0/store-s/checkpoint
#abort 文件存储路径
abortFile=/app/apps/rocketmq-4.8.0/store-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
3.修改服务器 master2(192.168.138.138)的broker配置文件
vim /app/apps/rocketmq-4.8.0/conf/2m-2s-sync/broker-b.properties
配置内容除了下面的和master1不同,其他的都和master1相同
brokerName=broker-b
4.修改服务器 slave1(192.168.138.138)的broker配置文件
vim /app/apps/rocketmq-4.8.0/conf/2m-2s-sync/broker-a-s.properties
配置内容除了下面的和 salve2 不同,其他的都和 salve2 相同
brokerName=broker-a
注意:同一个机器上的master和slave的store文件不能相同
三、服务启动
在启动之前先确定配置文件的内存是否已经调整足够小,可以参考 rocketmq安装与启动修改配置。
1.启动NameServer集群
分别在192.168.138.137和192.168.138.138上启动NameServer
cd /app/apps/rocketmq-4.8.0/bin/
nohup /app/apps/rocketmq-4.8.0/bin/mqnamesrv > /app/apps/rocketmq-4.8.0/logs/namesrv.log &
2.启动Broker集群
在192.168.138.137上启动master1和slave2
cd /app/apps/rocketmq-4.8.0/bin/
# master1
nohup ./mqbroker -c /app/apps/rocketmq-4.8.0/conf/2m-2s-sync/broker-a.properties > /app/apps/rocketmq-4.8.0/logs/broker-a.log &
#slave2
nohup ./mqbroker -c /app/apps/rocketmq-4.8.0/conf/2m-2s-sync/broker-b-s.properties > /app/apps/rocketmq-4.8.0/logs/broker-b-s.log &
在192.168.138.138上启动master2和slave1
cd /app/apps/rocketmq-4.8.0/bin/
# master2
nohup ./mqbroker -c /app/apps/rocketmq-4.8.0/conf/2m-2s-sync/broker-b.properties > /app/apps/rocketmq-4.8.0/logs/broker-b.log &
#slave1
nohup ./mqbroker -c /app/apps/rocketmq-4.8.0/conf/2m-2s-sync/broker-a-s.properties > /app/apps/rocketmq-4.8.0/logs/broker-a-s.log &
然后用jps查看机器上的进程,如果每个节点出现如下2个broker和1个nameServer进程说明启动成功
四、集群关闭
cd /app/apps/rocketmq-4.8.0/bin/
#1.关闭broker
sh bin/mqshutdown broker
# 2. 关闭namesrv
sh bin/mqshutdown namesrv