在本机搭建集群环境:
- 简便快速
- 不需要处理端口开放等防火墙设置
前提条件:
- 修改好JVM参数,比如将JVM的Xms等参数调小(默认4GB)。
- 在本机装好rocketMQ并成功运行(可以通过本地单机起nameserver服务,跑官方提供的demo验证)
原有RocketMQ包如下位置
复制一份在原地,并且修改名字为 rocketmq-all-4.7.0-bin-release-nameserver
进入刚刚创建的 rocketmq-all-4.7.0-bin-release-nameserver 包,在其conf包下面创建如下两个文件:
分别在这两个.properties文件里面输入 listenPort=19876和listenPort=29876。
返回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了。效果如下:
首先将还是将原来的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包下面,存在这样几个配置文件。
这一小节是在在配置完成之后,总结出来写的这一部分内容。
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
配置其中一个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启动之后,会在指定目录下出现如下文件夹:
另外,集群的名称是四个角色都要归属于同一个集群的,所以在brokerClusterName这一项的配置全部为rocketmq-cluster_2m-2s-sync。
brokerRole=SYNC_MASTER 首先标注了当前这个节点的角色是Slave,另外也说明了主从复制方式是同步,表示:Broker和Slave在完成消息同步之后,才会给消息的发送者一个响应。
启动之后可以打开jps查看当前运行的Java进程,可以看到两个NameServer和Broker启动在本机上。
作为一个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的主节点,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的后缀、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的集群的配置文件修改就到此配置完毕,主要的一些配置项分别如下:
- namesrvAddr
- listenPort
- brokerId
- brokerRole
编写
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命令验证。
可见,四个Broker= 两个Master + 两个Slave,配合两个NameServer就构成了本次想要搭建的集群。如果是在四台机器上面搭建此集群,则不会出现这种输出情况。
使用如下