RocketMQ笔记(2)_双主双从部署

Java基础

浏览数:16

2020-5-30

AD:资源代下载服务

  RocketMQ作为分布式的消息中间件,生产环境中只有集群部署才有实际意义。本文主要介绍双主双从的配置与及部署过程中可能遇到的问题,并假定每台机器均已安装好RocketMQ和JDK。如编译安装过程有疑问,请参考:

  RocketMQ笔记(1)_Linux下编译部署

 

1. 环境信息

1.1 版本说明

RocketMQ: 3.5.8

JDK: jdk-8u111-linux-x64

OS: Centos6.5_x64

 

1.2 安装目录

ROCKETMQ_HOME: /usr/javawork/RocketMQ

JAVA_HOME: /usr/java/jdk1.8.0_111

 

2. 服务器信息

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

 

3. Hosts信息

依次修改每台主机的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

 

4. 主机名修改

依次修改每台主机的network文件:

vim /etc/sysconfig/network

根据服务器信息设定主机名:

HOSTNAME=broker-b

这一步非必需,但为了让主机名更加清晰,所以重新命名。

 

5. Broker配置文件

5.1 配置文件模板生成

cd /usr/javawork/RocketMQ/bin/

mkdir ../conf/me-2m-2s-async/

sh mqbroker -m >../conf/me-2m-2s-async/broker.p

 

5.2 配置文件信息修改

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

 

6. 启动NameServer

每台机器依次执行命令:

screen sh mqnamesrv

 

出现如下信息表示启动成功:

The Name Server boot success. serializeType=JSON

 

按 Ctrl+a 保存会话,然后按d 返回命令窗口

 

7. 启动Broker

每台机器依次执行命令:

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

 

8. 简单测试

8.1 Windows环境测试

添加环境变量:

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服务,运行结果消息收发正常。

 

8.2 Linux环境测试

设定环境变量:

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

运行结果消息收发正常。

 

9. 问题

9.1 无法启动Broker

查看Broker运行日志:

tail -f ~/logs/rocketmqlogs/broker.log

 

⑴ 检查JDK版本是否为64bit 1.6+,否则会报“connect to <mqnameserver:9876> failed”。

⑵ 开发环境Broker运行的机器内存不小于2g; runbroker.sh的Java参数最低: -Xms2g -Xmx2g -Xmn512m;否则很容易报“java.lang.OutOfMemoryError: Java heap space”。生产环境按照官方文档说法是内存越大越好。

 

9.2 测试程序访问异常

com.alibaba.rocketmq.client.exception.MQClientException: No route info of this topic, TopicTest1

⑴ 启动Broker时是否加载了配置文件并指定NameServer。

⑵ NameServer和Broker所在主机的防火墙是否允许访问。

⑶ broker配置文件是否为“autoCreateTopicEnable=true”,有网友说即使这个选项为true,也无法自动创建超过4个Topic,需要手动创建,经测试并未发现此问题,估计新版已修复Bug。

 

9.3 其它

RocketMQ的编译、安装、运行都做得非常人性化,出现的问题几乎都跟网络环境有关,开发环境可以选择直接关闭防火墙。

开发环境:每台broker至少能访问一台nameServer;主从broker能互相访问;Producer和Consumer必须能访问至少一台nameServer。

 

10 配置下载

RocketMQ-3.5.8,双主双从配置文件、已编译安装包、安装部署文档及开发环境测试项目
下载

 

11 参考资料

《分布式消息队列RocketMQ部署与监控》 作者:workming

http://sofar.blog.51cto.com/353572/1540874

作者:Xcafe