移动云RocketMQ树叶云消息队列2.0的弹性存储层的设计与实践

作者|王维,中国移动云能力中心IaaS产品部rpc产品组研发工程师,主要负责消息队列云原生方向的设计与研发工作

胡宗棠,中国移动云能力中心laaS产品部消息队列&rpc团队的负责人,主要负责消息队列、rpc、配置管理等云原生中间件的架构设计与技术研发工作

1.背景介绍

移动云RocketMQ消息队列产品线,基于kubernetes组件和自定义Operator,在完成全面云原生化后,增加诸多云原生特性,比如一键化部署集群、极致弹性扩缩容和业务无感知热升级/热迁移等。同时,云原生化升级也导致RocketMQ面临多项挑战:

  • RocketMQ的Broker Pod节点是有状态的服务,在Broker Pod漂移后如何保证写入本地磁盘的消息数据同步迁移;
  • 基于(1)的问题,在移动云RocketMQ云原生消息队列 1.0的架构中,我们采用了Ceph/GlusterFS存储方案来解决该问题。但该方案带来的问题是:外部存储系统的引入,不仅增加了部署/运维的人力成本,而且使得消息队列服务架构复杂化;
  • RocketMQ消息队列集群的吞吐量受限于磁盘IO读写速率,相较于直接采用宿主机磁盘存储,引入Ceph/GlusterFS或者其他第三方存储系统会直接影响RocketMQ的性能;

基于上述问题,RocketMQ研发团队在移动云RocketMQ云原生消息队列2.0的架构设计中,基于“CSI + LVM”云原生容器存储技术,结合自研的Operator组件,在RocketMQ消息队列具备极致弹性扩缩等云原生特性的同时,能够承载万亿级数据洪峰,为移动云上客户的业务系统提供低延迟、高并发、高可靠的分布式消息队列云服务。

2.概念概述

1.CSI

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的方式部署。

2.LVM 

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,用户可以根据实际业务需求申请逻辑卷,之后同样也可以按需进行扩/缩容,从而可以实现用户对磁盘空间的按需申请、扩容缩容等需求。

3.基于“CSI+LVM”的RocketMQ消息队列容器存储层设计

通过实现CSI规范,同时借助LVM的能力,即可利用宿主机本地磁盘构建出一个简单的容器存储驱动,实现动态创建卷、对卷的扩缩容等功能。此外,为解决Broker Pod漂移带来的问题,我们在创建PV时添加亲和性,使其绑定原来的Node,由于RocketMQ消息队列集群本身就是采用分布式高可用架构。所以,在某些场景中,屏蔽一定的Pod漂移能力,并不会给RocketMQ消息队列的高可用带来什么影响。

上图展示了移动云消息队列存储部分的架构,其中蓝色部分是由我们实现的CSI插件部分

RocketMQ Operator 

遵循Kubernetes 的资源和控制器理念,通过拓展RocketMQ相关资源(CRD),以实现对RocketMQ集群生命周期的管理。

LVolume

用于整个流程管理存储的自定义资源对象(CRD)。

CSI-Controller-Plugin 

主要实现了CreateVolume、DeleteVolume、ControllerExpandVolume接口,负责LVolume的创建等。

CSI-Node-Plugin

主要实现了NodePublishVolume、NodeUnpublishVolume、NodeExpandVolume操作,内部通过调用LVM命令管理LV(逻辑卷)、PV(物理卷)、VG(卷组)资源,通过使用Cgroup 限制卷读写速率。

下面介绍下主要创建流程:

  1. 用户发起创建消息队列后会由RocketMQ Operator创建需要的Kubernetes 资源,其中包括指定StorageClassName的PVC、Pod资源;
  2. KubeScheduler调度PVC到指定节点后进入到Provision阶段;
  3. 0Sidecar容器 External-provisioner监听到PVC后调用同Pod中的ControllerPugin的CreateVolume接口;
  4. ControllerPlugin收到CreateVolume进行一些验证后,创建LVolume对象,用于记录需要创建的卷信息,而后返回成功给External-provisioner;
  5. External-provisioner根据返回结果创建PV对象,添加节点亲和性,并和PVC进行绑定;
  6. 由于我们不需要对卷Attach,故通过设置CSIDriver的AttachRequired属性为false跳过Attach阶段,而后kubeScheduler调度Pod到指定节点后进入mount阶段;
  7. Kubelet监听到绑定到自身节点的Pod后调用NodePlugin的NodePublishVolume接口;
  8. NodePlugin收到NodePublishVolume请求后通过调用lvm命令创建逻辑卷,并将卷mount到Pod的指定目录;
  9. 而后NodePlugin根据LVolume中的相关信息设置Cgroup限制磁盘读写IO速率;
  10. 至此主要流程结束;

