1. 准备环境
- 准备好三台虚拟机,下面是我的虚拟机的一些基本信息
名称 | ip地址 |
---|---|
worker0 | 10.117.33.135 |
worker1 | 10.117.39.202 |
worker2 | 10.117.9.52 |
- 三台虚拟机都已经部署了rabbitMQ以及maven和jdk环境
- 防火墙都已经关闭了
2. 修改主机名
通过修改主机名,三台虚拟机可以通过主机名来互相访问了(三台主机都要配置)
vim /etc/hosts
10.117.33.135 worker0
10.117.39.202 worker1
10.117.9.52 worker2
3. 免密登录配置
使用ssh-keygen
生成密钥(三个机器都要生成)
ssh-keygen
将生成的密钥进行互相分发
先分发worker0的密钥
ssh-copy-id worker0
ssh-copy-id worker1
ssh-copy-id worder2
同样的操作,将worker1以及worker2的密钥也进行一个分发
测试一下看是否可以进行免密登录:这里我使用worker1来登录worker2
ssh worker2
可以发现免密登录成功
4. 配置RocketMQ集群
使用conf/2m-2s-async
下的配置文件搭建一个2主2从的异步刷盘集群,集群的设计情况如下:
机器名 | nameserver节点部署 | broker节点部署 |
---|---|---|
worker0 | nameServer | |
worker1 | nameServer | broker-a,broker-b-s |
worker2 | nameServer | broker-b,broker-a-s |
可以看出上面的配置中,worker0作为nameserver服务器(三个机器都部署了nameserver),woker1与worke2在不同的集群中互为主从节点
配置方式介绍:conf目录下存在三种配置方式
- 2m-2s-async:2主2从异步刷盘(吞吐量较大,但是消息可能会丢失)
- 2m-2s-sync:2主2从同步刷盘(吞吐量会下降,但是消息更安全)
- 2m-noslave:2主无从(单点故障问题)。然后还可以直接配置broker.conf,进行单点环境部署
- dleger就是用来实现主从切换的,集群中的节点会基于Raft协议随机选择一个leader,其它的都是follows,通常正式环境都会采用这种方式来搭建集群
5. 搭建RocketMQ集群
首先保证RocketMQ环境在三台机器上都已经安装了,没有安装的参考我这篇博客
- 进入worker1机器的RocketMQ的目录下的
2m-2s-async
的目录下
根据前面的规划,worker2作为broker-a的主节点,作为broker-b的从节点
- 配置worker1
首先配置broker-a.properties:即进行brokera的主节点配置
#所属集群名字,名字一样的节点在一个集群
brokerClusterName=DefaultCluster
#broker名字,名字一样的节点就是一组主从节点
brokerName=broker.a
#brokerId,0表示是master,大于0表示是Slave
brokerId=0
#nameserver地址,分号分割
namesrvAddr=worker0:9876;worker1:9876;worker2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许broler自动创建订阅组,建议线下开启,线上关闭
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=/usr/local/rocketStore
#commitlog存储路径
storePathCommitLog=/usr/local/rocketStore/commitlog
#消费队列存储路径
storePathConsumeQueue=/usr/local/rocketStore/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketStore/index
#checkpoint文件存储路径
storeCheckpoint=/usr/local/rocketStore/checkpoint
#abort文件存储路径
abortFile=/usr/local/rocketStore/abort
#限制消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushComsumeQueueThoroughInterval=60000
#broker的角色
#-ASYNC_MASTER异步复制Master
#-SYNC_MASTER同步双写Master
#-SLAVE
brokerRole=SLAVE
#刷盘方式
#-ASYNC_FLUSH:异步刷盘
#-SYNC_FLUSH:同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=falise
#发消息的线程池数量
#sendMessageThreadPoolNums=128
#拉消息的线程池数量
#pullMessageThreadPoolNums=128
然后配置broker-b-s.properties:即进行brokerb的从节点配置
#所属集群名字,名字一样的节点在一个集群
brokerClusterName=DefaultCluster
#broker名字,名字一样的节点就是一组主从节点
brokerName=broker.b
#brokerId,0表示是master,大于0表示是Slave
brokerId=1
#nameserver地址,分号分割
namesrvAddr=worker0:9876;worker1:9876;worker2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许broler自动创建订阅组,建议线下开启,线上关闭
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=/usr/local/rocketStoreslave
#commitlog存储路径
storePathCommitLog=/usr/local/rocketStoreslave/commitlog
#消费队列存储路径
storePathConsumeQueue=/usr/local/rocketStoreslave/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketStoreslave/index
#checkpoint文件存储路径
storeCheckpoint=/usr/local/rocketStoreslave/checkpoint
#abort文件存储路径
abortFile=/usr/local/rocketStoreslave/abort
#限制消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushComsumeQueueThoroughInterval=60000
#broker的角色
#-ASYNC_MASTER异步复制Master
#-SYNC_MASTER同步双写Master
#-SLAVE
brokerRole=ASYNC_MASTER
#刷盘方式
#-ASYNC_FLUSH:异步刷盘
#-SYNC_FLUSH:同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=falise
#发消息的线程池数量
#sendMessageThreadPoolNums=128
#拉消息的线程池数量
#pullMessageThreadPoolNums=128
到此worker1机器就配置完毕了
- 配置worker2
进入worker2机器的RocketMQ的目录下的2m-2s-async
的目录下
首先配置broker-b.properties:即进行brokerb的主节点配置
#所属集群名字,名字一样的节点在一个集群
brokerClusterName=DefaultCluster
#broker名字,名字一样的节点就是一组主从节点
brokerName=broker.b
#brokerId,0表示是master,大于0表示是Slave
brokerId=0
#nameserver地址,分号分割
namesrvAddr=worker0:9876;worker1:9876;worker2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许broler自动创建订阅组,建议线下开启,线上关闭
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=/usr/local/rocketStore
#commitlog存储路径
storePathCommitLog=/usr/local/rocketStore/commitlog
#消费队列存储路径
storePathConsumeQueue=/usr/local/rocketStore/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketStore/index
#checkpoint文件存储路径
storeCheckpoint=/usr/local/rocketStore/checkpoint
#abort文件存储路径
abortFile=/usr/local/rocketStore/abort
#限制消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushComsumeQueueThoroughInterval=60000
#broker的角色
#-ASYNC_MASTER异步复制Master
#-SYNC_MASTER同步双写Master
#-SLAVE
brokerRole=SLAVE
#刷盘方式
#-ASYNC_FLUSH:异步刷盘
#-SYNC_FLUSH:同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=falise
#发消息的线程池数量
#sendMessageThreadPoolNums=128
#拉消息的线程池数量
#pullMessageThreadPoolNums=128
然后配置broker-a-s.properties:即进行brokera的从节点配置
#所属集群名字,名字一样的节点在一个集群
brokerClusterName=DefaultCluster
#broker名字,名字一样的节点就是一组主从节点
brokerName=broker.a
#brokerId,0表示是master,大于0表示是Slave
brokerId=1
#nameserver地址,分号分割
namesrvAddr=worker0:9876;worker1:9876;worker2:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许Broker自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许broler自动创建订阅组,建议线下开启,线上关闭
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=/usr/local/rocketStoreslave
#commitlog存储路径
storePathCommitLog=/usr/local/rocketStoreslave/commitlog
#消费队列存储路径
storePathConsumeQueue=/usr/local/rocketStoreslave/consumequeue
#消息索引存储路径
storePathIndex=/usr/local/rocketStoreslave/index
#checkpoint文件存储路径
storeCheckpoint=/usr/local/rocketStoreslave/checkpoint
#abort文件存储路径
abortFile=/usr/local/rocketStoreslave/abort
#限制消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushComsumeQueueThoroughInterval=60000
#broker的角色
#-ASYNC_MASTER异步复制Master
#-SYNC_MASTER同步双写Master
#-SLAVE
brokerRole=SLAVE
#刷盘方式
#-ASYNC_FLUSH:异步刷盘
#-SYNC_FLUSH:同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=falise
#发消息的线程池数量
#sendMessageThreadPoolNums=128
#拉消息的线程池数量
#pullMessageThreadPoolNums=128
worker2就到此配置完了
6. 启动集群
- 启动三个机器的nameserver服务(在bin目录下)
nohup sh ./mqnamesrv &
#观察日志查看是否启动成功
cat -f nohup.out
- 在worker1上启动broker-a节点和broker-b-s节点
nohup sh ./mqbroker -c ../conf/2m-2s-async/broker-a.properties &
nohup sh ./mqbroker -c ../conf/2m-2s-async/broker-b-s.properties &
#查看日志观察是否启动成功
cat -f nohup.out
- 在worker2上启动broker-a-s节点和broker-b节点
nohup sh ./mqbroker -c ../conf/2m-2s-async/broker-a-s.properties &
nohup sh ./mqbroker -c ../conf/2m-2s-async/broker-b.properties &
#查看日志观察是否启动成功
cat -f nohup.out
集群搭建完成