数据子系统
数据子系统的设计是为了满足大、小文件支持顺序随机访问的多租户需求。采用两种不同的复制协议,以确保副本之间的强一致性,并在性能和代码可用性上进行一些权衡。
系统特性
- 大文件存储
对于大文件,内容存储为一个或多个扩展数据块的序列,这些扩展数据块可以分布在不同数据节点上的不同数据分区中。将新文件写入扩展数据块存储区始终会导致数据以新扩展数据块的零偏移量写入,这样就不需要在扩展数据块内进行偏移。文件的最后一个范围不需要通过填充来补齐其大小限制(即该范围没有空洞),并且不会存储来自其他文件的数据。
- 小文件存储
将多个小文件的内容聚合存储在一个文件内,并将每个文件内容的物理偏移量记录在相应的元数据中。删除文件内容(释放此文件占用的磁盘空间)是通过底层文件系统提供的文件穿洞接口(fallocate())实现的。这种设计的优点是不需要实现垃圾回收机制,因此在一定程度上避免使用从逻辑偏移到物理偏移的映射。
- 复制
成员间的文件复制,根据文件写入模式,ChubaoFS采用不同的复制策略。
当文件按顺序写入ChubaoFS时,使用主备份复制协议来确保与优化的IO吞吐量的强一致性。在随机写入时覆盖现有的文件内容时,我们采用了一种基于Multi-Raft的复制协议,该协议类似于元数据子系统中使用的协议,以确保强一致性。
- 故障恢复
由于存在两种不同的复制协议,当发现复制副本上的故障时,我们首先通过检查每个数据块的长度并使所有数据块对齐,启动基于主备份的复制协议的恢复。一旦这个处理完成,我们就开始在我们的基于Multi-Raft的恢复。
HTTP接口
API | 方法 | 参数 | 描述 |
---|---|---|---|
/disks | GET | N/A | 获取磁盘的列表和信息。 |
/partitions | GET | N/A | 获取所有数据组的信息。 |
/partition | GET | partitionId[int] | 获取特定数据组的详细信息。 |
/extent | GET | partitionId[int]&extentId[int] | 获取特定数据组里面特定extent文件的信息。 |
/stats | GET | N/A | 获取DATA节点的信息。 |