CurveFS ChunkID持久化
of 3 curvefs chunkid 持久化© XXX Page 2 of 3 1. 2. 3. 1. 2. 3. 4. 5. 6. 1. 2. 3. 4. 1. 1. 1. 2. 1. 2. 3. 4. 3. 2. 背景 将原有的获取chunkid的方法从space迁入mds中,并持久化写入etcd中; 中,并持久化写入etcd中; 只考虑单 mds 工作的情况; chunkid全局递增。 实现 proto/space.proto 中的 message AllocateS3ChunkRequest、message AllocateS3ChunkResponse 复制到 proto/mds.proto; 修改 AllocateS3ChunkResponse 的状态码的类型为 FSStatusCode; 的一些配置。但是这些配置不会立即生效,而是等到当前 chunkId池枯竭时才会生效。 析构函数 GenChunkID 申请的chunkID池是否枯竭? 是,使用 KVStorageClient 申请新的chunkid Bundle (etcd中记录的已使用chunkID增加一个chunkID Bundle 的大小); 申请失败 storeKey_不存在,从现在已使用的 ChunkID 继续申请新的 Bundle0 码力 | 3 页 | 79.38 KB | 5 月前3CurveFS对接S3方案设计
k最大4M,每个block对应s3上一个object。 s3上对象已chunkid_indexblock_version进行命名,元数据则已S3ChunkInfo(见数据结构)的方式存储在inode中。对于文件顺序写场景,文件0~4M的s3对象必然为chunkid_0_0,4M~8M为chunkid_1_0,以此类推, 还有一种情况是文件先写了0~2M,然后在写2M~4M,这里会采 到同一个对象的方式进行写,而不是额外upload到一个新的对象;元数据则为{2,0,0,8M}。对于覆盖写,为了区分新老数据,则会对version进 行++,比如覆盖写了0~4M,则数据会写到chunkid_0_1的对象,则元数据包含了2个S3Chunkinfo{2,0,0,8M}和{2,1,0,4M}。 接口和关键数据结构 common.proto enum FSType { TYPE_S3 = 4; };© XXX Page 6 of 11 // inodes3chunk message S3ChunkInfo { required uint64 chunkId = 1; required uint64 version = 2; required uint64 offset = 3; required uint64 len = 4;0 码力 | 11 页 | 145.77 KB | 5 月前3CurveFS S3数据整理(合并碎片、清理冗余)
s3chuninfolist[index] = [s3chunkinfo(s)] s3chunkinfo { chunkid version // write always 0, compact will increase it offset len } s3 object命名: chunkid_version_index (index为obj在chunk内的index) 执行步骤 对于每一个s3类型的inode来说, 对每一个index内的chunkinfo按照chunkid升序排序. 对于一个chunk来说,chunkinfo数量大于20即进行处理 计算变更 - 记录整个chunk最大的chunkid - 读出一个chunk所有有效的部分(如果是最后一个chunk,需要注意不超出len),compaction+1,chunkid为上一步获取的chunkid,为需要新增的obj - 老的obj为全部需要删除的部分0 码力 | 3 页 | 101.58 KB | 5 月前3Curve核心组件之mds – 网易数帆
在 Curve 系统引入 CopySet 有几个目的: 1. 减少元数据量:如果为每个Chunk去保存复制组成员关系,需要至少 ChunkID+3×NodeID=20 个byte,而如 果在Chunk到复制组之间引入一个CopySet,每个Chunk可以用ChunkID+CopySetID=12个byte。 2. 减少复制组数量:如果一个数据节点存在 256K个复制组,复制组的内存资源占用将会非常恐怖;复制组之 ChunkServer,Copyset和Chunk三者之间的关系如下图: Mds在分配空间时,轮流在不同的copyset中分配,每次从copyset中分配1个chunk, 这个chunk用copysetId:chunkId来唯一标识。COPYSET Copyset的生成策略:Source code : curve/src/mds/copyset/ bool GenCopyset(const ClusterInfo& (CopysetId ,chunkId, offset in chunk, length in chunk); 3. Client 向 chunkserver 查询 chunk 所在的 copyset的leader Chunkserver节点; 4. Client 向 leader 发送读写请求client (IP, port, CopysetId, chunkId, offset in chunk0 码力 | 23 页 | 1.74 MB | 5 月前3Curve支持S3 数据缓存方案
存储的位置信息。采用2级索引的好处是,根据操作的offset可以快速定位到index,则只需要遍历index相关的S3ChunkInfoList,减少了遍历的范围。 对象名设计 对象名采用chunkId+blockindex+compaction(后台碎片整理才会使用,默认0)+inodeId。增加inodeId的目的是为了后续从对象存储上遍历,反查文件,这里就要求inodeId是永远不可重复。 dev,则会调用diskStroage进行本地磁盘write,最终写到s3则由diskStroage模块决定。 关键数据结构 message S3ChunkInfo { required uint64 chunkId = 1; required uint64 compaction = 2; required uint64 offset = 3; required uint64 len GetBlockSize() {return blockSize_;} uint64_t GetChunkSize() {return chunkSize_;} CURVEFS_ERROR AllocS3ChunkId(uint32_t fsId); CURVEFS_ERROR GetInode(uint64_t inodeId, Inode *out); private: S3Client *client_;0 码力 | 9 页 | 179.72 KB | 5 月前3CurveBS IO Processing Flow
MDS and stores the metadata locally. The request is converted to a chunk request (CopysetId=1, chunkId=5678, offset in chunk = 0, length in Chunk = 4096). If the currently segment written is not allocated 4. The Client sends read/write requests to the leader (IP=127.0.0.1, port=8200, CopysetId=1, chunkId=5678, offset in chunk=0, length in Chunk =4096). 5. The Chunkserver completes the request and0 码力 | 13 页 | 2.03 MB | 5 月前3Curve核心组件之snapshotclone
SnapFile 与ChunkFile是同构的,都 来自ChunkFilePool; SnapFile与ChunkFile在同一个目录; SnapFile的命名方式为“chunk_” + ChunkId + “_snap_”+ seqNum的形式,以区别于 ChunkFile。CHUNKSERVER端快照实现-SNAPFILE 字段 类型 说明 version uint8_t 文件格式协议0 码力 | 23 页 | 1.32 MB | 5 月前3
共 7 条
- 1