rocketmq概要

1 minute read

一 重要的概念

nameserver

nameserver share nothing,互相之间不通信,每个broker都需要注册到所有的nameserver上,nameserver主要作用是routing information provider,producer/consumer会随机选择一个连接上;

consumer可以通过broker master和slave进行消费,默认只会master进行消费,除非master挂了;

  1. broker都注册在nameserver上,namesserver负责broker的状态检查;
  2. 所有client都会连接nameserver,nameserver中保存所有topic&queue的route info;

broker server

Topic

Topic按照queue进行分片,queue分布在不同的broker-group上

producer和consumer都是在queue级别做负载均衡,因此只要添加queue就可以达到扩容的目的

一个queue只会被一个consumer消费,因此想要做到msg有序,保证这些msg有序的分发到同一个queue就可以

RocketMQ实战:生产环境中,autoCreateTopicEnable为什么不能设置为true

consumer and Producer

阿里RocketMQ如何解决消息的顺序&重复两大硬伤?

如果需要确保消息的时序性,需要producer生产消息的时候按照一致的算法,将需要保证时序性的消息发送到同一个queue;如果consumer和queue也是一对一的,如果consumer需要处理消息的重复性(A处理完了挂了,这个时候消息还没有被Rocketmq确认,会再次发送到B,这个时候消息被AB重复消费);

不保证消息不重复,如果你的业务需要保证严格的不重复消息,需要你自己在业务端去重;

二 部署安装

安装java

打开JDK链接,下载JDK

sudo mkdir /usr/local/java 

sudo tar -zxvf jdk-8u181-linux-x64.tar.gz -C /usr/local/java 

在/etc/profile后面追加 

JAVA_HOME=/usr/local/java/jdk1.8.0_181

JRE_HOME=/usr/java/jdk1.8.0_181/jre

CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

export JAVA_HOME JRE_HOME CLASS_PATH PATH 

source /etc/profile

java -version

安装rocketmq

sudo mkdir /usr/local/rocketmq

cd /usr/local/rocketmq

sudo curl -O http://mirror.bit.edu.cn/apache/rocketmq/4.2.0/rocketmq-all-4.2.0-bin-release.zip

sudo unzip rocketmq-all-4.2.0-bin-release.zip

sudo sh bin/os.sh

运行(QATest brocker 4C8G c5.xlarge ,nameserver 2C4G c5.large)

#添加rocketmq用户
sudo groupadd rocketmq
sudo useradd -d /usr/local/rocketmq/ -g rocketmq -m rocketmq
sudo chown -R rocketmq:rocketmq /usr/local/rocketmq/
sudo su - rocketmq

修改默认配置

❗️nameserver和broker的默认配置如下,因此如果机器配置不满足的时候修改bin/runserver.sh和bin/runbroker.sh

bin/runserver.sh

JAVA_OPT="${JAVA_OPT} -server -Xms3g -Xmx3g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"


bin/runbroker.sh

JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g"
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=3g"

启动

#启动nameserver (source /etc/profile)
nohup sh bin/mqnamesrv &
tail -f ~/logs/rocketmqlogs/namesrv.log

#启动broker(❗️根据情况选择自己的配置文件,-n制定nameserver的位置,其中9876是默认端口)
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a.properties -n "10.4.19.100:9876" & 
tail -f logs/rocketmqlogs/broker.log

#启动broker-slave
nohup sh bin/mqbroker -c conf/2m-2s-sync/broker-a-s.properties -n "10.4.19.100:9876" &
tail -f logs/rocketmqlogs/broker.log

#查看集群状态
sh bin/mqadmin clusterList -n "10.4.19.100:9876"

三 常用命令

打印配置文件

sh bin/mqbroker -c conf/2m-2s-sync/broker-a.properties -n “10.1.3.46:9876;10.1.3.49:9876” -p

启动rocketmq-console

java -jar target/rocketmq-console-ng-1.0.0.jar –rocketmq.config.namesrvAddr=”10.1.3.46:9876;10.1.3.49:9876”

简单测试

> export NAMESRV_ADDR=localhost:9876

> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer

SendResult [sendStatus=SEND_OK, msgId= …

> sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer

ConsumeMessageThread_%d Receive New Messages: [MessageExt…

查看集群状态

sh bin/mqadmin clusterList -n localhost:9876

查看topiclist

sh bin/mqadmin topicList -n localhost:9876

查看brokerConsume的生产和消费的offset差距问题,需要监控起来

sh bin/mqadmin brokerConsumeStats -b localhost:10911 -n localhost:9876

创建topic

sh bin/mqadmin updateTopic -t testTopic -c DefaultCluster -n localhost:9876

查看topic的状态

sh bin/mqadmin topicStatus -n localhost:9876 -t BenchmarkTest

删除topic

sh bin/mqadmin deleteTopic -c DefaultCluster -n localhost:9876 -t BenchmarkTest

动态修改topic的属性

./bin/mqadmin updateTopic -b broker-a -c DefaultCluster -n localhost:9876 -t BenchmarkTest -r 16 -w 16

详细的cli-admin-tool的帮助文档:https://rocketmq.apache.org/docs/cli-admin-tool/

rocketmq-console

wget http://repos.fedorapeople.org/repos/dchen/apache-maven/epel-apache-maven.repo -O /etc/yum.repos.d/epel-apache-maven.repo

yum -y install apache-maven

yum -y install ant

git clone https://github.com/apache/rocketmq-externals.git

cd rocketmq-externals/rocketmq-console

mvn package

压测

在benchmark目录下有producer.sh/consumer.sh文件,很方便

# cd benchmark/

# sh producer.sh —help

# sh producer.sh -k true -n localhost:9876 -s 128 -w 64

注意点

默认的日志目录在启动用户的根目录下面,可以在conf/logback*.xml中可以查到

默认的JVM配置可以在bin目录

默认的store也是在启动用户的根目录store下面

问题

  1. 如何扩容?

    增加broker-group,然后在相应的broker-group上需要手工在这个broker-group上建立topic的queue,然后该broker-group会将信息上报给nameserver,nameserver更新route table;

  2. Client是如何做负载均衡的?

    《深入理解RocketMQ》- MQ消息的投递机制

  3. broker-group中master宕机之后如何处理?

  4. topic对应的queue的数量如何确定合理值?

  5. 如何确保queue的分布是均衡的?

  6. nameserver挂了一台之后,整个过程是怎么样?

  7. 生产者和消费者的延迟如何监控?

  8. 核心的监控指标有什么?参照基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台

参照

RocketMQ核心概念*****

RocketMQ多Master集群模式部署

RocketMQ——水平扩展及负载均衡详解

修改queue数量之后的负载均衡https://my.oschina.net/tantexian/blog/703799

rocketmq问题汇总-如何将特定消息发送至特定queue,消费者从特定queue消费

RocketMQ(二)集群配置

RocketMQ的顺序消费和事务消费

Updated: