介绍
本文使用CentOS7系统进行RocketMQ双Master双Slave异步复制模式集群部署
共两台虚拟机 一台ip为192.168.32.99 另一台ip为192.168.32.100 以此来模拟真实部署环境
由于机器性能限制 如果读者机器性能优越 可以安装5台虚拟机分别部署启动NameServer及Broker来完成本次实验
服务名 | 部署机器IP |
---|---|
NameServer | 192.168.32.99、192.168.32.100 |
Master-a Broker | 192.168.32.99 |
Slave-a Broker | 192.168.32.100 |
Master-b Broker | 192.168.32.100 |
Slave-b Broker | 192.168.32.99 |
准备工作
可参照: RocketMq在Linux下安装启动 - 单Master版.
- 两台CentOS7虚拟机
- 虚拟机安装配置好了jdk环境
- 上传rocketmq压缩包并解压到
/usr/local/
目录下
配置
进入rocketmq安装目录下的conf文件夹
介绍一下:(摘抄至官方链接: 官网介绍.)
① 2m-2s-async:多Master多Slave模式-异步复制
每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:
- 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;
- 缺点:Master宕机,磁盘损坏情况下会丢失少量消息。
② 2m-2s-sync:多Master多Slave模式-同步双写
每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写(同步复制)方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:
优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;
缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。
③ 2m-noslave:多Master无slave模式
一个集群无Slave,全是Master,例如2个Master或者3个Master,这种模式的优缺点如下:
优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高;
缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。
(本文采用多Master多Slave异步复制模式部署 即2m-2s-async)
步骤:
以ip为192.168.32.99的虚拟机中部署NameServer及Master-a、Slave-b的Broker为例,其他虚拟机相同操作即可:
先配置Broker
① 进入2m-2s-async文件夹
该文件夹下一共有4个配置文件:
1.broker-a.properties / broker-b.properties: Master角色的Broker配置文件
2.broker-a-s.properties: 对应broker-a的slave角色的broker配置文件
3.broker-b-s.properties: 对应broker-b的slave角色的broker配置文件
② 编辑配置文件
由于我们在本机部署的是Master-a、Slave-b的Broker 所以只要编辑broker-a.properties
broker-b-s.propertie
两个文件
由于配置文件过长 放在
文章最后
需要注意修改的地方有对应注释 请仔细查看
③ 编辑启动配置文件
RocketMq默认配置的JVM内存要求较高 经常出现无法启动服务的错误 所以我们需要手动修改一下配置文件(机器配置高的小伙伴可以跳过本节内容)
- 编辑runserver.sh
原来的配置
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
要求过高 会导致无法启动服务
将内存占用修改小一点为512m即可 如下
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
修改完成后输入wq保存退出编辑
- 修改 runbroker.sh
原来的配置
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"
与上面一致 同理修改为
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m"
④ 设置防火墙
- NameServer默认使用9876端口
- Master默认使用10911端口
- Slave默认使用11011端口
方式一:
直接关闭防火墙
service firewalld stop
方式二:
添加开放端口 以9876为例
添加端口:firewall-cmd --zone=public --add-port=9876/tcp --permanent
说明:
–zone 作用域
–add-port 添加端口
–permanent 永久(即重启防火墙 配置不丢失)重新加载防火墙:service firewalld reload
启动
ps:以下启动命令若没有在配置了rocketmq环境变量的前提下 请在rocketmq安装目录bin文件夹下执行
① 启动NameServer
启动:nohup sh mqnamesrv &
查看动态日志:tail -f ~/logs/rocketmqlogs/namesrv.log
② 启动Master
启动:nohup sh mqbroker -c 配置文件路径 &
查看动态日志:tail -f ~/logs/rocketmqlogs/broker.log
③ 启动Slave
启动:nohup sh mqbroker -c 配置文件路径 &
查看动态日志:tail -f ~/logs/rocketmqlogs/broker.log
部署过程中发生的问题
- RemotingConnectException: connect to xxx failed(日志文件显示错误)
解决:
① 请检查防火墙是否关闭或是否开放了对应的端口
② 请检查配置文件properties中 namesrvAddr配置项是否配置正确(如ip错误,多个服务器地址请用分号
隔开) - RuntimeException: Lock failed,MQ already started(nohup.out日志文件显示错误 发生在slave启动时。broker日志文件显示的是RemotingConnectException错误)
解决:
① 检查broker配置文件,有关文件存储路径的配置项不能和同台机器其他服务配置相同
部署可视化界面
① 在以上链接拉取工程到本地
官方链接: rocketmq-dashboard.(rocketmq-connect-console工程已经是空的了 可能被淘汰了)
② 编辑项目配置文件 application.properties
③ 在本机上运行命令框 进入项目根目录 执行maven打包命令
mvn clean package -Dmaven.test.skip=true
出现以下界面即为打包成功。进入项目根目录会发现,多出一个target文件夹,点击进去可以看到已打包好的jar包。
④ 将打包好的jar包上传服务器
⑤ 进入虚拟机/usr/soft文件夹执行命令启动图形化管理界面工程
java -jar rocketmq-dashboard-2.0.0.jar
界面展示:
附录:broker-x.properties配置文件参数
#**********************需要认真查看是否需要修改范围***********************
#broker集群名称,用于划分broker
brokerClusterName=cluster001
#broker名称,用于主从配对,相同名称的broker才能做主从设置
brokerName=broker-a
#用于标识主从关系,0为主,其他大于0的为从(不能小于0)master设置0,slave设置1。Master角色的Broker支持读和写,Slave角色的Broker仅支持读,也就是Producer只能和Master角色的Broker连接写人消息:Consumer可以连接Master角色的Broker,也可以连接Slave角色的Broker来读取消息。
#Master节点设置
brokerId=0
#Slave节点设置
#brokerId=1
#name server服务器地址及端口,可以是多个,分号隔开
namesrvAddr=192.168.32.99:9876;192.168.32.100:9876
#broker服务监听端口(以本文章为例:master是10911、slave是11011)
listenPort=10911
#broker角色(请遵守以下写法:SYNC_MASTER:同步双写Master、ASYNC_MASTER:异步复制Master、SLAVE:SLAVE)
brokerRole=ASYNC_MASTER
#Slave节点设置
#brokerRole=SLAVE
# 请保证以下路径在服务启动之前就存在
#持久化消息存储根路径
storePathRootDir=/root/store
#commitLog文件存储路径
storePathCommitLog=/root/store/commitlog
#**********************需要认真查看是否需要修改范围 end***********************
#************************接下来的配置项可以默认*****************************
#创建topic时,若未指定topic下的队列数,则取该默认值作为默认队列数
defaultTopicQueueNums=8
#是否自动创建默认topic,生产需保持关闭
autoCreateTopicEnable=true
#是否自动创建topic的订阅组,默认开启
autoCreateSubscriptionGroup=true
#未消费的持久化消息清理时间点
deleteWhen=04
#持久化消息保存周期(单位:小时),超过该周期将被清理
fileReservedTime=24
#单个commitLog文件的大小限制(单位:字节)
mapedFileSizeCommitLog=1073741824
#单个consumeQueue大小限制(存储的消息条数 * 每条消息的索引大小20)
mapedFileSizeConsumeQueue=8000000
#存储使用率阀值,当使用率超过阀值时,将拒绝发送消息请求
diskMaxUsedSpaceRatio=88
#最大消息大小限制(单位:字节)
maxMessageSize=65536
#commitLog最少刷盘page数
flushCommitLogLeastPages=4
#consumeQueue最少刷盘page数
flushConsumeQueueLeastPages=2
#commitLog刷盘间隔时间
flushCommitLogThoroughInterval=10000
#consumeQueue刷盘间隔时间
flushConsumeQueueThoroughInterval=60000
#处理消息发送线程池大小
sendMessageThreadPoolNums=128
#处理消息拉取线程池大小
pullMessageThreadPoolNums=128
#刷盘方式(ASYNC_FLUSH:异步刷盘、SYNC_FLUSH:同步刷盘)
flushDiskType=ASYNC_FLUSH