原生glusterfs是以文件为单位分布存储的,是一个无元数据服务器分布式存储方案,这样的优点就是任何一台服务器宕机都不会影响整个集群的使用。但是由于我们是存储的数据文件夹,如果按照文件分布存储,则数据文件夹中的文件会被分布到不同的机器上,一旦一个机器磁盘损坏或者宕机,所有涉及该机器的数据文件夹都会不可用,而且,也不能分清楚哪些数据文件可用,哪些不可用。当然,glusterfs提供了备份机制,replicated卷存储方式,但是,这是一种镜像备份,即所有数据的完全复制,这样即使做1个副本,总的存储利用率也会低于50%,并且带来许多性能损耗。而且,glusterfs的replicated存储方式有可能会发生脑列问题,即如果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区间,会造成数据文件的重新分布,这个需要以后做。
还有,这种方式会遇到文件夹存储在该子卷上,后期一直添加文件,但是这个子卷的容量不够,如果允许分布在别的机器,又会有原始的文件夹分散的问题,如果不做处理,则文件存储会失败,所以,这个后面还需要考虑。<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>
看不到文件列表的,文件信息也是通过与存储机器的通信才知道是否有文件,如果机器宕机,是不能知道机器上存储的文件的列表以及其他情况的。
<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>
可以的,只是在这个机器上的文件看不到了,因为文件夹是会在所有的存储机器上创建的,但是可能文件夹中的文件就不全了