大数据&云计算|多图干货 | 分布式文件系统设计,该从哪些方面考虑?( 五 )


主流文件系统的权限模型有以下这么几种 。
DAC: 全称是 Discretionary Access Control , 就是我们熟悉的 Unix 类权限框架 , 以 user-group-privilege 为三级体系 , 其中 user 就是 owner , group 包括 owner 所在 group 和非 owner 所在的 group、privilege 有 read、write 和 execute 。 这套体系主要是以 owner 为出发点 , owner 允许谁对哪些文件具有什么样的权限 。
MAC: 全称是 Mandatory Access Control , 它是从资源的机密程度来划分 。 比如分为“普通”、“机密”、“绝密”这三层 , 每个用户可能对应不同的机密阅读权限 。 这种权限体系起源于安全机构或军队的系统中 , 会比较常见 。 它的权限是由管理员来控制和设定的 。 Linux 中的 SELinux 就是 MAC 的一种实现 , 为了弥补 DAC 的缺陷和安全风险而提供出来 。 关于 SELinux 所解决的问题可以参考 What is SELinux?
RBAC: 全称是 Role Based Access Control , 是基于角色 (role) 建立的权限体系 。 角色拥有什么样的资源权限 , 用户归到哪个角色 , 这对应企业 / 公司的组织机构非常合适 。 RBAC 也可以具体化 , 就演变成 DAC 或 MAC 的权限模型 。

市面上的分布式文件系统有不同的选择 , 像 ceph 就提供了类似 DAC 但又略有区别的权限体系 , Hadoop 自身就是依赖于操作系统的权限框架 , 同时其生态圈内有 Apache Sentry 提供了基于 RBAC 的权限体系来做补充 。
十、其他
空间分配
有连续空间和链表空间两种 。 连续空间的优势是读写快 , 按顺序即可 , 劣势是造成磁盘碎片 , 更麻烦的是 , 随着连续的大块磁盘空间被分配满而必须寻找空洞时 , 连续分配需要提前知道待写入文件的大小 , 以便找到合适大小的空间 , 而待写入文件的大小 , 往往又是无法提前知道的 (比如可编辑的 word 文档 , 它的内容可以随时增大);
而链表空间的优势是磁盘碎片很少 , 劣势是读写很慢 , 尤其是随机读 , 要从链表首个文件块一个一个地往下找 。
为了解决这个问题 , 出现了索引表——把文件和数据块的对应关系也保存一份 , 存在索引节点中 (一般称为 i 节点) , 操作系统会将 i 节点加载到内存 , 从而程序随机寻找数据块时 , 在内存中就可以完成了 。 通过这种方式来解决磁盘链表的劣势 , 如果索引节点的内容太大 , 导致内存无法加载 , 还有可能形成多级索引结构 。

实时删除还是延时删除? 实时删除的优势是可以快速释放磁盘空间;延时删除只是在删除动作执行的时候 , 置个标识位 , 后续在某个时间点再来批量删除 , 它的优势是文件仍然可以阶段性地保留 , 最大程度地避免了误删除 , 缺点是磁盘空间仍然被占着 。 在分布式文件系统中 , 磁盘空间都是比较充裕的资源 , 因此几乎都采用逻辑删除 , 以对数据可以进行恢复 , 同时在一段时间之后 (可能是 2 天或 3 天 , 这参数一般都可配置) , 再对被删除的资源进行回收 。
怎么回收被删除或无用的数据? 可以从文件的 meta 信息出发——如果 meta 信息的“文件 - 数据块”映射表中包含了某个数据块 , 则它就是有用的;如果不包含 , 则表明该数据块已经是无效的了 。 所以 , 删除文件 , 其实是删除 meta 中的“文件 - 数据块”映射信息 (如果要保留一段时间 , 则是把这映射信息移到另外一个地方去) 。
面向小文件的分布式文件系统
有很多这样的场景 , 比如电商——那么多的商品图片、个人头像 , 比如社交网站——那么多的照片 , 它们具有的特性 , 可以简单归纳下:
每个文件都不大;
数量特别巨大;
读多写少;
不会修改 。

针对这种业务场景 , 主流的实现方式是仍然是以大数据块的形式存储 , 小文件以逻辑存储的方式存在 , 即文件 meta 信息记录其是在哪个大数据块上 , 以及在该数据块上的 offset 和 length 是多少 , 形成一个逻辑上的独立文件 。 这样既复用了大数据块系统的优势和技术积累 , 又减少了 meta 信息 。


推荐阅读