linux环境下rocketmq(4.3.2)消息队列集群详细部署教程

版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/86613896

简介:

RcoketMQ 是一款低延迟、高可靠、可伸缩、易于使用的消息中间件,支持以下特性:

  1. 支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型
  2. 在一个队列中可靠的先进先出(FIFO)和严格的顺序传递
  3. 支持拉(pull)和推(push)两种消息模式
  4. 单一队列百万消息的堆积能力
  5. 支持多种消息协议,如 JMS、MQTT 等
  6. 分布式高可用的部署架构,满足至少一次消息传递语义
  7. 提供 docker 镜像用于隔离测试和云集群部署
  8. 提供配置、指标和监控等功能丰富的 Dashboard

核心概念:https://blog.csdn.net/alan_liuyue/article/details/85863785

linux系统环境准备:

  1. 两台linux服务器,内存空间1G以上(内存太小不建议使用消息队列,空间不足会自动宕机);
  2. 两台linux服务器安装jdk1.8;

部署方案:

rocketmq集群由nameServer和broker两种角色组成,nameServer的功能等同于zookeeper,用于集群状态管理,而broker集群的部署方案提供有三种:

  1. 2m-noslave:多master模式,集群2个broker都是主master,没有从slave;
  2. 2m-2s-async:多master多slave模式,异步复制,集群由两个主master和两个从slave构成,主从数据使用异步复制的方式进行同步;
  3. 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端口是否开放

 结语:

本篇博客描述了rocketmq集群部署的入门详细教程,当然还有更多的细节可以进行优化,程序员可以在实践的过程中逐步进行完善和优化,深入发掘rocketmq的源码;

实践是检验真理的唯一标准,亲手实践,发现真的能成功!!

猜你喜欢

转载自blog.csdn.net/alan_liuyue/article/details/86613896