RocketMQ安装部署
一、前言
1、常用的消息队列中间件有哪些
Apache Kafka、RabbitMQ、RocketMQ
2、不同消息中间件的对比
(1)Apache Kafka
#特点:
分布式、持久化的发布-订阅消息系统。
高吞吐量、低延迟。
支持水平扩展和数据持久化。
主要用于大数据流、日志收集、实时数据处理等场景。
#适用场景:
日志和事件数据的持久化和传输。
流式数据处理、实时数据分析。
构建实时数据管道。
#使用方法:
创建主题(Topic)来组织消息。
发布者(Producer)将消息发送到主题。
消费者(Consumer)订阅主题并接收消息。
可以使用 Kafka Connect 来连接其他系统,例如数据库、文件系统等。
(2)RabbitMQ
#特点:
开源的消息代理软件,实现了 AMQP(高级消息队列协议)。
支持多种消息协议,包括 AMQP、STOMP、MQTT 等。
灵活的消息路由和队列管理功能。
提供了丰富的插件系统,支持扩展和定制。
#适用场景:
异步消息传递、解耦系统组件。
工作队列、任务分发和处理。
RPC(远程过程调用)、事件驱动架构。
#使用方法:
创建队列(Queue)来存储消息。
发布者将消息发送到队列。
消费者从队列中获取消息并进行处理。
可以使用交换机(Exchange)来路由消息到不同的队列,以及设置路由规则。
(3)RocketMQ
#特点:
高吞吐量、低延迟的分布式消息中间件。
提供了丰富的消息模型,包括发布-订阅、点对点等。
支持事务消息和批量消息发送。
提供了丰富的监控和管理功能。
#适用场景:
异步消息传递、解耦系统组件。
分布式事务消息。
流式数据处理、实时消息分析。
#使用方法:
创建主题(Topic)来组织消息。
发布者(Producer)将消息发送到主题。
消费者(Consumer)订阅主题并接收消息。
提供了丰富的客户端 API 和控制台管理工具来管理和监控消息。
(4)小结
如果你需要处理大数据流,构建实时数据管道,Apache Kafka 是一个不错的选择。
如果你需要一种灵活、多协议支持的消息代理,或者需要实现任务队列、事件驱动等模式,可以考虑使用 RabbitMQ。
如果你在互联网应用、电商平台等领域需要高吞吐量、低延迟的消息中间件,并且需要支持分布式事务消息等高级特性,可以选择 RocketMQ。
二、部署环境及中间件版本
系统版本:CentOS Linux release 7.9.2009
maven版本:Apache Maven 3.0.5 (Red Hat 3.0.5-17)
java版本: 1.8.0_402
rocketmq版本:5.2.0
三、准备
1、关闭自带防火墙,用iptables
# 关闭SELinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 关闭Firewalld并禁止自启动
systemctl stop firewalld
systemctl disable firewalld
# 安装iptables
yum install -y iptables-services
# 启动iptables服务,并设置开机自启动(修改规则在/etc/sysconfig/iptables)
systemctl start iptables
systemctl enable iptables.service
2、时间同步
yum -y install ntp
systemctl enable ntpd
systemctl start ntpd
timedatectl set-timezone Asia/Shanghai
ntpdate -u time.nist.gov
date
3、创建安装包存放目录,并下载安装包
#1、创建安装包存放目录
mkdir -pv /server/tools
#2、下载安装包
wget https://dist.apache.org/repos/dist/release/rocketmq/5.2.0/rocketmq-all-5.2.0-bin-release.zip
wget https://dist.apache.org/repos/dist/release/rocketmq/rocketmq-dashboard/1.0.0/rocketmq-dashboard-1.0.0-source-release.zip
4、安装java服务
#如果要下载历史版本,可以去这个链接下面找(jdk-8u212-linux-x64.rpm)
#https://www.oracle.com/java/technologies/javase/javase8u211-later-archive-downloads.html
rpm -ivh jdk-8u212-linux-x64.rpm
四、安装部署RocketMQ
1、指定路径解压
cd /server/tools
unzip rocketmq-all-5.2.0-bin-release.zip -d /data
2、启动NameServer
#启动NameServer
cd /data/rocketmq-all-5.2.0-bin-release/bin
nohup sh mqnamesrv &
#查看日志
tail -f ~/logs/rocketmqlogs/namesrv.log
#检查进程(Namesrv)和端口(默认9876端口)
ps axu|grep Namesrv
ss -ntl|grep 9876
3、配置并启动Broker
(1) 修改配置文件broker.conf
#vim /data/rocketmq-all-5.2.0-bin-release/conf/broker.conf
#追加两行,指定brokerIP1(broker地址),namesrvAddr
brokerIP1=192.168.1.22
namesrvAddr=127.0.0.1:9876
(2) 启动Broker
#启动Broker
cd /data/rocketmq-all-5.2.0-bin-release/bin
#自动创建主题的功能,建议仅在测试环境使用,生产环境请勿打开,避免产生大量垃圾主题,无法管理和回收并浪费系统资源。
#nohup sh mqbroker -c ../conf/broker.conf -n 127.0.0.1:9876 autoCreateTopicEnable=true &
#nohup sh mqbroker -c ../conf/broker.conf -n 127.0.0.1:9876 &
nohup sh mqbroker -c ../conf/broker.conf -n localhost:9876 --enable-proxy &
#查看日志
tail -f ~/logs/rocketmqlogs/broker.log
#检查进程(broker)
ps aux|grep broker
注意:Broker在启动的过程中可能会存在由于堆空间初始值太大启动不起来的问题,需要调一下堆空间的初始值
解决方法:
cd /data/rocketmq-all-5.2.0-bin-release/bin
vim runbroker.sh
#87行,将4g改成1g(可根据情况自行修改)
#103行,将8g改成2g(可根据情况自行修改)
4、测试消息发送、接收
(1) 测试消息发送
export NAMESRV_ADDR=localhost:9876
sh ./tools.sh org.apache.rocketmq.example.quickstart.Producer
(2)测试消息接收
sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer
5、创建主题、创建消费组
cd /data/rocketmq-all-5.2.0-bin-release/bin
#创建主题
#sh mqadmin updateTopic -n -t <topic_name> -c <cluster_name> -a +message.type=<message_type>
sh mqadmin updateTopic -n 127.0.0.1:9876 -t test_normal -c DefaultCluster -a +message.type=NORMAL
sh mqadmin updateTopic -n 127.0.0.1:9876 -t test_delay -c DefaultCluster -a +message.type=DELAY
sh mqadmin updateTopic -n 127.0.0.1:9876 -t test_fifo -c DefaultCluster -a +message.type=FIFO
sh mqadmin updateTopic -n 127.0.0.1:9876 -t test_transaction -c DefaultCluster -a +message.type=TRANSACTION
#创建消费组
sh mqadmin updateSubGroup -n 127.0.0.1:9876 -c DefaultCluster -g test_fifo_group -s true
五、关闭RocketMQ
#关闭RocketMQ的时候,需要先关闭Broker,然后再关闭NameServer。
#关闭Broker
cd /data/rocketmq-all-5.2.0-bin-release/bin
sh ./mqshutdown broker
#关闭NameServer
cd /data/rocketmq-all-5.2.0-bin-release/bin
sh ./mqshutdown namesrv
六、安装RocketMQ的图形化界面(RocketMQ-Dashboard)
1、下载并解压缩
#下载地址:https://github.com/rocketmq/rocketmq-externals/tree/master
cd /server/tools
wget https://dist.apache.org/repos/dist/release/rocketmq/rocketmq-dashboard/1.0.0/rocketmq-dashboard-1.0.0-source-release.zip
#解压缩
unzip rocketmq-dashboard-1.0.0-source-release.zip -d /data
2、修改配置文件application.properties
#主要修改两个位置,一个位置是server.port=,另一个位置是rocketmq.config.namesrvAddr=
#server.port是配置服务的端口,rocketmq.config.namesrvAddr是配置namesrv服务的地址,修改rocketmq.config.dataPath
vim /data/rocketmq-externals-master/rocketmq-console/src/main/resources/application.properties
server.address=0.0.0.0
server.port=10080
spring.application.name=rocketmq-dashboard
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.level.root=INFO
logging.config=classpath:logback.xml
rocketmq.config.namesrvAddr=127.0.0.1:9876
rocketmq.config.isVIPChannel=
rocketmq.config.timeoutMillis=
rocketmq.config.dataPath=/data/rocketmq-dashboard-1.0.0/src/main/resources
rocketmq.config.enableDashBoardCollect=true
rocketmq.config.msgTrackTopicName=
rocketmq.config.ticketKey=ticket
rocketmq.config.loginRequired=false
rocketmq.config.useTLS=false
3、安装maven,并进行打包
#安装maven
yum install maven -y
#配置阿里云的maven源(在配置文件的<mirrors></mirrors>中添加阿里云公共仓库,即下面这段)
vim /etc/maven/settings.xml
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
#打包
cd /data/rocketmq-externals-master/rocketmq-console
mvn clean package -Dmaven.test.skip=true
4、运行jar包,防火墙放行10080端口
#运行jar包
cd /data/rocketmq-dashboard-1.0.0/target
nohup java -jar rocketmq-dashboard-1.0.0.jar 2>&1 &
#检查服务端口
ss -ntl|grep 10080
#防火墙放行8080端口
-A INPUT -p tcp -m tcp --dport 10080 -j ACCEPT
#重启防火墙
systemctl restart iptables
5、访问网站验证
http://192.168.1.22:10080
七、设置密码
1、设置RabbitMQ账号密码
(1)开启broker的acl控制
#在broker.conf文件中追加aclEnable=true
#vim /data/rocketmq-5.2.0/conf/broker.conf
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
brokerIP1=192.168.1.22
namesrvAddr=127.0.0.1:9876
#开启acl
aclEnable=true
(2)创建acl目录,配置plain_acl.yml文件
#创建acl目录
mkdir -pv /data/rocketmq-5.2.0/conf/acl
cd /data/rocketmq-5.2.0/conf/acl
cp ../plain_acl.yml
#修改plain_acl.yml的配置
#1、将白名单地址都去掉
#2、修改配置文件中默认的accessKey和secretKey。(注意:如果想在你所在的网段不用账号密码,可以添加在globalWhiteRemoteAddresses或whiteRemoteAddress中)
#vim /data/rocketmq-5.1.3/conf/acl/plain_acl.yml
globalWhiteRemoteAddresses:
#- 10.10.103.*
#- 192.168.0.*
accounts:
- accessKey: RocketMQ
secretKey: 自定义密码
whiteRemoteAddress:
admin: false
defaultTopicPerm: DENY
defaultGroupPerm: SUB
topicPerms:
- topicA=DENY
- topicB=PUB|SUB
- topicC=SUB
groupPerms:
# the group should convert to retry topic
- groupA=DENY
- groupB=PUB|SUB
- groupC=SUB
- accessKey: 自定义
secretKey: 自定义
#whiteRemoteAddress: 192.168.0.*
# if it is admin, it could access all resources
admin: true
#重启NameServer和Broker
2、配置RocketMQ-Dashboard账号密码
#修改rocketmq-dashboard配置文件application.properties
cd /data/rocketmq-dashboard-1.0.0/src/main/resources
sed -i s/rocketmq.config.loginRequired=false/rocketmq.config.loginRequired=true/g application.properties
sed -i s/rocketmq.config.accessKey=/rocketmq.config.accessKey=和plain_acl的密码一致/g application.properties
sed -i s/rocketmq.config.secretKey=/rocketmq.config.secretKey=和plain_acl的密码一致/g application.properties
#配置用户账号密码,修改users.properties配置文件(暂时先保留admin用户,其他的默认用户全部注释掉)
vim users.properties
admin=自定义密码,1
#重启RocketMQ-Dashboard
八、开发调用端口
#修改配置文件rmq-proxy.json(开发调用的端口是8081)
#namesrvAddr:NameServer地址,分号分割;
#proxyMode:cluster模式;
#rocketMQClusterName:目标broker集群名称(proxy是集群级别的);
#remotingListenPort:remoting协议端口,默认8080;
#grpcServerPort:grpc协议端口,默认8081;
#useEndpointPortFromRequest:查询路由,是否使用入参endpoint端点的端口;
#enableACL:是否开启acl(client和proxy之间);
#vim /data/rocketmq-5.1.3/conf/rmq-proxy.json
{
"namesrvAddr": "127.0.0.1:9876",
"proxyMode": "cluster",
"rocketMQClusterName": "DefaultCluster",
"remotingListenPort": 8080,
"grpcServerPort": 8081,
"useEndpointPortFromRequest": true,
"enableACL": true
}
#重启NameServer和Broker
九、FAQ
问题:
#命令创建消费者报错
#./mqadmin updateSubGroup -n 127.0.0.1:9876 -g TestConsume -b 127.0.0.1:10911
Caused by: org.apache.rocketmq.client.exception.MQClientException: CODE: 1 DESC: org.apache.rocketmq.acl.common.AclException: No acl config for rocketmq2, org.apache.rocketmq.acl.plain.PlainPermissionManager.validate(PlainPermissionManager.java:613)
#解决:
#mqadmin的授权配置在conf/tools.yml下,这里面的配置要与plain_acl.yml文件中的一致
vim /data/rocketmq-5.1.3/conf/tools.yml
accessKey: admin123
secretKey: admin123