 Curve文件系统元数据持久化方案设计,需要独立的 snapshot(目前 redis 做不到)探索其可行性?? rocksdb/leveldb + multiraft 可行,因为 leveldb 是可嵌入的,一个 raft 实例中可以绑定一个 leveldb 实例(leveldb 中的 wal 和 SST 文件都可以写到指定的目录) redis 改造 vs 自己实现? 结论:从目前元数据持久化的需要来看,更倾向于自己实现,理由如下: rehashidx, 并将它的值设置为 0, 表示 rehash 工作正式开始 (3) 在 rehash 进行期间, 每次对字典执行添加、删除、查找或者更新操作时, 程序除了执行指定的操作以外, 还会顺带将 ht[0] 哈希表在 rehashidx 索引上的所有键值对 rehash 到 ht[1], 当 rehash 工作完成之后, 程序将 rehashidx 属性的值增一 (4) 随着字典操作的不断执行 随着字典操作的不断执行, 最终在某个时间点上, ht[0] 的所有键值对都会被 rehash 至 ht[1], 这时程序将 rehashidx 属性的值设为 -1, 表示 rehash 操作已完成 哈希表渐进式 rehash 执行期间的哈希表操作: 因为在进行渐进式 rehash 的过程中, 字典会同时使用 ht[0] 和 ht[1] 两个哈希表, 所以在渐进式 rehash 进行期间, 字典的删除 (d0 码力 | 12 页 | 384.47 KB | 6 月前3 Curve文件系统元数据持久化方案设计,需要独立的 snapshot(目前 redis 做不到)探索其可行性?? rocksdb/leveldb + multiraft 可行,因为 leveldb 是可嵌入的,一个 raft 实例中可以绑定一个 leveldb 实例(leveldb 中的 wal 和 SST 文件都可以写到指定的目录) redis 改造 vs 自己实现? 结论:从目前元数据持久化的需要来看,更倾向于自己实现,理由如下: rehashidx, 并将它的值设置为 0, 表示 rehash 工作正式开始 (3) 在 rehash 进行期间, 每次对字典执行添加、删除、查找或者更新操作时, 程序除了执行指定的操作以外, 还会顺带将 ht[0] 哈希表在 rehashidx 索引上的所有键值对 rehash 到 ht[1], 当 rehash 工作完成之后, 程序将 rehashidx 属性的值增一 (4) 随着字典操作的不断执行 随着字典操作的不断执行, 最终在某个时间点上, ht[0] 的所有键值对都会被 rehash 至 ht[1], 这时程序将 rehashidx 属性的值设为 -1, 表示 rehash 操作已完成 哈希表渐进式 rehash 执行期间的哈希表操作: 因为在进行渐进式 rehash 的过程中, 字典会同时使用 ht[0] 和 ht[1] 两个哈希表, 所以在渐进式 rehash 进行期间, 字典的删除 (d0 码力 | 12 页 | 384.47 KB | 6 月前3
 Curve质量监控与运维 - 网易数帆测试用例可以持续积累,成为代码质量的。 目前Curve的 异常测试以及混沌测试 均实现了自动化。 15/33测试用例的编写方法 很多情况下,待测试场景会包含多个变化的参数,每个参数有若干个典 型值;如果将用例覆盖所有可能的情况,总用例数将达到不可接受的程 度。因此,需要通过组合测试的方法,尽量用较少的用例数量覆盖绝大 多数情况:  两因素组合测试 通过测试集覆盖任意两个变量的所有取值组合。理论上两因素组合测  支持python关键字,灵活定义测试  完善的测试报告  完美兼容Jenkins ci  丰富的第三方库(ssh, paramiko, request等) 用例设计原则  无需绑定特定环境,“随意拉起”  配置化(测试环境、测试负载定义)  控制用例时间(考虑一些折中方案)  Case独立性  Case通用性(兼顾curve、ceph等)  Tag规范(优先级、版本、运行时间) bvar::LatencyRecorder : 专用于记录延时和qps的变量。  bvar::Maxer Curve质量监控与运维 - 网易数帆测试用例可以持续积累,成为代码质量的。 目前Curve的 异常测试以及混沌测试 均实现了自动化。 15/33测试用例的编写方法 很多情况下,待测试场景会包含多个变化的参数,每个参数有若干个典 型值;如果将用例覆盖所有可能的情况,总用例数将达到不可接受的程 度。因此,需要通过组合测试的方法,尽量用较少的用例数量覆盖绝大 多数情况:  两因素组合测试 通过测试集覆盖任意两个变量的所有取值组合。理论上两因素组合测  支持python关键字,灵活定义测试  完善的测试报告  完美兼容Jenkins ci  丰富的第三方库(ssh, paramiko, request等) 用例设计原则  无需绑定特定环境,“随意拉起”  配置化(测试环境、测试负载定义)  控制用例时间(考虑一些折中方案)  Case独立性  Case通用性(兼顾curve、ceph等)  Tag规范(优先级、版本、运行时间) bvar::LatencyRecorder : 专用于记录延时和qps的变量。  bvar::Maxer- : 记录最大值,默认std::numeric_limits::min(), varname << N相当于varname = max(varname, N)。  bvar::Miner - : 记录最小值,默认std::numeric_limits::max(), varname << N相当于varname 0 码力 | 33 页 | 2.64 MB | 6 月前3
 TGT服务器的优化的坑不够多。 • TCMU的用户态代码会受到框架约束,不够灵活。iSCSI target 服务器 • TGT(STGT) • 比较久的历史,原来叫STGT,后来改成TGT • 纯用户态,不与内核绑定 • 支持复杂的存储系统,例如ceph rbd, sheepdog, glfs • 纯C代码,外加一些脚本 • 完整的源代码和维护工具、手册 • 编写IO驱动比较容易,容易扩展支持新的存储系统 •0 码力 | 15 页 | 637.11 KB | 6 月前3 TGT服务器的优化的坑不够多。 • TCMU的用户态代码会受到框架约束,不够灵活。iSCSI target 服务器 • TGT(STGT) • 比较久的历史,原来叫STGT,后来改成TGT • 纯用户态,不与内核绑定 • 支持复杂的存储系统,例如ceph rbd, sheepdog, glfs • 纯C代码,外加一些脚本 • 完整的源代码和维护工具、手册 • 编写IO驱动比较容易,容易扩展支持新的存储系统 •0 码力 | 15 页 | 637.11 KB | 6 月前3
 副本如何用CLup管理PolarDB注意创建PolarDB需要的阿里云环境创建PolarDB需要的阿里云环境 部署集把虚拟机打散到不通的物理机上创建PolarDB需要的阿里云环境 VIP的使用创建PolarDB需要的阿里云环境 把VIP绑定到多台数据库主机创建PolarDB需要的阿里云环境 创建虚拟机的时候选中的盘都不是共享盘,必须在创建完 虚拟机后,在单独添加共享盘创建PolarDB需要的阿里云环境 安装依赖包: * libaio0 码力 | 34 页 | 3.59 MB | 6 月前3 副本如何用CLup管理PolarDB注意创建PolarDB需要的阿里云环境创建PolarDB需要的阿里云环境 部署集把虚拟机打散到不通的物理机上创建PolarDB需要的阿里云环境 VIP的使用创建PolarDB需要的阿里云环境 把VIP绑定到多台数据库主机创建PolarDB需要的阿里云环境 创建虚拟机的时候选中的盘都不是共享盘,必须在创建完 虚拟机后,在单独添加共享盘创建PolarDB需要的阿里云环境 安装依赖包: * libaio0 码力 | 34 页 | 3.59 MB | 6 月前3
 Curve元数据节点高可用后要再次判断自身的key值是否还存在,如果存在才能认为竞选成功。 3.3 Observe的流程© XXX Page 15 of 30 1. 2. observe的功能在上面说过,主要用于监听leader的变化。 获取[指定prefix的key, 创建版本号最小]kv值, 如果不存在,会一直等待到有指定prefix的key创建为止。 如果存在,监听该key值,如果key被删除,回到1的操作。 MDS3收到Leader/MDS2退出的消息,Campagin返回成功© XXX Page 25 of 30 事件二: MDS2 Campagin成功后再次获取竞选时使用的key值Leader/MDS2,获取失败,退出 MDS2 Campagin成功后再次获取竞选时使用的key值Leader/MDS3,获取失败,退出 这种情况可以被正确的处理,三个mds都退出,依赖daemon重新拉起,发起新一轮的MDS leader竞选。 leader/MDS1失败,要timeout以后才能返回。出现双主的时间与GetTimeout,PeriodicGetTime, Lease的续约间隔有关 按照当前的配置:出现双主的时间为5s, 这个值目前还是可以接受的。 4.2.6 异常情况4:Etcd集群的follower节点异常 只要etcd集群不发生重新选举,且leader存在的情况下,对外的服务没有问题,不会对mds产生影响。 4.20 码力 | 30 页 | 2.42 MB | 6 月前3 Curve元数据节点高可用后要再次判断自身的key值是否还存在,如果存在才能认为竞选成功。 3.3 Observe的流程© XXX Page 15 of 30 1. 2. observe的功能在上面说过,主要用于监听leader的变化。 获取[指定prefix的key, 创建版本号最小]kv值, 如果不存在,会一直等待到有指定prefix的key创建为止。 如果存在,监听该key值,如果key被删除,回到1的操作。 MDS3收到Leader/MDS2退出的消息,Campagin返回成功© XXX Page 25 of 30 事件二: MDS2 Campagin成功后再次获取竞选时使用的key值Leader/MDS2,获取失败,退出 MDS2 Campagin成功后再次获取竞选时使用的key值Leader/MDS3,获取失败,退出 这种情况可以被正确的处理,三个mds都退出,依赖daemon重新拉起,发起新一轮的MDS leader竞选。 leader/MDS1失败,要timeout以后才能返回。出现双主的时间与GetTimeout,PeriodicGetTime, Lease的续约间隔有关 按照当前的配置:出现双主的时间为5s, 这个值目前还是可以接受的。 4.2.6 异常情况4:Etcd集群的follower节点异常 只要etcd集群不发生重新选举,且leader存在的情况下,对外的服务没有问题,不会对mds产生影响。 4.20 码力 | 30 页 | 2.42 MB | 6 月前3
 Open Flags 调研& openat 系统调用的区别:如果pathname是绝对路径,则dirfd参数没用。如果pathname是相对路径,并且dirfd的值不是AT_FDCWD,则pathname的参照物是相对于dirfd指向的目录,而不是进程的当前工作目录;反之,如 果dirfd的值是AT_FDCWD,pathname则是相对于进程当前工作目录的相对路径,此时等同于open。 open flags flags定义 更新(在linux 2.6.33之前只有O_SYNC flag, 但是在绝大多数文件系统中对O_SYNC的实现都是O_DSYNC的含义,在2.6.33版本支持了O_DSYNC flag,且值使用原O_SYNC的值,但为了兼容老版本的O_SYNC,现在O_SYNC=O_DSYNC|04000000)。 FASYNC: 异步的,启用signal-driven I/O。 : 直接I/O,执行磁盘I/O0 码力 | 23 页 | 524.47 KB | 6 月前3 Open Flags 调研& openat 系统调用的区别:如果pathname是绝对路径,则dirfd参数没用。如果pathname是相对路径,并且dirfd的值不是AT_FDCWD,则pathname的参照物是相对于dirfd指向的目录,而不是进程的当前工作目录;反之,如 果dirfd的值是AT_FDCWD,pathname则是相对于进程当前工作目录的相对路径,此时等同于open。 open flags flags定义 更新(在linux 2.6.33之前只有O_SYNC flag, 但是在绝大多数文件系统中对O_SYNC的实现都是O_DSYNC的含义,在2.6.33版本支持了O_DSYNC flag,且值使用原O_SYNC的值,但为了兼容老版本的O_SYNC,现在O_SYNC=O_DSYNC|04000000)。 FASYNC: 异步的,启用signal-driven I/O。 : 直接I/O,执行磁盘I/O0 码力 | 23 页 | 524.47 KB | 6 月前3
 CurveFS Client 概要设计p count值减少nlookup。 ( ) 这里涉及到一个lookup count 存在哪里的问题 unlink void (*unlink) (fuse_req_t req, fuse_ino_t parent, const char *name); 根据parent inode id 和 name找到当前文件的inode和denty结构 根据lookup count 值,如果非0,则需 fuse_ino_t parent, const char *name); 根据parent inode id 和 name找到当前文件的inode和denty结构 根据lookup count 值,如果非0,则需要延迟删除目录,如果为0,则删除目录。 删除时需要从缓存或mds查询删除inode和dentry的位置,并去metaserver删除,然后清除本地缓存 opendir 可先不支持,返回ENOSYS0 码力 | 11 页 | 487.92 KB | 6 月前3 CurveFS Client 概要设计p count值减少nlookup。 ( ) 这里涉及到一个lookup count 存在哪里的问题 unlink void (*unlink) (fuse_req_t req, fuse_ino_t parent, const char *name); 根据parent inode id 和 name找到当前文件的inode和denty结构 根据lookup count 值,如果非0,则需 fuse_ino_t parent, const char *name); 根据parent inode id 和 name找到当前文件的inode和denty结构 根据lookup count 值,如果非0,则需要延迟删除目录,如果为0,则删除目录。 删除时需要从缓存或mds查询删除inode和dentry的位置,并去metaserver删除,然后清除本地缓存 opendir 可先不支持,返回ENOSYS0 码力 | 11 页 | 487.92 KB | 6 月前3
 curvefs client删除文件和目录功能设计所以在实现unlink接口或rmdir接口时,需要判断unlink字段的当前值,当nlink字段大于1时,只减nlink字段就可以了,当nlink字段减到0时,才真正的执行删除inode。 目录的nlink字段与文件的nlink字段不同, , 并且在目录下, , 删除目录nlink相应的减1。 目录的nlink字段初始值为2 每创建一个新目录,nlink字段也会+1 目录不支持硬链接。0 码力 | 15 页 | 325.42 KB | 6 月前3 curvefs client删除文件和目录功能设计所以在实现unlink接口或rmdir接口时,需要判断unlink字段的当前值,当nlink字段大于1时,只减nlink字段就可以了,当nlink字段减到0时,才真正的执行删除inode。 目录的nlink字段与文件的nlink字段不同, , 并且在目录下, , 删除目录nlink相应的减1。 目录的nlink字段初始值为2 每创建一个新目录,nlink字段也会+1 目录不支持硬链接。0 码力 | 15 页 | 325.42 KB | 6 月前3
 CurveFS Copyset与FS对应关系到1个inode。 client在系统初始化的时候, 还需要起来一个后台线程,定期的检查每一个fs的copyset的状态,如果某一个fs的可以提供分配inode能力的copyset的个数小于规定的值(来自配置文件,默认3个), 就为这个fs创 建一个新的copyset。© XXX Page 12 of 19© XXX Page 13 of 19 6.4、open流程© XXX Page 14 16776 8.2 一台机器上建议的copyset数量 当前curve机器上的copyset的数量是100个。curvefs也可按照curve的规格,每个机器上管理100个copyset。实际上这个值通过配置文件控制,到时候可以根据测试结果确定合适的copyset的数量。 8.3 每个copyset建议管理存储容量的大小 如果有100个的copyset,每个copyset管理2GB大小的元数据。0 码力 | 19 页 | 383.29 KB | 6 月前3 CurveFS Copyset与FS对应关系到1个inode。 client在系统初始化的时候, 还需要起来一个后台线程,定期的检查每一个fs的copyset的状态,如果某一个fs的可以提供分配inode能力的copyset的个数小于规定的值(来自配置文件,默认3个), 就为这个fs创 建一个新的copyset。© XXX Page 12 of 19© XXX Page 13 of 19 6.4、open流程© XXX Page 14 16776 8.2 一台机器上建议的copyset数量 当前curve机器上的copyset的数量是100个。curvefs也可按照curve的规格,每个机器上管理100个copyset。实际上这个值通过配置文件控制,到时候可以根据测试结果确定合适的copyset的数量。 8.3 每个copyset建议管理存储容量的大小 如果有100个的copyset,每个copyset管理2GB大小的元数据。0 码力 | 19 页 | 383.29 KB | 6 月前3
 CurveFs 用户权限系统调研allow-other'以允许相应用户有权访问该文件系统,如果挂载者不是root还需要在/etc/fuse.conf(/usr/local/etc/fuse.conf)中增加配置项“user_allow_other”(该配置项是无值的)。详见libfuse官方文 档:https://github.com/libfuse/libfuse#security-implications # The file /etc/fuse.conf 为什么默认创建的目录权限为755,文件为644? 在linux系统中, ,这些新的文件或目录都会有默认的访问权限 创建一个新的文件或者目录时 umask命令与文件和目录的默认访问权限有关,umask值则表明了需要从默认权限中去掉哪些权限来成 为最终的默认权限值。 root@pubbeta2-curve5:~# umask 0022 权限为777,文件为666,经过与umask作用,最终权限为755、6440 码力 | 33 页 | 732.13 KB | 6 月前3 CurveFs 用户权限系统调研allow-other'以允许相应用户有权访问该文件系统,如果挂载者不是root还需要在/etc/fuse.conf(/usr/local/etc/fuse.conf)中增加配置项“user_allow_other”(该配置项是无值的)。详见libfuse官方文 档:https://github.com/libfuse/libfuse#security-implications # The file /etc/fuse.conf 为什么默认创建的目录权限为755,文件为644? 在linux系统中, ,这些新的文件或目录都会有默认的访问权限 创建一个新的文件或者目录时 umask命令与文件和目录的默认访问权限有关,umask值则表明了需要从默认权限中去掉哪些权限来成 为最终的默认权限值。 root@pubbeta2-curve5:~# umask 0022 权限为777,文件为666,经过与umask作用,最终权限为755、6440 码力 | 33 页 | 732.13 KB | 6 月前3
共 14 条
- 1
- 2













