由于云服务资源缺少,本教程居于单机环境下搭建集群
1.必须有jdk1.8的环境
RocketMQ运行版本下载地址:https://dlcdn.apache.org/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip
RocketMQ源码版本下载地址:https://dlcdn.apache.org/rocketmq/4.9.4/rocketmq-all-4.9.4-source-release.zip
先进入到soft/rocketmq目录
- >wget https://dlcdn.apache.org/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip
-
-
- >unzip rocketmq-all-4.9.4-bin-release.zip
或是下载后再上传到服务器里
但是要注意,RocketMQ默认预设的JVM内存是4G,这是RocketMQ给我们的最佳配置。但是通常我们用虚拟机的话都是不够4G内存的,所以需要调整下JVM内存大小。 用vim runserver.sh编辑这个脚本,在脚本中找到这一行调整内存大小为256M
- #进入bin目录
- cd rocketmq-all-4.9.4-bin-release/bin/
- #修改runserver.sh
- vim runserver.sh
JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=160m"
我们为了便于观察,这次搭建一个2主2从异步刷盘的集群,所以我们会使用conf/2m-2s-async下的配置文件,实际项目中,为了达到高可用,一般会使用dleger。预备设计的集群情况如下:
| 机器名 | nemaeServer节点部署 | broker节点部署 |
|---|---|---|
| worker1 | nameserver | |
| worker2 | nameserver | broker-a, broker-b-s |
| worker3 | nameserver | broker-b,broker-a-s |
所以修改的配置文件是进入rocketmq的config目录下修改2m-2s-async的配置文件。--只需要配置broker.conf。
在rocketmq的config目录下可以看到rocketmq建议的各种配置方式:
- 2m-2s-async: 2主2从异步刷盘(吞吐量较大,但是消息可能丢失),
- 2m-2s-sync:2主2从同步刷盘(吞吐量会下降,但是消息更安全),
- 2m-noslave:2主无从(单点故障),然后还可以直接配置broker.conf,进行单点环境配置。
- 而dleger就是用来实现主从切换的。集群中的节点会基于Raft协议随机选举出一个leader,其他的就都是follower。通常正式环境都会采用这种方式来搭建集群。
我们这次采用2m-2s-async的方式搭建集群。
- mkdir worker1
- mkdir worker2
- mkdir worker3
- #创建三个文件夹
- mkdir /soft/rocketmq/worker1/rocketmq-all-4.9.4-bin-release/
- mkdir /soft/rocketmq/worker2/rocketmq-all-4.9.4-bin-release/
- mkdir /soft/rocketmq/worker3/rocketmq-all-4.9.4-bin-release/
-
-
- #copy
- cp -r rocketmq-all-4.9.4-bin-release/* /soft/rocketmq/worker1/rocketmq-all-4.9.4-bin-release/
-
- cp -r rocketmq-all-4.9.4-bin-release/* /soft/rocketmq/worker2/rocketmq-all-4.9.4-bin-release/
-
- cp -r rocketmq-all-4.9.4-bin-release/* /soft/rocketmq/worker3/rocketmq-all-4.9.4-bin-release/
在worker2上先配置borker-a的master节点。先配置2m-2s-async/broker-a.properties
cd /soft/rocketmq/worker2/rocketmq-all-4.9.4-bin-release/conf/2m-2s-async/
3.3.1 第一组broker-a
vim broker-a.properties
然后把下面配置粘贴进 broker-a.properties
- #所属集群名字,名字一样的节点就在同一个集群内
- brokerClusterName=rocketmq-cluster
- #broker名字,名字一样的节点就是一组主从节点。
- brokerName=broker-a
- #brokerid,0就表示是Master,>0的都是表示 Slave
- brokerId=0
- #nameServer地址,分号分割
- namesrvAddr=106.112.12.85:9876;106.112.12.85.85:9877;106.112.12.85.85:9878
- #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
- defaultTopicQueueNums=4
- #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
- autoCreateTopicEnable=true
- #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
- autoCreateSubscriptionGroup=true
- #Broker 对外服务的监听端口
- listenPort=11912
- #删除文件时间点,默认凌晨 4点
- deleteWhen=04
- #文件保留时间,默认 48 小时
- fileReservedTime=120
- #commitLog每个文件的大小默认1G
- mapedFileSizeCommitLog=1073741824
- #ConsumeQueue每个文件默认存30W条,根据业务情况调整
- mapedFileSizeConsumeQueue=300000
- #destroyMapedFileIntervalForcibly=120000
- #redeleteHangedFileInterval=120000
- #检测物理文件磁盘空间
- diskMaxUsedSpaceRatio=88
- #存储路径
- storePathRootDir=/soft/rocketmq/worker2/store
- #commitLog 存储路径
- storePathCommitLog=/soft/rocketmq/worker2/store/commitlog
- #消费队列存储路径存储路径
- storePathConsumeQueue=/soft/rocketmq/worker2/store/consumequeue
- #消息索引存储路径
- storePathIndex=/soft/rocketmq/worker2/store/index
- #checkpoint 文件存储路径
- storeCheckpoint=/soft/rocketmq/worker2/store/checkpoint
- #abort 文件存储路径
- abortFile=/soft/rocketmq/worker2/store/abort
- #限制的消息大小
- maxMessageSize=65536
- #flushCommitLogLeastPages=4
- #flushConsumeQueueLeastPages=2
- #flushCommitLogThoroughInterval=10000
- #flushConsumeQueueThoroughInterval=60000
- #Broker 的角色
- #- ASYNC_MASTER 异步复制Master
- #- SYNC_MASTER 同步双写Master
- #- SLAVE
- brokerRole=ASYNC_MASTER
- #刷盘方式
- #- ASYNC_FLUSH 异步刷盘
- #- SYNC_FLUSH 同步刷盘
- flushDiskType=ASYNC_FLUSH
- #checkTransactionMessageEnable=false
- #发消息线程池数量
- #sendMessageThreadPoolNums=128
- #拉消息线程池数量
- #pullMessageThreadPoolNums=128
3.3.2 配置broker-b-s.properties
vim broker-b-s.properties
配置
- #所属集群名字,名字一样的节点就在同一个集群内
- brokerClusterName=rocketmq-cluster
- #broker名字,名字一样的节点就是一组主从节点。
- brokerName=broker-b
- #brokerid,0就表示是Master,>0的都是表示 Slave
- brokerId=1
- #nameServer地址,分号分割
- namesrvAddr=106.112.12.85:9876;106.112.12.85:9877;106.112.12.85:9878
- #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
- defaultTopicQueueNums=4
- #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
- autoCreateTopicEnable=true
- #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
- autoCreateSubscriptionGroup=true
- #Broker 对外服务的监听端口
- listenPort=21012
- #删除文件时间点,默认凌晨 4点
- deleteWhen=04
- #文件保留时间,默认 48 小时
- fileReservedTime=120
- #commitLog每个文件的大小默认1G
- mapedFileSizeCommitLog=1073741824
- #ConsumeQueue每个文件默认存30W条,根据业务情况调整
- mapedFileSizeConsumeQueue=300000
- #destroyMapedFileIntervalForcibly=120000
- #redeleteHangedFileInterval=120000
- #检测物理文件磁盘空间
- diskMaxUsedSpaceRatio=88
- #存储路径
- storePathRootDir=/soft/rocketmq/worker2/storeSlave
- #commitLog 存储路径
- storePathCommitLog=/soft/rocketmq/worker2/storeSlave/commitlog
- #消费队列存储路径存储路径
- storePathConsumeQueue=/soft/rocketmq/worker2/storeSlave/consumequeue
- #消息索引存储路径
- storePathIndex=/soft/rocketmq/worker2/storeSlave/index
- #checkpoint 文件存储路径
- storeCheckpoint=/soft/rocketmq/worker2/storeSlave/checkpoint
- #abort 文件存储路径
- abortFile=/soft/rocketmq/worker2/storeSlave/abort
- #限制的消息大小
- maxMessageSize=65536
- #flushCommitLogLeastPages=4
- #flushConsumeQueueLeastPages=2
- #flushCommitLogThoroughInterval=10000
- #flushConsumeQueueThoroughInterval=60000
- #Broker 的角色
- #- ASYNC_MASTER 异步复制Master
- #- SYNC_MASTER 同步双写Master
- #- SLAVE
- brokerRole=SLAVE
- #刷盘方式
- #- ASYNC_FLUSH 异步刷盘
- #- SYNC_FLUSH 同步刷盘
- flushDiskType=ASYNC_FLUSH
- #checkTransactionMessageEnable=false
- #发消息线程池数量
- #sendMessageThreadPoolNums=128
- #拉消息线程池数量
- #pullMessageThreadPoolNums=128
cd /soft/rocketmq/worker3/rocketmq-all-4.9.4-bin-release/conf/2m-2s-async/
3.4.1 broker-b.properties
vim broker-b.properties
配置
- #所属集群名字,名字一样的节点就在同一个集群内
- brokerClusterName=rocketmq-cluster
- #broker名字,名字一样的节点就是一组主从节点。
- brokerName=broker-b
- #brokerid,0就表示是Master,>0的都是表示 Slave
- brokerId=0
- #nameServer地址,分号分割
- namesrvAddr=106.112.12.85:9876;106.112.12.85:9877;106.112.12.85:9878
- #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
- defaultTopicQueueNums=4
- #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
- autoCreateTopicEnable=true
- #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
- autoCreateSubscriptionGroup=true
- #Broker 对外服务的监听端口
- listenPort=20913
- #删除文件时间点,默认凌晨 4点
- deleteWhen=04
- #文件保留时间,默认 48 小时
- fileReservedTime=120
- #commitLog每个文件的大小默认1G
- mapedFileSizeCommitLog=1073741824
- #ConsumeQueue每个文件默认存30W条,根据业务情况调整
- mapedFileSizeConsumeQueue=300000
- #destroyMapedFileIntervalForcibly=120000
- #redeleteHangedFileInterval=120000
- #检测物理文件磁盘空间
- diskMaxUsedSpaceRatio=88
- #存储路径
- storePathRootDir=/soft/rocketmq/worker3/store
- #commitLog 存储路径
- storePathCommitLog=/soft/rocketmq/worker3/store/commitlog
- #消费队列存储路径存储路径
- storePathConsumeQueue=/soft/rocketmq/worker3/store/consumequeue
- #消息索引存储路径
- storePathIndex=/soft/rocketmq/worker3/store/index
- #checkpoint 文件存储路径
- storeCheckpoint=/soft/rocketmq/worker3/store/checkpoint
- #abort 文件存储路径
- abortFile=/soft/rocketmq/worker3/store/abort
- #限制的消息大小
- maxMessageSize=65536
- #flushCommitLogLeastPages=4
- #flushConsumeQueueLeastPages=2
- #flushCommitLogThoroughInterval=10000
- #flushConsumeQueueThoroughInterval=60000
- #Broker 的角色
- #- ASYNC_MASTER 异步复制Master
- #- SYNC_MASTER 同步双写Master
- #- SLAVE
- brokerRole=ASYNC_MASTER
- #刷盘方式
- #- ASYNC_FLUSH 异步刷盘
- #- SYNC_FLUSH 同步刷盘
- flushDiskType=ASYNC_FLUSH
- #checkTransactionMessageEnable=false
- #发消息线程池数量
- #sendMessageThreadPoolNums=128
- #拉消息线程池数量
- #pullMessageThreadPoolNums=128
3.4.2 broker-a-s.properties
vim broker-a-s.properties
配置
- #所属集群名字,名字一样的节点就在同一个集群内
- brokerClusterName=rocketmq-cluster
- #broker名字,名字一样的节点就是一组主从节点。
- brokerName=broker-a
- #brokerid,0就表示是Master,>0的都是表示 Slave
- brokerId=1
- #nameServer地址,分号分割
- namesrvAddr=106.112.12.85:9876;106.112.12.85:9877;106.112.12.85:9878
- #在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
- defaultTopicQueueNums=4
- #是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
- autoCreateTopicEnable=true
- #是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
- autoCreateSubscriptionGroup=true
- #Broker 对外服务的监听端口
- listenPort=21013
- #删除文件时间点,默认凌晨 4点
- deleteWhen=04
- #文件保留时间,默认 48 小时
- fileReservedTime=120
- #commitLog每个文件的大小默认1G
- mapedFileSizeCommitLog=1073741824
- #ConsumeQueue每个文件默认存30W条,根据业务情况调整
- mapedFileSizeConsumeQueue=300000
- #destroyMapedFileIntervalForcibly=120000
- #redeleteHangedFileInterval=120000
- #检测物理文件磁盘空间
- diskMaxUsedSpaceRatio=88
- #存储路径
- storePathRootDir=/soft/rocketmq/worker3/storeSlave
- #commitLog 存储路径
- storePathCommitLog=/soft/rocketmq/worker3/storeSlave/commitlog
- #消费队列存储路径存储路径
- storePathConsumeQueue=/soft/rocketmq/worker3/storeSlave/consumequeue
- #消息索引存储路径
- storePathIndex=/soft/rocketmq/worker3/storeSlave/index
- #checkpoint 文件存储路径
- storeCheckpoint=/soft/rocketmq/worker3/storeSlave/checkpoint
- #abort 文件存储路径
- abortFile=/soft/rocketmq/worker3/storeSlave/abort
- #限制的消息大小
- maxMessageSize=65536
- #flushCommitLogLeastPages=4
- #flushConsumeQueueLeastPages=2
- #flushCommitLogThoroughInterval=10000
- #flushConsumeQueueThoroughInterval=60000
- #Broker 的角色
- #- ASYNC_MASTER 异步复制Master
- #- SYNC_MASTER 同步双写Master
- #- SLAVE
- brokerRole=SLAVE
- #刷盘方式
- #- ASYNC_FLUSH 异步刷盘
- #- SYNC_FLUSH 同步刷盘
- flushDiskType=ASYNC_FLUSH
- #checkTransactionMessageEnable=false
- #发消息线程池数量
- #sendMessageThreadPoolNums=128
- #拉消息线程池数量
- #pullMessageThreadPoolNums=128
- mkdir -p /soft/rocketmq/worker3/storeSlave/{commitlog,consumequeue,index}
-
-
-
- mkdir -p /soft/rocketmq/worker2/storeSlave/{commitlog,consumequeue,index}
-
-
-
- mkdir -p /soft/rocketmq/worker3/store/{commitlog,consumequeue,index}
-
-
-
- mkdir -p /soft/rocketmq/worker2/store/{commitlog,consumequeue,index}
这样broker就配置完成了。
需要注意的配置项:1、同一机器上两个实例的store目录不能相同,否则会报错 Lock failed,MQ already started
2、同一机器上两个实例的listenPort也不能相同。否则会报端口占用的错
nameserver不需要进行配置,直接启动就行。这也看出nameserver是无状态的
由于是单机运行的,故不能运行在同一个端口上
4.1.1 修改worker2
- touch /soft/rocketmq/worker2/rocketmq-all-4.9.4-bin-release/conf/application.properties
-
- vim /soft/rocketmq/worker2/rocketmq-all-4.9.4-bin-release/conf/application.properties
添加配置
listenPort=9877
4.1.2 修改worker3
- touch /soft/rocketmq/worker3/rocketmq-all-4.9.4-bin-release/conf/application.properties
-
- vim /soft/rocketmq/worker3/rocketmq-all-4.9.4-bin-release/conf/application.properties
添加配置
listenPort=9878
第一个节点
- cd /soft/rocketmq/worker1/rocketmq-all-4.9.4-bin-release/bin/
-
-
- nohup sh mqnamesrv &
第二个节点
- cd /soft/rocketmq/worker2/rocketmq-all-4.9.4-bin-release/bin/
-
-
- nohup sh mqnamesrv -c /soft/rocketmq/worker2/rocketmq-all-4.9.4-bin-release/conf/application.properties &
第三个节点
- cd /soft/rocketmq/worker3/rocketmq-all-4.9.4-bin-release/bin/
-
-
- nohup sh mqnamesrv -c /soft/rocketmq/worker3/rocketmq-all-4.9.4-bin-release/conf/application.properties &
启动完成每个节点的nohup.out里面都可以看到启动成功的日志
- Java HotSpot(TM) 64-Bit Server VM warning: Using the DefNew young collector with the CMS collector is deprecated and will likely be removed in a future release
- Java HotSpot(TM) 64-Bit Server VM warning: UseCMSCompactAtFullCollection is deprecated and will likely be removed in a future release.
- load config properties file OK, /soft/rocketmq/worker3/rocketmq-all-4.9.4-bin-release/conf/application.properties
- The Name Server boot success. serializeType=JSON
worker2上启动broker-a的master节点和broker-b的slave节点
- nohup sh mqbroker -c /soft/rocketmq/worker2/rocketmq-all-4.9.4-bin-release/conf/2m-2s-async/broker-a.properties &
-
-
-
- nohup sh mqbroker -c /soft/rocketmq/worker2/rocketmq-all-4.9.4-bin-release/conf/2m-2s-async/broker-b-s.properties &
在work3上启动broker-b的master节点和broker-a的slave节点
- nohup sh mqbroker -c /soft/rocketmq/worker3/rocketmq-all-4.9.4-bin-release/conf/2m-2s-async/broker-b.properties &
-
-
- nohup sh mqbroker -c /soft/rocketmq/worker3/rocketmq-all-4.9.4-bin-release/conf/2m-2s-async/broker-a-s.properties &
启动slave时,如果遇到报错 Lock failed,MQ already started ,那是因为有多个实例共用了同一个storePath造成的,这时就需要调整store的路径。