• 20210329 4. RocketMQ 集群与运维


    RocketMQ 集群与运维

    集群搭建方式

    集群特点

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

    集群的搭建

    单 Master 模式

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

    启动 NameServer
    ### 首先启动NameServer
    mqnamesrv
    ### 检查Name Server是否启动成功
    tail -f ~/logs/rocketmqlogs/namesrv.log
    
    # 出现以下日志说明启动成功
    # The Name Server boot success
    
    启动 Broker
    ### 首先启动broker
    mqbroker -n localhost:9876 -c $ROCKET_HOME/conf/broker.conf
    ### 检查broker是否启动成功。如果看到broker的下面的语句表示启动成功
    tail -f ~/logs/rocketmqlogs/broker.log
    
    # 出现以下日志说明启动成功
    # The broker[broker-a, 192.168.181.133:10911] boot success
    

    多 Master 模式

    多 Master 模式意味着所有的节点都是 Master 节点,没有 Slave 节点。优缺点如下:

    • 优点:
      • 配置简单。
      • 一个服务器节点的停用或重启(维护目的)不会对应用造成大的影响。
      • 如果磁盘配置了 RAID10 ,就不会由消息的丢失。(因为 RAID10 非常可靠,即使服务器不可恢复,在异步刷盘时会丢失小量数据,同步刷盘不会丢数据)。
      • 该模式性能最好。
    • 缺点:
      • 单个节点停用期间,消费者无法消费该节点上的数据,也不能订阅该节点上的数据,除非节点恢复。消息的实时性受到影响。
    启动 NameServer
    ### 首先启动NameServer
    mqnamesrv
    ### 检查Name Server是否启动成功
    tail -f ~/logs/rocketmqlogs/namesrv.log
    
    # 出现以下日志说明启动成功
    # The Name Server boot success
    
    启动 Broker 集群
    ### 启动第一个broker,假定namesrv在192.168.1.1上。注意这里的配置文件的位置
    mqbroker -n 192.168.181.133:9876 -c $ROCKET_HOME/conf/2m-noslave/broker-a.properties
    ### 在第二台服务器上启动另一个broker。
    mqbroker -n 192.168.181.133:9876 -c $ROCKET_HOME/conf/2m-noslave/broker-b.properties
    
    
    ### 检查broker是否启动成功。如果看到broker的下面的语句表示启动成功
    tail -f ~/logs/rocketmqlogs/broker.log
    
    # 出现以下日志说明启动成功
    # The broker[broker-a, 192.168.181.133:10911] boot success
    

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

    多 Master 和 Slave 模式 - 异步复制

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

    • 优点:
      • 磁盘坏掉,会有少量消息丢失,但是消息的实时性不会受到影响。
      • 同时,如果 Master 宕机,消费者依然可以从 Slave 节点消费,并且这个转换是透明的,也无需运维手动介入。
      • 性能和多Master模式差不多,弱一点点。
    • 缺点:
      • 如果 Master 宕机,磁盘坏掉,会丢失少量消息。
    启动 NameServer

    同上

    启动 Broker 集群
    ### broker-a
    mqbroker -n 192.168.181.133:9876 -c $ROCKET_HOME/conf/2m-2s-async/broker-a.properties
    ### broker-b
    mqbroker -n 192.168.181.133:9876 -c $ROCKET_HOME/conf/2m-2s-async/broker-b.properties
    ### broker-a slave
    mqbroker -n 192.168.181.133:9876 -c $ROCKET_HOME/conf/2m-2s-async/broker-a-s.properties
    ### broker-b slave
    mqbroker -n 192.168.181.133:9876 -c $ROCKET_HOME/conf/2m-2s-async/broker-b-s.properties
    
    
    
    ### 检查broker是否启动成功。如果看到broker的下面的语句表示启动成功
    tail -f ~/logs/rocketmqlogs/broker.log
    
    # 出现以下日志说明启动成功
    # The broker[broker-a, 192.168.181.133:10911] boot success
    

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

    多 Master 和 Slave 模式 - 同步双写

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

    优缺点如下:

    • 优点:
      • 数据和服务都没有单点故障
      • 当 Master 主机宕机,消息的消费不会延迟。
      • 服务和数据的高可用。
    • 缺点:
      • 该模式的性能比异步复制的模式低 10% 左右。
      • 发送消息的延迟稍微高一点。
      • 当前版本中,如果 Master 节点宕机, Slave 节点不能自动切换为 Master 模式。
    启动 NameServer

    同上

    启动 Broker 集群
    ### broker-a
    mqbroker -n 192.168.181.133:9876 -c $ROCKET_HOME/conf/2m-2s-sync/broker-a.properties
    ### broker-b
    mqbroker -n 192.168.181.133:9876 -c $ROCKET_HOME/conf/2m-2s-sync/broker-b.properties
    ### broker-a slave
    mqbroker -n 192.168.181.133:9876 -c $ROCKET_HOME/conf/2m-2s-sync/broker-a-s.properties
    ### broker-b slave
    mqbroker -n 192.168.181.133:9876 -c $ROCKET_HOME/conf/2m-2s-sync/broker-b-s.properties
    
    
    
    ### 检查broker是否启动成功。如果看到broker的下面的语句表示启动成功
    tail -f ~/logs/rocketmqlogs/broker.log
    
    # 出现以下日志说明启动成功
    # The broker[broker-a, 192.168.181.133:10911] boot success
    

    上述配置中,通过相同的 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:portport 默认是 10911
    5. tools 下可以看到很多命令,但并不是所有命令都能使用,只有在 MQAdminStartup 中初始化的命令才能使用,你也可以修改这个类,增加或自定义命令
    6. 由于版本更新问题,少部分命令可能未及时更新,遇到错误请直接阅读相关命令源码

    Topic 相关

    启动集群: 多 Master 和 Slave 模式 - 同步双写

    命令列表
    名称 含义 命 令 选 项 说明
    updateTopic 创建更新Topic配置 -b Broker 地址,表示 topic 所在 Broker,只支持单台Broker,地址为 ip:port
    -c cluster 名称,表示 topic 所在集群(集 群可通过 clusterList 查询)
    -h 打印帮助
    -n NameServer服务地址,格式 ip:port
    -p 指定新topic的读写权限
    -r 可读队列数(默认为 8)
    -w 可写队列数(默认为 8)
    -t topic 名称(名称只能使用字符 [1]+$ )
    deleteTopic 删除Topic -c cluster 名称,表示删除某集群下的某 个 topic (集群 可通过 clusterList 查 询)
    -h 打印帮助
    -n NameServer 服务地址,格式 ip:port
    -t topic 名称(名称只能使用字符 [2]+$ )
    topicList 查看 Topic 列表信息 -h 打印帮助
    -c 不配置-c只返回topic列表,增加-c返回 clusterName, topic, consumerGroup 信息,即topic的所属集群和订阅关系, 没有参数
    -n NameServer 服务地址,格式 ip:port
    topicRoute 查看 Topic 路由信息 -t topic 名称
    -h 打印帮助
    -n NameServer 服务地址,格式 ip:port
    topicStatus 查看 Topic 消息队列 offset -t topic 名称
    -h 打印帮助
    -n NameServer 服务地址,格式 ip:port
    topicClusterList 查看 Topic 所在集群列 表 -t topic 名称
    -h 打印帮助
    -n NameServer 服务地址,格式 ip:port
    updateTopicPerm 更新 Topic 读写权限 -t topic 名称
    -h 打印帮助
    -n NameServer 服务地址,格式 ip:port
    -b Broker 地址,表示 topic 所在 Broker,只支持单台Broker,地址为 ip:port
    -p 指定新 topic 的读写权限
    -c cluster 名称,表示 topic 所在集群(集 群可通过 clusterList 查询),-b优先, 如果没有-b,则对集群中所有Broker执 行命令
    updateOrderConf 从NameServer上创 建、删除、获取特定命 名空间的kv配置,目前 还未启用 -h 打印帮助
    -n NameServer 服务地址,格式 ip:port
    -t topic,键
    -v orderConf,值
    -m method,可选get、put、delete
    allocateMQ 以平均负载算法计算消 费者列表负载消息队列 的负载结果 -t topic 名称
    -h 打印帮助
    -n NameServer 服务地址,格式 ip:port
    -i ipList,用逗号分隔,计算这些ip去负 载Topic的消息队列
    statsAll 打印Topic订阅关系、 TPS、积累量、24h读 写总量等信息 -h 打印帮助
    -n NameServer 服务地址,格式 ip:port
    -a 是否只打印活跃topic
    -t 指定topic
    具体操作
    # 查看指定NameServer下的主题
    mqadmin topicList -n localhost:9876
    # 查看指定NameServer,指定集群名称下的主题
    mqadmin topicList -n localhost:9876 -c DefaultCluster
    # 创建主题,指定NameServer,指定Broker 指定主题名称,指定主题的写队列个数,指定读主题队列个数
    mqadmin updateTopic -b localhost:10911 -r 3 -w 3 -t tp_admin_01
    # 描述主题,指定NameServer,指定主题名称
    mqadmin topicStatus -t tp_admin_01 -n localhost:9876
    # 创建主题,指定NameServer,指定集群名称,指定主题名称,指定读主题队列个数,指定写主题队列个数
    mqadmin updateTopic -c DefaultCluster -n localhost:9876 -r 3 -w 3 -t tp_admin_02
    # 查看指定主题的状态,指定NameServer地址,指定主题名称
    mqadmin topicStatus -t tp_admin_02 -n localhost:9876
    #删除主题,指定NameServer地址,指定集群名称,指定主题名称
    mqadmin deleteTopic -n localhost:9876 -c DefaultCluster -t tp_admin_03
    # 查看主题所在的集群,指定NameServer地址,指定主题名称。因为不同集群可以拥有同名的主题,并且不同集群可以注册到同一个NameServer
    mqadmin topicClusterList -n localhost:9876 -t tp_admin_02
    # 计算消费的负载均衡,不同的-i列表,计算不同的消费平衡负载结果
    mqadmin allocateMQ -n localhost:9876 -t tp_admin_02 -i node1,node3
    mqadmin allocateMQ -n localhost:9876 -t tp_admin_02 -i node1,node2,node3,node4
    # 打印Topic订阅关系、TPS、积累量、24h读写总量等信息
    mqadmin statsAll -n localhost:9876
    

    集群相关

    命令列表
    名称 含义 命 令 选 项 说明
    clusterList 查看集群信息,集群、 BrokerName、BrokerId、 TPS等信息 -m 打印更多信息 (增加打印出如下信息 #InTotalYest, #OutTotalYest, #InTotalToday ,#OutTotalToday)
    -h 打印帮助
    -n NameServer 服务地址,格式 ip:port
    -i 打印间隔,单位秒
    clusterRT 发送消息检测集群各Broker RT。消息发往 ${BrokerName} Topic。 -a amount,每次探测的总数,RT = 总时间 / amount
    -s 消息大小,单位B
    -c 探测哪个集群
    -p 是否打印格式化日志
    -h 打印帮助
    -m 所属机房,打印使用
    -i 发送间隔,单位秒
    -n NameServer 服务地址,格式 ip:port
    具体操作
    # 查看集群信息,集群、BrokerName、BrokerId、TPS等信息
    mqadmin clusterList -n node1:9876 -i 1 -m
    # 检查集群中broker的延迟。
    mqadmin clusterRT -a 5 -s 1048576 -c DefaultCluster -p true -i 2 -n node1:9876
    

    Broker相关

    命令列表
    名称 含义 命 令 选 项 说明
    updateBrokerConfig 更新 Broker 配置文件,会修改 Broker.conf -b Broker 为ip:port 地址,格式
    -c cluster 名称
    -k key 值
    -v value 值
    -h 打印帮助
    -n NameServer 服务 地址,格式 ip:port
    brokerStatus 查看 Broker 统计信息、运行状态(你 想要的信息几乎都在里面) -b Broker 为ip:port 地址,地址
    -h 打印帮助
    -n NameServer 服务 地址,格式 ip:port
    brokerConsumeStats Broker中各个消费者的消费情况, 按Message Queue维度返回Consume Offset,Broker Offset, Diff,TImestamp等信息 -b Broker 地址,地址 为ip:port
    -t 请求超时时间
    -l diff阈值,超过阈值 才打印
    -o 是否为顺序topic, 一般为false
    -h 打印帮助
    -n NameServer 服务 地址,格式 ip:port
    getBrokerConfig 获取Broker配置 -b Broker 地址,地址 为ip:port
    -n NameServer 服务 地址,格式 ip:port
    wipeWritePerm 从NameServer上清除 Broker写权限 -b Broker 地址,地址 为ip:port
    -n NameServer 服务 地址,格式 ip:port
    -h 打印帮助
    cleanExpiredCQ 清理Broker上过期的Consume Queue, 如果手动减少对列数可能产生过期队列 -n NameServer 服务 地址,格式 ip:port
    -h 打印帮助
    -b Broker 地址,地址 为ip:port
    -c 集群名称
    cleanUnusedTopic 清理Broker上不使用的Topic,从内存 中释放Topic的Consume Queue, 如果手动删除Topic会产生不使用的 Topic -n NameServer 服务 地址,格式 ip:port
    -h 打印帮助
    -b Broker 地址,地址 为ip:port
    -c 集群名称
    sendMsgStatus 向Broker发消息,返回发送状态和RT -n NameServer 服务 地址,格式 ip:port
    -h 打印帮助
    -b BrokerName,注 意不同于Broker地 址
    -s 消息大小,单位B
    -c 发送次数
    具体操作
    # 查看broker状态
    mqadmin brokerStatus -b node1:10911
    mqadmin brokerStatus -n node1:9876 -b node2:10911
    # 修改节点的配置,配置文件也会修改
    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配置
    mqadmin getBrokerConfig -n node1:9876 -b node3:10911
    # 清理Broker上不使用的Topic,从内存中释放Topic的Consume Queue,如果手动删除Topic会产生不使用的Topic
    mqadmin cleanUnusedTopic -n node1:9876 -b node1:10911 -c
    DefaultCluster
    # 向Broker发消息,返回发送状态和RT
    mqadmin sendMsgStatus -n node1:9876 -b broker-b -s 128 -c 5
    

    消息相关

    命令列表
    名称 含义 命 令 选 项 说明
    queryMsgById 根据offsetMsgId查询msg,如果 使用开源控制台,应使用 offsetMsgId,此命令还有其他参 数,具体作用请阅读 QueryMsgByIdSubCommand。 -i msgId
    -h 打印帮助
    -n NameServer 服务地 址,格式 ip:port
    queryMsgByKey 根据消息 Key 查询消息 -k msgKey
    -t Topic 名称
    -h 打印帮助
    -n NameServer 服务地 址,格式 ip:port
    queryMsgByOffset 根据 Offset 查询消息 -b Broker 名称,(这里需 要注意 填写的是 Broker 的名称,不是 Broker 的地址, Broker 名称可以在 clusterList 查到)
    -i query 队列 id
    -o offset 值
    -t topic 名称
    -h 打印帮助
    -n NameServer 服务地 址,格式 ip:port
    queryMsgByUniqueKey 根据msgId查询,msgId不同于 offsetMsgId,区别详见常见运维 问题。-g,-d配合使用,查到消息 后尝试让特定的消费者消费消息并 返回消费结果 -h 打印帮助
    -n NameServer 服务地 址,格式 ip:port
    -i uniqe msg id
    -g consumerGroup
    -d clientId
    -t topic名称
    checkMsgSendRT 检测向topic发消息的RT,功能类 似clusterRT -h 打印帮助
    -n NameServer 服务地 址,格式 ip:port
    -t topic名称
    -a 探测次数
    -s 消息大小
    sendMessage 发送一条消息,可以根据配置发往 特定Message Queue,或普通发 送。 -h 打印帮助
    -n NameServer 服务地 址,格式 ip:port
    -t topic名称
    -p body,消息体
    -k keys
    -c tags
    -b BrokerName
    -i queueId
    consumeMessage 消费消息。可以根据offset、开始 &结束时间戳、消息队列消费消 息,配置不同执行不同消费逻辑, 详见 ConsumeMessageCommand。 -h 打印帮助
    -n NameServer 服务地 址,格式 ip:port
    -t topic名称
    -b BrokerName
    -o 从offset开始消费
    -i queueId
    -g 消费者分组
    -s 开始时间戳,格式详见 -h
    -d 结束时间戳
    -c 消费多少条消息
    printMsg 从Broker消费消息并打印,可选 时间段 -h 打印帮助
    -n NameServer 服务地 址,格式 ip:port
    -t topic名称
    -c 字符集,例如UTF-8
    -s subExpress,过滤表达式
    -b 开始时间戳,格式参见- h
    -e 结束时间戳
    -d 是否打印消息体
    printMsgByQueue 类似printMsg,但指定Message Queue -h 打印帮助
    -n NameServer 服务地 址,格式 ip:port
    -t topic名称
    -i queueId
    -a BrokerName
    -c 字符集,例如UTF-8
    -s subExpress,过滤表达式
    -b 开始时间戳,格式参见 -h
    -e 结束时间戳
    -p 是否打印消息
    -d 是否打印消息体
    -f 是否统计tag数量并打印
    resetOffsetByTime 按时间戳重置offset,Broker和 consumer都会重置 -h 打印帮助
    -n NameServer 服务地址,格式 ip:port
    -g 消费者分组
    -t topic名称
    -s 重置为此时间戳对应的 offset
    -f 是否强制重置,如果 false,只支持回溯 offset,如果true,不 管时间戳对应offset与 consumeOffset关系
    -c 是否重置c++客户端 offset
    具体操作
    # 根据MsgKey查询消息,指定NameServer地址,指定主题名称,指定MsgKey
    mqadmin queryMsgByKey -n node1:9876 -t tp_admin_01 -k 00100
    # 根据UNIQ_KEY查询消息,指定NameServer地址,指定UNIQ_KEY,指定消费组名称,指定主题名称 
    mqadmin queryMsgByUniqueKey -n node1:9876 -i C0A864672C8B277050DC5F8417BA0000 -g test_grp_console -t tp_admin_01
    # 发送检查消息延迟,指定NameServer,指定主题,指定测试次数,指定消息大小,默认128KB
    mqadmin checkMsgSendRT -n node1:9876 -t tp_admin_01 -a 5 -s 128
    # 指定发送消息的大小,以测试延迟 1MB
    mqadmin checkMsgSendRT -n node1:9876 -t tp_admin_01 -a 5 -s 1048576
    # 消费消息,指定NameServer,指定主题,指定broker名称,指定MQ的id。
    mqadmin consumeMessage -n node1:9876 -t tp_admin_01 -o 0 -b broker-a -i 0
    # 发送消息,指定主题,指定NameServer地址,指定消息体
    mqadmin sendMessage -n node1:9876 -t tp_admin_01 -p 'hello lagou console'
    # 发送消息,指定主题,指定NameServer地址,指定消息体,指定keys,指定tags
    mqadmin sendMessage -n node1:9876 -t tp_admin_01 -p 'hello lagou console' -k '00100' -c 'test'
    # 发送消息,指定NameServer,指定消息体,指定Broker,指定主题
    mqadmin sendMessage -n node1:9876 -p 'hello lagou test 01' -b broker-a -i 0 -t 'tp_admin_01'
    # 查看偏移量,指定NameServer,指定主题
    mqadmin topicStatus -n node1:9876 -t tp_admin_01
    # 打印消息,指定NameServer地址,指定主题,指定标签过滤,指定是否打印消息体
    mqadmin printMsg -n node1:9876 -t tp_admin_01 -s "*" -d true
    

    消费者、消费组相关

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

    连接相关

    命令列表
    名称 含义 命令选 项 说明
    consumerConnection 查询 Consumer 的网 络连接 -g 消费者所属组名
    -n NameServer 服务地址,格式 ip:port
    -h 打印帮助
    producerConnection 查询 Producer 的网络 连接 -g 生产者所属组名
    -t 主题名称
    -n NameServer 服务地址,格式 ip:port
    -h 打印帮助
    具体操作
    # 查看生产者连接
    mqadmin producerConnection -g mygrp -t tp_admin_01 -n node1:9876
    # 查看消费者连接
    mqadmin consumerConnection -g mygrp_consume -n node1:9876
    

    NameServer 相关

    命令列表
    名称 含义 命令 选项 说明
    updateKvConfig 更新NameServer的kv配置, 目前还未使用 -s 命名空间
    -k key
    -v value
    -n NameServer 服务地址, 格式 ip:port
    -h 打印帮助
    deleteKvConfig 删除NameServer的kv配置 -s 命名空间
    -k key
    -n NameServer 服务地址, 格式 ip:port
    -h 打印帮助
    getNamesrvConfig 获取NameServer配置 -n NameServer 服务地址, 格式 ip:port
    -h 打印帮助
    updateNamesrvConfig 修改NameServer配置 -n NameServer 服务地址, 格式 ip:port
    -h 打印帮助
    -k key
    -v value
    具体操作
    # 获取NameServer配置信息
    mqadmin getNamesrvConfig -n node1:9876
    # 修改NameServer的配置
    mqadmin updateNamesrvConfig -n node1:9876 -k serverWorkerThreads -v 10
    

    其他

    命令列表
    名称 含义 命令 选项 说明
    startMonitoring 开启监控进程,监控消息误删、重 试队列消息数等 -n NameServer 服务地址, 格式 ip:port
    -h 打印帮助
    具体操作
    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 。

    1. a-zA Z0-9_- ↩︎

    2. a-zA Z0-9_- ↩︎

  • 相关阅读:
    《Scrum实战》第0次课【如何学习敏捷】全团课后任务汇总
    关于 Android 5.0 原生系统网络图标上的感叹号问题解决方法
    [Android Tips] 18. Enable/Disable WiFi via adb
    [Android Tips] 17. 查看 APK 签名信息
    [Android Tips] 16. Update Android SDK from command-line
    [Android Tips] 15. Enforcing spaces in string resources
    Gradle Cheat Sheet
    [Android Tips] 14. Using Proguard with Android without obfuscation
    cuda线程/线程块索引小结
    cuda编程学习6——点积dot
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/14593217.html
Copyright © 2020-2023  润新知