TGT服务器的优化TGT 服务器的优化块设备协议 • NBD • Linux专有块设备协议 • iSCSI • 广泛支持的外部设备协议(块,磁带等)Curve云原生存储支持块设备 • 通过NBD,只支持Linux • 通过SDK API,目前只支持Linux • PFS • 扩大使用范围 • 通过iSCSI支持更多系统,例如Windows, 类UNIX系统等,使用两项基础 技术 • TCP/IP Client端: iscsi initiator,系统自带 • Linux open-iscsi • Windows iSCSI 发起者 • 服务器端 • 必须是CurveBS原生支持的平台,因为需要curve原生接口,目前是LinuxiSCSI target服务器 • LINUX LILO • 一般用于输出内核本地块设备 • TCMU • 作为LILO支持用户态的接口 • 如何评价LILO • ve, brpc, c++, protobuf 等) • TCMU多了一层转接,配置过程复杂,业界踩的坑不够多。 • TCMU的用户态代码会受到框架约束,不够灵活。iSCSI target 服务器 • TGT(STGT) • 比较久的历史,原来叫STGT,后来改成TGT • 纯用户态,不与内核绑定 • 支持复杂的存储系统,例如ceph rbd, sheepdog, glfs • 纯C代码,外加一些脚本0 码力 | 15 页 | 637.11 KB | 6 月前3
CurveFS S3本地缓存盘方案做一个硬链接链接到该文件。 本次io在本地硬盘写入好之后,异步上传模块会适时把本地硬盘写缓存目录中的文件上传到远端对象存储集群,上传成功后,删除本地写缓存目录中的对应文件。 同时,缓存清理模块会定时检查本地硬盘缓存目录容量情况,如果容量已经达到阈值了,则进行文件的清理工作。 另外,异常管理模块处理客户端挂掉后的文件重新上传问题。 主要数据结构定义 class DiskCacheManagerImpl loadAllCacheReadFile() {}; private: std::string CacheReadDir_;© XXX Page 8 of 9 }; 方案设计思考 本地硬盘如何管理 借用linux本地文件系统进行管理,存储进本地硬盘的内容以文件的形式来表现。 配置一个目录用于本地硬盘的文件管理,对作为缓存盘的本地硬盘进行格式化并挂载到该目录(如果没有缓存盘,那一般而言就是系统盘本身了)。 到读缓存目录。 这样,写缓存目录中的文件上传完之后就可以直接删除了,那么该文件的读缓存还是存在的。 缓存盘空间管理 当缓存文件内容达到阈值时,停止向本地缓存盘写入。 同时,缓存清理模块会定时检查本地硬盘缓存目录容量情况,如果容量已经达到阈值了,则进行文件的清理工作。 本地缓存盘的异步上传 工作队列: 该队列中保存缓存盘中的待上传文件名 工作线程: 遍历工作队列(队列swap),从缓存0 码力 | 9 页 | 150.46 KB | 6 月前3
CurveFS Copyset与FS对应关系样: →pool :存储池(curve的physical pool和logic pool这里合并,只保留一个pool) →zone:可用域 →server:代表着一台服务器 →metaserver:代表着一块盘© XXX Page 9 of 19 每个copyset的由处于不同zone的metaserver组成复制组。 5、curvefs mds和metaserver的心跳 CopySetScheduler: copyset均衡调度器。根据集群中copyset的分布情况生成copyset迁移任务; LeaderScheduler: leader均衡调度器。根据集群中leader的分布情况生成leader变更任务; ReplicaScheduler: 副本数量调度器。根据当前copyset的副本数生成副本增删任务; RecoverScheduler: 恢复调度器。根据当前copyset副本的存活状态生成迁移任务。 状态生成迁移任务。 结论:心跳参考curve。目前这些调度器在curvefs第一阶段不用全部实现。所有和均衡相关的,暂时不做。只做和故障处理相关的副本补全恢复的调度。 6、详细设计 6.1 创建fs curvefs管理工具发起创建fs命令,mds收到createfs命令之后,在mds插入的一条fs记录,状态为NEW。然后为fs创建copyset,默认为3个。mds调用topology的接口0 码力 | 19 页 | 383.29 KB | 6 月前3
Curve核心组件之mds – 网易数帆MDS 管理元数据信息 收集集群状态信息,自动调度 • 数据节点 Chunkserver 数据存储 副本一致性 • 客户端 Client 对元数据增删改查 对数据增删改查 • 快照克隆服务器MDS各个组件 MDS是中心节点,负责元数据管理、集群状态收集与调度。MDS包含以下几个部分: • Topology: 管理集群的 topo 元数据信息。 • Nameserver: 管理文件的元数据信息。 理资源的扩 容。 • zone: 故障隔离的基本单元,一般来说属于不同zone的机 器至少是部署在不同的机架,一个server必须归属于一个 zone。 • server: 用于抽象描述一台物理服务器,chunkserver必须 归属一个于server。 • Chunkserver: 用于抽象描述物理服务器上的一块物理磁盘 (SSD),chunkserver以一块磁盘作为最小的服务单元。TOPOLOGY 信息更新拓扑 中的信息。 • ConfGenerator: 将当前上报的 copyset 信息提交给调度模块, 获取该 copyset 上可能需要执行的任务。 • HealthyChecker: 检查集群中的 chunkserver 在当前时间点距 离上一次心跳的时间,根据这个时间差更新chunkserver状态。 Chunkserver端:chunkserver 端的心跳由两个部分组成: •0 码力 | 23 页 | 1.74 MB | 6 月前3
CurveFS方案设计快照是文件系统或卷的只读副本,快照要求可以即时创建。类似 moosefs,curvefs 可以计划支持目录及文件级别的快照,目录级别和文件级别的快照可以认为就是cp的实现。 对于文件/目录级别的快照: 检查目的节点的父节点中是否有同名文件存在: 存在 若源节点类型为TYPE_DIRECTORY则对源节点目录下的所有子文件进行快照 若源节点类型为TYPE_FILE则开始比较源节点与目的节点的 inode 分空间的回收。 blustore/polarfs 直接在块设备上构建分布式fs。一个文件的数据对应块设备上某个空间,因此需要知道块设备的哪些空间是空闲的,哪些是已经分配出去的, 需要一个空间分配管理器。blustore有两个空间分配器bitmap和stupid。polarfs开源部分有空间映射关系,但空间分配器没有公布。 当前curve已经实现了块设备。curve的数据节点采用了chunkfil0 码力 | 14 页 | 619.32 KB | 6 月前3
CurveFs 用户权限系统调研2081 folder fuse默认是不会检查文件访问权限的,它允许在文件系统中自由的实现访问控制策略或将其下放到底层文件访问机制(e.g. in case of network filesystems)。挂载参数‘default_permissions’用于启用内核自己的权限检查,而不是将权限检查推迟到文件系统,除了文件系统的任何权限检查之外,内核还会进行检查,并且两者都必须成功才能允许操作 。 。 。 。 内核执行标准的 UNIX 权限检查 如果文件系统在打开设备 fd 时的初始功能协商期间启用了 ACL 支持,则此挂载选项将被隐式激活。 在这种情况下,内核执行 ACL 和标准的 unix 权限检查 疑问:协商期间do_init()中的启用ACL的flags如何设置? 初始化时的 通过 : 功能协商 init()函数实现© XXX Page 9 of 33 // libfuse lib/fuse_lowlevel time_gran; /** * For future use.© XXX Page 14 of 33 */ unsigned reserved[22]; }; 未实现任何权限检查的文件系统通常 应在内部添加此选项,可与参数‘allow_other’一起达到共享文件访问控制。© XXX Page 15 of 33 # LD_PRELOAD=/usr/lib/x86_64-l0 码力 | 33 页 | 732.13 KB | 6 月前3
CurveFS S3数据整理(合并碎片、清理冗余)已经在整理的任务不会被新的删除标记的请求打断. 如果标记删除到实际删除之间的时间间隔非常短, 并且在标记删除前已经开始了整理任务, 可能会出现边删除边整理的状态(出现概率较小) 可以在实际删除前检查当前整理的inode列表, 如果在列表里就暂时跳过(同步删除)/重新丢进删除队列(异步删除) 或者就不管, 处理一下报错, 让后续的应该会开发的数据清理工具来删除, 因为出现这个冲突的概率比较小 truncate:0 码力 | 3 页 | 101.58 KB | 6 月前3
Curve文件系统元数据管理6、curve文件系统的多文件系统的设计 1、设计一个分布式文件系统需要考虑的点: 文件系统的元数据是否全缓存? 元数据持久化在单独的元数据服务器上?在磁盘上?在volume上? inode+dentry方式?当前curve块存储的kv方式? 是否有单独的元数据管理服务器? 2、其他文件系统的调研总结 fs 中心化元数据 内存namespace元数据 内存空间分配元数据 元数据持久化 元数据扩展 有元数据服务器 全内存 fsnode → hashtable(inode id) fsedge → hashtable (parent inode + name) 全内存 chunk → hashtable(chunk id) log + dump record 差 否 chunk 链式多副本 overwirte有数据不一致风险 chubaofs(cfs) 有元数据服务器 inode 更适合大文件顺序写 fastcfs 有元数据服务器 inode和dentry放一个结构体。 inode → hashtable(key是ino,全局) dentry → skip list (key是name,每个目录下一个) 计算出来的 binlog,随时间会越来越大 差 DG Master/Slave glusterfs 无中心化服务器 dht算法 hash 扩展时大量迁移0 码力 | 24 页 | 204.67 KB | 6 月前3
BRPC与UCX集成指南EchoRequest EchoResponse5 BRPC简介 ●Channel类 –代表一个连接,Client通过Channel发 送请求和接收应答 ●Server类 –代表一个服务器,可以注册不同的 接口服务,例如上面的EchoService6 BRPC SERVER7 BRPC SERVER8 BRPC client9 BRPC EndPoint EndPoint是一个代表通讯地址的数据结构 1个 UcpContext: N个 UcpWorker42 连接管理器UcpCm ●连接管理类 –全局唯一对象 –通过UcpCm * get_or_create_ucp_cm(void)获取 –完成连接的接受 –完成连接的创建 ●监视brpc::Socket类关闭文件句柄 ●连接以文件句柄表示43 连接管理器UcpCm ● 连接以文件句柄返回 –int Accept(ucp_conn_request_h req); –int Connect(const butil::EndPoint &peer); –UcpConnectionRef GetConnection(int fd1);44 连接管理器UcpCm ●Brpc socket代码不少地方需要文件句柄表示连接,使用句柄可以减少代码修改。例如 SocketOptions.fd为-1表示尚未连接。 ●UcpCm返回的文件句柄实际上是pipe的写端句柄0 码力 | 66 页 | 16.29 MB | 6 月前3
Raft在Curve存储中的工程实践速度取决于写的较快的大多数RAFT协议简介 • Leader:负责从客户端接受日志,把日志复制到其 他服务器,当保证安全性的时候告诉其他服务器应用 日志条目到他们的状态机中。 • Candidate: 发起选举。获取大多数选票的候选人将 成为领导者。 • Follower: 响应来自其他服务器的请求,如果接受不 到消息,就变成候选人并发起一次选举。 • 时间被划分成一个个的任期,每个任期开始都是一次 leader把请求指令记录下来,写入日志,然后并⾏发 给其他的服务器,让他们复制这条⽇志。 3. 当这条⽇志条⽬被安全的复制,leader会应⽤这条⽇ 志条⽬到它的状态机中。 4. 然后把执⾏的结果返回给客户端。 • 提供命令在多个节点之间有序复制和执行,当多个节 点初始状态一致的时候,保证节点之间状态一致。 raft日志复制RAFT协议简介 raft配置变更 • 配置:加入一致性算法的服务器集合。 • 集群的配置不可避免会发生变更,比如替换宕机的机器。0 码力 | 29 页 | 2.20 MB | 6 月前3
共 21 条
- 1
- 2
- 3













