2022/2/3 23:12:38

本文主要是介绍,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

在本机搭建集群环境:

  1. 简便快速
  2. 不需要处理端口开放等防火墙设置

前提条件:

  1. 修改好JVM参数,比如将JVM的Xms等参数调小(默认4GB)
  2. 在本机装好rocketMQ并成功运行(可以通过本地单机起nameserver服务,跑官方提供的demo验证

创建NameServer集群

复制原RocketMQ包

原有RocketMQ包如下位置

image-20211213203629164

复制一份在原地,并且修改名字为 rocketmq-all-4.7.0-bin-release-nameserver

新增两个配置文件

进入刚刚创建的 rocketmq-all-4.7.0-bin-release-nameserver 包,在其conf包下面创建如下两个文件:

  • namesrv1.properties
  • namesrv2.properties

分别在这两个.properties文件里面输入 listenPort=19876和listenPort=29876。

编写并启动start.sh脚本

返回conf包上一层,创建启动脚本文件start.sh。在这个脚本里面编写如下启动语句:

echo "starting nameserver1"
nohup sh bin/mqnamesrv -c conf/namesrv1.properties &
echo "started nameserver1"
echo "starting nameserver2"
nohup sh bin/mqnamesrv -c conf/namesrv2.properties &
echo "started nameserver2"

接着就可以启动两个运行在端口号是19876和29876的两个NameServer了。效果如下:

image-20211213203230645

搭建Broker集群

配置文件修改

首先将还是将原来的RocketMQ包复制并命名为 rocketmq-all-4.7.0-bin-release-sync 用于搭建Broker集群。在/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync/conf/2m-2s-sync包下面,存在这样几个配置文件。

  1. broker-a-s.properties
  2. broker-a.properties
  3. broker-b-s.properties
  4. broker-b.properties

配置文件的要点

这一小节是在在配置完成之后,总结出来写的这一部分内容。

brokerName配置错误:

在第一次配置配置完成之后,运行demo,但是发现使用任何消息发送的方式发送的消息,都会出现返回的发送状态SendResult对象当中出现的是SLAVE_NOT_AVAILABLE的错误信息(正确应该是SEND_OK)。

直觉告诉原因就是Master找不到对应的Slave,参考资料和回查配置文件的时候,发现下面配置的四个文件中,每个 brokerName配置的brokerName都不一样,导致了每个broker都是孤立的主从节点。

正确的方式应该是broker-a、broker-a-s互为主从节点,那么就设定为同一名字“broker-a”,这样brokerRole=SYNC_MASTER的主节点在接受到消息的时候,如果需要同步消息,就能找到作为brokerRole=SLAVE的从节点。

总结:互为主从的Broker的brokerName=配置项必须一样!

brokerRole属性解析

brokerRole包含三种属性,其中Master相关的属性包含SYNC_MASTER和ASYNC_MASTER,SLAVE相关的只有一个。SYNC_MASTER这种属性既包含了同步机制,也就是主从是否同步完消息再返回OK状态(如果是就为SYNC,否则为ASYNC)

关于刷盘:

什么是刷盘,就是将消息写入存储物质,这个存储物质可以是磁盘、也可以是Page Cache 页高速缓冲存储器

Page Cache 页高速缓冲存储器

用来缓存一些磁盘上文件内容的内存,一页为4K。用户进程调用read()系统调用,内核先去内存查看是否命中,否则就去磁盘读取(速度很慢)。

Linux中的Page Cache

Broker-a的配置

配置其中一个Slave,设置监听消息的端口为10211。

#所属集群名字
brokerClusterName=rocketmq-cluster_2m-2s-sync
#broker名字,注意此处不同的配置文件填写的不一样 例如:在a.properties 文件中写 broker-a 在b.properties 文件中写 broker-b
brokerName=broker-a
#0 表示 Master,>0 表示 Slave
brokerId=0 
#两个nameserver的对应的ip地址。
namesrvAddr=127.0.0.1:19876;127.0.0.1:29876
#Broker 对外服务的监听端口
listenPort=10211
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#- Broker 的角色;SLAVE;SYNC_MASTER 同步双写Master;ASYNC_MASTER 异步复制Master
brokerRole=SYNC_MASTER
#- 刷盘方式:SYNC_FLUSH 同步刷盘; ASYNC_FLUSH 异步刷盘
flushDiskType=SYNC_FLUSH



#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径和一些配置消息的根目录(应该是只用配置此路径,二下面的几条路径配置可以省略)
storePathRootDir=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a/store

#commitLog 存储路径
storePathCommitLog=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a/store/consumequeue
#消息索引存储路径
storePathIndex=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a/store/index
#checkpoint 文件存储路径
storeCheckpoint=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a/store/checkpoint
#abort 文件存储路径
abortFile=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a/store/abort

#限制的消息大小
maxMessageSize=65536

需要额外注意的是,RocketMQ会自动将接受到的消息,自动的持久化,持久化的位置默认是root的home路径下,上面的如下部分就是将这个持久化的位置修改为了指定路径/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a下面。这样命名和指定的好处就是每一个Broker的消息持久化的路径都不不同。

#存储路径
storePathRootDir=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a/store
#commitLog 存储路径
storePathCommitLog=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a/store/commitlog
#消费队列存储路径存储路径
storePathConsumeQueue=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a/store/consumequeue
#消息索引存储路径
storePathIndex=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a/store/index
#checkpoint 文件存储路径
storeCheckpoint=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a/store/checkpoint
#abort 文件存储路径
abortFile=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a/store/abort

全部Broker启动之后,会在指定目录下出现如下文件夹:

image-20211213210220950

另外,集群的名称是四个角色都要归属于同一个集群的,所以在brokerClusterName这一项的配置全部为rocketmq-cluster_2m-2s-sync。

brokerRole=SYNC_MASTER 首先标注了当前这个节点的角色是Slave,另外也说明了主从复制方式是同步,表示:Broker和Slave在完成消息同步之后,才会给消息的发送者一个响应。

启动之后可以打开jps查看当前运行的Java进程,可以看到两个NameServer和Broker启动在本机上。

image-20211213205328352

Broker-a-s的配置

作为一个Slave,首先明显的标识就是brokerId = 1,另外注意的是这个Slave的对外消息的监听端口是20111。

brokerClusterName=rocketmq-cluster_2m-2s-sync
brokerName=broker-a
brokerId=1
namesrvAddr=127.0.0.1:19876;127.0.0.1:29876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=20111
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
diskMaxUsedSpaceRatio=88
storePathRootDir=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a-s/store
storePathCommitLog=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a-s/store/commitlog
storePathConsumeQueue=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a-s/store/consumequeue
storePathIndex=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a-s/store/index
storeCheckpoint=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a-s/store/checkpoint
abortFile=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-a-s/store/abort
maxMessageSize=65536
brokerRole=SLAVE
flushDiskType=SYNC_FLUSH

Broker-b的配置

作为Broker-b的主节点,brokerRole=SYNC_MASTER和brokerId=0都必须标注上去。监听消息的端口为10311

brokerClusterName=rocketmq-cluster_2m-2s-sync
brokerName=broker-b
brokerId=0
namesrvAddr=127.0.0.1:19876;127.0.0.1:29876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=10311
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
diskMaxUsedSpaceRatio=88
storePathRootDir=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-b/store
storePathCommitLog=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-b/store/commitlog
storePathConsumeQueue=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-b/store/consumequeue
storePathIndex=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-b/store/index
storeCheckpoint=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-b/store/checkpoint
abortFile=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-b/store/abort
maxMessageSize=65536
brokerRole=SYNC_MASTER
flushDiskType=SYNC_FLUSH

Broker-b-s的配置

同样是Broker-b,但是-s的后缀、brokerRole和brokerId的配置项都表明其是一个Slave。监听消息的端口号是10411

brokerClusterName=rocketmq-cluster_2m-2s-sync
brokerName=broker-b
brokerId=1
namesrvAddr=127.0.0.1:19876;127.0.0.1:29876
defaultTopicQueueNums=4
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
listenPort=10411
deleteWhen=04
fileReservedTime=120
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=300000
diskMaxUsedSpaceRatio=88
storePathRootDir=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-b-s/store
storePathCommitLog=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-b-s/store/commitlog
storePathConsumeQueue=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-b-s/store/consumequeue
storePathIndex=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-b-s/store/index
storeCheckpoint=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-b-s/store/checkpoint
abortFile=/Users/apple/dev/rocketmq-all-4.7.0-bin-release-sync_broker-b-s/store/abort
maxMessageSize=65536 
brokerRole=SLAVE
flushDiskType=SYNC_FLUSH

到目前为止,Broker-a监听10211、Broker-a-s监听20211、Broker-b监听10311、Broker-b-s监听10411。2M2S的集群的配置文件修改就到此配置完毕,主要的一些配置项分别如下:

  1. namesrvAddr
  2. listenPort
  3. brokerId
  4. brokerRole

编写并启动Broker集群

编写

echo "starting broker-a"
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a.properties &
echo "started broker-a"
echo "starting broker-a-s"
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a-s.properties &
echo "started broker-a-s"
echo "starting broker-b"
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b.properties &
echo "started broker-b"
echo "starting broker-b-s"
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-b-s.properties &
echo "started broker-b-s"

rocketmq-all-4.7.0-bin-release-sync 下创建start.sh脚本文件。

nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a.properties &

-c 参数的作用是指定配置文件来启动Broker程序,指定的配置文件路径紧跟在后面。

验证搭建成功

编写并保存之后,启动此sh脚本文件即可启动Broker集群。使用jps命令验证。

image-20211213215342381

可见,四个Broker= 两个Master + 两个Slave,配合两个NameServer就构成了本次想要搭建的集群。如果是在四台机器上面搭建此集群,则不会出现这种输出情况。

使用如下



这篇关于的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程