Curve核心组件之mds – 网易数帆陈威Curve 是高性能、高可用、高可靠的分布式存储系统 • 高性能、低延迟 • 可支撑储场景:块存储、对象存储、云原生数据库、EC等 • 当前实现了高性能块存储,对接OpenStack和 K8s 网易内部线上无故障稳定运行一年多 • 已开源 • github主页: https://opencurve.github.io/ • github代码仓库: https://github.com/opencurve/curve 例如要在(zone1 zone2 zone3 zone4)中创建8个copyset: result: cs1 [copyset-1, copyset-7] cs2 [copyset-2, copyset-5] cs3 [copyset-3, copyset-6] cs4 [copyset-1, copyset-6] cs5 [copyset-2, copyset-8] cs6 [copyset-4, copyset-5] copyset-5] cs7 [copyset-1, copyset-5] cs8 [copyset-3, copyset-8] cs9 [copyset-4, copyset-7] cs10[copyset-2, copyset-7] cs11[copyset-3, copyset-6] cs12[copyset-4, copyset-8] round2: zone1 zone2 zone3 zone40 码力 | 23 页 | 1.74 MB | 6 月前3
Curve核心组件之Client - 网易数帆CURVE是高性能、高可用、高可靠的分布式存储系统 • 高性能、低延迟存储底座 • 可扩展存储场景:块存储、对象存储、云原生数据库、EC等 • 当前实现了高性能块存储,对接 OpenStack 和 k8s • 网易内部线上无故障稳定运行400+天 • 已开源 • github主页: https://opencurve.github.io/ • github代码仓库: https://github ChunkServer:通过raft维护复制组内的主-从关系CLIENT IO流程 用户下发一个写请求 off: 8M len: 16M 请求落在两个逻辑chunk上,所以 请求会被拆分成两个子请求: ChunkIdx 1, off: 8M len 8M ChunkIdx 2, off: 0 len 8MCLIENT IO流程 子请求由哪个chunkserver处理,依赖以 下信息: 逻辑chunk与物理chunk映射关系 从任务队列取出任务后进行拆分 5. 拆分过程依赖元数据,可能会通过MDSClient向 MDS获取 6. 拆分成的子请求放入队列CLIENT IO线程模型 IO分发线程 7. 从队列中取出子请求准备发送 8. 发送依赖复制组leader,可能会向 Chunkserver查询复制组leader 9. 发送写请求给Chunkserver BRPC线程 10.Chunkserver处理完成后返回RPC0 码力 | 27 页 | 1.57 MB | 6 月前3
CurveFs 用户权限系统调研nbs@pubbeta1-nostest2:/tmp/fsmount$ cat file1 hello world 测试curvefs,发现文件系统链路默认是没有做权限控制。( 挂载点mode 755)© XXX Page 8 of 33 wanghai01@pubbeta1-nostest2:/tmp$ ls -l | grep fsmount drwxr-xr-x 0 root root uint32 mtime = 5; required uint32 atime = 6; required uint32 uid = 7; required uint32 gid = 8; required uint32 mode = 9; required sint32 nlink = 10; required FsFileType type = 11;Last mounted on: /data/chunkserver16 Filesystem UUID: 5ba783e9-44bd-49ce-b8bc-b7ba0ef33531 Filesystem magic number: 0xEF53 Filesystem revision #: 1 (dynamic) Filesystem features: 0 码力 | 33 页 | 732.13 KB | 6 月前3
CurveFS对接S3方案设计s3上对象已chunkid_indexblock_version进行命名,元数据则已S3ChunkInfo(见数据结构)的方式存储在inode中。对于文件顺序写场景,文件0~4M的s3对象必然为chunkid_0_0,4M~8M为chunkid_1_0,以此类推, 还有一种情况是文件先写了0~2M,然后在写2M~4M,这里会采用append到同一个对象的方式进行写,而不是额外upload到一个新的对象;元数据则为{2,0,0 required uint64 blockSize = 6; required uint32 mountNum = 7; repeated MountPoint mountpoints = 8; required FSType fsType = 9; optional common.Volume volume = 10; optional common.S3Info uint32 mtime = 5; optional uint32 atime = 6; optional uint32 uid = 7; optional uint32 gid = 8; optional uint32 mode = 9; optional VolumeExtentList volumeExtentList = 10; // TYPE_FILE only0 码力 | 11 页 | 145.77 KB | 6 月前3
新一代云原生分布式存储无中心节点:哈希算法 INPUT (Offset, Len) HASH HASH mod 72 (DiskNums) (0, 4MB) 163342856 2 58 (4MB, 8MB) 759463473 9 3 (8MB, 16MB) 342165799 5 51 • 映射信息无需记录,直接通过计算获得 • 伪随机算法在服务器数量特别大的时候接近均衡 • 节点故障(DiskNums)变更会涉及其他数据的迁移 中心节点感知集群的信息,进行资源实时调度 • 节点故障不会涉及其他的数据迁移 KEY (Offset, Len) VALUE (DiskID) (0, 4MB) 70 (4MB, 8MB) 60 (8MB, 16MB) 50分布式存储的要素 — 一致性协议 多副本: 写三次? 一致性协议 一致性:WARO(Write-all-read-one)、Quorum WARO • 所有副本写成功 直观查看任务运行情况, 数据开发方便,系统运 维方便 高质量 基于在架构上的选择和优秀的工程实践,Curve 在性能、运维、稳定性、工程实践质量上都优于Ceph主要亮点 — 高性能 测试环境:3台服务器*8块NVME, Intel(R) Xeon(R) Gold 5318Y CPU @ 2.10GHz ,256G,3副本,使用自带fio 高性能 NVME 块存储场景,Curve随机读写性能远优于Ceph0 码力 | 29 页 | 2.46 MB | 6 月前3
Curve文件系统元数据持久化方案设计key $key_length 编码后的 key [value_length] 4 value 长度 [value] $value_length 编码后的 value checksum 8 前面 5 部分的校验和© XXX Page 4 of 12 Raft Snapshot +---------+---------+------+-----------------+-----+-----------+ version 4 文件版本号(当文件格式变化时,可以 100% 向后兼容加载旧版持久化文件) size 8 键值对数量 key_value_pairs / 键值对(当 size 为 0 时,该字段为空) EOF 1 特殊标记常量 (0XFF),表示内容已结束 check_sum 8 保存校验和 (根据前 5 个部分内容计算得出) key_value_pairs 字段 字节数 说明 key_length uint32 mtime = 5; required uint32 atime = 6; required uint32 uid = 7; required uint32 gid = 8; required uint32 mode = 9; required sint32 nlink = 10; required FsFileType type = 11;0 码力 | 12 页 | 384.47 KB | 6 月前3
CurveFS Copyset与FS对应关系curvefs copyset与fs对应关系© XXX Page 2 of 19 版本 时间 修改者 修改内容 1.0 2021/7/23 陈威 初稿 1.1 2021/8/4 陈威 根据评审意见修改 1.2 2021/8/9 陈威 增加详细设计 1、背景 2、chubaofs的元数据管理 2.1、meta partition的创建 2.2、meta partition的管理 2.3、meta 3、创建文件/目录 6.4、open流程 6.5、读写流程 6.6、topology 7、工作评估 7.1 client端 7.2 mds端 7.3 metaserver端 metaserver 子模块拆分 8、inode和dentry的内存估算 8.1 一台机器上能存放多少个inode和dentry 8.2 一台机器上建议的copyset数量 8.3 每个copyset建议管理存储容量的大小 1、背景 opysetid = getPartition(inodeid) copyset管理的inode的范围:inoderange = getInodeRange(copyset)© XXX Page 8 of 19 3.1 如何获取inodeid 在create inode的时候,并不知道inode id,inode id是在创建完成之后返回的,这就没有办法利用分片规则去确定到底应该由哪个copyset去服务这个inode。0 码力 | 19 页 | 383.29 KB | 6 月前3
Curve文件系统元数据Proto(接口定义)required Volume volume = 6; required uint32 mountNum = 7; repeated mountPoint mountpoints = 8; } message GetFsInfoResponse { required MetaStatusCode statusCode = 1; optional FsInfo fsInfo dentry = 1; } message CreateDentryResponse { required MetaStatusCode statusCode = 1; }© XXX Page 8 of 15 message UpdateDentryRequest { required Dentry dentry = 1; } message UpdateDentryResponse uint32 mtime = 5; required uint32 atime = 6; required uint32 uid = 7; required uint32 gid = 8; required uint32 mode = 9; required sint32 nlink = 10; required FileType type = 11;0 码力 | 15 页 | 80.33 KB | 6 月前3
Curve核心组件之snapshotclone” + ChunkId + “_snap_”+ seqNum的形式,以区别于 ChunkFile。CHUNKSERVER端快照实现-SNAPFILE 字段 类型 说明 version uint8_t 文件格式协议 版本号 demaged bool 损坏标记 sn uint64_t 快照版本号 bits uint32_t 位图的位数 bitmap char[] 位图 crc uint32_t chunkserver接口创建CloneChunk。 • 5. 更新克隆卷状态为metaInstalled。 • 6. 发起ChunkServer数据拷贝 • 7. ChunkServer从克隆源拷贝数据。 • 8. 将卷从临时卷rename为克隆目标卷名。 • 9. 更新克隆卷状态为Cloned。 克隆流程: chunk chunk chunk chunkserver meta object data 安装元数据时即分配好chunk。 无额外接口: 无需Flatten接口。 适用场景: 适用于从云主机或快照创建镜像CHUNKSERVER端克隆实现-CHUNKFILE 字段 类型 说明 version uint8_t 文件格式协议版本号 sn uint64_t chunk文件的版本号 correntSn uint64_t chunk的修正版本号 locationSi ze size_t 可缺省,当前为CloneChunk时表示0 码力 | 23 页 | 1.32 MB | 6 月前3
Curve文件系统空间分配方案行处理,处理完成后,返回RPC。 空间分配器相关的RPC接口,及request/response定义如下。与 里的定义基本一致。 CurveFS Client 概要设计(已实现)#%E6%8E%A5%E5%8F%A3%E9%9C%80%E6%B1%82 syntax="proto2"; option cc_generic_services = true; enum StatusCode { optional uint64 leftOffset = 2; // optional uint64 rightOffset = 3; // }© XXX Page 8 of 11 message AllocateSpaceRequest { required uint64 fsId = 1; // ID required uint320 码力 | 11 页 | 159.17 KB | 6 月前3
共 26 条
- 1
- 2
- 3













