前言

天猫、淘宝等购物网站,海量的商品图片和视频,是如何存储的?当用户访问量大时,又如何保证下载速度?分布式文件系统就是用来解决这些问题的。

那么分布式文件系统该如何使用呢?别急,今天袁老师就会带领大家来学习这些非常实用的技能:

  • 分布式文件系统概述
  • 主流的分布式文件系统的介绍
  • 重点介绍 FastDFS 架构
  • 掌握 FastDFS 的安装和配置

FastDFS 概述

1. 分布式文件系统

分布式文件系统 (Distributed File System) 是一个软件 / 软件服务器,此软件可以用来管理在多个服务器节点中的文件(这些服务器节点通过网络相连并构成一个庞大的文件存储服务器集群,即这些服务器节点都是用来存储文件资源的,且用 DFS 来管理这些文件)。而传统文件系统与分布式文件系统的对比,有如下区别:

经过对比,我们会发现传统文件系统存在如下缺点:

  • 若用户数量多,则 IO 操作会很频繁 则对磁盘的访问压力会较大;
  • 若磁盘故障,则可能会造成数据的丢失;
  • 一个磁盘的存储容量有限。

2. 主流的分布式文件系统

2.1 HDFS

Hadoop Distributed File System,Hadoop 分布式文件系统。这是一个高容错的系统,适合部署到廉价的机器上,能提供高吞吐量的数据访问,非常适合大规模数据应用。HDFS 采用主从结构,一个 HDFS 是由一个 name 节点和 N 个 data 节点组成。name 节点储存元数据,一个文件分割成 N 份存储在不同的 data 节点上。

2.2 GFS

Google File System,可扩展的分布式文件系统,用于大型的,分布式的,对大量数据进行访问的应用。GFS 可以运行于廉价的普通硬件上,可以提供容错功能,它可以给大量的用户提供总体性能较高的服务。GFS 采用主从结构,一个 GFS 集群由一个 master 和大量的 chunkserver(分块服务器) 组成,一个文件被分割若干块,分散储存到多个分块 server 中。

2.3 FastDFS

FastDFS 由淘宝资深架构师余庆编写并开源,使用 C 语言编写而成。FastDFS 为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标。使用 FastDFS 能够很容易搭建出一套高性能的文件服务器集群,实现文件上传、下载等服务。

HDFS 和 GFS 都是通用的文件系统,他们的优点是开发体验好,但是系统的复杂度较高,性能也一般。相比之下,专用的分布式文件系统体验差,但是复杂度低,性能也高。尤其是 FastDFS,特别适合图片、小视频等小文件。因为 FastDFS 对文件是不分割的,所以没有文件合并的开销。并且 FastDFS 网络通信使用 Socket,速度也较快。

基于 FastDFS 的诸多优点,所以接下来我们就重点给大家介绍 FastDFS 的使用。

FastDFS 架构

FastDFS 架构包括 Tracker Server 和 Storage Server。客户端请求 Tracker Server 进行文件上传、下载,通过 Tracker Server 调度最终由 Storage Server 完成文件上传和下载。

Tracker Server 作用是负载均衡和调度,通过 Tracker Server 在文件上传时可以根据一些策略找到 Storage Server 提供文件上传服务。可以将 Tracker 称为追踪服务器或调度服务器。

Storage Server 作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上,Storage Server 没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将 Storage 称为存储服务器。

1. Tracker 集群

FastDFS 集群中的 Tracker Server 可以有多台,Tracker Server 之间是相互平等关系同时提供服务,Tracker Server 不存在单点故障。客户端请求 Tracker Server 采用轮询方式,如果请求的 Tracker 无法提供服务则换另一个 Tracker。

2. Storage 集群

Storage 集群采用了分组存储方式。Storage 集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,组内的 Storage Server 之间是平等关系,不同组的 Storage Server 之间不会相互通信,同组内的 Storage Server 之间会相互连接进行文件同步,从而保证同组内每个 Storage 上的文件完全一致的。一个组的存储容量为该组内存储服务器容量最小的那个,由此可见组内存储服务器的软硬件配置最好是一致的。

采用分组存储方式的好处是灵活、可控性较强。比如上传文件时,可以由客户端直接指定上传到的组也可以由 Tracker 进行调度选择。一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,可以增加组来扩充存储容量(横向扩容)。

3. Storage 状态收集

Storage Server 会连接集群中所有的 Tracker Server,定时向他们报告自己的状态,包括磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。

