# RocketMQ集群部署说明 #
## 一 RocketMQ概述 ##
RocketMQ 物理部署结构
! [](https://i.imgur.com/14coz1W.png)
如图所示,RocketMQ部署有如下特点:
1. NameServer是个几乎无任何状态的节点,节点之间无任何信息同步
2. Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。
3. Producer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
4. Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。
##二 集群部署 ##
环境准备
----------
1. 安装jdk1.8
2. 下载rocketmq安装包 git clone -b release-4.0.0-incubating https://github.com/apache/rocketmq.git
3. 安装maven3.5.0
构建安装包
----------
- cd rocketmq (vim BUILDIN 打开BUILDING文件,里面有构建安装包的说明)
- mvn clean install -Prelease-all assembly:assembly -U(使用mvn 的assembly:assembly命令自定义打包)
- cd target
! [](https://i.imgur.com/xFy3y2l.png)
这里可以直接进入apache-rocketmq-all/bin启动里面的脚本,也可以直接解压apache-rocketmq-all.tar.gz包,进入bin目录启动里面的脚本,其中lib目录下就是启动服务需要依赖的包
安装rocketmq
----------
1. 修改hosts
root@rocketmq-master2:~# cat /etc/hosts
172.20.255.104 mqnameserver1
172.20.255.109 mqnameserver2
172.20.255.104 rocketmq-master1
172.20.255.109 rocketmq-master2
root@rocketmq-master2:~# ping mqnameserver1
PING mqnameserver1 (192.168.1.157) 56(84) bytes of data.
64 bytes from mqnameserver1 (192.168.1.157): icmp_req=1 ttl=64 time=0.122
2. 修改conf
众所周知,RocketMQ有多种集群部署方式,它们的配置文件也是分开的,如下
! [](https://i.imgur.com/rt2Mx5r.png)
2m-noslave: 多Master模式
2m-2s-sync: 多Master多Slave模式,同步双写
2m-2s-async:多Master多Slave模式,异步复制
在这里我们使用2m-2s-async的部署方式
RocketMQ默认提供的配置文件都是最基本的,很多配置都是默认值,无法满足我们的需求,需要我们手动去配置
//所属集群名字
brokerClusterName=rocketmq-cluster
//broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a|broker-b
//0 表示 Master,>0 表示 Slave
brokerId=0
//nameServer地址,分号分割
namesrvAddr=192.168.1.101:9876;192.168.1.102:9876
//在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
//是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
//是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
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/alibaba-rocketmq/store
//commitLog 存储路径
storePathCommitLog=/usr/local/alibaba-rocketmq/store/commitlog
//消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/alibaba-rocketmq/store/consumequeue
//消息索引存储路径
storePathIndex=/usr/local/alibaba-rocketmq/store/index
//checkpoint 文件存储路径
storeCheckpoint=/usr/local/alibaba-rocketmq/store/checkpoint
//abort 文件存储路径
abortFile=/usr/local/alibaba-rocketmq/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. 分别修改启动nameserver和broker时候设定的内存大小
在启动过程中可能会报内存不足的错误,需要分别修改两台主机的runserver.sh和runbroker.sh文件,要根据个人的机器配置进行修改 例如
runserver.sh的修改
39 #JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:PermSize=128m -XX:MaxPermSize=320m"
40 JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:PermSize=64m
runbroker.sh的修改
39 #JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:PermSize=128m -XX:MaxPermSize=320m"
40 JAVA_OPT="${JAVA_OPT} -server -Xmx1g -Xmx1g -Xmn250m -XX:PermSize=64m
4. 分别启动四台主机:NameServer,broker,slave
分别按顺序启动:NameServer A ---> NameServer B --->broker A --->SlaveA---> broker B--->SlaveB
//启动NameServerA
[root@promote bin]# nohup sh mqnamesrv
//启动BrokerA
[root@promote bin]# nohup sh mqbroker -c ../conf/2m-2s-async/broker-a.properties
//启动SlaveA
nohup: ignoring input and appending output to ‘nohup.out’
[root@promote bin]# nohup sh mqbroker -c ../conf/2m-2s-async/broker-a-s.properties
nohup: ignoring input and appending output to ‘nohup.out’
到相应目录下查看服务日志,看是否正常
## 安装console控制台,监控消息队列的收发情况 ##
1. 下载console安装包
git clone https://github.com/apache/rocketmq-externals.git
2. 修改配置
vim application.properties
添加配置
//console的访问端口
server.port=18097
//namesrv的访问地址
rocketmq.config.namesrvAddr=mqnameserver1:9876;mqnameserver2:9876;
//要根据个人部署情况进行配置
3. 构建安装包
cd rocketmq-console
mvn clean package -DskipTests
4. 启动运行
java -jar rocketmq.~.jar
! [](https://i.imgur.com/OKFTdEF.jpg)
## 一 RocketMQ概述 ##
RocketMQ 物理部署结构
! [](https://i.imgur.com/14coz1W.png)
如图所示,RocketMQ部署有如下特点:
1. NameServer是个几乎无任何状态的节点,节点之间无任何信息同步
2. Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与Name Server集群中的所有节点建立长连接,定时注册Topic信息到所有Name Server。
3. Producer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署。
4. Consumer与Name Server集群中的其中一个节点(随机选择)建立长连接,定期从Name Server取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定。
##二 集群部署 ##
环境准备
----------
1. 安装jdk1.8
2. 下载rocketmq安装包 git clone -b release-4.0.0-incubating https://github.com/apache/rocketmq.git
3. 安装maven3.5.0
构建安装包
----------
- cd rocketmq (vim BUILDIN 打开BUILDING文件,里面有构建安装包的说明)
- mvn clean install -Prelease-all assembly:assembly -U(使用mvn 的assembly:assembly命令自定义打包)
- cd target
! [](https://i.imgur.com/xFy3y2l.png)
这里可以直接进入apache-rocketmq-all/bin启动里面的脚本,也可以直接解压apache-rocketmq-all.tar.gz包,进入bin目录启动里面的脚本,其中lib目录下就是启动服务需要依赖的包
安装rocketmq
----------
1. 修改hosts
root@rocketmq-master2:~# cat /etc/hosts
172.20.255.104 mqnameserver1
172.20.255.109 mqnameserver2
172.20.255.104 rocketmq-master1
172.20.255.109 rocketmq-master2
root@rocketmq-master2:~# ping mqnameserver1
PING mqnameserver1 (192.168.1.157) 56(84) bytes of data.
64 bytes from mqnameserver1 (192.168.1.157): icmp_req=1 ttl=64 time=0.122
2. 修改conf
众所周知,RocketMQ有多种集群部署方式,它们的配置文件也是分开的,如下
! [](https://i.imgur.com/rt2Mx5r.png)
2m-noslave: 多Master模式
2m-2s-sync: 多Master多Slave模式,同步双写
2m-2s-async:多Master多Slave模式,异步复制
在这里我们使用2m-2s-async的部署方式
RocketMQ默认提供的配置文件都是最基本的,很多配置都是默认值,无法满足我们的需求,需要我们手动去配置
//所属集群名字
brokerClusterName=rocketmq-cluster
//broker名字,注意此处不同的配置文件填写的不一样
brokerName=broker-a|broker-b
//0 表示 Master,>0 表示 Slave
brokerId=0
//nameServer地址,分号分割
namesrvAddr=192.168.1.101:9876;192.168.1.102:9876
//在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
//是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
//是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
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/alibaba-rocketmq/store
//commitLog 存储路径
storePathCommitLog=/usr/local/alibaba-rocketmq/store/commitlog
//消费队列存储路径存储路径
storePathConsumeQueue=/usr/local/alibaba-rocketmq/store/consumequeue
//消息索引存储路径
storePathIndex=/usr/local/alibaba-rocketmq/store/index
//checkpoint 文件存储路径
storeCheckpoint=/usr/local/alibaba-rocketmq/store/checkpoint
//abort 文件存储路径
abortFile=/usr/local/alibaba-rocketmq/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. 分别修改启动nameserver和broker时候设定的内存大小
在启动过程中可能会报内存不足的错误,需要分别修改两台主机的runserver.sh和runbroker.sh文件,要根据个人的机器配置进行修改 例如
runserver.sh的修改
39 #JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:PermSize=128m -XX:MaxPermSize=320m"
40 JAVA_OPT="${JAVA_OPT} -server -Xms256m -Xmx256m -Xmn128m -XX:PermSize=64m
runbroker.sh的修改
39 #JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:PermSize=128m -XX:MaxPermSize=320m"
40 JAVA_OPT="${JAVA_OPT} -server -Xmx1g -Xmx1g -Xmn250m -XX:PermSize=64m
4. 分别启动四台主机:NameServer,broker,slave
分别按顺序启动:NameServer A ---> NameServer B --->broker A --->SlaveA---> broker B--->SlaveB
//启动NameServerA
[root@promote bin]# nohup sh mqnamesrv
//启动BrokerA
[root@promote bin]# nohup sh mqbroker -c ../conf/2m-2s-async/broker-a.properties
//启动SlaveA
nohup: ignoring input and appending output to ‘nohup.out’
[root@promote bin]# nohup sh mqbroker -c ../conf/2m-2s-async/broker-a-s.properties
nohup: ignoring input and appending output to ‘nohup.out’
到相应目录下查看服务日志,看是否正常
## 安装console控制台,监控消息队列的收发情况 ##
1. 下载console安装包
git clone https://github.com/apache/rocketmq-externals.git
2. 修改配置
vim application.properties
添加配置
//console的访问端口
server.port=18097
//namesrv的访问地址
rocketmq.config.namesrvAddr=mqnameserver1:9876;mqnameserver2:9876;
//要根据个人部署情况进行配置
3. 构建安装包
cd rocketmq-console
mvn clean package -DskipTests
4. 启动运行
java -jar rocketmq.~.jar
! [](https://i.imgur.com/OKFTdEF.jpg)