Curve技术解析之MDS元数据管理
curve简介
github主页:https://opencurve.github.io/
github代码仓库:https://github.com/opencurve/curve
元数据节点MDS,主要有两个职责,一方面管理和存储元数据信息,另一方面感知集群状态并进行调度。元数据存储在etcd中。
数据节点ChunkServer, 一方面负责数据的存储,另一方面负责数据一致性(如果底层是多副本,需要负责副本间的数据一致性)。
客户端Client, 向上层应用提供对文件的操作接口(open、read、write等), 会和MDS以及ChunkServer交互,与MDS交互实现对元数据的增删改查;与ChunkServer交互实现对数据的增删改查。
快照克隆服务器独立于核心服务,对外提供了http接口,用于处理和管理快照克隆任务。
const char FILEINFOKEYPREFIX[] = "01";
const char SEGMENTINFOKEYPREFIX[] = "02";
const char SNAPSHOTFILEINFOKEYPREFIX[] = "03";
const char CHUNKSTOREKEY[] = "05";
const char TOPOLOGYITEMPRIFIX[] = "10";
拓扑元数据信息
故障域的隔离:比如副本的放置分布在不同机器,不同机架,或是不同的交换机下面。
隔离和共享:不同用户的数据可以实现固定物理资源的隔离和共享。
pool: 用于实现对机器资源进行物理隔离,server不能跨Pool交互。运维上,建议以pool为单元进行物理资源的扩容。
zone: 故障隔离的基本单元,一般来说属于不同zone的机器至少是部署在不同的机架,一个server必须归属于一个zone。
server: 用于抽象描述一台物理服务器,chunkserver必须归属一个于server。
Chunkserver: 用于抽象描述物理服务器上的一块物理磁盘(SSD),chunkserver以一块磁盘作为最小的服务单元。
PageFile支持块设备。
AppendFile支持在线对象存储(规划中)。
AppendECFile支持近线对象存储可以共存(规划中)。
cluster_map:
servers:
- name: server1
internalip: 192.168.0.1
internalport: 8200
externalip: 192.168.0.1
externalport: 8200
zone: zone1
physicalpool: pool1
- name: server2
internalip: 192.168.0.2
internalport: 8200
externalip: 192.168.0.2
externalport: 8200
zone: zone2
physicalpool: pool1
- name: server3
internalip: 192.168.0.3
internalport: 8200
externalip: 192.168.0.3
externalport: 8200
zone: zone3
physicalpool: pool1
logicalpools:
- name: logicalPool1
physicalpool: pool1
type: 0
replicasnum: 3
copysetnum: 100
zonenum: 3
scatterwidth: 0
Online: chunk server在线,正常服务。
Unstable: chunk server一段时间没收到心跳(默认30s),但是还没有到达offline的时间(默认30min),chunkserver状态改为unstable状态,打印一条warning日志。
Offline :chunk server超过offline的时间没有收到心跳(默认30min), chunkserver状态改为offline,打印一条error日志。调度模块感知到offline状态,触发chunk server的recover修复。
namespace元数据信息
key:prefix(2Byte)+parentId(8Byte)+fileName;
Value:FileInfo序列化后的字符串。
文件列目录:列出目录下的所有文件和目录
文件查找:查找一个具体的文件
目录重命名:对一个目录/文件进行重命名
地址空间映射元数据信息:
key:prefix(2Byte)+文件的inodeid(8Byte)+offset(8Byte);
Value:PageFileSegment序列化后的字符串。
字段名 | 类型 | 字段说明 |
copysetID | uint32 | chunk所属的copyset id |
chunkID | uint64 | chunk的id |
减少元数据量:一般来说实际物理文件chunk不会设置的太大,都是M级别的。如果直接去记录这些chunk的信息,元数据量会很大。引入copyset可以认为就是分组,对于chunk的信息记录就是组信息+组内信息,数据量会少很多。如果为每个Chunk去保存复制组成员关系,需要至少 ChunkID+3×NodeID=20 个byte,而如果在Chunk到复制组之间引入一个CopySet,每个Chunk可以用ChunkID+CopySetID=12个byte。
减少复制组数量:如果一个数据节点存在 256K个复制组,复制组的内存资源占用将会非常恐怖;复制组之间的通信将会非常复杂,例如复制组内Primary给Secondary定期发送心跳进行探活,在256K个复制组的情况下,心跳的流量将会非常大;而引入CopySet的概念之后,可以以CopySet的粒度进行探活、配置变更,降低开销。
提高数据可靠性:在数据复制组过度打散的情况下,在发生多个节点同时故障的情况下,数据的可靠性会受到影响。引入CopySet,可提高分布式存储系统中的数据持久性,降低数据丢失的概率。
小结
Curve项目已经完全开源到github:https://github.com/opencurve/curve,欢迎感兴趣的小伙伴去star&&fork。如对curve有疑问或者想参加curve的开发,欢迎给我们提issue或者pr。 Curve微信交流群,7*24h为大家答疑解惑,欢迎搜索微信号opencurve加好友后拉进群。