分布式文件存储系统-wfs
2024-10-22 17:01:57 阿炯

Wfs用在于将海量提交存储的小文件进行高效的压缩归档。可以高效地进行文件存储和读取,并提供简洁的数据读取方式和文件后台管理和以及归档文件的碎片整理等,支持 Linux,Windows,Macos,FreeBSD,Solaris 等系统。采用Go语言实现并在BSD-3-Clause协议下授权。


特点

高效,简易,零依赖
界面管理
内置图片基础处理

其支持的客户端绑定有go、rust、java、python等。与Go-FastDFS有类似的功能特色。

海量小文件问题(LOSF)是一个在大规模数据存储与管理中广泛存在的挑战,尤其是在互联网、物联网、云计算、大数据等领域的应用场景中尤为突出。海量小文件存储在不同的硬件环境和系统架构下都会带来一系列显著的问题,无论是采用传统的机械硬盘(HDD)还是现代的固态硬盘(SSD),这些问题都可能影响系统的性能、效率、扩展性和成本:

1.存储效率低下:对于任何类型的硬盘,小文件通常会导致物理存储空间的低效使用。由于硬盘有其最小存储单元(扇区或页),小文件可能会占用超过其实际内容大小的空间,尤其是在每个文件还需额外存储元数据的情况下,如inode(在Unix-like系统中)或其他形式的元数据记录,这会进一步加大空间浪费。inode耗尽:每个文件和目录至少占用一个inode,而inode的数量是在格式化磁盘并创建文件系统时预先设定的。当系统中有大量小文件时,即使硬盘空间还很充足,也可能因为inode用完而导致无法继续创建新文件,尽管剩余磁盘空间足以存放更多数据。性能影响:随着inode数量增多,查找和管理这些inode所对应的元数据会变得更复杂和耗时,尤其是对于不支持高效索引机制的传统文件系统,这会影响文件系统的整体性能。扩展性受限:文件系统设计时通常有一个固定的inode总数,除非通过特殊手段(如调整文件系统或重新格式化时指定更多inode),否则无法动态增加inode数量来适应小文件增长的需求。

2.I/O性能瓶颈与资源消耗:在HDD环境中,随机读写大量小文件会引发频繁的磁盘寻道操作,从而降低整体I/O性能。而在SSD中,尽管寻道时间几乎可以忽略,但过于密集的小文件访问仍可能导致控制器压力增大、写入放大效应以及垃圾回收机制负担加重。

3.索引与查询效率问题:海量小文件对文件系统的索引结构形成挑战,随着文件数量的增长,查找、更新和删除小文件时所需的元数据操作会变得非常耗时。尤其在需要快速检索和分析场景下,传统索引方法难以提供高效的查询服务。

4.备份恢复复杂性与效率:备份海量小文件是一个繁琐且耗时的过程,同时在恢复过程中,尤其是按需恢复单个文件时,需要从大量备份数据中定位目标文件,这将极大地影响恢复速度和效率。

5.扩展性与可用性挑战:存储系统在处理海量小文件时,可能面临扩展性难题。随着文件数量的增长,如何有效分配和管理资源以维持良好的性能和稳定性是一大考验。在分布式存储系统中,还可能出现热点问题,导致部分节点负载过高,影响整个系统的稳定性和可用性。


针对 LOSF 问题的实现:

1.高效存储布局与合并技术:WFS将多个小文件聚合成大文件存储,以减少元数据开销和提高存储利用率。同时,通过灵活的索引机制,确保每个小文件都能快速定位和提取。

2.分布式存储架构:wfs1.x版本主要聚焦性能提升来满足特定应用场景的需求,并建议通过第三方负载均衡分发技术如nginx,实现横向扩展节点数量来应对海量小文件的存储需求,确保系统在高并发场景下的稳定性和性能表现。

3.元数据管理优化:针对大量小文件元数据管理难题,wfs采用高效元数据索引和缓存策略,减少元数据查询时间,并采用层级目录结构或哈希索引等方法,降低元数据存储的复杂度。

4.缓存与预读策略:引入lru缓存机制,对访问频繁的数据进行缓存,降低I/O操作次数,提高读取速度。

