海量文件存储及FastDFS容器化部署及访问

一. 背景

     当我们需要存储海量文件的时候,可能想到的几种方式:

         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容器化部署及访问_第1张图片
fastdfs架构

三. FastDFS容器化安装

    FastDFS本地化安装比较复杂,需要大量的配置及相关插件安装,不利于分布式环境的部署和迁移。因此将其所有的配置容器化打包为docker镜像进行部署,仅仅需要一两步即可完成,使用起来非常方便。本文采用的是已经封装好的镜像。

    1、服务规划

海量文件存储及FastDFS容器化部署及访问_第2张图片
服务规划

    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容器化部署及访问_第3张图片
文件目录

四. FastDFS命令行文件操作

     通过命令行的方式来操作文件,由于FastDFS的命令都被封装在容器环境中需要进入容器中进行操作:

    1. 查看已经运行容器

docker ps

    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会将上传的文件重命名为一个随机的名称。

海量文件存储及FastDFS容器化部署及访问_第4张图片
查看文件实际存储

五. 通过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容器化部署及访问_第5张图片
独立地址访问

    FastDFS的HTTP服务较为简单,即需要直接访问某一个storage的地址,而无法提供统一的地址负载均衡等高性能的服务。因此需要我们手动配置nginx来实现这三台服务器统一的访问及负载均衡。

    此处nginx同样使用容器进行部署(docker pull nginx:1.15),nginx.conf文件主要配置如下:

海量文件存储及FastDFS容器化部署及访问_第6张图片
负载均衡配置

    即访问192.168.1.51:8808链接会被随机映射到实际的vm1,vm2,vm3三台服务器上获取数据,这样就解决了统一访问链接和负载均衡的问题,如下:

海量文件存储及FastDFS容器化部署及访问_第7张图片
统一地址访问

六. 通过java操作FastDFS的文件操作

    1. 新建maven项目,在pom中添加依赖:

海量文件存储及FastDFS容器化部署及访问_第8张图片
maven包依赖

    2. 添加fastdfs操作配置文件fdfs_client.conf:

海量文件存储及FastDFS容器化部署及访问_第9张图片
配置文件
海量文件存储及FastDFS容器化部署及访问_第10张图片
配置信息(与/etc/fdfs/client.conf一致)

      2. fastdfs操作类:

          文件上传:

海量文件存储及FastDFS容器化部署及访问_第11张图片
文件上传

       文件下载:

海量文件存储及FastDFS容器化部署及访问_第12张图片
文件下载

       文件删除:

海量文件存储及FastDFS容器化部署及访问_第13张图片
文件删除

       文件信息获取:

海量文件存储及FastDFS容器化部署及访问_第14张图片
文件信息获取

七. FastDFS在企业中的应用

        海量的小文件的频繁读取,包括:

             -文档、图片、音频、视频

你可能感兴趣的:(海量文件存储及FastDFS容器化部署及访问)