Rubin's Blog

  • 首页
  • 关于作者
  • 隐私政策
享受恬静与美好~~~
分享生活的点点滴滴~~~
  1. 首页
  2. RocketMQ
  3. 正文

RocketMQ之集群与运维

2021年 11月 25日 848点热度 0人点赞 0条评论

集群搭建方式

集群特点

  • NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步
  • Broker部署相对复杂,Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer
  • Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master建立长连接,且定时向Master发送心跳。Producer完全无状态,可集群部署
  • Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供Topic服务的Master、Slave建立长连接,且定时向Master、Slave发送心跳。Consumer既可以从Master订阅消息,也可以从Slave订阅消息,订阅规则由Broker配置决定

集群模式

单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会略高,且目前版本在主节点宕机后,备机不能自动切换为主机

集群的搭建

前置配置

  • 安装JDK 8+
  • 如果是JDK11的话需要修改RocketMQ的启动脚本,修改方式见《RocketMQ之架构与实战》

单Master模式

这是最简单也是风险最大的模式,一旦broker重启或宕机,整个服务不可用。不推荐在生产环境使用,一般用于开发或本地测试。

步骤如下:

启动NameServer

# 首先启动NameServer
$ nohup sh mqnamesrv &

# 检查Name Server是否启动成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...

只要在namesrv.log中看到“The Name Server boot success.. ”就表示NameServer启动成功了。

启动Broker

# 首先启动broker
$ nohup sh mqbroker -n localhost:9876 &

# 检查broker是否启动成功。如果看到broker的下面的语句表示启动成功
$ tail -f ~/logs/rocketmqlogs/broker.log
The broker[broker-a,192.169.1.2:10911] boot success...

如果在broker.log中看到“The broker[brokerName,ip:port] boot success..”就表示broker启动成功。

多Master模式

多Master模式意味着所有的节点都是Master节点,没有Slave节点。

启动步骤如下:

启动NameServer

# 首先启动NameServer
$ nohup sh mqnamesrv &

# 检查Name Server是否启动成功
$ tail -f ~/logs/rocketmqlogs/namesrv.log
The Name Server boot success...

只要在namesrv.log中看到“The Name Server boot success.. ”就表示NameServer启动成功了。

启动Broker集群

# 启动第一个broker,假定namesrv在192.168.1.1上。注意这里的配置文件的位置
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-
noslave/broker-a.properties &

# 在第二台服务器上启动另一个broker。
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-
noslave/broker-b.properties &

上面的NameServer是一台,IP地址直接写,如果是多台NameServer,则需要在-n后接多个NameServer的地址,使用分号分开。由于shell对分号敏感,可以使用单引号引起来多个NameServer的地址,禁止shell对分号的解释。

多Master和Slave模式-异步复制

每个Master节点配置一个或多个Slave节点,组成一组,有多组这样的组合组成集群。HA使用异步复制,Master和Slave节点间有毫秒级的消息同步延迟。

启动步骤如下:

启动Broker

# 首先启动broker
$ nohup sh mqbroker -n localhost:9876 &

# 检查broker是否启动成功。如果看到broker的下面的语句表示启动成功
$ tail -f ~/logs/rocketmqlogs/broker.log
The broker[broker-a,192.169.1.2:10911] boot success...

如果在broker.log中看到“The broker[brokerName,ip:port] boot success..”就表示broker启动成功。

启动Broker集群

# 启动Master的broker:broker-a
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-
async/broker-a.properties &

# 在另外一台服务器上启动另一个Master的broker:broker-b
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-
async/broker-b.properties &

# 在另一台服务器上启动broker-a的Slave
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-
async/broker-a-s.properties &

# 在另一台服务器上启动broker-b的Slave
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-
async/broker-b-s.properties &

以上启动的是2M-2S-Async模式,双主双从,主从异步复制模式。

多Master和Slave模式-同步双写

该模式中,每个Master节点配置多个Slave节点,它们构成一组,多组构成集群。HA使用同步双写,即只有消息在Master节点和多个Slave节点上写成功,才返回生产者消息发送成功。

启动步骤如下:

启动Broker

# 首先启动broker
$ nohup sh mqbroker -n localhost:9876 &

