文章目录

  • 一、分布式文件系统概述
    • 1.单机时代
    • 2.独立文件服务器
    • 3.分布式文件系统
    • 4.FastDFS
    • 5.FastDFS核心概念
    • 6.上传机制
    • 7.下载机制
  • 二、分布式文件系统实践
    • 1.环境搭建
    • 2.FastDFS指令操作
  • 总结:

一、分布式文件系统概述

1.单机时代

初创初期由于时间紧,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子项目来区分。例如resource/static/file、resource/static/img等
优点是便利,使用方便;缺点是文件越多存放越混乱。

2.独立文件服务器

随着公司业务不断发展,将代码和文件放在同一服务器的弊端就会越来越明显。为了解决上面的问题,引入独立文件服务器。
工作流程:项目上传文件时,首先通过ftp或者ssh将文件上传到图片服务器的某个目录下,再通过nginx或者apache来访问此目录下的文件,返回一个独立域名的图片URL地址,前端使用文件时就通过这个URL地址读取。

3.分布式文件系统

随着业务继续发展,单台服务器存储和响应也很快达到了瓶颈,新的业务需要文件访问具有高响应性、高可用性来支持系统。
优点:
扩展能力:扩展能力是一个分布式文件系统最重要的特点。
高可用性:在分布式文件系统中,高可用性包含两层,一是整个文件系统的高可用性,二是数据的完整和一致性。
弹性存储:可以根据业务需要灵活的增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。
缺点:系统复杂度高,需要更多服务器

独立文件服务器的缺点是容灾、单点故障问题、垂直扩展性稍差。
垂直扩展:我们通过增加系统成员的生产效率来获得期望的负荷量。
水平扩展:就是增加服务器的数量。

4.FastDFS

FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(48k<file_size<500mb)为载体的在线服务,如相册网站、视频网站等等。
FastDFS特性:
文件不分块存储,上传的文件和OS文件系统中的文件一一对应
支持相同内容的文件只保存一份,节约磁盘空间
下载文件支持HTTP协议,可以使用Web Server,也可以和其他Web Server配合使用
支持在线扩容
支持主从文件
分布式文件服务提供商有阿里的OSS、七牛云存储、百度云存储。

5.FastDFS核心概念

tracker,跟踪服务器,主要做调度工作,起负载均衡作用。在内存中记录集群中所有存储组和存储服务器状态信息,是客户端和数据服务器交互的枢纽。

