linux环境下rocketmq(4.3.2)消息队列集群详细部署教程
简介:RcoketMQ 是一款低延迟、高可靠、可伸缩、易于使用的消息中间件,支持以下特性:支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型在一个队列中可靠的先进先出(FIFO)和严格的顺序传递支持拉(pull)和推(push)两种消息模式单一队列百万消息的堆积能力支持多种消息协议,如 JMS、MQTT 等分布式高可用的部署架构,满足至少一次消息传递语义提供...
简介:
RcoketMQ 是一款低延迟、高可靠、可伸缩、易于使用的消息中间件,支持以下特性:
- 支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型
- 在一个队列中可靠的先进先出(FIFO)和严格的顺序传递
- 支持拉(pull)和推(push)两种消息模式
- 单一队列百万消息的堆积能力
- 支持多种消息协议,如 JMS、MQTT 等
- 分布式高可用的部署架构,满足至少一次消息传递语义
- 提供 docker 镜像用于隔离测试和云集群部署
- 提供配置、指标和监控等功能丰富的 Dashboard
核心概念:https://blog.csdn.net/alan_liuyue/article/details/85863785
linux系统环境准备:
- 两台linux服务器,内存空间1G以上(内存太小不建议使用消息队列,空间不足会自动宕机);
- 两台linux服务器安装jdk1.8;
部署方案:
rocketmq集群由nameServer和broker两种角色组成,nameServer的功能等同于zookeeper,用于集群状态管理,而broker集群的部署方案提供有三种:
- 2m-noslave:多master模式,集群2个broker都是主master,没有从slave;
- 2m-2s-async:多master多slave模式,异步复制,集群由两个主master和两个从slave构成,主从数据使用异步复制的方式进行同步;
- 2m-2s-sync:多master多slave模式,同步双写,集群由两个主master和两个从slave构成,主从数据使用同步双写的方式进行同步;
rocketmq默认的部署方案一般是异步复制的多master多slave方案,这里也选择这种方式进行部署(上面的2表示搭建集群最低需要的服务器数量)
实践方案:
本次集群使用2m-2s-async多master多slave异步复制这种方案进行搭建,集群的配置方式如下:
- 服务器A:nameserver1,broker-a,broker-b-s;
- 服务器B:nameserver2,broker-b,broker-a-s;
说明:
- nameserver是相互独立存在的,这里两个服务器分别部署一个,默认端口9876;
- 主broker和从broker一般部署于不同的服务器,所以当broker-a主在服务器A的时候,broker-a-s从则部署于服务器B;
- 主broker和从broker通过配置文件的brokerName进行统一,通过brokerId进行区分,即主从的brokerName相同,当brokerId等于0时broker为主,当brokerId为1时broker为从;
部署流程:
- 1. 官网下载最新版rocketmq的二进制安装包(注意是二进制安装包),这里选择的版本是4.3.2,下载链接:https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.3.2/rocketmq-all-4.3.2-bin-release.zip
- 2. linux服务器新建rocketmq安装文件夹,这里的路径是:/data/rocketmq;
- 3. 将安装包上传到远程服务器A的rocketmq文件夹内(服务器B执行相同的操作),解压之后,将解压后的文件全部移出到rocketmq当前文件夹下,linux命令为:mv /data/rocketmq/rocketmq-all-4.3.2-bin-release/* . ;
- 4. 由于我们采用的是2m-2s-async这种部署方案,我们需要修改rocketmq的conf下对应的配置文件(直接复制以下配置文件内容即可,需要修改成自己服务器的ip地址),配置文件路径:/data/rocketmq/conf/2m-2s-async ;
broker-a.properties:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,名字可重复,主从同名
brokerName=broker-a
#指定启动服务器ip,修改成自己的服务器ip
brokerIP1=192.168.6.112
#0 表示 Master,>0 表示 Slave
brokerId=0
#Broker 的角色,属于主还是从,如果brokerId=0,则是master;如果是brokerId=1,则是slave
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#nameServer地址,分号分割,修改成自己的服务器ip
namesrvAddr=192.168.6.112:9876;192.168.6.154: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=/data/rocketmq/store/broker-a
#commitLog 存储路径,需提前建好文件夹
storePathCommitLog=/data/rocketmq/store/broker-a/commitlog
#消费队列存储路径存储路径,需提前建好文件夹
storePathConsumeQueue=/data/rocketmq/store/broker-a/consumequeue
#消息索引存储路径,需提前建好文件夹
storePathIndex=/data/rocketmq/store/broker-a/index
#checkpoint 文件存储路径,需提前建好文件夹
storeCheckpoint=/data/rocketmq/store/checkpoint
#abort 文件存储路径,需提前建好文件夹
abortFile=/data/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
broker-a-s.properties:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,名字可重复,主从同名
brokerName=broker-a
#指定启动服务器ip,修改成自己的服务器ip
brokerIP1=192.168.6.154
#0 表示 Master,>0 表示 Slave
brokerId=1
#Broker 的角色,属于主还是从,如果brokerId=0,则是master;如果是brokerId=1,则是slave
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#nameServer地址,分号分割,修改成自己的服务器ip
namesrvAddr=192.168.6.112:9876;192.168.6.154:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口,
listenPort=10920
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径,需提前建好文件夹
storePathRootDir=/data/rocketmq/store/broker-a-s
#commitLog 存储路径,需提前建好文件夹
storePathCommitLog=/data/rocketmq/store/broker-a-s/commitlog
#消费队列存储路径存储路径,需提前建好文件夹
storePathConsumeQueue=/data/rocketmq/store/broker-a-s/consumequeue
#消息索引存储路径,需提前建好文件夹
storePathIndex=/data/rocketmq/store/broker-a-s/index
#checkpoint 文件存储路径,需提前建好文件夹
storeCheckpoint=/data/rocketmq/store/checkpoint
#abort 文件存储路径,需提前建好文件夹
abortFile=/data/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
broker-b.properties:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,名字可重复,主从需同名
brokerName=broker-b
#指定启动服务器ip,修改成自己的服务器ip
brokerIP1=192.168.6.154
#0 表示 Master,>0 表示 Slave
brokerId=0
#Broker 的角色,属于主还是从,如果brokerId=0,则是master;如果是brokerId=1,则是slave
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER
#nameServer地址,分号分割,修改成自己的服务器ip
namesrvAddr=192.168.6.112:9876;192.168.6.154: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=/data/rocketmq/store/broker-b
#commitLog 存储路径,需提前建好文件夹
storePathCommitLog=/data/rocketmq/store/broker-b/commitlog
#消费队列存储路径存储路径,需提前建好文件夹
storePathConsumeQueue=/data/rocketmq/store/broker-b/consumequeue
#消息索引存储路径,需提前建好文件夹
storePathIndex=/data/rocketmq/store/broker-b/index
#checkpoint 文件存储路径,需提前建好文件夹
storeCheckpoint=/data/rocketmq/store/checkpoint
#abort 文件存储路径,需提前建好文件夹
abortFile=/data/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
broker-b-s.properties:
#所属集群名字
brokerClusterName=rocketmq-cluster
#broker名字,名字可重复,主从需同名
brokerName=broker-b
#指定启动服务器ip,修改成自己的服务器ip
brokerIP1=192.168.6.112
#0 表示 Master,>0 表示 Slave
brokerId=1
#Broker 的角色,属于主还是从,如果brokerId=0,则是master;如果是brokerId=1,则是slave
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SLAVE
#nameServer地址,分号分割,修改成自己的服务器ip
namesrvAddr=192.168.6.112:9876;192.168.6.154:9876
#在发送消息时,自动创建服务器不存在的topic,默认创建的队列数
defaultTopicQueueNums=4
#是否允许 Broker 自动创建Topic,建议线下开启,线上关闭
autoCreateTopicEnable=true
#是否允许 Broker 自动创建订阅组,建议线下开启,线上关闭
autoCreateSubscriptionGroup=true
#Broker 对外服务的监听端口,
listenPort=10920
#删除文件时间点,默认凌晨 4点
deleteWhen=04
#文件保留时间,默认 48 小时
fileReservedTime=120
#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824
#ConsumeQueue每个文件默认存30W条,根据业务情况调整
mapedFileSizeConsumeQueue=300000
#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径,需提前建好文件夹
storePathRootDir=/data/rocketmq/store/broker-b-s
#commitLog 存储路径,需提前建好文件夹
storePathCommitLog=/data/rocketmq/store/broker-b-s/commitlog
#消费队列存储路径存储路径,需提前建好文件夹
storePathConsumeQueue=/data/rocketmq/store/broker-b-s/consumequeue
#消息索引存储路径,需提前建好文件夹
storePathIndex=/data/rocketmq/store/broker-b-s/index
#checkpoint 文件存储路径,需提前建好文件夹
storeCheckpoint=/data/rocketmq/store/checkpoint
#abort 文件存储路径,需提前建好文件夹
abortFile=/data/rocketmq/store/abort
#限制的消息大小
maxMessageSize=65536
#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000
#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH
#checkTransactionMessageEnable=false
#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128
- 5. 将broker-a.properties和broker-b-s.properties留在服务器A,然后将broker-a-s.properties和broker-b.properties移到服务器B相同路径下,把其他默认properties删掉;
- 6. 注意事项:
1.autoCreateTopicEnable=true,是否自动创建topic,建议线下开启,线上关闭,线上手动进行创建;
autoCreateSubscriptionGroup=true,是否自动创建订阅组,建议线下开启,线上关闭,线上手动进行创建;
2.brokerName不同配置文件名称不同,但主从名称一致;
3.listenPosr的默认端口为10911,同一台机器上启动多个broker实例时,应填写不同的端口;
4.brokerId默认为0,表示主master,同时也需要将brokerRole修改为ASYNC_MASTER或者SYNC_MASTER;
当brokerId为1时,表示从slave,同时也需要将brokerRole修改为SLAVE,否则主从配置不起作用;
ep:
主:brokerId=0;brokerRole=ASYNC_MASTER
从:brokerId=1;brokerRole=SLAVE
5.由于一个rocketmq项目里面需要启动多个实例,可能存在很多日志,所以,
(1)在启动namesrv和broker的时候,都尽量指定日志生成目录,
例如:nohup sh ./mqnamesrv >/data/rocketmq/logs/mqnamesrv.log 2>&1 &
(2)在启动多个broker实例的时候,需要在配置文件指定存储路径,方便管理,
例如:nohup sh ./mqbroker -c /data/rocketmq/conf/2m-2s-async/broker-a.properties >/data/rocketmq/logs/broker-a.log 2>&1 &
(3)broker配置文件指定的存储路径文件夹都需要提前创建好,
例如:
mkdir /data/rocketmq/store;
mkdir /data/rocketmq/store/broker-a;
mkdir /data/rocketmq/store/broker-a/commitlog;
mkdir /data/rocketmq/store/broker-a/consumequeue;
mkdir /data/rocketmq/store/broker-a/index;
mkdir /data/rocketmq/store/checkpoint;
mkdir /data/rocketmq/store/abort;
6.namesrvAddr如果配置多台服务器的话,在配置文件使用分号';'进行分割;
ep:namesrvAddr=192.168.6.112:9876;192.168.6.154:9876
7.broker主从一般分开服务器部署,比如服务器A部署主和服务器B部署从,或者相反,多个broker的话交互部署;
8.如果部署在内部网,切记需要指定启动的服务器ip,brokerIP1=公网ip地址;否则会报错
ep:brokerIP1=服务器公网ip
9.在搭建集群之前,先将服务器的JDK版本配置成jdk8,maven版本安装成3.5以上(maven主要用于可视化界面编译的情况下有用,
如果已经在本地项目搭建好可视化界面,可忽略)
10.配置文件的属性连接或者后缀都不能留有空格!特别是namesrvAddr,很容易被忽略,然后找不到问题出现在哪!
比如namesrvAddr=192.168.6.112 :9876和namesrvAddr=192.168.6.112:9876是不一样的,前者多了一个空格,然后就会
报远程无法连接的错误;
又比如brokerIP1=192.168.6.112 和brokerIP1=192.168.6.112这两个也是不一样的,前者在后面多了一个空格,很容易
被忽略,到处都是坑啊,配置文件要小心谨慎!
11.namesrv和broker启动时,都可能会报内存不足的问题,需要将bin文件夹启动文件里面的内存大小改小,
例如:
(1)启动NameServer时,修改文件:vim /bin/runserver.sh
原数据:JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m";
修改后:JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
(2)启动Broker时,修改文件:vim /bin/runbroker.sh
原数据:JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g"
修改后:JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m"
- 7. 启动集群:
首先,启动两台服务器的nameserver;
接着,启动服务器a:主broker-a,以及启动服务器b:从broker-a-s
然后,启动服务器b:主broker-b,以及启动服务器a:从broker-b-s
最后,查看集群启动状态:sh ./mqadmin clusterList -n 192.168.6.112:9876(如果是外网部署,则需要换成外网的ip地址)
启动集群相关命令:
1. 启动顺序:
首先启动服务器A和服务器B的nameserver;
然后启动服务器A的主broker-a,然后启动服务器B的从broker-a-s;
再启动服务器B的主broker-b,最后启动服务器A的从broker-b-s;
2. 启动相关命令:
(1)启动nameserver(指定启动配置文件和启动日志):
nohup sh ./mqnamesrv >/data/rocketmq/logs/mqnamesrv.log 2>&1 &
(2)启动broker-a(指定启动配置文件和启动日志):
nohup sh ./mqbroker -c /data/rocketmq/conf/2m-2s-async/broker-a.properties >/data/rocketmq/logs/broker-a.log 2>&1 &
(3)启动broker-a-s(指定启动配置文件和启动日志):
nohup sh ./mqbroker -c /data/rocketmq/conf/2m-2s-async/broker-a-s.properties >/data/rocketmq/logs/broker-a-s.log 2>&1 &
(4)启动broker-b(指定启动配置文件和启动日志):
nohup sh ./mqbroker -c /data/rocketmq/conf/2m-2s-async/broker-b.properties >/data/rocketmq/logs/broker-b.log 2>&1 &
(5)启动broker-b-s(指定启动配置文件和启动日志):
nohup sh ./mqbroker -c /data/rocketmq/conf/2m-2s-async/broker-b-s.properties >/data/rocketmq/logs/broker-b-s.log 2>&1 &
(6)快速查看启动进程:
jps
(7)重启broker和namesrv:
sh mqshutdown broker
sh mqshutdown namesrv
--等待停止
(8)查看集群的启动状况:
sh ./mqadmin clusterList -n 192.168.6.112:9876
(9)关闭防火墙:
systemctl stop firewall
(10)杀死残留进程:
rm -rf /tmp/hsperfdata_*
- 8. 如果需要添加可视化界面,也很简单,要在linux添加maven环境以及下载rocketmq-console项目jar包,本次演示不展示linux的可视化界面部署,直接使用的开发工具启动rocketmq-console项目;
- 项目下载地址:https://download.csdn.net/download/alan_liuyue/10934549
- 启动之后的界面展示如下:
-
9. 常见问题:
1. runbroker.sh: line 62: 17778 Killed $JAVA ${JAVA_OPT} $@
说明:rocketmq已经运行起来了,但是过几分钟就自动停止,进程被杀死;
解决:服务器运行内存不足,检查服务器的内存是否足够支撑mq的运行,如果不够,则将runbroker.sh的运行内存减小
2. There is insufficient memory for the Java Runtime Environment to continue
说明:当启动多个broker的时候,发现不能启动新的broker
解决:服务器运行内存不足,将broker的运行内存减小
3. 说明:broker集群搭建完毕,但查看集群状态的时候,发现全都是BID=0的主broker,配置文件brokerId=1不起作用;
解决:检查配置文件brokerRole,如果是brokerId=1,则修改成brokerRole=SLAVE;如果brokerId=0,则将brokerRole=ASYNC_MASTER或者SYNC_MASTER
4. com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to<rocketmq-nameserver1 :9876>failes
说明:rocketmq已经启动成功,但总是报远程连接错误;
解决:(1)检查服务器的防火墙是否开启,如果开启,则关闭防火墙,systemctl stop firewalld;
(2)用telnet命令,检查服务器的rocket端口是否开放,如果端口无法连接,则配置好云服务器的端口认证规则
(3)检查配置文件的属性配置是否有多余的空格,具体操作见注意事项;
(4)检查配置文件的brokerIP1是否已经填写成当前服务器的公网(外网)ip地址,因为如果不填写则会默认使用内网的ip,则会报错;
5. org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to <null> failed
说明:当使用sh ./mqadmin clusterList命令查看集群状态的时候,发现报错
解决:首先检查当前服务器的namesrv是否开启,其次检查当前服务器的broker是否已经启动成功,再则检查当前服务器的rocketmq端口是否开放
6.当设置了自动创建topic:autoCreateTopicEnable=true;但是却依旧报如下错误:
问题:No route info of this topic:demo-topic
解决:检查服务器和客户端的rocketmq版本是否一致,如果不一致,则将pom文件的rocketmq版本改成服务器版本,然后就可以自动创建了;
解决2:或者在创建生产者的时候,指定topickey:
DefaultMQProducer producer = new DefaultMQProducer("sixmonth");
//设置自动创建topic的key值
producer.setCreateTopicKey("AUTO_CREATE_TOPIC_KEY");//4.3版本之后的
//producer.setCreateTopicKey("TBW102");//4.3版本之前的
结语:
本篇博客描述了rocketmq集群部署的入门详细教程,当然还有更多的细节可以进行优化,程序员可以在实践的过程中逐步进行完善和优化,深入发掘rocketmq的源码;
实践是检验真理的唯一标准,亲手实践,发现真的能成功!!
更多推荐
所有评论(0)