目录
一、背景介绍
二、概念概述
1.CSI
2.LVM
三、基于“CSI+LVM”的RocketMQ消息队列容器存储层设计
四、总结
参考
移动云RocketMQ消息队列产品线,基于kubernetes组件和自定义Operator,在完成全面云原生化后,增加诸多云原生特性,比如一键化部署集群、极致弹性扩缩容和业务无感知热升级/热迁移等。同时,云原生化升级也导致RocketMQ面临多项挑战:
(1)RocketMQ的Broker Pod节点是有状态的服务,在Broker Pod漂移后如何保证写入本地磁盘的消息数据同步迁移;
(2)基于(1)的问题,在移动云RocketMQ云原生消息队列 1.0的架构中,我们采用了Ceph/GlusterFS存储方案来解决该问题。但该方案带来的问题是:外部存储系统的引入,不仅增加了部署/运维的人力成本,而且使得消息队列服务架构复杂化;
(3)RocketMQ消息队列集群的吞吐量受限于磁盘IO读写速率,相较于直接采用宿主机磁盘存储,引入Ceph/GlusterFS或者其他第三方存储系统会直接影响RocketMQ的性能;
基于上述问题,RocketMQ研发团队在移动云RocketMQ云原生消息队列2.0的架构设计中,基于“CSI + LVM”云原生容器存储技术,结合自研的Operator组件,在RocketMQ消息队列具备极致弹性扩缩等云原生特性的同时,能够承载万亿级数据洪峰,为移动云上客户的业务系统提供低延迟、高并发、高可靠的分布式消息队列云服务。
CSI[1](Container Storage Interface)即容器存储接口,是Kubernetes 目前主推的存储扩展方式。该方式为容器编排系统定义了标准的接口,使得开发者可以更灵活方便的将第三方存储系统与容器工作负载集成。
开发者通过实现CSI 规定的RPC接口(CSI Identity、CSI Controller、CSI Node),即下图中Custom Components部分,协同社区提供的辅助Sidecar容器(External Components),与Kubernetes 核心组件进行交互,从而实现对自定义容器存储的管理。
图片出处[2]
External Components 是一系列由社区Storage sig小组维护的辅助容器,主要包括如下:
External-provisioner : 用于实现持久卷(PersistentVolume)的创建、删除等功能
External-attacher: 用于实现持久卷的附着、分离功能
External-snapshotter : 用于实现持久卷快照、备份恢复功能
External-resizer : 用于实现持久卷的扩容缩容功能
Node-driver-registrar : 使用kubelet插件机制向所在节点的kubelet注册用户开发的CSI 驱动信息
Livenessprobe: 用于辅助用户CSI插件实现健康检查功能
这些不同功能的Sidecar容器,由开发者根据自己实际需要选择使用。更详细的使用可以查看官方文档[3]
Custom Components 需要开发者自己实现,由三组RPC接口集合组成,来实现对存储卷整个生命周期的管理。
Identity Service负责对外暴露插件信息,开发者实现的存储插件必须实现该操作集,其中GetPluginCapabilities 根据用户实际实现的RPC操作返回对应的集合。
Controller Service包含一些卷的创建,删除、快照等操作。同样的,用户可以根据实际需要的功能选择性实现接口。实现Controller Service的插件可以根据自身实际需要选择不同的部署方式,通常会使用Deployment 部署单个或少量节点。
Node Service包含一些节点管理的接口。其负责需要和宿主机打交道的操作,例如挂载卸载存储卷等操作,通常会以DaemonSet的方式部署。
LVM (Logical Volume Manager)即逻辑卷管理器,通过将多个物理分区/硬盘从逻辑上组合成一个更大的虚拟硬盘,从而实现对硬盘容量的弹性管理。
图片出处 [4]
以下是LVM中的几个概念
PV 物理卷(Physical Volume):通常对应一个普通分区或硬盘;
VG 卷组(Volume Group): 由若干个物理卷组成,卷组可以动态添加或者移除物理卷;
PE 物理扩展块(Physical Extend):PE是LVM的最小存储单位,类似文件系统block;
LV 逻辑卷(Logical Volume):从卷组中分割出部分空间,形成逻辑卷。用户格式化后挂载文件系统使用;
如下以一个实际使用例子列举部分命令
序号 | LVM存储操作命令 | 说明 |
---|---|---|
1 | pvcreate /dev/sdb /dev/sdc | 创建物理卷 |
2 | vgcreate vg1 /dev/sdb /dev/sdc | 创建卷组 |
3 | lvcreate -L 2G -n lv1 vg1 | 创建逻辑卷 |
4 | mkfs -t xfs /dev/vg1/lv1 | 格式化逻辑卷 |
5 | mount /mount/test /dev/vg1/lv1 | 挂载使用卷 |
6 | lvextend -L +2G /dev/vg1/lv1 | 逻辑卷扩容 |
借助LVM,用户可以根据实际业务需求申请逻辑卷,之后同样也可以按需进行扩/缩容,从而可以实现用户对磁盘空间的按需申请、扩容缩容等需求。
通过实现CSI规范,同时借助LVM的能力,即可利用宿主机本地磁盘构建出一个简单的容器存储驱动,实现动态创建卷、对卷的扩缩容等功能。此外,为解决Broker Pod漂移带来的问题,我们在创建PV时添加亲和性,使其绑定原来的Node,由于RocketMQ消息队列集群本身就是采用分布式高可用架构。所以,在某些场景中,屏蔽一定的Pod漂移能力,并不会给RocketMQ消息队列的高可用带来什么影响。
上图展示了移动云消息队列存储部分的架构,其中蓝色部分是由我们实现的CSI插件部分
下面介绍下主要创建流程
本文介绍了基于“CSI + LVM”云原生容器存储技术及RocketMQ消息队列在容器存储上的设计与实践,其中实现了基于“CSI +LVM”的容器存储,支持本地卷的动态创建、动态扩缩容、磁盘IO速率限制、拓扑支持等基本功能,同时为移动云云原生消息中间件提供了一种采用本地卷作为容器存储方式。后续,RocketMQ研发团队会完善和丰富该部分的功能,比如:
增加对CgroupV2的支持;
增加对LVM条带化、数据卷备份恢复等功能的支持;
增加对本地卷Metric和监控数据采集的支持;
完善对CSI Storage Capacity Tracking功能的支持;
本文作者:
王维
中国移动云能力中心IaaS产品部rpc产品组研发工程师,主要负责消息队列云原生方向的设计与研发工作
胡宗棠
中国移动云能力中心laaS产品部消息队列&rpc团队的负责人,主要负责消息队列、rpc、配置管理等云原生中间件的架构设计与技术研发工作
^CSI规范 https://github.com/container-storage-interface/spec
^CSI图片出处 云计算K8s组件系列—- 存储CSI
^官方文档 Introduction - Kubernetes CSI Developer Documentation
^LVM图片出处 LVM逻辑卷管理器 - 聆听城市喧哗 - 博客园