5.数据去重与压缩技术:实现数据去重和数据压缩,去除重复内容,减小存储空间占用,并通过多级压缩算法优化存储效率。

6.高可用与容错设计:支持元数据导出与数据导入,确保在发生故障时,可以快速恢复数据,保证系统服务的持续性和数据完整性。

应用场景:

1.海量非结构化数据存储:适用于存储大量的非结构化数据,如图片、视频、日志文件、 备份数据、静态资源文件等。

2.高效文件数据读取:wfs 存储引擎可以达到 100 万/每秒以上的数据读取效率,特别适合文件读取密集型的业务。

3.多种图片处理需求:wfs 内置图片基础处理,适合对图片处理多种要求的业务,如图片适应多个尺寸,自定义裁剪等。

部署使用简单说明

执行文件下载地址:https://tlnet.top/download

启动:./linux101_wfs -c wfs.json

其延续了Go的单文件服务的风格,其配置文件也是尽量简洁。

wfs.json 配置说明
{
    "listen": 4660,     
    "opaddr": ":6802",
    "webaddr": ":6801",
    "memLimit": 128,
    "data.maxsize": 10000,
    "filesize": 100,
}

属性说明:
listen        http/https 资源获取服务监听端口
opaddr        thrift 后端资源操作地址
webaddr        管理后台服务地址
memLimit        wfs 内存最大分配 (单位:MB)
data.maxsize        wfs 上传图片大小上限 (单位:KB)
filesize        wfs 后端归档文件大小上限 (单位:MB)

分布式部署方案
wfs0.x版本到wfs1.x版本的设计变更说明:wfs0.x 版本实现了分布式存储,这使得系统能够跨多个服务器分散存储和处理数据,具备水平扩展能力和数据备份冗余能力,但是在实际应用中也暴露出一些问题,如元数据重复存储导致空间利用率不高。对于小文件的处理效率低,因为在节点间频繁转发传输,造成系统资源消耗增加。

wfs1.x版本的目标在于通过精简架构、聚焦性能提升来满足特定应用场景的需求,而在分布式部署方面的考量则交由用户借助第三方工具和服务来实现。

1.wfs1.x不直接支持分布式存储,但为了应对大规模部署和高可用需求,推荐采用如Nginx这样的负载均衡服务,通过合理的资源配置和定位策略,可以在逻辑上模拟出类似分布式的效果。也就是说,虽然每个wfs实例都是单机存储,但可以通过外部服务实现多个wfs实例之间的请求分发,从而达到业务层面的“分布式部署”。如何实现wfs的“分布式部署”可以参考文章《WFS的分布式部署方案

2.必须说明的是,超大规模数据存储业务中,分布式系统确实具有显著优势,包括动态资源调配、数据分块存储、多节点备份等高级功能。然而,分布式采用负载均衡策略的wfs1.x,则需要用户自行采取措施保证数据安全性和高可用性,例如定期备份数据、搭建负载均衡集群,并且在应用程序中配置并设计路由规则,确保数据能正确地路由到目标节点。

3.wfs的优势在于其简洁性和高效性。实际上,并非任何文件存储业务都需要复杂的分布式文件系统,相反,大部分业务尚未达到超大规模的量级,而使用复杂的分布式文件系统可能会带来与之不相匹配的过多额外成本和运维难度。目前的wfs及其相应的分布式部署策略已经能够较好地满足各种业务需求。

最新版本:1.0
v1.0.7于2024年9月下旬发布,更新内容如下:
修复 bug、优化性能、优化后台管理界面。

说明:wfs 的图片处理,有较多 url 参数,使用图片处理,可以方便显示图片处理的正确参数用法,更多具体的图片处理方式可以参考使用文档。新增后台图片处理界面,通过图片处理,界面将显示图片处理参数的正确拼接方式。


说明:后台界面管理只是一种辅助模式,应用到项目中时,高效对图片进行增删改查,建议使用 wfs 客户端,客户端使用 tcp 与压缩协议,可以有效提高文件操作效率。

项目主页:
https://tlnet.top/wfs

https://github.com/donnie4w/wfs