集群模式:双主双从的同步集群模式(2m-2s-async)
1. 准备环境
1.1 服务器
使用两台 Linux(centos7) 的服务器模拟集群
序号 | IP | 角色 | 服务 | 端口 |
---|---|---|---|---|
1 | 192.168.56.113 | NameServer | NameServer | 9876 |
Broker | Master1 | 10909,10911,10912 | ||
Slave2 | 10909,10911,10912 | |||
2 | 192.168.56.114 | NameServer | NameServer | 9876 |
Broker | Master2 | 10909,10911,10912 | ||
Slave1 | 10909,10911,10912 |
1.2 rocketMQ
版本:4.4.0
安装rocketMQ需要JDK1.8(64)位或以上的java环境
解压并移动到/usr/local
文件夹下
1 | # 解压 unzip命令无法识别时需要先执行 yum install -y unzip 进行安装 |
目录结构:
1.3 关闭防火墙
宿主机需要远程访问虚拟机的服务时,需要开放相关端口,或者直接关闭防火墙
直接关闭防火墙命令
1 | # 关闭防火墙 |
或者只开放需要的端口(更安全)
需要开放的端口:
9876
:NameServer注册端口
10909
:vip通道端口
10911
:接受客户端连接的监听端口
10912
:Master监听Slaver开放的端口
1 | firewall-cmd --zone=public --add-port=9876/tcp --permanent |
重置防火墙
1 | firewall-cmd --reload |
查看开放的端口列表
1 | firewall-cmd --zone=public --list-ports |
2. 集群搭建
2.1 Broker配置属性详解
属性 | 说明 |
---|---|
brokerClusterName | 所属集群名字,默认值 DefaultCluster |
brokerName | Broker 的名称,不同的broker配置文件值不能相同 |
brokerId | broker id, 0 表示 master, 其他的正整数表示 slave |
namesrvAddr | NameServer地址,多个以分号分隔 |
brokerIP1 | 当前broker监听的IP,一般会自动识别本机ip,但在多网卡的情况下可能会识别错误 |
brokerIP2 | 存在主从 broker 时,如果在 broker 主节点上配置了 brokerIP2 属性,broker 从节点会连接主节点配置的 brokerIP2 进行同步 |
defaultTopicQueueNums | 创建topic时默认的队列数量,默认值 4 |
autoCreateTopicEnable | 是否允许 Broker 自动创建Topic,建议线上关闭 |
autoCreateSubscriptionGroup | 是否允许 Broker 自动创建订阅组,建议线上关闭 |
listenPort | 接受客户端连接的监听端口,默认值 10911 |
haListenPort | 表示Master监听Slave请求的端口,默认为服务端口+1 |
deleteWhen | 在每天的什么时间删除已经超过文件保留时间的 commit log,默认凌晨 4点 |
fileReservedTime | 以小时计算的文件保留时间,默认值72 |
mapedFileSizeCommitLog | commitLog每个文件的大小,默认1G |
mapedFileSizeConsumeQueue | ConsumeQueue每个文件默认存30W条,根据业务情况调整 |
destroyMapedFileIntervalForcibly | 默认值 1000 * 120 |
redeleteHangedFileInterval | 默认值 1000 * 120 |
diskMaxUsedSpaceRatio | 检测物理文件磁盘空间 |
storePathRootDir | 存储根目录 |
storePathCommitLog | 存储 commit log 的路径 |
storePathConsumeQueue | 存储 consume queue 的路径 |
storePathIndex | 消息索引存储路径 |
storeCheckpoint | checkpoint 文件存储路径 |
abortFile | abort 文件存储路径 |
maxMessageSize | 消息的最大长度,默认值:1024 * 1024 * 4,单位:字节 |
flushCommitLogLeastPages | 刷新 CommitLog 时要刷新多少页,默认4 |
flushConsumeQueueLeastPages | 刷新消费队列时要刷新多少页,默认2 |
flushCommitLogThoroughInterval | 默认值 1000 * 10 |
flushConsumeQueueThoroughInterval | 默认值 1000 * 60 |
brokerRole | Broker 的角色,默认值 ASYNC_MASTER - ASYNC_MASTER 异步复制Master - SYNC_MASTER 同步双写Master - SLAVE |
flushDiskType | 刷盘方式,默认 ASYNC_FLUSH - ASYNC_FLUSH 异步刷盘,broker 利用刷盘一组消息的模式,可以取得更好的性能 - SYNC_FLUSH 同步刷盘,broker 保证在收到确认生产者之前将消息刷盘 |
checkTransactionMessageEnable | |
sendMessageThreadPoolNums | 发送线程个数,建议配置成 Cpu 核数 |
pullMessageThreadPoolNums | 拉消息线程池数量 |
更多其他属性请参考MessageStoreConfig
2.2 修改Broker配置文件
1. master1
服务器:192.168.56.113
1 | vim /usr/local/rocketmq-4.4.0/conf/2m-2s-sync/broker-a.properties |
修改配置如下:
1 | brokerClusterName=rocketmq-cluster |
2. slaver2
服务器:192.168.56.113
1 | vim /usr/local/rocketmq-4.4.0/conf/2m-2s-sync/broker-b-s.properties |
修改配置如下:
1 | brokerClusterName=rocketmq-cluster |
3. master2
服务器:192.168.56.114
1 | vim /usr/local/rocketmq-4.4.0/conf/2m-2s-sync/broker-b.properties |
修改配置如下:
1 | brokerClusterName=rocketmq-cluster |
4. slaver1
服务器:192.168.56.114
1 | vim /usr/local/rocketmq-4.4.0/conf/2m-2s-sync/broker-a-s.properties |
修改配置如下:
1 | brokerClusterName=rocketmq-cluster |
5. 配置文件小结
- 同一集群下,
brokerClusterName
字段(所属集群名字)值必须一致brokerName
字段(Broker名称)值,对于不同的配置文件不能相同,但Master及其对应的Slaver可以保持一致storePathRootDir
等存储目录字段,一般情况下会保持一致,但是由于此次为每台虚拟机启动两个Broker进程,若存储目录保持一致会导致启动失败,所以这里Master和Slaver的消息存储目录的路径是不相同的- RocketMQ存储目录的字段配置后,使用配置文件作为参数启动时,若文件不存在,则会自动创建文件
2.3 修改启动脚本
RocketMQ默认JVM配置过大,启动服务前需要修改其配置
1) runbroker.sh
1 | vim /usr/local/rocketmq-4.4.0/bin/runbroker.sh |
需要根据内存大小进行适当的对JVM参数进行调整:
1 | JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m" |
2) runserver.sh
1 | vim /usr/local/rocketmq-4.4.0/bin/runserver.sh |
1 | JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" |
2.4 服务启动
1) 启动 NameServer 集群
分别在
192.168.56.113
和192.168.56.114
上启动 NameServer
1 | cd /usr/local/rocketmq-4.4.0/bin |
2) 启动 Broker 集群
在
192.168.56.113
上启动 master1 和 slaver2
1 | cd /usr/local/rocketmq-4.4.0/bin |
在
192.168.56.114
上启动 master2 和 slaver1
1 | cd /usr/local/rocketmq-4.4.0/bin |
查看启动状态
1 | jps |
1 | netstat -tunlp | grep java |
端口说明:
9876
:NameServer服务注册端口10909
:vip通道的监听端口10911
:Master监听端口10912
:Master监听Slave请求的端口
3. 集群监控平台搭建
RocketMQ有一个对其扩展的开源项目rocketmq-externals,其中的rocketmq-console子模块便是RocketMQ的控制台管理项目了
下载项目:
1 | git clone https://github.com/apache/rocketmq-externals.git |
没有安装git可以直接去github下载 rocketmq-externals
进入 rocketmq-console 目录:
修改NameServer集群配置:
1 | # 打开文件 rocketmq-externals-master/rocketmq-console/src/main/resources/application.properties |
打开cmd,并执行打包命令:
1 | mvn clean package -Dmaven.test.skip=true |
打包完成后的jar包就在 rocketmq-console/target
目录下了,可以直接在本地运行,也可以复制到虚拟机上运行,运行命令:
1 | java -jar rocketmq-console-ng-2.0.0.jar |
也可以在后台运行
1 | nohup java -jar rocketmq-console-ng-2.0.0.jar & |
部署完成后就可以通过浏览器访问8080端口来查看自己部署的RocketMQ集群了,其他使用可以参考官方中文文档