分布式文件存储与数据缓存 FastDFS(一)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 分布式文件存储与数据缓存 FastDFS(一)

一、FastDFS概述

1.1 什么是分布式文件系统

单机时代

初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分。例如:resources\static\fileresources\static\img等。

优点:便利,使用方便。

缺点:文件越多存放越混乱

独立文件服务器

随着公司业务不断发展,将代码和文件放在同一服务器的弊端就会越来越明显。为了解决上面的问题引入独立图片服务器,

流程:

项目上传文件时,首先通过ftp或者ssh将文件上传到图片服务器的某个目录下,再通过Ngnix或者Apache来访问此目录下的文件,返回一个独立域名的图片URL地址,前端使用文件时就通过这个URL地址读取。

缺点:

存在单点故障的问题。数据备份需要人为干预。

分布式文件系统

业务继续发展,单台服务器存储和响应也很快到达了瓶颈,新的业务需要文件访问具有高响应性、高可用性来支持系统。

优点

  • 扩展能力: 毫无疑问,扩展能力是一个分布式文件系统最重要的特点;
  • 高可用性: 在分布式文件系统中,高可用性包含两层,一是整个文件系统的可用性,二是数据的完整和一致性;
  • 弹性存储: 可以根据业务需要灵活地增加或缩减数据存储以及增删存储池中的资源,而不需要中断系统运行。

缺点:系统复杂度稍高,需要更多服务器

1.2 FastDFS简介

FastDFS是一个开源的轻量级分布式文件系统。它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等。

FastDFS特性

  • 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
  • 支持相同内容的文件只保存一份,节约磁盘空间
  • 下载文件支持HTTP协议,可以使用内置Web Server,也可以和其他Web Server配合使用
  • 支持在线扩容
  • 支持主从文件

分布式文件服务提供商

1、阿里的OSS

2、七牛云存储

3、百度云储存

1.3 FastDFS核心概念

FastDFS服务端有三个角色:跟踪服务器(tracker)、存储服务器(storage)和客户端(client)。

tracker

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

storage

存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。相当于是工厂的工人。

client

客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。

group

组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。

流程:

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

1.4 FastDFS上传机制

首先客户端请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求上传文件,存储服务器接收到请求后生产文件,并且将文件内容写入磁盘并返回给客户端file_id、路径信息、文件名等信息,客户端保存相关信息上传完毕。

内部机制如下

1、选择Tracker server

当集群中不止一个Tracker server时,由于Tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。

2、选择Storage server

当选定Group后,Tracker会在Group内选择一个Storage Server给客户端

3、选择Storage path

当分配好Storage Server后,客户端将向Storage发送写文件请求,Storage将会为文件分配一个数据存储目录。

注意:

剩余存储空间最多的优先。

4、生成Fileid

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

5、生成文件名

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

1.5 FastDFS下载机制

客户端带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端。

内部机制如下

  1. client询问tracker下载文件的storage,参数为文件标识(组名和文件名)
  2. tracker返回一台可用的storage
  3. client直接和storage通讯完成文件下载

二、Linux搭建FastDFS

2.1 安装FastDFS

下载安装gcc

安装方式为yum安装(需网络):

yum install gcc-c++ perl-devel pcre-devel openssl-devel zlib-devel wget

下载安装FastDFS

wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz

下载安装FastDFS依赖

wgethttps://github.com/happyfish100/libfastcommon/archive/V1.0.43.tar.gz

下载安装FastDFS

wget https://github.com/happyfish100/fastdfs/archive/V6.06.tar.gz

解压缩依赖tar包

tar -zxvf V1.0.43.tar.gz -C /usr/local
tar -zxvf  V6.06.tar.gz -C /usr/local

编译并安装libfastcommon

cd /usr/local/libfastcommon-1.0.43/
 ./make.sh && ./make.sh install

编译并安装FastDFS

cd /usr/local/fastdfs-6.06
./make.sh && ./make.sh install

进入etc目录下复制配置文件

cd /etc/fdfs/
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf

2.2 创建tracker服务

创建tracker目录

mkdir -p  /data/fastdfs/tracker

修改配置文件

vim /etc/fdfs/tracker.conf
disabled=false          #启用配置文件
port=22122            #设置 tracker 的端口号
base_path=/data/fastdfs/tracker #设置 tracker 的数据文件和日志目录(需预先创建)
http.server_port=8888      #设置 http 端口号,指的是在tracker服务器上启动http服务进程,如:apache或者nginx 启动时所监听的端口

启动tracker服务

/etc/init.d/fdfs_trackerd start

检查tracker服务

netstat -lntup |grep fdfs

2.3 创建storage服务

创建storage目录

mkdir -p /data/fastdfs/base   #日志
mkdir -p /data/fastdfs/storage   #文件存储位置

修改配置文件

