4003?1458378099

【功能】 针对glusterfs以目录为单位分布存储方案研究总结 正常


李立添加于 2016-11-16 23:17

针对glusterfs以目录为单位分布存储方案研究总结

一、      研究背景

原生glusterfs是以文件为单位分布存储的,是一个无元数据服务器分布式存储方案,这样的优点就是任何一台服务器宕机都不会影响整个集群的使用。但是由于我们是存储的数据文件夹,如果按照文件分布存储,则数据文件夹中的文件会被分布到不同的机器上,一旦一个机器磁盘损坏或者宕机,所有涉及该机器的数据文件夹都会不可用,而且,也不能分清楚哪些数据文件可用,哪些不可用。当然,glusterfs提供了备份机制,replicated卷存储方式,但是,这是一种镜像备份,即所有数据的完全复制,这样即使做1个副本,总的存储利用率也会低于50%,并且带来许多性能损耗。而且,glusterfsreplicated存储方式有可能会发生脑列问题,即如果2副本之间同时改动,可能出现系统不能识别的问题,这样的问题用户完全无法解决,所以,replicated存储方式并不适合我们的存储要求。所以,我们需要研究基于文件夹的分布式存储。

二、      研究方案

目前有两个解决方案:

1)         将数据文件夹变成一个文件,用压缩或者其他方式,然后存储在集群中,使用的时候再解压缩,使用完成后再压缩存储。这样整个文件夹的存储就是一个文件,会保存在一台机器上,但是,这样首先会有非常大的性能损耗,大文件的压缩和解压缩都非常慢,启动数据库之前需要先解压这个过程不能忍受的,其次,这个方案可能会有较大安全隐患,如果在启动状态更改了数据文件,但是此时系统出现问题,则更改文件没有压缩存储,会丢失更改。所以,并不推荐这个方案。

2)         第二种就是通过glusterfs的代码的修改,完成我们所需要的功能。Glusterfs分布式存储是通过hash完成的。根据以前的研究,具体过程如下:

 

创建文件夹:

a)         在创建文件夹的时候,会在所有存储块执行创建文件。

b)         创建成功后,会为每个存储块的文件夹写入对应的hash值区间。

创建文件:

a)         根据文件名计算hash值,根据父目录hash分布获取其hashed

b)         hashed卷空间,inode数目等没有超过上限,则直接在hashed卷创建该文件。

c)         hashed卷空间,inode数目等超过了上限,则在子卷中选择一个最优的作为其avail卷。

d)         hashed卷上创建DHTLINKFILE,其扩展属性中记录着avail卷的名字。

e)         avail卷上创建该文件。

所以,只需在创建文件夹的时候,更改其上的hash区间,保证其只有一个子卷对应所有的hash区间,这样,就可以保证这个文件夹的所以文件会分布在一台机器上。

三、      目前存在的问题

虽然用第二种方案能够达到要求,但是还是存在几点问题:

1.         由前几天的原理研究和测试证实,glusterfs无备份hash分布卷在一个子卷掉线会,会造成整个集群不可用,因为创建文件夹会返回失败,分布文件在这台机器上也会失败。对于这种情况,目前考虑:第一,如果子卷可以恢复,就恢复后再使用集群,一旦一个子卷异常,则整个集群设置为不可用;第二,如果子卷不能恢复,则直接删除子卷,这样可以保证集群仍然可用,只损失该子卷数据,但集群仍然可以使用。

2.         还有就是,需要考虑glusterfs集群添加brick和删除brick后的rebalance操作,这个操作会更改文件夹的hash区间,会造成数据文件的重新分布,这个需要以后做。

还有,这种方式会遇到文件夹存储在该子卷上,后期一直添加文件,但是这个子卷的容量不够,如果允许分布在别的机器,又会有原始的文件夹分散的问题,如果不做处理,则文件存储会失败,所以,这个后面还需要考虑。
回复(8)
  • 4003?1458378099
    李立 8年前
    5?1460204756
    尹刚 8年前

    <p> <span style="color:#484848;background-color:#FFFFFF;">一旦一个机器磁盘损坏或者宕机,所有涉及该机器的数据文件夹都会不可用,而且,也不能分清楚哪些数据文件可用,哪些不可用</span> </p> <p> <span style="color:#484848;background-color:#FFFFFF;"><br /> </span> </p> <p> <span style="background-color:#FFFFFF;">请问:如果一个磁盘坏了,这个磁盘上的文件列表能不能获取到?</span> </p>

    看不到文件列表的,文件信息也是通过与存储机器的通信才知道是否有文件,如果机器宕机,是不能知道机器上存储的文件的列表以及其他情况的。

  • 4003?1458378099
    李立 8年前
    4003?1458378099
    李立 8年前

    好的,我去发一个看看有人回复吗

    5?1460204756
    尹刚 8年前

    <p> 我初步判断这个问题是非常值得研究的。请尽快在gfs社区中交流。 </p> <p> gfs在github上托管了吗? </p>

    恩恩,代码托管在github上,但是他的交流方式有点怪,是用的邮件方式,没有那种网站社区, 昨天已经和社区的人交流过, 对于我们这种场景的应用,gfs目前还没有专门的解决方案,我们可以自己定制。

  • 4003?1458378099
    李立 8年前
    5?1460204756
    尹刚 8年前

    <p> <span style="color:#484848;background-color:#FFFFFF;">一旦一个机器磁盘损坏或者宕机,所有涉及该机器的数据文件夹都会不可用,而且,也不能分清楚哪些数据文件可用,哪些不可用</span> </p> <p> <span style="color:#484848;background-color:#FFFFFF;"><br /> </span> </p> <p> <span style="background-color:#FFFFFF;">请问:如果一个磁盘坏了,这个磁盘上的文件列表能不能获取到?</span> </p>

    可以的,只是在这个机器上的文件看不到了,因为文件夹是会在所有的存储机器上创建的,但是可能文件夹中的文件就不全了

  • 5?1460204756
    尹刚 8年前

    很好!请看看有没有人遇到过类似的问题?你能不能在gfs社区发布一个issue?看看他们对这个问题的反馈?

  • 4003?1458378099
0?1470885445
登录后可添加回复
  • 当前状态 新增
  • 选定优先级 正常
  • 指派给 尹刚
  • 里程碑 --
  • 开始日期 2016-11-16
  • 结束日期
  • 预计工时(H) 0.00 小时
  • 完成度 0%
  • 关联Commit

© Copyright 2007~2021 国防科技大学Trustie团队 & IntelliDE 湘ICP备 17009477号

问题和建议
还能输入50个字符 提交

加入QQ群

关注微信APP


×