# 检查broker是否启动成功。如果看到broker的下面的语句表示启动成功
$ tail -f ~/logs/rocketmqlogs/broker.log
The broker[broker-a,192.169.1.2:10911] boot success...

如果在broker.log中看到“The broker[brokerName,ip:port] boot success..”就表示broker启动成功。

启动Broker集群

# 在一个节点启动broker-a(MASTER)
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-
sync/broker-a.properties &

# 在另一个节点启动broker-b(MASTER)
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-
sync/broker-b.properties &

# 在另一个节点启动broker-a的同步Slave节点:broker-a-s
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-
sync/broker-a-s.properties &

# 在另一个节点启动broker-b的同步Slave节点:broker-b-s
$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-
sync/broker-b-s.properties &

上述配置中,通过相同的brokerName不同的brokerId将Master和Slave组合为一组。Master的brokerId必须是0,Slave的brokerId必须大于0,且不能相同。

mqadmin管理工具

注意:

  1. 执行命令方法: ./mqadmin {command} {args}
  2. 几乎所有命令都需要配置-n表示NameServer地址,格式为ip:port
  3. 几乎所有命令都可以通过-h获取帮助
  4. 如果既有Broker地址(-b)配置项又有clusterName(-c)配置项,则优先以Broker地址执行命令,如果不配置Broker地址,则对集群中所有主机执行命令,只支持一个Broker地址。-b格式为ip:port,port默认是10911
  5. 在tools下可以看到很多命令,但并不是所有命令都能使用,只有在MQAdminStartup中初始化的命令才能使用,你也可以修改这个类,增加或自定义命令
  6. 由于版本更新问题,少部分命令可能未及时更新,遇到错误请直接阅读相关命令源码

Topic相关

启动集群:

root@node1 ~]# nohup sh mqnamesrv &
[root@node1 ~]# nohup sh mqbroker -n node1:9876 -c /opt/rocketmq/conf/2m-2s-
sync/broker-a.properties &
[root@node2 ~]# nohup sh mqbroker -n node1:9876 -c /opt/rocketmq/conf/2m-2s-
sync/broker-a-s.properties &
[root@node3 ~]# nohup sh mqbroker -n node1:9876 -c /opt/rocketmq/conf/2m-2s-
sync/broker-b.properties &
[root@node4 ~]# nohup sh mqbroker -n node1:9876 -c /opt/rocketmq/conf/2m-2s-
sync/broker-b-s.properties &

命令列表

名称含义命令选项说明
updateTopic创建更新Topic配置-bBroker地址,表示topic所在Broker,只支持单台Broker,地址为ip:port
-ccluster名称,表示topic所在集群(集群可通过clusterList查询)
-h打印帮助
-nNameServer服务地址,格式ip:port
-p指定新topic的读写权限
-r可读队列数(默认为 8)
-w可写队列数(默认为 8)
-ttopic名称(名称只能使用字符 ^[a-zA-Z0-9_-]+$ )
deleteTopic删除Topic-ccluster名称,表示topic所在集群(集群可通过clusterList查询)
-h 打印帮助
-nNameServer服务地址,格式ip:port
-t topic名称(名称只能使用字符 ^[a-zA-Z0-9_-]+$ )
topicList查看Topic列表信息-h 打印帮助
-c不配置-c只返回topic列表,增加-c返回clusterName, topic, consumerGroup信息,即topic的所属集群和订阅关系,没有参数
-n NameServer服务地址,格式ip:port
topicRoute查看Topic路由信息 -t topic名称(名称只能使用字符 ^[a-zA-Z0-9_-]+$ )
-h 打印帮助
-n NameServer服务地址,格式ip:port
topicStatus查看 Topic 消息队列offset-t topic名称(名称只能使用字符 ^[a-zA-Z0-9_-]+$ )
-h 打印帮助
-n NameServer服务地址,格式ip:port
topicClusterList查看Topic所在集群列表-t topic名称(名称只能使用字符 ^[a-zA-Z0-9_-]+$ )
-h 打印帮助
-n NameServer服务地址,格式ip:port
updateTopicPerm更新Topic读写权限-ttopic名称(名称只能使用字符 ^[a-zA-Z0-9_-]+$ )
-h打印帮助
-nNameServer服务地址,格式ip:port
-bBroker地址,表示topic所在Broker,只支持单台Broker,地址为ip:port
-p指定新topic的读写权限
-ccluster 名称,表示 topic 所在集群(集群可通过 clusterList 查询),-b优先,如果没有-b,则对集群中所有Broker执行命令
updateOrderConf从NameServer上创建、删除、获取特定命名空间的kv配置,目前还未启用-h打印帮助
-nNameServer服务地址,格式ip:port
-ttopic名称(名称只能使用字符 ^[a-zA-Z0-9_-]+$ )
-vorderConf,值
-mmethod,可选get、put、delete
allocateMQ以平均负载算法计算消费者列表负载消息队列的负载结果-ttopic名称(名称只能使用字符 ^[a-zA-Z0-9_-]+$ )
-h打印帮助
-nNameServer服务地址,格式ip:port
-iipList,用逗号分隔,计算这些ip去负载Topic的消息队列
statsAll打印Topic订阅关系、TPS、积累量、24h读写总量等信息-h打印帮助
-nNameServer 服务地址,格式 ip:port
-a是否只打印活跃topic
-ttopic名称(名称只能使用字符 ^[a-zA-Z0-9_-]+$ )