4. 文件上传流程

客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。

组名:文件上传后所在的 Storage 组名称,在文件上传成功后由 Storage 服务器返回,需要客户端自行保存。

虚拟磁盘路径:Storage 配置的虚拟路径,与磁盘选项 store_path * 对应。如果配置了 store_path0 则是 M00,如果配置了 store_path1 则是 M01,以此类推。

数据两级目录:Storage 服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。

文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

5. 文件下载流程

Tracker 根据请求的文件路径即文件 ID 来快速定义文件,比如请求下边的文件:

以上请求处理过程如下:

  • 通过组名 Tracker 能够很快的定位到客户端需要访问的存储服务器组是 group1,并选择合适的存储服务器提供客户端访问。
  • 存储服务器根据文件存储 “虚拟磁盘路径” 和“数据两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。

了解了 FastDFS 的运行原理之后,接下来我们就来开始进行 FastDFS 的安装及配置过程吧。

FastDFS 安装及配置

1.FastDFS 安装

1.1 安装 gcc

使用 yum 命令安装 gcc 和 gcc-c++,编译时需要使用。

[root@user ~]# yum install -y gcc gcc-c++

说明:Linux 系统下使用 gcc 编译 C 语言的代码,使用 g++ 编译 C++ 的代码。

1.2 安装 libevent

使用 yum 安装 libevent,运行时需求。

[root@user ~]# yum -y install libevent

1.3 安装 libfastcommon

libfastcommon 是由 FastDFS 官方提供的,在 GitHub 开源的一个 C 基础库,包含了 FastDFS 运行所需要的一些基础库。它提供了 ini 文件解析、logger、64 位唯一整数生成器、字符串处理、socket 封装、对象池、skiplist、定时任务调度器、时间轮等等。在这一步的安装过程中,要经历如下几个小的安装步骤。

(1)访问 libfastcommon 包下载地址:

https://github.com/happyfish100/libfastcommon

(2)将 libfastcommon-1.0.39.zip 安装包上传到 CentOS 的 / opt 目录下。

# 1.Windows系统使用Xftp工具或者lrzsz工具将libfastcommon-1.0.39.zip安装包上传至CentOS系统

# 2.Mac系统使用scp命令将libfastcommon-master.zip安装包上传至CentOS系统
scp /Users/yuanxin/Downloads/libfastcommon-1.0.39.zip [email protected]:/opt

(3)在 CentOS 系统中安装解压 zip 包的命令。

[root@user ~]# yum install -y unzip

(4)通过 unzip 命令解压 libfastcommon-1.0.39.zip 压缩包,获取 libfastcommon-1.0.39 目录。

[root@user ~]# unzip libfastcommon-1.0.39.zip

(5)进入 libfastcommon-1.0.39 目录,执行 make.sh 脚本文件。

[root@user ~]# cd libfastcommon-1.0.39
[root@user libfastcommon-1.0.39]# ./make.sh

(6)如果执行 make.sh 脚本时,提示 “权限不够”,则需要对 make.sh 文件进行授权。然后再重新执行 make.sh 脚本文件。

[root@user libfastcommon-1.0.39]# ./make.sh
-bash: ./make.sh: 权限不够
[root@user libfastcommon-1.0.39]# chmod 777 make.sh
[root@user libfastcommon-1.0.39]# ./make.sh

(7)然后执行安装命令。

[root@user libfastcommon-1.0.39]# ./make.sh install
mkdir -p /usr/lib64
mkdir -p /usr/lib
mkdir -p /usr/include/fastcommon
install -m 755 libfastcommon.so /usr/lib64
install -m 644 common_define.h hash.h chain.h logger.h base64.h shared_func.h pthread_func.h ini_file_reader.h _os_define.h sockopt.h sched_thread.h http_func.h md5.h local_ip_func.h avl_tree.h ioevent.h ioevent_loop.h fast_task_queue.h fast_timer.h process_ctrl.h fast_mblock.h connection_pool.h fast_mpool.h fast_allocator.h fast_buffer.h skiplist.h multi_skiplist.h flat_skiplist.h skiplist_common.h system_info.h fast_blocked_queue.h php7_ext_wrapper.h id_generator.h char_converter.h char_convert_loader.h common_blocked_queue.h multi_socket_client.h skiplist_set.h fc_list.h json_parser.h /usr/include/fastcommon
if [ ! -e /usr/lib/libfastcommon.so ]; then ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so; fi

