安装
打开 官方Quick Start 下载带bin版本的rocketmq,这样就不需要再次编译安装了,可以直接使用。如果下载的是带source的下载包的话,则必须使用 mvn -Prelease-all -DskipTests clean install -U 来打包。
1 | wget https://mirrors.bfsu.edu.cn/apache/rocketmq/4.8.0/rocketmq-all-4.8.0-bin-release.zip |
然后解压到指定目录即可。如果只要单机启动的话,就比较简单,运行以下命令即可:
1 | nohup sh bin/mqnamesrv & |
集群部署配置
模式介绍
一般部署方法有以下几种:
- 单Master模式:这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,可以用于本地测试。
- 多Master模式:一个集群无Slave,全是Master,例如2个Master或者3个Master,这种模式的优缺点如下:
- 优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高;
- 缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。
- 多Master多Slave模式-异步复制:每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:
- 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;
- 缺点:Master宕机,磁盘损坏情况下会丢失少量消息。
- 多Master多Slave模式-同步双写:每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:
- 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;
- 缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。
- Dledger集群:
RocketMQ-on-DLedger Group是指一组「相同名称的 Broker」,至少需要 3 个节点,通过 「Raft」 自动选举出一个 Leader,其余节点作为 Follower,并在 Leader 和 Follower 之间复制数据以保证高可用。
同步双写
在conf目录下有以下目录,分别代表了不同的模式,2m-2s-async 表示多Master多Slave模式-异步复制,2m-2s-sync 表示多Master多Slave模式-同步复制,2m-noslave 表示多Master,broker.conf 表示单机配置,还有一种是dledger是自动选举模式,必须三台机器
1 | [root@8fptpfxk957bjm rocketmq]# ll conf/ |
我们以同步双写的方法来配置。
配置解析
1 | #mq-master01节点配置/data/rocketmq/conf/2m-2s-sync/broker-a.properties |
详细配置
以下是我的环境,2台机器互为主备,这边使用配置文件进行区分,实际上2台机器上面的配置文件名是可以一样的。
| 配制文件 | IP | 角色 |
|---|---|---|
| broker-a.properties | 172.31.0.21 | SYNC_MASTER |
| broker-a-s.properties | 172.31.0.22 | SLAVE |
| broker-b.properties | 172.31.0.22 | SYNC_MASTER |
| broker-b-s.properties | 172.31.0.21 | SLAVE |
以下是 172.31.0.21 的配置文件,主备关系是通过brokerName+brokerId+brokerRole来确认的,实际上配置文件都是差不多的。同时注意目录路径是有区别的:
1 | [root@8fptpfxk957bjm 2m-2s-sync]# cat broker-a.properties |
以下是 172.31.0.22 的配置文件,
1 | [root@27zrgari9hd937 2m-2s-sync]# cat broker-b.properties |
同时要注意配置storePathRootDir以及storePathCommitLog的路径。
java启动配置
官方默认的启动脚本所使用的内存比较大,由于是测试环境,需要修改一下:
bin/mqnamesrv:对应的脚本是
sh ${ROCKETMQ_HOME}/bin/runserver.sh,按以下方式修改:1
2
3
4
5
6# 修改内存大小
JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
# 默认的日志是配置是在 $user.home/logs/rocketmqlogs/下,需要修改:
JAVA_OPT="${JAVA_OPT} -Dons.client.logRoot=/usr/local/rocketmq"
JAVA_OPT="${JAVA_OPT} -Duser.home=/usr/local/rocketmq"bin/mqbroker:对应的脚本是
sh ${ROCKETMQ_HOME}/bin/runbroker.sh:1
2
3JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn2g"
JAVA_OPT="${JAVA_OPT} -Dons.client.logRoot=/usr/local/rocketmq"
JAVA_OPT="${JAVA_OPT} -Duser.home=/usr/local/rocketmq"
启动脚本
nohup方式管理的方法如下:
- nameserver
1 | 启动:cd /usr/local/rocketmq/bin && nohup ./mqnamesrv & |
- broker
1 | 启动:cd /usr/local/rocketmq/ && nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a.properties & |
比较麻烦,还是通过systemctl来接管。
根据实际的情况修改以下配置:
1 | [root@8fptpfxk957bjm 2m-2s-sync]# systemctl cat rocketmq-namesrv.service |
然后start相对应的服务即可。
常用命令
1 | # 生产消息 |
有关 mqadmin 的命令说明,可以访问: mqadmin管理工具
rocketmq-console部署
rocketmq-console是可以管理rocketmq集群的,先下载rocketmq-externals
1 | git clone https://github.com/apache/rocketmq-externals.git |
下载会比较慢,自己想办法解决:
修改rocketmq-externals/rocketmq-console/src/main/resources/application.properties
1 | server.address=0.0.0.0 |
修改rocketmq-externals/rocketmq-console/pom.xml,与服务端版本一致
1 | <rocketmq.version>4.7.1</rocketmq.version> |
打包, 打包期间报错修改pom.xml中的jar 版本
1 | cd rocketmq-externals/rocketmq-console |
启动 java -jar target/rocketmq-console-ng-2.0.0.jar,访问 http://localhost:8088 即可。
如果想自定义参数,可以直接使用配置文件来做自定义:
- users.properties,配置控制台用户名和密码。
1 | # This file supports hot change, any change will be auto-reloaded without Console restarting. |
application.properties:配置访问端口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29server.contextPath=
server.port=8088
### SSL setting
#server.ssl.key-store=classpath:rmqcngkeystore.jks
#server.ssl.key-store-password=rocketmq
#server.ssl.keyStoreType=PKCS12
#server.ssl.keyAlias=rmqcngkey
#spring.application.index=true
spring.application.name=rocketmq-console
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
logging.config=classpath:logback.xml
#if this value is empty,use env value rocketmq.config.namesrvAddr NAMESRV_ADDR | now, you can set it in ops page.default localhost:9876
rocketmq.config.namesrvAddr=127.0.0.1:9876
#if you use rocketmq version < 3.5.8, rocketmq.config.isVIPChannel should be false.default true
rocketmq.config.isVIPChannel=
#rocketmq-console's data path:dashboard/monitor
rocketmq.config.dataPath=/usr/local/rocketmq/data/broker-a
#set it false if you don't want use dashboard.default true
rocketmq.config.enableDashBoardCollect=true
#set the message track trace topic if you don't want use the default one
rocketmq.config.msgTrackTopicName=
rocketmq.config.ticketKey=ticket
#Must create userInfo file: ${rocketmq.config.dataPath}/users.properties if the login is required
rocketmq.config.loginRequired=true
然后使用 java -jar rocketmq-console-ng-2.0.0.jar -Dspring.config.location=./ 来启动。
使用方法,请参考 RocketMQ系列:rocketmq运维控制台使用详解(全网独家)
mqadmin详解
为了方便命令运行,将 export PATH=$PATH:/usr/local/rocketmq/bin/加入到/etc/profile。
集群状态查看
1 | # 集群状态 |
topic相关命令
1 | # topicList |
消息相关命令
1 | # 发送消息 |
可以使用命令创建订阅组,但是没有找到方法怎么样去跟topic关联起来。所以在rocketmq里面,不需要创建消费组。