一. 背景
当我们需要存储海量文件的时候,可能想到的几种方式:
1. 将文件存储于本地文件系统中,然后将其路径存储于关系型数据库。
2. 部署HDFS,将文件存储于HDFS分布式文件系统中,然后记录其存储路径。
3. 通过HBase MOB机制进行小文件的存储。
4. 将文件存储于FastDFS这样的分布式文件系统中/
如何选择存储方式会对文件的读写性能产生大的影响,因此需要根据使用场景匹配其适合的存储场景:
1. 第一种是最传统的软件系统的存储方式,仅适合存储数量较少,临时使用,可周期性删除的文件的,由于文件存储在本地,因此文件的安全,存储的扩展都不能得到支持,如若没有定时删除机制迟早会将磁盘写满,对系统和应用的稳定性产生影响。
2. 第二种方式是大数据的常用存储手段,由于hdfs中namenode的元数据数量限制及其有限节点性能的压力,不适合存储海量的小文件(如互联网应用中的用户头像)以及数据频繁的更新的场景。hdfs中适合存储大文件,并且适合一次写入多次读取的批量计算的情况。
3. 第三种方式通过HBase 的MOB机制进行文件的存储,这种方式因为涉及到图片的压缩会带来region性能的下降,因此存储小于10K的文件比较适合,如果超过100K的文件会经常造成regionserver不可用的问题。
4. 第四种方式FastDFS本文主要讨论,适合海量小文件的分布式存储,支持storage从节点的横向扩展,结合storage负载均衡机制,可大大提高海量小文件的访问性能。Fastdfs不适合存储GB以上的大文件,会造成传输超时等问题。
二. Fastdfs原理
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题,特别适合以中小文件(4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。
三. FastDFS容器化安装
FastDFS本地化安装比较复杂,需要大量的配置及相关插件安装,不利于分布式环境的部署和迁移。因此将其所有的配置容器化打包为docker镜像进行部署,仅仅需要一两步即可完成,使用起来非常方便。本文采用的是已经封装好的镜像。
1、服务规划
2、节点先安装docker服务
vm1,vm2,vm3 节点都执行。
参考:https://www.cnblogs.com/yufeng218/p/8370670.html
3、获取FastDFS容器镜像
vm1,vm2,vm3 节点都执行。
执行命令:docker pull delron/fastdfs
4. 启动tracker服务:
vm3节点执行。
执行命令:docker run -dti --network=host --name tracker -eTRACKER_SERVER=192.168.1.53:22122-v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
注:可根据实际需要修改挂在本地卷路径,当前挂载在本地/var/fdfs/tracker下)
5. 启动storage服务:
vm1,vm2,vm3 节点都执行。
执行命令:docker run -dti --network=host --name storage -eTRACKER_SERVER=192.168.1.53:22122-v /var/fdfs/storage:/var/fdfs delron/fastdfs storage
(注:可根据实际需要修改挂在本地卷路径,当前挂载在本地/var/fdfs/storage下)
6. 启动成功后,可以在本地路径下找到其挂在目录(每个存储节点都一样):
四. FastDFS命令行文件操作
通过命令行的方式来操作文件,由于FastDFS的命令都被封装在容器环境中需要进入容器中进行操作:
1. 查看已经运行容器
2. 进入tracker或者storage容器
执行命令:docker exec -it 45a8fde90694 /bin/bash
3. 上传文件到fastdfs集群:
执行命令:/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /anaconda-post.log
命令返回:group1/M00/00/00/wKgBNF0R_kuAOCx_AAAuyAYKcJ4393.log
其中: /anaconda-post.log为需要上传的文件绝对路径
4. 退出容器
执行命令:exit
5. 查看已上传的文件
在本地系统中路径/var/fdfs/storage/data/00/00/下查看已经上传的文件wKgBNF0R_kuAOCx_AAAuyAYKcJ4393.log,fastdfs会将上传的文件重命名为一个随机的名称。
五. 通过http方式直接访问文件
若需要直接通过浏览器访问存储的文件(例如图片),需要用到FastDFS的http服务(默认8888端口)。其访问方式如下:
http://192.168.1.51:8888/group1/M00/00/00/group1/M00/00/00/wKgBNV0SytyAYKipANXq6U4HsAU139.jpg
http://192.168.1.52:8888/group1/M00/00/00/group1/M00/00/00/wKgBNV0SytyAYKipANXq6U4HsAU139.jpg
http://192.168.1.53:8888/group1/M00/00/00/group1/M00/00/00/wKgBNV0SytyAYKipANXq6U4HsAU139.jpg
FastDFS的HTTP服务较为简单,即需要直接访问某一个storage的地址,而无法提供统一的地址和负载均衡等高性能的服务。因此需要我们手动配置nginx来实现这三台服务器统一的访问及负载均衡。
此处nginx同样使用容器进行部署(docker pull nginx:1.15),nginx.conf文件主要配置如下:
即访问192.168.1.51:8808链接会被随机映射到实际的vm1,vm2,vm3三台服务器上获取数据,这样就解决了统一访问链接和负载均衡的问题,如下:
六. 通过java操作FastDFS的文件操作
1. 新建maven项目,在pom中添加依赖:
2. 添加fastdfs操作配置文件fdfs_client.conf:
2. fastdfs操作类:
文件上传:
文件下载:
文件删除:
文件信息获取:
七. FastDFS在企业中的应用
海量的小文件的频繁读取,包括:
-文档、图片、音频、视频