curve简介
curve是今年7月份开源的一个⾼性能、⾼可⽤、⾼可靠的分布式存储系统,主打⾼性能、低延迟。
Curve设计可以作为多种存储场景的底层存储:例如块存储,对象存储,云原⽣数据库,EC等。
当前Curve已实现⾼性能块存储,并且基于这⼀场景对接了openstack 和 k8s。openstack上主要是⽤作云主机的系统盘和云盘,⽬前已经在线上稳定一年多了。k8s上主要是想作为计算节点的数据⽬录,这个场景⽬前在灰度环境中测试验证中。
当前curve的整个项目已经完全开源到github,感兴趣的小伙伴可以去star&&fork围观一下。
- github主页:https://opencurve.github.io/
- github代码仓库:https://github.com/opencurve/curve
Curve存储系统的基础设计框架与经典的GFS基本类似,采⽤有中⼼节点的架构,核⼼服务由三个部分组成:
- 元数据节点MDS,主要有两个职责,⼀⽅⾯管理和存储元数据信息,另⼀⽅⾯感知集群状态并进⾏调度。元数据存储在etcd中。
- 数据节点chunkserver, ⼀⽅⾯负责数据的存储,另⼀⽅⾯负责数据⼀致性(如果底层是多副本,需要负责副本间的数据⼀致性)。
- 客⼾端client, 向上层应⽤提供对⽂件的操作接⼝(open、read、write等), 会和mds以及chunkserver交互,与mds交互实现对元数据的增删改查;与chunkserver交互实现对数据的增删改查。
还有一个快照克隆服务器:
- 快照克隆服务器独⽴于核⼼服务,对外提供了http接⼝,⽤于处理和管理快照克隆任务。
这篇文章会介绍一下curve的元数据的管理,主要是mds的元数据的管理。
mds是curve的元数据管理服务,负责整个集群的元数据管理。mds的所有元数据信息都会持久化到kv存储中,curve选择了etcd作为元数据的存储。
为了加快元数据的访问,mds还在内存维护了一个元数据的cache。cache采用LRU(Least Recently Used)淘汰策略,cache最多缓存的记录条目数量,通过mds的配置文件进行配置。
mds存储的元数据包含拓扑信息的元数据,namespace的元数据。所有的信息都是经过一定的编码,以kv的方式保存在元数据中。不同类型的元数据的编码方式不同,所有保存在mds的元数据的key都是以 “prefix + 其他字段”的方式进行编码。value则是对应的元数据序列化为字符串。
不同类型的元数据的前缀不同,这些前缀比如:
const char FILEINFOKEYPREFIX[] = "01";
const char SEGMENTINFOKEYPREFIX[] = "02";
const char SNAPSHOTFILEINFOKEYPREFIX[] = "03";
const char CHUNKSTOREKEY[] = "05";
const char TOPOLOGYITEMPRIFIX[] = "10";
拓扑元数据信息
curve的拓扑信息由mds的topology模块管理,topology管理集群的 topo元数据信息。用于管理和组织机器,利用底层机器的放置、网络的规划以面向业务提供如下功能和非功能需求。
- 故障域的隔离:比如副本的放置分布在不同机器,不同机架