前言
已经正式工作近一个月了,方向是云数据库相关,在了解云数据库体系架构时,接触到了控制面(control plane)
和数据面 (data plane)
的概念,本文就讲一下控制面和数据面这两个概念,希望对同样是刚刚接触云数据库的同学有所帮助。
软件架构设计
微服务架构倾向于将系统拆分为许多个执行较少数量功能的模块,而单体架构则完全相反。但即便是单体架构,如下的几个模块也必须是单列的:
- 存储,业务逻辑和数据存储分离,并使用 API 进行通信。
- 负载均衡,分布式系统会以某种方式让客户端请求负载分布到多个实例上。
- 高可用,尽量不因为软硬件错误导致服务不可用。
- 扩缩容,根据系统负载情况动态变更资源配置。
- 资源调度,统一管理分布式系统中多个实例的存算资源。
虽让上述五个模块都是独立于业务逻辑之外的,但也略有区别:
存储和负载均衡与业务的距离更近一些,当业务的流量变高时,也意味着需要更多的存储资源,负载均衡也需要更多的计算资源来处理客户端请求。而高可用、扩缩容和资源调度则离业务远一些,一般不会受到业务流量的影响。
因此通常将存储、负载均衡归类于数据面,高可用、扩缩容、资源调度归类于控制面。
CP & DP
每个分布式系统中的组件,都可以大致分为数据面和控制面两类:位于请求路径上的数据面组件、和帮助数据面组件工作的控制面组件。
正确划分数据面组件和控制面组件是分布式系统设计中最重要的事情之一。
举个栗子
以阿里云数据库为例,有如下 6 个模块:
- 数据链路服务
- 高可用服务
- 备份服务
- 监控服务
- 调度服务
- 数据迁移服务
那依照本文所讲的,如何对上述 6 个模块进行数据面/控制面的划分呢?首先高可用服务和调度服务在第二节已经讲过是控制面服务,而数据链路服务就是请求路径上的服务,因此是数据面服务。那么备份服务、监控服务、数据迁移服务应该归类于数据面还是控制面?我猜备份服务是数据面,监控服务和数据迁移服务是控制面。
结语
写到这里,虽然明白什么是控制面和数据面了,但其实还是不明白为什么要划分控制面和数据面,自己实际工作中,控制面和数据面并不仅仅是逻辑上的概念,在集群层面上它们也是分离的,可能这样做能划分不同组件的权责?