具体操作

# 查看指定NameServer下的主题
[root@node4 ~]# mqadmin topicList -n node1:9876
# 查看指定NameServer,指定集群名称下的主题
[root@node4 ~]# mqadmin topicList -n node1:9876 -c DefaultCluster
# 创建主题,指定NameServer,指定Broker 指定主题名称,指定主题的写队列个数,指定读主题队
列个数
[root@node4 ~]# mqadmin updateTopic -b node1:10911 -r 3 -w 3 -t tp_admin_01
# 描述主题,指定NameServer,指定主题名称
[root@node4 ~]# mqadmin topicStatus -t tp_admin_01 -n node1:9876
# 创建主题,指定NameServer,指定集群名称,指定主题名称,指定读主题队列个数,指定写主题队
列个数
[root@node4 ~]# mqadmin updateTopic -c DefaultCluster -n node1:9876 -r 3 -w
 3 -t tp_admin_02
# 查看指定主题的状态,指定NameServer地址,指定主题名称
[root@node4 ~]# mqadmin topicStatus -t tp_admin_02 -n node1:9876
# 删除主题,指定NameServer地址,指定集群名称,指定主题名称
[root@node3 ~]# mqadmin deleteTopic -n node1:9876 -c DefaultCluster -t
 tp_admin_03
# 查看主题所在的集群,指定NameServer地址,指定主题名称。因为不同集群可以拥有同名的主题,
并且不同集群可以注册到同一个NameServer
[root@node3 ~]# mqadmin topicClusterList -n node1:9876 -t tp_admin_02
# 计算消费的负载均衡,不同的-i列表,计算不同的消费平衡负载结果
[root@node3 ~]# mqadmin allocateMQ -n node1:9876 -t tp_admin_02 -i
 node1,node3
[root@node3 ~]# mqadmin allocateMQ -n node1:9876 -t tp_admin_02 -i
 node1,node2,node3,node4
# 打印Topic订阅关系、TPS、积累量、24h读写总量等信息
[root@node3 ~]# mqadmin statsAll -n node1:9876

集群相关

命令列表

