只知道HDFS和GFS?你其实并不懂分布式文件系统( 三 )

  • 怎样保证新加入的节点,不会因短期负载压力过大而崩塌?
  • 如果需要数据迁移,那如何使其对业务层透明?
  •  
    1)如何尽量使各存储节点的负载相对均衡?
     
    首先要有评价存储节点负载的指标 。有多种方式,可以从磁盘空间使用率考虑,也可以从磁盘使用率 +CPU 使用情况 + 网络流量情况等做综合判断 。一般来说,磁盘使用率是核心指标 。
     
    其次在分配新空间的时候,优先选择资源使用率小的存储节点;而对已存在的存储节点,如果负载已经过载、或者资源使用情况不均衡,则需要做数据迁移 。
     
    2)怎样保证新加入的节点,不会因短期负载压力过大而崩塌?
     
    当系统发现当前新加入了一台存储节点,显然它的资源使用率是最低的,那么所有的写流量都路由到这台存储节点来,那就可能造成这台新节点短期负载过大 。因此,在资源分配的时候,需要有预热时间,在一个时间段内,缓慢地将写压力路由过来,直到达成新的均衡 。
     
    3)如果需要数据迁移,那如何使其对业务层透明?
     
    在有中心节点的情况下,这个工作比较好做,中心节点就包办了——判断哪台存储节点压力较大,判断把哪些文件迁移到何处,更新自己的 meta 信息,迁移过程中的写入怎么办,发生重命名怎么办 。无需上层应用来处理 。
     
    如果没有中心节点,那代价比较大,在系统的整体设计上,也是要考虑到这种情况,比如 ceph,它要采取逻辑位置和物理位置两层结构,对 Client 暴露的是逻辑层 (pool 和 place group),这个在迁移过程中是不变的,而下层物理层数据块的移动,只是逻辑层所引用的物理块的地址发生了变化,在 Client 看来,逻辑块的位置并不会发生改变 。
     
    2、中心节点的伸缩
     
    如果有中心节点,还要考虑它的伸缩性 。由于中心节点作为控制中心,是主从模式,那么在伸缩性上就受到比较大的限制,是有上限的,不能超过单台物理机的规模 。我们可以考虑各种手段,尽量地抬高这个上限 。有几种方式可以考虑:
     
    • 以大数据块的形式来存储文件——比如 HDFS 的数据块的大小是 64M,ceph 的的数据块的大小是 4M,都远远超过单机文件系统的 4k 。它的意义在于大幅减少 meta data 的数量,使中心节点的单机内存就能够支持足够多的磁盘空间 meta 信息 。
    • 中心节点采取多级的方式——顶级中心节点只存储目录的 meta data,其指定某目录的文件去哪台次级总控节点去找,然后再通过该次级总控节点找到文件真正的存储节点;
    • 中心节点共享存储设备——部署多台中心节点,但它们共享同一个存储外设 / 数据库,meta 信息都放在这里,中心节点自身是无状态的 。这种模式下,中心节点的请求处理能力大为增强,但性能会受一定影响 。iRODS 就是采用这种方式 。
     
    七、高可用性 
    1、中心节点的高可用
     
    中心节点的高可用,不仅要保证自身应用的高可用,还得保证 meta data 的数据高可用 。
     
    meta data 的高可用主要是数据持久化,并且需要备份机制保证不丢 。一般方法是增加一个从节点,主节点的数据实时同步到从节点上 。也有采用共享磁盘,通过 raid1 的硬件资源来保障高可用 。显然增加从节点的主备方式更易于部署 。
     
    meta data 的数据持久化策略有以下几种方式:
     
    • 直接保存到存储引擎上,一般是数据库 。直接以文件形式保存到磁盘上,也不是不可以,但因为 meta 信息是结构化数据,这样相当于自己研发出一套小型数据库来,复杂化了 。
    • 保存日志数据到磁盘文件 (类似 MySQL 的 binlog 或 redis 的 aof),系统启动时在内存中重建成结果数据,提供服务 。修改时先修改磁盘日志文件,然后更新内存数据 。这种方式简单易用 。
     
    当前内存服务 + 日志文件持久化是主流方式 。一是纯内存操作,效率很高,日志文件的写也是顺序写;二是不依赖外部组件,独立部署 。
     
    为了解决日志文件会随着时间增长越来越大的问题,以让系统能以尽快启动和恢复,需要辅助以内存快照的方式——定期将内存 dump 保存,只保留在 dump 时刻之后的日志文件 。这样当恢复时,从最新一次的内存 dump 文件开始,找其对应的 checkpoint 之后的日志文件开始重播 。


    推荐阅读