说明:libfastcommon 安装好后会在 / usr/lib64 目录下生成 libfastcommon.so 库文件。

(8)将 / usr/lib64 目录下的 libfastcommon.so 库文件拷贝到 / usr/lib 目录下。

[root@user libfastcommon-1.0.39]# cd /usr/lib64
[root@user lib64]# cp libfastcommon.so /usr/lib

1.4 安装 Tracker

在这一步的安装过程中,也要经历如下几个安装步骤。

(1)将 fastdfs-5.11.tar.gz 安装包上传到 CentOS 的 / opt 目录下。

# 1.Windows系统使用Xftp工具或者lrzsz工具将fastdfs-5.11.tar.gz安装包上传至CentOS系统

# 2.Mac系统使用scp命令将fastdfs-5.11.tar.gz安装包上传至CentOS系统
scp /Users/yuanxin/Downloads/fastdfs-5.11.tar.gz [email protected]:/opt

(2)解压 fastdfs-5.11.tar.gz 安装包。

[root@user opt]# tar -zxvf fastdfs-5.11.tar.gz

(3)进入 fastdfs-5.11 目录,执行 make.sh 脚本文件。

[root@user opt]# cd fastdfs-5.11
[root@user fastdfs-5.11]# ./make.sh
[root@user fastdfs-5.11]# ./make.sh install

(4)安装成功将 fastdfs-5.11 安装目录下的 conf 目录下的所有文件拷贝到 / etc/fdfs / 下。

[root@user fastdfs-5.11]# cp /opt/fastdfs-5.11/conf/* /etc/fdfs/

2.FastDFS 配置

2.1 Tracker 配置

在这一步的安装过程中,要经历如下几个安装步骤。

(1)打开 / etc/fdfs / 目录下的 tracker.conf 配置文件。

[root@user ~]# vim /etc/fdfs/tracker.conf

(2)修改 base_path 属性的值,将 base_path 属性的取值设置成 / home/fastdfs。

# tracker追踪者服务器端口
port=22122
# 存储数据和日志文件的基础目录(Tracker运行时会向此目录存储storage的管理数据)
# base_path=/home/yuqing/fastdfs
base_path=/home/fastdfs

(3)基础目录 / home/fastdfs 是不存在的,需要自行进行创建。

[root@user ~]# mkdir /home/fastdfs

2.2 Storage 配置

在这一步的安装过程中,要经历如下几个安装步骤。

(1)打开 / etc/fdfs / 目录下的 storage.conf 配置文件。

[root@user ~]# vim /etc/fdfs/storage.conf

(2)修改 base_path 属性、store_path0 属性和 tracker_server 属性的取值。

# 配置组名
# 此存储服务器所属的组的名称。
# 注释或删除从tracker服务器获取的该项,此时在tracker.conf中必须将use_storage_id设置为true,并且必须正确配置storage_ids.conf
group_name=group1
# storage存储服务器端口
port=23000
# 向tracker心跳间隔(秒)
heart_beat_interval=30
# storage基础目录(目录不存在,需要自行创建)
# base_path=/home/yuqing/fastdfs
base_path=/home/fastdfs
# store存放文件的位置(store_path)。可以理解一个磁盘一个store_path,多个磁盘多个store_path
# store_path0=/home/yuqing/fastdfs
store_path0=/home/fastdfs/fdfs_storage
# 如果有多个挂载磁盘,则定义多个store_path*属性,如下:
# store_path1=...
# store_path2=...
# 配置tracker服务器IP
tracker_server=192.168.230.131:22122
# 如果有多个则配置多个tracker
# tracker_server=192.168.230.xxx:22122

(3)创建 store 存放文件的目录,需要自行创建。

[root@user ~]# mkdir /home/fastdfs/fdfs_storage

(4)启动服务

启动服务时要经历如下几个小的步骤。

  • 启动 tracker。
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
  • 启动 storage。
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
  • 查看所有运行的端口。
netstat -ntlp

结语

关于 FastDFS 安装和配置的教程,袁老师就给同学们介绍到这里了,请大家赶紧去试一试能不能徒手搭建起一个 FastDFS 的开发环境吧。

如果你还想继续进行 FastDFS 后续内容的学习,接下来我们还会给大家继续更新 FastDFS 的文件存储、文件同步、文件访问 (文件上传、文件下载) 等相关知识的内容,以及如何使用 FastDFS 解决大容量存储和负载均衡的问题。