vim /etc/fdfs/storage.conf
disabled=false             #启用配置文件
group_name=group1           #组名,根据实际情况修改
port=23000               #设置 storage 的端口号
base_path=/data/fastdfs/base      #设置 storage 的日志目录(需预先创建)
store_path_count=1           #存储路径个数,需要和 store_path 个数匹配
store_path0=/data/fastdfs/storage     #存储路径
tracker_server = 192.168.66.100:22122   #tracker 服务器的 IP 地址和端口号
http.server_port=8888         #设置storage上启动的http服务的端口号,如安装的nginx的端口号

启动storage服务

/etc/init.d/fdfs_storaged start

查看storage服务

netstat -lntup |grep fdfs

2.3 配置Client服务

创建client日志文件目录

mkdir -p /data/fastdfs/client

修改client配置文件

vim /etc/fdfs/client.conf
connect_timeout=30
network_timeout=60
base_path=/data/fastdfs/client      # 日志路径
tracker_server=192.168.66.100:22122    # 追踪服务器的IP,有多个服务器可以另一行

查看启动的服务

ps -ef | grep fdfs

三、FastDFS指令

3.1 上传文件指令:fdfs_upload_file

fdfs_upload_file <config_file> <local_filename> [storage_ip:port] [store_path_index]

参数含义:

  1. <config_file> :客户端client配置文件路径
  2. <local_filename> :要上传的文件的地址
  3. [storage_ip:port] :(可选参数)
  4. [store_path_index] :(可选参数)

示例:

fdfs_upload_file /etc/fdfs/client.conf ./pdx.jpg  #将当前文件夹下的pdx.jpg文件上传到FastDFS
group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg  #上传文件后会返回文件在FastDFS中的唯一文件标识,即卷名+文件名

在/data/fastdfs/storage/data/00/00可以查看当前上传的文件

3.2 下载文件指令

fdfs_download_file <config_file> <file_id> [local_filename] [<download_offset> <download_bytes>

参数含义:

  1. <config_file> :客户端配置文件路径
  2. <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名
  3. [local_filename] :文件下载地址
  4. <download_offset> :(可选参数)文件下载开始时间
  5. <download_bytes> :(可选参数)文件下载的字节数

示例:

#将文件下载到当前路径下
fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg

3.3 查看文件信息指令

fdfs_file_info <config_file> <file_id>

参数含义:

  1. <config_file> :客户端配置文件路径
  2. <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名

示例:

#查看文件的信息
fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg

3.4 删除文件指令

fdfs_delete_file <config_file> <file_id>

参数含义:

  1. <config_file> :客户端配置文件路径
  2. <file_id> :文件在FastDFS中的唯一文件标识,即卷名+文件名

示例:

fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKhCZGSzyi6ANZJJAANsTCZQKGY266.jpg

注意:

删除指令使用后,文件在该卷中的所有备份都会被删除,因为卷内的存储节点会相互同步,故慎用。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
150 1
|
5天前
|
存储 缓存 NoSQL
分布式系统架构8:分布式缓存
本文介绍了分布式缓存的理论知识及Redis集群的应用,探讨了AP与CP的区别,Redis作为AP系统具备高性能和高可用性但不保证强一致性。文章还讲解了透明多级缓存(TMC)的概念及其优缺点,并详细分析了memcached和Redis的分布式实现方案。此外,针对缓存穿透、击穿、雪崩和污染等常见问题提供了应对策略,强调了Cache Aside模式在解决数据一致性方面的作用。最后指出,面试中关于缓存的问题多围绕Redis展开,建议深入学习相关知识点。
62 8
|
3月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
59 2
数据的存储--Redis缓存存储(二)
|
8天前
|
存储 缓存 安全
分布式系统架构7:本地缓存
这是小卷关于分布式系统架构学习的第10篇文章,主要介绍本地缓存的基础理论。文章分析了引入缓存的利弊,解释了缓存对CPU和I/O压力的缓解作用,并讨论了缓存的吞吐量、命中率、淘汰策略等属性。同时,对比了几种常见的本地缓存工具(如ConcurrentHashMap、Ehcache、Guava Cache和Caffeine),详细介绍了它们的访问控制、淘汰策略及扩展功能。
33 6
|
11天前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
34 7
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
59 5
|
2月前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
3月前
|
JSON 分布式计算 前端开发
前端的全栈之路Meteor篇(七):轻量的NoSql分布式数据协议同步协议DDP深度剖析
本文深入探讨了DDP(Distributed Data Protocol)协议,这是一种在Meteor框架中广泛使用的发布/订阅协议,支持实时数据同步。文章详细介绍了DDP的主要特点、消息类型、协议流程及其在Meteor中的应用,包括实时数据同步、用户界面响应、分布式计算、多客户端协作和离线支持等。通过学习DDP,开发者可以构建响应迅速、适应性强的现代Web应用。
|
4月前
|
缓存 NoSQL Java
谷粒商城笔记+踩坑(12)——缓存与分布式锁,Redisson+缓存数据一致性
缓存与分布式锁、Redisson分布式锁、缓存数据一致性【必须满足最终一致性】
200 14
谷粒商城笔记+踩坑(12)——缓存与分布式锁,Redisson+缓存数据一致性
|
3月前
|
缓存 监控 前端开发
处理页面缓存中数据不一致的问题
【10月更文挑战第9天】
68 2