storage,存储服务器(又称存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。Storage server直接利用OS文件系统调用管理文件。

client,客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。
group,组,也可称卷。同组内服务器上的文件是完全相同的,同组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行。

traker相当于FastDFS的大脑,不论是上传还是下载都是通过tracker来分配资源;客户端一般可以使用nginx等静态服务器来做调用或做一部分缓存;存储服务器成为组(或卷),组与组之间是平行的关系,根据资源使用情况可以随时增加,组内服务器文件相互同步备份,以达到容灾的目的。

工作流程:client发起业务请求,通过tracker,tracker告诉你该找哪个storage并记录,client上传文件到storage,storage操作(上传时group内同步操作),最后返回结果给client。

6.上传机制

首先客户端请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的ip地址和端口请求上传文件,存储服务器接收到请求后生产文件,并且将文件内容写入磁盘并返回给客户端file_id、路径信息、文件名等信息,客户端保存相关信息上传完毕。
上传的工作流程:
1.storage server向tracker server定时上传状态信息
2.client上传连接请求到tracker server
3.tracker server查看可用的storage server
4.tracker server返回信息(storage的ip和端口)给client,(剩余空间最多的优先返回给client)
5.上传文件(file content和meta data)到storage server
6.storage server生成file_id以及路径信息和文件名
7.storage server将上传内容写入磁盘
8.storage server返回file_id以及路径信息和文件名给client
9.client存储storage返回的文件信息

生成file_id:选定存储目录后,storage会为文件生成一个file_id,由storage server ip、文件创建时间,文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。可查看RFC2045~RFC2049,上面有MIME的详细规范。
Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读。

生成文件名:当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、file_id、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

7.下载机制

客户端将带上文件名信息请求tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。
下载的工作流程:
1.storage server向tracker server定时上传状态信息
2.client带文件名向tracker server发起下载连接请求
3.查询可用storage(检验同步状态)
4.返回信息(storage的ip和端口)给client
5.client向storage server下载文件,并传递file_id(组名,路径、文件名)
6.storage server查找文件
7.storage server返回文件内容file_content给client

二、分布式文件系统实践

1.环境搭建

  • 通过yum下载安装gcc:yum -y install gcc-c++ perl-devel pcre-devel openssl-devel zlib-devel wget,gcc-c++即下载c++的编译器。
  • 从github下载安装FastDFS:wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz
  • 从github下载安装FastDFS依赖:wget https://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz
  • 解压V1.0.43.tar.gz到/usr/local目录:tar -zxvf V1.0.43.tar.gz -C /usr/local
  • 解压V6.06.tar.gz到/usr/local目录:tar -zxvf V6.06.tar.gz -C /usr/local
  • cd进入到/usr/local/libfastcommon-1.0.43目录下,启动make.sh脚本并安装:./make.sh&&./make.sh install
  • cd进入到/usr/local/fastdfs-6.06目录下,启动make.sh脚本并安装:./make.sh&&./make.sh install
  • 进入到/etc/fdfs目录下,将4个文件的sample后缀去掉:cp client.conf.sample client.confcp storage.conf.sample storage.confcp tracker.conf.sample tracker.conf

tracker:

  • 递归创建tracker目录:mkdir -p /data/fastdfs/tracker
  • 编辑/etc/fdfs/tracker.conf文件,修改tracker的数据文件和日志的目录base_path以及http端口号http.server_port:base_path = /data/fastdfs/trackerhttp.server_port = 8888;路径后面不要加注释
  • 进入到/etc/init.d/目录下,启动tracker服务:./fdfs_trackerd start
  • 查看FastDFS状态:ps -ef|grep fastdfs,ps -ef|grep用来查找特定进程。
    检查FastDFS服务:netstat -lntup |grep fdfs,此时有tracker一个角色

storage:

  • 创建storage日志目录:mkdir /data/fastdfs/base
  • 创建storage目录:mkdir /data/fastdfs/storage
  • 编辑/etc/fdfs/storage.conf文件,修改storage日志记录的目录base_path、数据文件存储的目录base_path0以及tracker服务器的ip地址和端口号:base_path = /data/fastdfs/basebase_path0 = /data/fastdfs/storagetracker_server = 192.168.126.11:22122;路径后面不要加注释
    此时storage的日志记录和数据文件存储目录是分开的,而tracker是一起的。
  • 进入到/etc/init.d/目录下,启动storage服务: ./fdfs_storaged start
  • 检查FastDFS服务:netstat -lntup |grep fdfs,此时有storage和tracker俩个角色

client:

  • 创建client日志目录:mkdir /data/fastdfs/client
  • 编辑/etc/fdfs/client.conf文件,修改client的数据文件和日志的目录base_path以及tracker_server的ip地址和端口号:base_path = /data/fastdfs/clienttracker_server = 192.168.126.11:22122;路径后面不要加注释

2.FastDFS指令操作

  • 上传指令:fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]
    <config_file>:配置文件路径
    <local_filename>:本地文件路径
    [storage_ip:port]:可选参数
    [store_path_index]:可选参数

  • 下载指令:fdfs_download_file <config_file> <file_id> [local_filename] [<download_offset> <download_bytes>]
    <config_file>:配置文件路径
    <file_id>:文件在FastDFS中的唯一文件标识,即卷名+文件名
    [local_filename]:可选参数,文件下载后的存放地址
    <download_offset> :可选参数,文件下载开始时间
    <download_bytes>:可选参数,文件下载的字节数

  • 查看指令:fdfs_file_info <config_file> <file_id>
    <config_file>:配置文件路径
    <file_id>:文件在FastDFS中的唯一文件标识,即卷名+文件名

  • 删除指令:fdfs_delete_file <config_file> <file_id>
    <config_file>:配置文件路径
    <file_id>:文件在FastDFS中的唯一文件标识,即卷名+文件名

实践示例:

上传:

  • 在/opt目录下上传一张图1.jpg;然后再将图片上传至FastFDS:fdfs_upload_file /etc/fdfs/client.conf /opt/1.jpg,此时返回group1/M00/00/00/wKh-C2LlN-WAHjmXAALqcbRjO_Y336.jpg
    即上传至/data/fastdfs/storage/data/00/00wKh-C2LlN-WAHjmXAALqcbRjO_Y336.jpg

下载:

  • 在/opt目录下,从FastDFS中下载一张图片:fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKh-C2LlN-WAHjmXAALqcbRjO_Y336.jpg,在/opt目录会出现这张图片wKh-C2LlN-WAHjmXAALqcbRjO_Y336.jpg

查看:

  • 从FastDFS查看图片信息:fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKh-C2LlN-WAHjmXAALqcbRjO_Y336.jpg

删除:

  • 从FastDFS中删除一张图片:fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKh-C2LlN-WAHjmXAALqcbRjO_Y336.jpg

总结:

1.FastDFS的工作流程是storage server向tracker server定时发送状态信息;然后client向tracker server发起业务请求,tracker server 查看storage server组,在组中将合适的storage server的ip地址和端口号返回给client;而client根据ip地址和端口号下载/上传/查看/删除文件;storage server group同步处理业务;最后返回结果给client。
即client请求tracker server,tracker server返回storage server的端口号和ip地址,client根据端口号和ip地址对storage server操作,处理业务。
2.小项目可以直接将文件保存在项目中,不小不大的可以使用独立文件服务器,大项目用分布式文件系统。但是也要根据业务的需要来决定。
3.FastDFS是一个分布式文件系统,适合文件大小为48k到500m之间的。

