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


如果有中心节点 , 则数据节点定期和中心节点进行通信 , 汇报自己的数据块的相关信息 , 中心节点将其与自己维护的信息进行对比 。 如果某个数据块的 checksum 不对 , 则表明该数据块被损坏了;如果某个数据块的 version 不对 , 则表明该数据块过期了 。

如果没有中心节点 , 以 ceph 为例 , 它在自己的节点集群中维护了一个比较小的 monitor 集群 , 数据节点向这个 monitor 集群汇报自己的情况 , 由其来判定是否被损坏或过期 。
当发现被损坏或过期副本 , 将它从 meta 信息中移除 , 再重新创建一份新的副本就好了 , 移除的副本在随后的回收机制中会被收回 。
该返回哪个副本给 Client
这里的策略就比较多了 , 比如 round-robin、速度最快的节点、成功率最高的节点、CPU 资源最空闲的节点、甚至就固定选第一个作为主节点 , 也可以选择离自己最近的一个 , 这样对整体的操作完成时间会有一定节约 。
六、伸缩性
存储节点的伸缩
当在集群中加入一台新的存储节点 , 则它主动向中心节点注册 , 提供自己的信息 , 当后续有创建文件或者给已有文件增加数据块的时候 , 中心节点就可以分配到这台新节点了 , 比较简单 。 但有一些问题需要考虑 。
如何尽量使各存储节点的负载相对均衡?
怎样保证新加入的节点 , 不会因短期负载压力过大而崩塌?
如果需要数据迁移 , 那如何使其对业务层透明?
如何尽量使各存储节点的负载相对均衡

首先要有评价存储节点负载的指标 。 有多种方式 , 可以从磁盘空间使用率考虑 , 也可以从磁盘使用率 +CPU 使用情况 + 网络流量情况等做综合判断 。 一般来说 , 磁盘使用率是核心指标 。
其次在分配新空间的时候 , 优先选择资源使用率小的存储节点;而对已存在的存储节点 , 如果负载已经过载、或者资源使用情况不均衡 , 则需要做数据迁移 。
怎样保证新加入的节点 , 不会因短期负载压力过大而崩塌
当系统发现当前新加入了一台存储节点 , 显然它的资源使用率是最低的 , 那么所有的写流量都路由到这台存储节点来 , 那就可能造成这台新节点短期负载过大 。 因此 , 在资源分配的时候 , 需要有预热时间 , 在一个时间段内 , 缓慢地将写压力路由过来 , 直到达成新的均衡 。
如果需要数据迁移 , 那如何使其对业务层透明?
在有中心节点的情况下 , 这个工作比较好做 , 中心节点就包办了——判断哪台存储节点压力较大 , 判断把哪些文件迁移到何处 , 更新自己的 meta 信息 , 迁移过程中的写入怎么办 , 发生重命名怎么办 。 无需上层应用来处理 。

如果没有中心节点 , 那代价比较大 , 在系统的整体设计上 , 也是要考虑到这种情况 , 比如 ceph , 它要采取逻辑位置和物理位置两层结构 , 对 Client 暴露的是逻辑层 (pool 和 place group) , 这个在迁移过程中是不变的 , 而下层物理层数据块的移动 , 只是逻辑层所引用的物理块的地址发生了变化 , 在 Client 看来 , 逻辑块的位置并不会发生改变 。
中心节点的伸缩
如果有中心节点 , 还要考虑它的伸缩性 。 由于中心节点作为控制中心 , 是主从模式 , 那么在伸缩性上就受到比较大的限制 , 是有上限的 , 不能超过单台物理机的规模 。 我们可以考虑各种手段 , 尽量地抬高这个上限 。 有几种方式可以考虑:
以大数据块的形式来存储文件——比如 HDFS 的数据块的大小是 64M , ceph 的的数据块的大小是 4M , 都远远超过单机文件系统的 4k 。 它的意义在于大幅减少 meta data 的数量 , 使中心节点的单机内存就能够支持足够多的磁盘空间 meta 信息 。
中心节点采取多级的方式——顶级中心节点只存储目录的 meta data , 其指定某目录的文件去哪台次级总控节点去找 , 然后再通过该次级总控节点找到文件真正的存储节点;


推荐阅读