微信公众号:千里行走
头条技术号:实战架构
交流邮箱:hpy253215039@163.com
欢迎关注,一起交流,学习,提高。
本文主要讲述:
rocketmq主从架构的生产级实践,并提供rocketqmq的master-slave结构的生产级容器化配置。
(1).rocketmq生产级镜像制作
(2).rocketmq生产级镜像制作注意事项
(3).rocketmq-console-ng生产级镜像
(4).kubernetes容器化rocketmq生产级主从集群
1.容器化配置文件说明
2.本例配置文件用于生产环境需要的改动
(5).压测容器化rocketmq集群
(附1).相关资源
(附2).rocketmq生产实践相关文章
(1).rocketmq生产级镜像制作
使用rocketmq的master-slave结构。
笔者提供了一个step by step的完整制作流程,位于:
https://github.com/hepyu/rocketmq-docker-image
以rocketmq4.3.2为例:
下载rocketmq4.3.2的二进制包:
wget http://dist.apache.org/repos/dist/release/rocketmq/4.3.2/rocketmq-all-4.3.2-bin-release.zip
git clone https://github.com/hepyu/rocketmq-docker-image.git
解压后的文件夹重命名为rocketmq,放到目录:
rocketmq-docker-image/image-build
然后执行脚本完成镜像制作:
cd sh ./image-build
sh build-4.3.2.sh
(2).rocketmq生产级镜像制作注意事项
1.本镜像基于centos:7, java-1.8.0-openjdk-devel.x86_64制作。
2.镜像名称格式为:rocketmqinc/rocketmq:${ROCKETMQ_VERSION}
如果想修改为其他格式,请执行docker tag tagId newName重新命名,tagId指镜像标识。
3.由于broker集群通过序号标识,所以需要容器化前通过脚本自动的识别当前启动的broker的序号和角色(master/slave)。
修改image-build/scripts/mqbroker,增加:
sh ${ROCKETMQ_HOME}/bin/rewrite-broker-config.sh
在kubernetes容器化时,配置configmap时,配置文件rewrite-broker-config.sh,目的是在broker容器启动前先行修改broker-config配置文件,根据statefulset的pod序号确认brokerName的序号,同时根据pod序号的奇偶数来确定当前container的角色(master/slave)。
上述脚本文件位于:
https://github.com/hepyu/k8s-app-config/blob/master/product/standard/rocketmq-pro/rocketmq-ms-cluster-pro/rocketmq-broker-configmap.yaml
(3).rocketmq-console-ng生产级镜像
使用官方镜像:styletang/rocketmq-console-ng
位于:
https://hub.docker.com/r/styletang/rocketmq-console-ng
https://github.com/apache/incubator-rocketmq-externals/tree/master/rocketmq-console
(4).kubernetes容器化rocketmq生产级主从集群
同样,笔者提供了生产级的yaml配置,位于:
https://github.com/hepyu/k8s-app-config/tree/master/product/standard/rocketmq-pro/rocketmq-ms-cluster-pro
git clone后进入目录直接执行:
kubectl apply -f .
但要注意需要执行两遍,因为namespace刚开始可能还没有初始化,会报错。
本地配置ingress宿主机的host,即可访问rocketmq-console控制台:
Ip pro-rocketmq-c4-k8s.inc.com
1.容器化配置文件说明
2.本例配置文件用于生产环境需要的改动
修改为2master-2slave-2namesrv的结构。
(5).压测容器化rocketmq集群
由于之前独立部署rocketmq时已经做过完备的压力测试,所以这里的容器化测试只是看看大概数据而已,并非严格压力测试(资源也不允许),benchmark都是在namesrv上跑的,没有单独划分资源。但是保证cpu和内存和我们独立部署的rocketmq集群是一致的,再次确保生产环境正常。
被压rocketmq集群资源:
a.broker-containers:
2master-2slave共4个container,分布在4个pod,每个container的资源如下:
limits=requests,cpu=4,memory=8G;jvm内存开启,-Xms4g -Xmx4g -Xmn2g
b.namesrv-containers:
共2个container,分布在2个pod,每个container的资源如下:
limits=requests,cpu=1,memory=4G;jvm内存开启,-Xms3g -Xmx3g -Xmn1g
c.console-container:
忽略,不影响压测。
使用rocketmq自带的benchmark压测:
/producer.sh --w=1 --s=1024 --n=rocketmq-c4-namesrv-prod-server-0.rocketmq-c4-namesrv-prod-server.coohua.svc.cluster.local:9876;rocketmq-c4-namesrv-prod-server-0.rocketmq-c4-namesrv-prod-server.coohua.svc.cluster.local:9876
由于我们生产环境用的是阿里云的nas存储,都是SSD,所以效果比我们之前独立部署的非容器化集群要好(用的是物理磁盘);成本也不会增加,严格来讲是减少,因为rocketmq正常情况下不需要很大磁盘空间,而且nas存储是根据实际使用量来计算费用(即使你的PV声明了2TB也是按照使用量来计算),综合下来是更划算些。
测试期间worknode各资源耗费情况:
(6).TODO LIST
1.重制镜像,增加oracle-jdk8的镜像制作文件,同时集成mysql-client, redis-client和arthas。openjdk坑的一点是没有jstat等各种调试工具。
(附1).相关资源
1.官方rocketmq镜像与容器化
https://github.com/apache/rocketmq-docker
2.笔者rocketmq镜像制作
https://github.com/hepyu/rocketmq-docker-image
3.笔者oracle-jdk生产级镜像,包含redis-cli, mysql-cli等基本组件。
https://github.com/hepyu/oraclejdk-docker-image
4.笔者oracle-jdk-skywalking生产级镜像,包含redis-cli, mysql-cli等基本组件,同时集成了链路追踪skywalking-agent。
https://github.com/hepyu/oraclejdk-skywalking-docker-image
(附2).rocketmq生产实践相关文章
rocketmq-1:集群主要结构和监控,性能测试与成本控制
rocketmq-2:性能测试方案&压测&选型&结论
rocketmq-3:rocketmq流控,重试机制与应对
rocketmq-4:线上rocketmq slave节点的ECS宕机恢复实记
rocketmq-5:生产级rocketmq集群部署