名称含义 命令选项 说明
clusterList查看集群信息,集群、BrokerName、BrokerId、TPS等信息-m打印更多信息 (增加打印出如下信息InTotalYest, #OutTotalYest,InTotalToday ,#OutTotalToday)
-h打印帮助
-nNameServer服务地址,格式 ip:port
-i打印间隔,单位秒
clusterRT发送消息检测集群各BrokerRT。消息发往${BrokerName} Topic-aamount,每次探测的总数,RT = 总时间 / amount
-s消息大小,单位B
-c探测哪个集群
-p是否打印格式化日志
-h打印帮助
-m所属机房,打印使用
-i发送间隔,单位秒
-nNameServer服务地址,格式 ip:port

具体操作

# 查看集群信息,集群、BrokerName、BrokerId、TPS等信息
[root@node3 ~]# mqadmin clusterList -n node1:9876 -i 1 -m
# 检查集群中broker的延迟
[root@node3 ~]# mqadmin clusterRT -a 5 -s 1048576 -c DefaultCluster -p true -
i 2 -n node1:9876

Broker相关

名称含义命令选项说明
updateBrokerConfig更新Broker配置文件,会修改Broker.conf-bBroker地址,格式为ip:port
-ccluster名称
-kkey值
-vvalue值
-h打印帮助
-nNameServer服务地址,格式 ip:port
brokerStatus查看Broker统计信息、运行状态(你想要的信息几乎都在里面)-bBroker地址,地址为ip:port
-h打印帮助
-nNameServer服务地址,格式 ip:port
brokerConsumeStatsBroker中各个消费者的消费情况,按Message Queue维度返回Consume Offset,Broker Offset,Diff,TImestamp等信息-bBroker地址,地址为ip:port
-t请求超时时间
-ldiff阈值,超过阈值才打印
-o是否为顺序topic,一般为false
-h打印帮助
-nNameServer服务地址,格式 ip:port
getBrokerConfig获取Broker配置-bBroker地址,地址为ip:port
-nNameServer服务地址,格式 ip:port
wipeWritePerm从NameServer上清除Broker写权限-bBroker地址,地址为ip:port
-nNameServer服务地址,格式 ip:port
-h打印帮助
cleanExpiredCQ清理Broker上过期的Consume Queue,如果手动减少对列数可能产生过期队列-nNameServer服务地址,格式 ip:port
-h打印帮助
-bBroker地址,地址为ip:port
-c集群名称
cleanUnusedTopic清理Broker上不使用的Topic,从内存中释放Topic的Consume Queue,如果手动删除Topic会产生不使用的Topic-nNameServer 服务地址,格式 ip:port
-h打印帮助
-bBroker 地址,地址为ip:port
-c集群名称
sendMsgStatus向Broker发消息,返回发送状态和RT-nNameServer服务地址,格式 ip:port
-h打印帮助
-bBrokerName,注意不同于Broker地址
-s消息大小,单位B
-c发送次数

具体操作

# 查看broker状态
[root@node3 ~]# mqadmin brokerStatus -b node1:10911
[root@node3 ~]# mqadmin brokerStatus -n node1:9876 -b node2:10911
# 修改节点的配置,配置文件也会修改
[root@node3 ~]# mqadmin updateBrokerConfig -n node1:9876 -b node2:10911 -c
 DefaultCluster -k brokerRole -v ASYNC_MASTER -k brokerId -v 0 -k brokerName
 -v 'broker-c'
# 获取Broker配置
[root@node1 ~]# mqadmin getBrokerConfig -n node1:9876 -b node3:10911
# 清理Broker上不使用的Topic,从内存中释放Topic的Consume Queue,如果手动删除Topic会产
生不使用的Topic
[root@node1 ~]# mqadmin cleanUnusedTopic -n node1:9876 -b node1:10911 -c
 DefaultCluster
# 向Broker发消息,返回发送状态和RT
[root@node3 ~]# mqadmin sendMsgStatus -n node1:9876 -b broker-b -s 128 -c 5

消息相关

命令列表

名称含义命令选项说明
checkMsgSendRT检测向topic发消息的RT,功能类似clusterRT-h打印帮助
-nNameServer服务地址,格式 ip:port
-ttopic名称
-a探测次数
-s消息大小
sendMessage发送一条消息,可以根据配置发往特定Message Queue,或普通发送-h打印帮助
-nNameServer服务地址,格式 ip:port
-ttopic名称
-pbody,消息体
-kkeys
-ctags
-bBrokerName
-iqueueId
consumeMessage消费消息。可以根据offset、开始&结束时间戳、消息队列消费消息,配置不同执行不同消费逻辑,详见ConsumeMessageCommand-h打印帮助
-nNameServer服务地址,格式 ip:port
-ttopic名称
-bBrokerName
-o从offset开始消费
-iqueueId
-g消费者分组
-s开始时间戳,格式详见-h
-d结束时间戳
-c消费多少条消息
printMsg从Broker消费消息并打印,可选时间段-h打印帮助
-nNameServer服务地址,格式 ip:port
-ttopic名称
-c字符集,例如UTF-8
-ssubExpress,过滤表达式
-b开始时间戳,格式参见-h
-e结束时间戳
-d是否打印消息体
printMsgByQueue类似printMsg,但指定Message Queue-h打印帮助
-nNameServer服务地址,格式 ip:port
-ttopic名称
-iqueueId
-aBrokerName
-c字符集,例如UTF-8
-ssubExpress,过滤表达式
-b开始时间戳,格式参见-h
-e结束时间戳
-p是否打印消息
-d是否打印消息体
-f是否统计tag数量并打印
resetOffsetByTime按时间戳重置offset,Broker和consumer都会重置-h打印帮助
-nNameServer服务地址,格式 ip:port
-g消费者分组
-ttopic名称
-s重置为此时间戳对应的offset
-f是否强制重置,如果false,只支持回溯
offset,如果true,不管时间戳对应offset与
consumeOffset关系
-c是否重置c++客户端offset

具体操作

# 根据MsgKey查询消息,指定NameServer地址,指定主题名称,指定MsgKey
[root@node3 ~]# mqadmin queryMsgByKey -n node1:9876 -t tp_admin_01 -k 00100
# 根据UNIQ_KEY查询消息,指定NameServer地址,指定UNIQ_KEY,指定消费组名称,指定主题名
称
[root@node3 ~]# mqadmin queryMsgByUniqueKey -n node1:9876 -i
C0A864672C8B277050DC5F8417BA0000 -g test_grp_console -t tp_admin_01
# 发送检查消息延迟,指定NameServer,指定主题,指定测试次数,指定消息大小,默认128KB
[root@node3 ~]# mqadmin checkMsgSendRT -n node1:9876 -t tp_admin_01 -a 5 -s
 128
# 指定发送消息的大小,以测试延迟 1MB
[root@node3 ~]# mqadmin checkMsgSendRT -n node1:9876 -t tp_admin_01 -a 5 -s
 1048576
# 消费消息,指定NameServer,指定主题,指定broker名称,指定MQ的id。
[root@node3 ~]# mqadmin consumeMessage -n node1:9876 -t tp_admin_01 -o 0 -b
 broker-a -i 0
# 发送消息,指定主题,指定NameServer地址,指定消息体
[root@node3 ~]# mqadmin sendMessage -n node1:9876 -t tp_admin_01 -p 'hello
 rubin console'
# 发送消息,指定主题,指定NameServer地址,指定消息体,指定keys,指定tags
[root@node3 ~]# mqadmin sendMessage -n node1:9876 -t tp_admin_01 -p 'hello
 rubin console' -k '00100' -c 'test'
# 发送消息,指定NameServer,指定消息体,指定Broker,指定主题
[root@node3 ~]# mqadmin sendMessage -n node1:9876 -p 'hello rubin test 01'
 -b broker-a -i 0 -t 'tp_admin_01'
# 查看偏移量,指定NameServer,指定主题
[root@node1 ~]# mqadmin topicStatus -n node1:9876 -t tp_admin_01
# 打印消息,指定NameServer地址,指定主题,指定标签过滤,指定是否打印消息体
[root@node3 ~]# mqadmin printMsg -n node1:9876 -t tp_admin_01 -s "*" -d
 true

消费者、消费组相关

名称含义命令选项说明
consumerProgress查看订阅组消费状态,可以查看具体的client IP的消息积累量-g消费者所属组名
-s是否打印client IP
-h打印帮助
-nNameServer服务地址,格式 ip:port
consumerStatus查看消费者状态,包括同一个分组中是否都是相同
的订阅,分析Process Queue是否堆积,返回消费者jstack结果,内容较多,使用者参见ConsumerStatusSubCommand
-h打印帮助
-nNameServer服务地址,格式 ip:port
-gconsumer group
-iclientId
-s是否执行jstack
updateSubGroup更新或创建订阅关系-nNameServer服务地址,格式 ip:port
-h打印帮助
-bBroker地址
-c集群名称
-g消费者分组名称
-s分组是否允许消费
-m是否从最小offset开始消费
-d是否是广播模式
-q重试队列数量
-r最大重试次数
-i当slaveReadEnable开启时有效,且还未达到从slave消
费时建议从哪个BrokerId消
费,可以配置备机id,主动
从备机消费
-w如果Broker建议从slave消
费,配置决定从哪个slave消费,配置BrokerId,例如1
-a当消费者数量变化时是否通知其他消费者负载均衡
deleteSubGroup从Broker删除订阅关系-nNameServer服务地址,格式 ip:port
-h打印帮助
-bBroker地址
-c集群名称
-g消费者分组名称
cloneGroupOffset在目标群组中使用源群组的offset-nNameServer服务地址,格式 ip:port
-h打印帮助
-s源消费者组
-d目标消费者组
-ttopic名称
-o暂未使用

具体操作

# 查看消费者状态
[root@node3 ~]# mqadmin consumerStatus -n node1:9876 -g mygrp_consume -s

连接相关

命令列表

名称含义命令选项说明
consumerConnection查询Consumer的网络连接-g消费者所属组名
-nNameServer服务地址,格式rver 服务地址,格式
-h打印帮助
producerConnection查询Producer的网络连接-g生产者所属组名
-t主题名称
-nNameServer服务地址,格式ip:port
-h打印帮助

具体操作

# 查看生产者连接
[root@node3 bin]# mqadmin producerConnection -g mygrp -t tp_admin_01 -n
 node1:9876
# 查看消费者连接
[root@node3 bin]# mqadmin consumerConnection -g mygrp_consume -n node1:9876

NameServer相关

命令列表

名称含义命令选项说明
updateKvConfig更新NameServer的kv配置,目前还未使用-s命名空间
-kkey
-vvalue
-nNameServer服务地址,格式 ip:port
-h打印帮助
deleteKvConfig删除NameServer的kv配置-s命名空间
-kkey
-nNameServer服务地址,格式 ip:port
-h打印帮助
getNamesrvConfig获取NameServer配置-nNameServer服务地址,格式 ip:port
-h打印帮助
updateNamesrvConfig修改NameServer配置-nNameServer服务地址,格式 ip:port
-h打印帮助
-kkey
-vvalue

具体操作

# 获取NameServer配置信息
[root@node2 ~]# mqadmin getNamesrvConfig -n node1:9876
# 修改NameServer的配置
[root@node2 ~]# mqadmin updateNamesrvConfig -n node1:9876 -k
 serverWorkerThreads -v 10

其他

命令列表

名称含义命令选项说明
startMonitoring开启监控进程,监控消息误删、重试队列消息数等-nNameServer服务地址,格式 ip:port
-h打印帮助

具体操作

[root@node4 ~]# mqadmin startMonitoring -n node1:9876 

运维常见问题

RocketMQ的mqadmin命令报错问题

问题描述:有时候在部署完RocketMQ集群后,尝试执行“mqadmin”一些运维命令,会出现下面的异常信息:

org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to
 <null> failed

解决方法:可以在部署RocketMQ集群的虚拟机上执行 export NAMESRV_ADDR=ip:9876(ip指的是集群中部署NameServer组件的机器ip地址)命令之后再使用mqadmin的相关命令进行查询,即可得到结果。

RocketMQ生产端和消费端版本不一致导致不能正常消费的问题

问题描述:同一个生产端发出消息,A消费端可消费,B消费端却无法消费,RocketMQ Console中出现:

Not found the consumer group consume stats, because return offset table is
 empty, maybe the consumer not consume any message的异常消息。

解决方案:RocketMQ 的jar包:rocketmq-client等包应该保持生产端,消费端使用相同的version。

新增一个topic的消费组时,无法消费历史消息的问题

问题描述:当同一个topic的新增消费组启动时,消费的消息是当前的offset的消息,并未获取历史消息。

解决方案:rocketmq默认策略是从消息队列尾部,即跳过历史消息。如果想消费历史消息,则需要设置:org.apache.rocketmq.client.consumer.DefaultMQPushConsumer#setConsumeFromWhere 。常用的有以下三种配置:

  • 默认配置,一个新的订阅组第一次启动从队列的最后位置开始消费,后续再启动接着上次消费的进度开始消费,即跳过历史消息
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET); 
  • 一个新的订阅组第一次启动从队列的最前位置开始消费,后续再启动接着上次消费的进度开始消费,即消费Broker未过期的历史消息
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); 
  • 一个新的订阅组第一次启动从指定时间点开始消费,后续再启动接着上次消费的进度开始消费,和consumer.setConsumeTimestamp()配合使用,默认是半个小时以前
consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP); 

如何开启从Slave读数据功能

在某些情况下,Consumer需要将消费位点重置到1-2天前,这时在内存有限的Master Broker上,CommitLog会承载比较重的IO压力,影响到该Broker的其它消息的读与写。可以开启slaveReadEnable=true ,当Master Broker发现Consumer的消费位点与CommitLog的最新值的差值的容量超过该机器内存的百分比( accessMessageInMemoryMaxRatio=40% ),会推荐Consumer从Slave Broker中去读取数据,降低Master Broker的IO。

性能调优问题

异步刷盘建议使用自旋锁,同步刷盘建议使用重入锁,调整Broker配置项useReentrantLockWhenPutMessage,默认为false,异步刷盘建议开启TransientStorePoolEnable 。建议关闭transferMsgByHeap,提高拉消息效率,同步刷盘建议适当增大sendMessageThreadPoolNums,具体配置需要经过压测。

在RocketMQ中msgId和offsetMsgId的含义与区别

使用RocketMQ完成生产者客户端消息发送后,通常会看到如下日志打印信息:

SendResult [sendStatus=SEND_OK, msgId=0A42333A0DC818B4AAC246C290FD0000,
offsetMsgId=0A42333A00002A9F000000000134F1F5, messageQueue=MessageQueue
 [topic=topicTest1, BrokerName=mac.local, queueId=3], queueOffset=4]
  • msgId:对于客户端来说msgId是由客户端producer实例端生成的,具体来说,调用方法MessageClientIDSetter.createUniqIDBuffer() 生成唯一的Id
  • offsetMsgId:offsetMsgId是由Broker服务端在写入消息时生成的(采用”IP地址+Port端口”与“CommitLog的物理偏移量地址”做了一个字符串拼接),其中offsetMsgId就是在RocketMQ控制台直接输入查询的那个messageId

