使用
docker-image
+docker-compose
搭建的本地rocket-mq集群环境,使用的是2broker(6node)+2name-server
搭建的,同时还有学习rocket-mq的一些文章:doc
rocket-mq
版本:4.8.0
go-client
版本:go get -u -v github.com/apache/rocketmq-client-go/[email protected]
rocker-mq 官方文档:文档链接
学习文档:
- 源码环境搭建
- CommitLog&&ConsumerQueue&&IndexFile&&延时队列源码分析
- broker学习
- name-server学习
- Rocket-MQ与Kafka的对比
- 各种集群模式的优缺点
1、支持通过本地docker环境搭建rocket-mq 集群
2、支持横向拓展多个节点,便于查看
3、提供了WEB-UI的 rocketmq-console 的启动支持
1、rocketmq 的 shell脚本的问题,主要原因是 rocketMQ
的启动脚本shell的不规范问题,可以看 apache/rocketmq#2655
2、启动时切记要修改JVM参数,不然本地集群启动起来瞬间爆炸,单台Broker内存启动为8G,可以通过环境变量JAVA_OPT_EXT
控制JVM启动参数,可能docker容器内存不足,直接被kill掉进程。
3、切记电脑的总内存分配给Docker的不要过于小,下面是我机器的docker配置信息
➜ ~ docker info
Containers: 55
Running: 0
Paused: 0
Stopped: 55
Images: 323
Server Version: 18.09.2
## .......
OSType: linux
Architecture: x86_64
CPUs: 4
Total Memory: 5.818GiB
Name: linuxkit-025000000001
ID: 5JBH:7VOE:3R3W:6G4I:6NXD:AXGN:MI2Z:DNUI:7BZ5:KRT6:NC5T:AJGE
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): true
File Descriptors: 24
Goroutines: 50
System Time: 2021-02-07T08:18:25.936909812Z
EventsListeners: 2
## .......
➜ rocket_mq git:(master) ✗ tree -L 1
.
├── Makefile ## 脚本
├── broker-01 ## 1broker,3节点
├── broker-02
├── broker-03
├── broker-04 ## 2broker,3节点
├── broker-05
├── broker-06
├── docker-compose.yml # docker-compose 启动脚本
├── image # rocket-mq的本地镜像搭建
├── nameserver-01 ## name-server两个节点
└── nameserver-02
通过修改本地文件可以横向拓展多个节点
进去 docker
目录, 执行make help命令
➜ docker git:(master) ✗ make help
image 初始化镜像
run 启动docker集群容器,默认是2broker(6node,2m4s),2nameserver,1manager
run-signle 启动docker集群容器,默认是1broker(3node,1m2s),2nameserver,1manager
stop 关闭容器
delete 删除容器
clean 清除本地volume的文件和容器
down-rocketmq 下载rocketmq
config 配置docker容器内rocket-mq的IP地址可以使得宿主机服务可以访问到
help 帮助
以Broker-01来说,配置文件在 broker-01/conf/broker.conf
,所以启动参数为mqbroker -c conf/broker.conf
,切记至少一个broker需要有三个节点,如果broker两个节点的话如果down掉一个broker无法使用,现象是无法选举出新的master , DLeger
的好处是能够和kafka
一样自动选择leader,不需要手动指定brokerId=0
为master。
####################### broker 配置 ###########################
# 集群概念不清晰目前
brokerClusterName = RaftCluster
# broker的名称
brokerName=RaftNode00
# 如果采用dLeger模式搭建,默认为-1,所以不配置
# brokerId=-1
# 本地网卡IP,如果是内网可以不设置这个,由于我们需要在宿主机测试,需要修改这个ip(宿主机物理网卡的IP),这里执行make config 即可
brokerIP1=192.168.1.4
# 默认监听10911端口
listenPort=10911
# name-server配置
namesrvAddr=nameserver-01:9876;nameserver-02:9876
# 不允许自动创建topic
autoCreateTopicEnable=false
################# DLeger配置 ##########################
# 是否开启DLegerCommitLog
enableDLegerCommitLog=true
# 这个最好和brokerName名称一致
dLegerGroup=RaftNode00
dLegerPeers=n0-broker-01:40911;n1-broker-02:40911
dLegerSelfId=n0
sendMessageThreadPoolNums=4
全部配置可以看: broker
由于name-server 配置不是特别多,走默认配置即可(由于我们是单机器部署一个实例,所以不需要考虑环境冲突问题,也不推荐name-server和broker放在一台机器的做法)
默认配置可以看:name-server
本文采用的是 dLeger
模式,具体的模式好坏可以看 ,https://github.com/apache/rocketmq/blob/release-4.8.0/docs/cn/operation.md , 如果要高可用,必须要求每个broker至少有三台节点(由它的选举机制决定),具体down机模拟看后面
整体架构是:2n+1m+2s
,这个集群可以随意拓展
机器节点 | 角色 | broker-name | 备注 |
---|---|---|---|
nameserver-01 | nameserver | ||
nameserver-02 | nameserver | ||
broker-01 | broker | RaftNode00 | 通过选择选master,不需要指定brokerId |
broker-02 | broker | RaftNode00 | |
broker-03 | broker | RaftNode00 |
➜ rocket_mq docker exec -it a629ee26b7a9 mqadmin clusterList -n "nameserver-01:9876;nameserver-02:9876"
RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0).
RocketMQLog:WARN Please initialize the logger system properly.
#Cluster Name #Broker Name #BID #Addr #Version #InTPS(LOAD) #OutTPS(LOAD) #PCWait(ms) #Hour #SPACE
RaftCluster RaftNode00 0 172.15.64.10:10911 V4_8_0 0.00(0,0ms) 0.00(0,0ms) 0 447918.62 -1.0000
RaftCluster RaftNode00 2 172.15.64.10:10912 V4_8_0 0.00(0,0ms) 0.00(0,0ms) 0 447918.62 -1.0000
RaftCluster RaftNode00 3 172.15.64.10:10913 V4_8_0 0.00(0,0ms) 0.00(0,0ms) 0 447918.62 -1.0000
官方文档:https://github.com/apache/rocketmq/blob/master/docs/cn/operation.md
其他文档:集群模式
1、进入到 docker目录 ,然后进入到 镜像目录执行make
即可
2、进入到, make run
或者 docker-compose --compatibility up -d
, 由于做了资源限制,所以需要使用--compatibility
参数
➜ rocket_mq make run
docker-compose --compatibility up -d
Creating network "rocket_mq_default" with the default driver
Creating rocket_mq_broker-01_1 ... done
Creating rocket_mq_nameserver-02_1 ... done
Creating rocket_mq_broker-03_1 ... done
Creating rocket_mq_rocketmq-console_1 ... done
Creating rocket_mq_broker-02_1 ... done
Creating rocket_mq_nameserver-01_1 ... done
2、查看broker节点
➜ rocket_mq docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a629ee26b7a9 rocketmq:v4.8.0 "mqbroker -c conf/br…" 2 minutes ago Up 2 minutes 9876/tcp, 10911/tcp, 0.0.0.0:10912->10912/tcp rocket_mq_broker-02_1
6dbbec743077 rocketmq:v4.8.0 "mqnamesrv" 2 minutes ago Up 2 minutes 10911/tcp, 0.0.0.0:9871->9876/tcp rocket_mq_nameserver-01_1
e9ffbeba13bd rocketmq:v4.8.0 "mqbroker -c conf/br…" 2 minutes ago Up 2 minutes 9876/tcp, 0.0.0.0:10911->10911/tcp rocket_mq_broker-01_1
bad3443fd2b7 rocketmq:v4.8.0 "mqnamesrv" 2 minutes ago Up 2 minutes 10911/tcp, 0.0.0.0:9872->9876/tcp rocket_mq_nameserver-02_1
6cb53d20f162 apacherocketmq/rocketmq-console:2.0.0 "sh -c 'java $JAVA_O…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->8080/tcp rocket_mq_rocketmq-console_1
10ae582153eb rocketmq:v4.8.0 "mqbroker -c conf/br…" 2 minutes ago Up 2 minutes 9876/tcp, 10911/tcp, 0.0.0.0:10913->10913/tcp rocket_mq_broker-03_1
3、查看docker节点的资源占用情况
➜ rocket_mq git:(master) ✗ docker stats --no-stream
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
a629ee26b7a9 rocket_mq_broker-02_1 34.21% 373.6MiB / 512MiB 72.96% 1.66MB / 1.16MB 41.6MB / 8.95MB 158
6dbbec743077 rocket_mq_nameserver-01_1 0.28% 131.9MiB / 256MiB 51.52% 843kB / 419kB 5.63MB / 8.96MB 41
e9ffbeba13bd rocket_mq_broker-01_1 35.53% 390.1MiB / 512MiB 76.20% 1.49MB / 3.67MB 9.45MB / 8.95MB 160
bad3443fd2b7 rocket_mq_nameserver-02_1 0.30% 149.4MiB / 256MiB 58.38% 860kB / 442kB 30.5MB / 8.96MB 41
6cb53d20f162 rocket_mq_rocketmq-console_1 0.56% 240.6MiB / 256MiB 93.97% 1.45MB / 924kB 124MB / 46.4MB 43
10ae582153eb rocket_mq_broker-03_1 38.44% 401.4MiB / 512MiB 78.40% 1.65MB / 1.15MB 2.95MB / 8.95MB 158
4、查看总占用的内存情况(这个是6个docker容器的内存使用情况)
➜ rocket_mq git:(master) ✗ docker stats --no-stream | awk '{print $4}' | sed '1d' | awk '{a+=$1}END{printf "%sM\n",a}'
1676.9M