Rocket MQ 集群搭建(示例三台机器分别是:56 57 58)
集群搭建(三台机器56 57 58)
RocketMQ:设置broker的对外IP
brokerIP1:当前broker监听的IP。
brokerIP2:broker为master-slave模式时,broker的从节点通过brokerIP2和主节点进行连接。
环境配置(三台机器)
vim /etc/hosts
#添加如下
10.22.101.56 worker1
10.22.101.57 worker2
10.22.101.58 worker3
免密登录(56机器)
#切换到oper用户,生成公私钥
ssh-keygen
#执行
ssh-copy-id worker1
ssh-copy-id worker2
ssh-copy-id worker3
搭建(2主2从)
#检查防火墙
#检查java环境
cd /app/rocketmq/rocketmq-4.8.0/conf
ll
2m-2s-async # 2主2从异步刷盘(吞吐量较大,但是消息可能丢失)
2m-2s-sync #2主2从同步刷盘(吞吐量会下降,但是消息更安全),
2m-noslave #2主无从(单点故障),还可以直接配置broker.conf,进行单点环境配置
dleger #实现主从切换,正式环境都会采用这种方式来搭建集群
配置第一组broker-a
#1.worker2配置borker-a的master节点
[oper@worker2 root]$ vim /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-a.properties
#所属集群名字,名字一样的节点就在同一个集群内
brokerClusterName=rocketmq-cluster
#broker名字,名字一样的节点就是一组主从节点
brokerName=broker-a
#brokerid,0就表示是Master,>0的都是表示Slave
brokerId=0
#nameServer地址,分号分割
namesrvAddr=worker1:9876;worker2:9876;worker3: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
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
storePathRootDir=/app/rocketmq/store
#commitLog存储路径
storePathCommitLog=/app/rocketmq/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/app/rocketmq/store/consumequeue
#消息索引存储路径
storePathIndex=/app/rocketmq/store/index
#checkpoint文件存储路径
storeCheckpoint=/app/rocketmq/store/checkpoint
#abort文件存储路径
abortFile=/app/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#Broker的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#2.worker3配置borker-a的从节点,2m-2s-async/broker-a-s.properties
[oper@worker3 root]$ vim /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-a-s.properties
#同上,需要修改
brokerId=1
listenPort=11011
storePathRootDir=/app/rocketmq/storeSlave
storePathCommitLog=/app/rocketmq/storeSlave/commitlog
storePathConsumeQueue=/app/rocketmq/storeSlave/consumequeue
storePathIndex=/app/rocketmq/storeSlave/index
storeCheckpoint=/app/rocketmq/storeSlave/checkpoint
abortFile=/app/rocketmq/storeSlave/abort
brokerRole=SLAVE
配置第二组broker-b
#worker3配置borker-b的主节点
[oper@worker3 root]$ vim /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-b.properties
#同上,只要修改
brokerName=broker-b
#同上,需要修改
brokerName=broker-b
brokerId=1
listenPort=11011
storePathRootDir=/app/rocketmq/storeSlave
storePathCommitLog=/app/rocketmq/storeSlave/commitlog
storePathConsumeQueue=/app/rocketmq/storeSlave/consumequeue
storePathIndex=/app/rocketmq/storeSlave/index
storeCheckpoint=/app/rocketmq/storeSlave/checkpoint
abortFile=/app/rocketmq/storeSlave/abort
brokerRole=SLAVE
需要注意的配置项:
1、同一机器上两个实例的store目录不能相同,否则会报错 Lock failed,MQ already started
2、同一机器上两个实例的listenPort也不能相同。否则会报端口占用的错。nameserver不需要进行配置,直接启动就行。这也看出nameserver是无状态的
启动集群
① 修改三个节点上的bin/runserver.sh,调整里面的jvm内存配置
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m
② 直接在三个节点上启动nameServer
nohup /app/rocketmq/rocketmq-4.8.0/bin/mqnamesrv &
# 检查日志
#JPS查看进程
③ 启动broker
#worker2机器,启动broker-a的master节点和broker-b的slave节点
nohup /app/rocketmq/rocketmq-4.8.0/bin/mqbroker -c /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-a.properties &
nohup /app/rocketmq/rocketmq-4.8.0/bin/mqbroker -c /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-b-s.properties &
#jps检查,1个NameSrvStartup进程和两个BrokerStartup进程
jps
#worker3机器,启动broker-b的master节点和broker-a的slave节点
nohup /app/rocketmq/rocketmq-4.8.0/bin/mqbroker -c /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-b.properties &
nohup /app/rocketmq/rocketmq-4.8.0/bin/mqbroker -c /app/rocketmq/rocketmq-4.8.0/conf/2m-2s-async/broker-a-s.properties &
#jps检查,1个NameSrvStartup进程和两个BrokerStartup进程
jps
④ 验证
#worker3发消息
/app/rocketmq/rocketmq-4.8.0/bin/tools.sh org.apache.rocketmq.example.quickstart.Producer
#worker2接收消息
/app/rocketmq/rocketmq-4.8.0/bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
搭建管理控制台
① 下载地址:https://github.com/apache/rocketmq-externals
② 进入rocket-console目录,使用maven进行编译
mvn clean package -Dmaven.test.skip=true
③ 上传jar包/app/rocketmq/rocketmq-console,并在当前目录新增application.properties,覆盖jar包默认的属性
rocketmq.config.namesrvAddr=worker1:9876;worker2:9876;worker3:9876
④ 执行
java -jar rocketmq-console-ng-1.0.1.jar
集群工作流程:
① 启动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建立连接通道,开始消费消息。
————————————————
版权声明:本文为CSDN博主「海是鹏印出的影」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36211262/article/details/125753057