rocketmq概要
一 重要的概念
nameserver
nameserver share nothing,互相之间不通信,每个broker都需要注册到所有的nameserver上,nameserver主要作用是routing information provider,producer/consumer会随机选择一个连接上;
consumer可以通过broker master和slave进行消费,默认只会master进行消费,除非master挂了;
- broker都注册在nameserver上,namesserver负责broker的状态检查;
- 所有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
如果需要确保消息的时序性,需要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下面
问题
如何扩容?
增加broker-group,然后在相应的broker-group上需要手工在这个broker-group上建立topic的queue,然后该broker-group会将信息上报给nameserver,nameserver更新route table;
Client是如何做负载均衡的?
broker-group中master宕机之后如何处理?
topic对应的queue的数量如何确定合理值?
如何确保queue的分布是均衡的?
nameserver挂了一台之后,整个过程是怎么样?
生产者和消费者的延迟如何监控?
核心的监控指标有什么?参照基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台
参照
修改queue数量之后的负载均衡https://my.oschina.net/tantexian/blog/703799