Rocketmq-运维常见问题
运维常见问题RocketMQ的mqadmin命令报错问题问题描述:有时候在部署完RocketMQ集群后,尝试执行“mqadmin”一些运维命令,会出现下面的异常信息:org.apache.rocketmq.remoting.exception.RemotingConnectException: connect to<null> failed解决方法:可以在部署RocketMQ集群的虚拟
运维常见问题
- 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;
ffsetMsgId,offsetMsgId是由Broker服务端在写入消息时生成的(采用”IP地址+Port端口”与“CommitLog的物理偏移量地址”做了一个字符串拼接),其中offsetMsgId就是在RocketMQ控制台直接输入查询的那个messageId。
更多推荐
所有评论(0)