FastDFS分布式文件系统_Linux相关推荐

  1. Fastdfs分布式文件系统的应用

    2019独角兽企业重金招聘Python工程师标准>>> 26 MARCH 2016 on fastdfs, 分布式文件系统 我们在实际项目中常常遇到这样的应用场景,用户需要上传图片, ...

  2. FastDFS分布式文件系统(详细入门级介绍)

    分布式文件系统 (Distributed File System) 是一个软件/软件服务器: 这个软件可以用来管理文件: 但这个软件所管理的文件通常不是在一个服务器节点上,而是在多个服务器节点上,这些 ...

  3. 搭建自己的云存储空间|FastDFS分布式文件系统考虑一下?

    一. 前言 最近有很多小伙伴问壹哥,大规模的文件存储该怎么做? 这个感觉很难实现呢.其实这个需求,并没有大家想的那么难以实现.今天壹哥就带着各位,用10分钟的时间来搞定这个需求.不信?那你就跟着壹哥一 ...

  4. 大量文件不知道 怎么管理,快试试FastDFS(分布式文件系统)

    FastDFS(分布式文件系统)入门到精通 GitHub:个人GitHub Blog: 个人博客 1 什么是FastDFS 1.1 简介 FastDFS是用c语言编写的一款开源的分布式文件系统,它是由 ...

  5. FastDFS 分布式文件系统详解

    FastDFS 分布式文件系统详解 什么是文件系统 文件系统是操作系统用于在磁盘或分区上组织文件的方法和数据结构.磁盘空间是什么样的我们并不清楚,但文件系统可以给我们呈现一个非常清晰的表象,我们可以创 ...

  6. Docker安装FastDFS分布式文件系统

    Docker安装FastDFS分布式文件系统: 1.首先下载FastDFS文件系统的docker镜像 2.拉取镜像 3.查看镜像 4.使用docker镜像构建tracker容器(跟踪服务器,起到调度的 ...

  7. FastDFS分布式文件系统使用手册

    FastDFS分布式文件系统使用手册 1.概述 1.1.FastDFS简介 FastDFS是由国人余庆所开发,其项目地址:https://github.com/happyfish100,FastDFS ...

  8. FastDFS分布式文件系统详解

    FastDFS 简介 FastDFS 是基于 C 语言开发的,是一个轻量级开源的高性能分布式文件系统.主要功能有:文件存储.文件同步.文件访问(文件上传/下载),解决了大容量的文件存储和高并发访问的问 ...

  9. FastDFS分布式文件系统的安装及配置

    由于网站使用nfs共享方式保存用户上传的图片,附件等资料,然后通过apache下载的方式供用户访问,在网站架构初期,使用这种简单的方式实现了静态资源的读写分离,但随着网站数据量的增加,图片服务器渐渐成 ...

最新文章

  1. MySQL--5子查询与连接小结
  2. linux网卡Bond模式
  3. ashx 跨域_ASP.NET通用HTTP处理程序(ashx的),支持JSONP
  4. POJ 2513 Colored Sticks
  5. wait放弃对象锁_终于搞懂了sleep/wait/notify/notifyAll,真的是不容易
  6. 使用Spring Boot Actuator监视Java应用程序
  7. 引入antd组件样式_个人作品:一个技术栈koa2+ mysql+react + antd的个人博客
  8. thinkphp 响应
  9. 吸顶那个叫什么_吸顶式无线ap优缺点(无线吸顶ap是什么)
  10. python编程新手常犯的错误_Python新手常犯的10个错误 - 里维斯社
  11. python json函数_Json概述以及python对json的相关操作
  12. PMP考试提分必刷题
  13. 华为数通(一):如何使用ssh console telnet来连接设备
  14. ureport 显示html,UReport2 与业务结合
  15. 笔记本用PCIE转并口卡连接H-JTAG烧写PXA270 NOR Flash
  16. C语言————输出It‘s a computer中的computer
  17. linux 下 packet_mmap 前篇 (抓包实现)
  18. 三星android应用商店,三星应用商店(Galaxy Apps)
  19. web渗透信息收集知识总结
  20. VMware vSphere 服务器虚拟化部署安装图解

热门文章

  1. c语言的魅力,c语言的魅力
  2. 动手学深度学习之目标检测基础
  3. 从年终奖看待美国留学热门专业就业薪酬
  4. Apollo ROS
  5. 小程序网络请求wx.request总结
  6. java生鲜超市进销存管理系统SSM框架
  7. bartender连接oracle,了解BarTender支持的OLEDB数据源
  8. cos(x)求导为什么是-sin(x)?
  9. OpenGLSL初探(六)使用GLSL实现滤镜之灰度滤镜、正方形马赛克滤镜、六边形马赛克滤镜和三角形马赛克滤镜
  10. 微信小程序授权登录如何实现(超级版本)