RocketMQ08之运维管理

运维管理

1 集群搭建

1.1 单Master模式

这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,可以用于本地测试。

  1. 启动 NameServer

### 首先启动Name Server

$ nohup sh mqnamesrv &

验证Name Server 是否启动成功

$ tail -f ~/logs/rocketmqlogs/namesrv.log

The Name Server boot success...

  1. 启动 Broker

### 启动Broker

$ nohup sh bin/mqbroker -n localhost:9876 &

### 验证Name Server 是否启动成功,例如Broker的IP为:192.168.1.2,且名称为

### broker-a

$ tail -f ~/logs/rocketmqlogs/Broker.log

The broker[broker-a, 192.169.1.2:10911] boot success...

1.2 多Master模式

一个集群无Slave,全是Master,例如2个Master或者3个Master,这种模式的优缺点如下:

  1. 优点:配置简单,单个Master宕机或重启维护对应用无影响,在磁盘配置为RAID10时,即使机器宕机不可恢复情况下,由于RAID10磁盘非常可靠,消息也不会丢(异步刷盘丢失少量消息,同步刷盘一条不丢),性能最高;
  2. 缺点:单台机器宕机期间,这台机器上未被消费的消息在机器恢复之前不可订阅,消息实时性会受到影响。
  1. 启动NameServer

NameServer需要先于Broker启动,且如果在生产环境使用,为了保证高可用,建议一般规模的集群启动3NameServer各节点的启动命令相同,如下:

### 首先启动Name Server

$ nohup sh mqnamesrv &

### 验证Name Server 是否启动成功

$ tail -f ~/logs/rocketmqlogs/namesrv.log

The Name Server boot success...

  1. 启动Broker集群

### 在机器A,启动第一个Master,例如NameServer的IP为:192.168.1.1

$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-noslave/broker-a.properties &

 

### 在机器B,启动第二个Master,例如NameServerIP为:192.168.1.1

$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-noslave/broker-b.properties &

 

...

如上启动命令是在单个NameServer情况下使用的。对于多个NameServer的集群,Broker启动命令中-n后面的地址列表用分号隔开即可,例如 192.168.1.1:9876;192.161.2:9876

1.3 多Master多Slave模式-异步复制

每个Master配置一个Slave,有多对Master-Slave,HA采用异步复制方式,主备有短暂消息延迟(毫秒级),这种模式的优缺点如下:

  1. 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;
  2. 缺点:Master宕机,磁盘损坏情况下会丢失少量消息。
  1. 启动NameServer

### 首先启动Name Server

$ nohup sh mqnamesrv &

### 验证Name Server 是否启动成功

$ tail -f ~/logs/rocketmqlogs/namesrv.log

The Name Server boot success...

  1. 启动Broker集群

### 在机器A,启动第一个Master,例如NameServer的IP为:192.168.1.1

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

 

### 在机器B,启动第二个Master,例如NameServer的IP为:192.168.1.1

$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b.properties &

 

### 在机器C,启动第一个Slave,例如NameServer的IP为:192.168.1.1

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

 

### 在机器D,启动第二个Slave,例如NameServer的IP为:192.168.1.1

$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b-s.properties &

1.4 多Master多Slave模式-同步双写

每个Master配置一个Slave,有多对Master-Slave,HA采用同步双写方式,即只有主备都写成功,才向应用返回成功,这种模式的优缺点如下:

  1. 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;

 

  1. 缺点:性能比异步复制模式略低(大约低10%左右),发送单个消息的RT会略高,且目前版本在主节点宕机后,备机不能自动切换为主机。

 

  1. 启动NameServer

### 首先启动Name Server

$ nohup sh mqnamesrv &

 

### 验证Name Server 是否启动成功

$ tail -f ~/logs/rocketmqlogs/namesrv.log

The Name Server boot success...

  1. 启动Broker集群

### 在机器A,启动第一个Master,例如NameServer的IP为:192.168.1.1

$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a.properties &

 

### 在机器B,启动第二个Master,例如NameServer的IP为:192.168.1.1

$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b.properties &

 

### 在机器C,启动第一个Slave,例如NameServer的IP为:192.168.1.1

$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a-s.properties &

 

### 在机器D,启动第二个Slave,例如NameServer的IP为:192.168.1.1

$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b-s.properties &

以上Broker与Slave配对是通过指定相同的BrokerName参数来配对,Master的BrokerId必须是0,Slave的BrokerId必须是大于0的数。另外一个Master下面可以挂载多个Slave,同一Master下的多个Slave通过指定不同的BrokerId来区分。$ROCKETMQ_HOME指的RocketMQ安装目录,需要用户自己设置此环境变量

2 mqadmin管理工具

注意:

执行命令方法:sh  mqadmin {command} {args}

  1. 几乎所有命令都需要配置-n表示NameServer地址,格式为ip:port多个用分号隔开
  2. 几乎所有命令都可以通过-h获取帮助
  3. 如果既有Broker地址(-b)配置项又有clusterName(-c)配置项,则优先以Broker地址执行命令,如果不配置Broker地址,则对集群中所有主机执行命令,只支持一个Broker地址。-b格式为ip:port,port默认是10911
  4. 在tools下可以看到很多命令,但并不是所有命令都能使用,只有在MQAdminStartup中初始化的命令才能使用,你也可以修改这个类,增加或自定义命令

由于版本更新问题,少部分命令可能未及时更新,遇到错误请直接阅读相关命令源码

 

-t: topic

-c;cluster即集群名

-b:broker

-n:namesrv

1. 例如,查看 updateTopic 的使用sh  mqadmin  help  updateTopic

2. 关闭nameserver和所有的broker:

   sh mqshutdown namesrv

   sh mqshutdown broker

3. 查看所有消费组group:

   sh mqadmin consumerProgress  -n  192.168.1.23:9876

4. 查看指定消费组下的所有topic数据堆积情况:

    sh mqadmin consumerProgress -n 192.168.1.23:9876 -g warning-group

5. 查看所有topic :

     sh mqadmin topicList -n 192.168.1.23:9876

6. 查看topic信息列表详情统计

   sh mqadmin   topicstatus  -n 192.168.1.23:9876  -t  topicWarning

7.  新增topic

   sh mqadmin updateTopic –n 192.168.1.23:9876 –c DefaultCluster –t topicWarning

8. 删除topic

   sh mqadmin deleteTopic –n 192.168.1.23:9876 –c DefaultCluster –t topicWarning

9. 查询集群消息

sh mqadmin  clusterList -n 192.168.1.23:9876

2.1 Topic相关

sh  mqadmin   {command}   {args}

  1. 以下“名称”就是command 
  2. args 就是命令选型 + 参数值

 

 

2.2 集群相关

2.3 Broker相关

2.4 消息相关

2.5 消费者、消费组相关

2.6 连接相关

2.7 NameServer相关

2.8 其他

3 运维常见问题

3.1 RocketMQ的mqadmin命令报错问题

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

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

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

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

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

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

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

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

  1. 问题描述:当同一个topic的新增消费组启动时,消费的消息是当前的offset的消息,并未获取历史消息。
  2. 解决方案:rocketmq默认策略是从消息队列尾部,即跳过历史消息。如果想消费历史消息,则需要设置:

org.apache.rocketmq.client.consumer.DefaultMQPushConsumer#setConsumeFromWhere。常用的有以下三种配置:

  1. 默认配置,一个新的订阅组第一次启动从队列的最后位置开始消费,后续再启动接着上次消费的进度开始消费,即跳过历史消息;

consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);

  1. 一个新的订阅组第一次启动从队列的最前位置开始消费,后续再启动接着上次消费的进度开始消费,即消费Broker未过期的历史消息;

consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

  1. 一个新的订阅组第一次启动从指定时间点开始消费,后续再启动接着上次消费的进度开始消费,和consumer.setConsumeTimestamp()配合使用,默认是半个小时以前;

consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_TIMESTAMP);

3.4 如何开启从Slave读数据功能

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

3.5 性能调优问题

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

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

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

SendResult [sendStatus=SEND_OK, msgId=0A42333A0DC818B4AAC246C290FD0000, offsetMsgId=0A42333A00002A9F000000000134F1F5, messageQueue=MessageQueue [topic=topicTest1, BrokerName=mac.local, queueId=3], queueOffset=4]

  1. msgId,对于客户端来说msgId是由客户端producer实例端生成的,具体来说,调用方法MessageClientIDSetter.createUniqIDBuffer()生成唯一的Id
  2. offsetMsgId,offsetMsgId是由Broker服务端在写入消息时生成的(采用”IP地址+Port端口”与“CommitLog的物理偏移量地址”做了一个字符串拼接),其中offsetMsgId就是在RocketMQ控制台直接输入查询的那个messageId。

3.7 RocketMQ 错误:The broker does not support consumer to filter message by SQL92

解决方法在broker-a.properties这里类配置文件中,添加enablePropertyFilter=true配置项

 

4. 常用命令

4.1 启动namesrv

nohup mqnamesrv start &

4.2 启动broker

nohup sh mqbroker -c ../conf/2m-2s-sync/broker-a.properties  &

4.3 关闭namesrv

sh mqshutdown namesrv

4.4 关闭broker

sh mqshutdown broker

4.5  查看集群状态

        sh mqadmin clusterlist -n 152.168.1.88:9876

5. 日志

5.1 namesrv日志

        /logs/rocketmqlogs/namesrv.log

5.2 broker

        /logs/rocketmqlogs/broker.log

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章