4.总结

本文介绍了基于“CSI + LVM”云原生容器存储技术及RocketMQ消息队列在容器存储上的设计与实践,其中实现了基于“CSI +LVM”的容器存储,支持本地卷的动态创建、动态扩缩容、磁盘IO速率限制、拓扑支持等基本功能,同时为移动云云原生消息中间件提供了一种采用本地卷作为容器存储方式。

引用链接

1.CSI规范https://github.com/container-storage-interface/spec

2.CSI图片出处https://kingjcy.github.io/post/cloud/paas/base/kubernetes/k8s-store-csi/

3.CS文档https://kubernetes-csi.github.io/docs/introduction.html

4.LVM图片出处https://www.cnblogs.com/fzhelpdesk/p/16189915.html

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/258146.html<

(0)
管理的头像管理
上一篇2025-05-02 02:35
下一篇 2025-05-02 02:36

相关推荐

  • 云服务器和云虚拟主机怎么选?云服务器和虚拟主机区别

    云服务器适合业务增长快、需弹性扩展的场景,而云虚拟主机适合预算有限、技术门槛低的小型静态网站或测试环境,二者核心区别在于资源独享性与运维复杂度,核心差异解析:从底层架构到使用体验很多人容易混淆这两者,觉得它们都是“买空间建站”,它们的底层逻辑完全不同,云服务器(ECS)就像是你租了一整栋别墅,水电网络独立,你想……

    2026-06-29
    0
  • 赣州智慧旅游招聘是真的吗?赣州旅游人才招聘信息

    中级岗位(3-5年经验)月薪范围通常在6000-10000元,这类岗位需要独立负责项目模块,如独立运营一个抖音账号,或维护一个景区小程序的功能迭代,具备成功案例的候选人议价能力较强,高级岗位(5年以上经验)月薪范围通常在10000-20000元,部分核心管理岗可达更高,这类人才需要具备战略规划能力,如制定整个景……

    2026-06-29
    0
  • 赣州智能物联网车位锁如何管理?智能车位锁管理系统多少钱

    赣州智能物联网车位锁管理的核心在于通过云端平台实现远程控锁、状态实时监控及自动计费,彻底解决传统车位“被占难管”与“找位难”的痛点,在赣州这样的城市,随着机动车保有量的持续增长,老旧小区、商业综合体以及私人固定车位的资源矛盾日益凸显,传统的机械地锁或简易遥控锁,不仅操作繁琐,更无法实现数据化管理,引入智能物联网……

    2026-06-29
    0
  • 赣州智能消防栓好用吗,智能消防栓多少钱一个

    赣州智能消防栓通过物联网技术实现实时监测与远程报警,能显著降低火灾响应时间并提升城市消防安全管理水平,是目前智慧城市建设中不可或缺的基础设施,赣州智能消防栓的核心价值与应用场景传统消防栓往往存在“看不见、摸不着、用不了”的痛点,在赣州这样地形复杂、老城区与新城区并存的区域,传统设施的管理难度极大,智能消防栓的出……

    2026-06-29
    0
  • 云服务器和物理机到底有啥区别?

    云服务器本质上是虚拟化资源池中的弹性实例,而传统物理服务器是独占的硬件实体,前者胜在弹性与运维便捷,后者强在物理隔离与性能稳定,具体选择取决于业务对成本、扩展性及安全合规的权衡,很多人初次接触服务器时,容易把“云服务器”和“传统物理服务器”混为一谈,觉得它们都是用来跑网站或存数据的盒子,这两者的底层逻辑完全不同……

    2026-06-29
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注