以上就是本文的全部内容。欢迎小伙伴们积极留言交流~~~

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: RocketMQ
最后更新:2022年 6月 9日

RubinChu

一个快乐的小逗比~~~

打赏 点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复
文章目录
  • 集群搭建方式
    • 集群特点
    • 集群模式
      • 单Master模式
      • 多Master模式
      • 多Master多Slave模式(异步)
      • 多Master多Slave模式(同步)
  • 集群的搭建
    • 前置配置
    • 单Master模式
      • 启动NameServer
      • 启动Broker
    • 多Master模式
      • 启动NameServer
      • 启动Broker集群
    • 多Master和Slave模式-异步复制
      • 启动Broker
      • 启动Broker集群
    • 多Master和Slave模式-同步双写
      • 启动Broker
      • 启动Broker集群
  • mqadmin管理工具
    • Topic相关
      • 命令列表
      • 具体操作
    • 集群相关
      • 命令列表
      • 具体操作
    • Broker相关
      • 具体操作
    • 消息相关
      • 命令列表
      • 具体操作
    • 消费者、消费组相关
      • 具体操作
    • 连接相关
      • 命令列表
      • 具体操作
    • NameServer相关
      • 命令列表
      • 具体操作
    • 其他
      • 命令列表
      • 具体操作
  • 运维常见问题
    • RocketMQ的mqadmin命令报错问题
    • RocketMQ生产端和消费端版本不一致导致不能正常消费的问题
    • 新增一个topic的消费组时,无法消费历史消息的问题
    • 如何开启从Slave读数据功能
    • 性能调优问题
    • 在RocketMQ中msgId和offsetMsgId的含义与区别
最新 热点 随机
最新 热点 随机
问题记录之Chrome设置屏蔽Https禁止调用Http行为 问题记录之Mac设置软链接 问题记录之JDK8连接MySQL数据库失败 面试系列之自我介绍 面试总结 算法思维
算法思维 RabbitMQ之集群与运维 架构设计基本原则 Dubbo之应用案例 MongoDB之架构设计 MySQL学习之字符串类型

COPYRIGHT © 2021 rubinchu.com. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

京ICP备19039146号-1