管控面与数据面的差异与思考
定义
管控面对最终用户提供服务,包括console、API、sdk等,还需要对整个流程进行编排,包括创建数据中心、创建 保护实例、创建容灾卷、将容灾卷挂载到复制网关、获取被保护虚拟机详情等。
数据面完成最终的业务功能,实现数据的流动和存储。
区别
整个云计算其实大部分都是管控面。管控面繁杂,数据面单点更难。
管控面的竞争力
管控面更接近用户,对易用性、适应性要求高。灾备产品不属于用户粘性产品,用户不会经常去控制台进行操作,因此对高并发要求倒不是很高。
快速迭代能力
- 公共基础能力,包括操作系统、DB、消息队列、微服务框架等。
- 高效的流程,缩小特性上线周期TTM。
易用性
- 界面
- API/SDK
- 编排能力
生态系统
单纯卖虚拟化、磁盘的时代已经过去了。
- SAAS集成
- 应用支持度
管控面难点
- 数据模型和API设计,这个设计好之后确实很多开发就是CRUD。数据模型很多时候决定了后期的扩展能力和易用性。
- 与周边系统的集成,与不同部门的人沟通,拉通对齐。每个人都有自己的屁股,希望自己的模型改动少,架构不腐烂。
- 基础组件、公共服务能力,比如数据库、消息队列、安装部署、扩容、监控、PaaS平台(k8s)等。
- 架构统一,不同架构的管理面整合成统一的备份服务,提升开发、运维效率。
数据面的编码难点
内存是TOP1问题。
规避手段:
- 使用智能指针,尽量避免内存手工动态分配。通过
shared_from_this
来延长生命周期。 - 尽量使用局部变量,通过右值引用延长生命周期
- 使用
valgrind
工具进行内存泄漏检测 - 代码检视,从多个角度进行审视
并发是TOP2问题。
规避手段:
- 尽量避免用锁,一是提高效率,二是防止死锁。
- 划分不同的线程池,主线程用来串行,通过队列等保序;使用线程池处理大量异步任务,处理完扔完主线程。
- 设计时想清楚哪些放在主线程,哪些放到线程池;具体来说就是消息的收发放到主线程,数据处理如合并、压缩、hash等放在线程池。
- 合理设置线程数,线程太多不一定好,有可能造成相互抢占CPU资源形成等待。
- 避免使用
sleep
,采取重新调度的方式。
数据面的三座大山
数据面面临三大挑战:性能、可靠性、安全。
可靠性提升方法
进行软件sfmea故障模式库分析,分析不同故障如进程重启、网络故障、磁盘IO响应慢等各种场景下软件应该如何应对。通过故障点注入的方式进行验证,本质上就是通过编译宏改变函数处理流程,直接模拟异常场景,比如S3无法下载数据。
安全提升方法
根据安全checklist逐一排查。
DRA难点
数据模型
以dataset为粒度进行处理,提升数据处理能力。
线程调度
数据传输目标为又快又好,将调度模型划分为三种:
- 主线程:消息收发,保证顺序,在主线程中不同有任何阻塞。
- 线程池:迸发异步处理后台任务,包括压缩、hash、s3上传下载等。
- 只包含一个线程的线程池:处理既需要保序又需要异步,如写文件、更新done文件等。
dataset编号
将dataset分别三种:
- 正常dataset:每个dataset带上编号。
- skip的dataset:记录skip的开始和结束。
- 完成的dataset:通过done文件标记。
dataset编号始终以s3中存在的数据为准。
buffer机制
通过buffer保证传输不会过载。