RocketMQ作为分布式的消息中间件,生产环境中只有集群部署才有实际意义。本文主要介绍双主双从的配置与及部署过程中可能遇到的问题,并假定每台机器均已安装好RocketMQ和JDK。如编译安装过程有疑问,请参考:
RocketMQ笔记(1)_Linux下编译部署
RocketMQ: 3.5.8
JDK: jdk-8u111-linux-x64
OS: Centos6.5_x64
ROCKETMQ_HOME: /usr/javawork/RocketMQ
JAVA_HOME: /usr/java/jdk1.8.0_111
4台服务器均是虚拟机,配置为 1核CPU + 2g内存。
IP |
主机名 |
用途 |
Broker角色 |
192.168.0.11 |
broker-a |
NameServer,Broker |
Master |
192.168.0.14 |
broker-b |
NameServer, Broker |
Master |
192.168.0.16 |
broker-a-s |
NameServer, Broker |
Slave |
192.168.0.17 |
broker-b-s |
NameServer, Broker |
Slave |
依次修改每台主机的hosts文件:
vim /etc/hosts
添加如下信息:
192.168.0.11 mqnameserver1
192.168.0.14 mqnameserver2
192.168.0.16 mqnameserver3
192.168.0.17 mqnameserver4
192.168.0.11 broker-a
192.168.0.14 broker-b
192.168.0.16 broker-a-s
192.168.0.17 broker-b-s
依次修改每台主机的network文件:
vim /etc/sysconfig/network
根据服务器信息设定主机名:
HOSTNAME=broker-b
这一步非必需,但为了让主机名更加清晰,所以重新命名。
cd /usr/javawork/RocketMQ/bin/
mkdir ../conf/me-2m-2s-async/
sh mqbroker -m >../conf/me-2m-2s-async/broker.p
vim ../conf/me-2m-2s-async/broker.p
主机192.168.0.11(broker-a)修改后的配置文件信息如下
namesrvAddr=mqnameserver1:9876;mqnameserver2:9876;mqnameserver3:9876;mqnameserver4:9876
brokerIP1=192.168.0.11
brokerName=broker-a
brokerClusterName=TestCluster
brokerId=0
autoCreateTopicEnable=true
autoCreateSubscriptionGroup=true
rejectTransactionMessage=false
fetchNamesrvAddrByAddressServer=false
storePathRootDir=/root/store
storePathCommitLog=/root/store/commitlog
flushIntervalCommitLog=1000
flushCommitLogTimed=false
deleteWhen=04
fileReservedTime=72
maxTransferBytesOnMessageInMemory=262144
maxTransferCountOnMessageInMemory=32
maxTransferBytesOnMessageInDisk=65536
maxTransferCountOnMessageInDisk=8
accessMessageInMemoryMaxRatio=40
messageIndexEnable=true
messageIndexSafe=false
haMasterAddress=
brokerRole=ASYNC_MASTER
flushDiskType=ASYNC_FLUSH
cleanFileForciblyEnable=true
红色部分是根据模板文件修改的内容:
namesrvAddr=mqnameserver1:9876;mqnameserver2:9876;mqnameserver3:9876;mqnameserver4:9876
指定broker注册的NameServer服务器
brokerIP1=192.168.0.11
强制指定本机IP,需要根据每台机器进行修改。官方介绍可为空,系统默认自动识别,但多网卡时IP地址可能读取错误
brokerName=broker-a
系统根据此名称确定主从关系,因此master和slave必须一致。每台机器的设定如下:
192.168.0.11 |
192.168.0.14 |
192.168.0.16 |
192.168.0.17 |
broker-a |
broker-b |
broker-a-s |
broker-b-s |
brokerClusterName=TestCluster
集群名称,可根据自己的需要修改。
brokerId=0
0 表示 Master, >0 表示 Slave,每台机器的设定如下:
192.168.0.11 |
192.168.0.14 |
192.168.0.16 |
192.168.0.17 |
0 |
0 |
1 |
1 |
brokerRole=ASYNC_MASTER
主从角色和是否异步,每台机器的设定如下:
192.168.0.11 |
192.168.0.14 |
192.168.0.16 |
192.168.0.17 |
ASYNC_MASTER |
ASYNC_MASTER |
SLAVE |
SLAVE |
每台机器依次执行命令:
screen sh mqnamesrv
出现如下信息表示启动成功:
The Name Server boot success. serializeType=JSON
按 Ctrl+a 保存会话,然后按d 返回命令窗口
每台机器依次执行命令:
screen sh mqbroker -c ../conf/me-2m-2s-async/broker.p
出现如下信息表示启动成功:
load config properties file OK, ../conf/me-2m-2s-async/broker.p
The broker[broker-a, 192.168.0.11:10911] boot success. serializeType=JSON and name server is mqnameserver1:9876;mqnameserver2:9876;mqnameserver3:9876;mqnameserver4:9876
添加环境变量:
NAMESRV_ADDR
192.168.0.11:9876;192.168.0.14:9876;192.168.0.16:9876;192.168.0.17:9876
运行测试:
分别运行Producer和PushConsumer:
⑴ 注释掉NameServer,运行结果消息收发正常。
⑵ 指定任意一台NameServer的IP,运行结果消息收发正常。
⑶ 关闭任意一台机器的NameServer服务,运行结果消息收发正常。
⑷ 关闭Slave的Broker服务,运行结果消息收发正常。
设定环境变量:
export NAMESRV_ADDR=192.168.0.11:9876\;192.168.0.14:9876\;192.168.0.16:9876\;192.168.0.17:9876
运行测试:
bash tools.sh com.alibaba.rocketmq.example.quickstart.Producer
bash tools.sh com.alibaba.rocketmq.example.quickstart.Consumer
运行结果消息收发正常。
查看Broker运行日志:
tail -f ~/logs/rocketmqlogs/broker.log
⑴ 检查JDK版本是否为64bit 1.6+,否则会报“connect to
⑵ 开发环境Broker运行的机器内存不小于2g; runbroker.sh的Java参数最低: -Xms2g -Xmx2g -Xmn512m;否则很容易报“java.lang.OutOfMemoryError: Java heap space”。生产环境按照官方文档说法是内存越大越好。
com.alibaba.rocketmq.client.exception.MQClientException: No route info of this topic, TopicTest1
⑴ 启动Broker时是否加载了配置文件并指定NameServer。
⑵ NameServer和Broker所在主机的防火墙是否允许访问。
⑶ broker配置文件是否为“autoCreateTopicEnable=true”,有网友说即使这个选项为true,也无法自动创建超过4个Topic,需要手动创建,经测试并未发现此问题,估计新版已修复Bug。
RocketMQ的编译、安装、运行都做得非常人性化,出现的问题几乎都跟网络环境有关,开发环境可以选择直接关闭防火墙。
开发环境:每台broker至少能访问一台nameServer;主从broker能互相访问;Producer和Consumer必须能访问至少一台nameServer和一台主broker。
《分布式消息队列RocketMQ部署与监控》 作者:workming
http://sofar.blog.51cto.com/353572/1540874