FastDFS搭建分布式文件系统
1. 什么是分布式文件系统
分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。
通俗来讲:
- 传统文件系统管理的文件就存储在本机。
- 分布式文件系统管理的文件存储在很多机器,这些机器通过网络连接,要被统一管理。无论是上传或者访问文件,都需要通过管理中心来访问
2. 什么是FastDFS
FastDFS是由淘宝的余庆先生所开发的一个轻量级、高性能的开源分布式文件系统。用纯C语言开发,功能丰富:
- 文件存储
- 文件同步
- 文件访问(上传、下载)
- 存取负载均衡
- 在线扩容
适合有大容量存储需求的应用或系统。同类的分布式文件系统有谷歌的GFS、HDFS(Hadoop)、TFS(淘宝)等。
3. FastDFS的架构
3.1 fast架构
FastDFS两个主要的角色:Tracker Server 和 Storage Server 。
- Tracker Server:跟踪服务器,主要负责调度storage节点与client通信,在访问上起负载均衡的作用,和记录storage节点的运行状态,是连接client和storage节点的枢纽。
- Storage Server:存储服务器,保存文件和文件的meta data(元数据),每个storage server会启动一个单独的线程主动向Tracker cluster中每个tracker server报告其状态信息,包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息
- Group:文件组,多台Storage Server的集群。上传一个文件到同组内的一台机器上后,FastDFS会将该文件即时同步到同组内的其它所有机器上,起到备份的作用。不同组的服务器,保存的数据不同,而且相互独立,不进行通信。
- Tracker Cluster:跟踪服务 器的集群,有一组Tracker Server(跟踪服务器)组成。
- Storage Cluster :存储集群,有多个Group组成。
3.2 上传和下载流程
上传
- Client通过Tracker server查找可用的Storage server。
- Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
- Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。
- 上传完成,Storage server返回Client一个文件ID,文件上传结束。
下载
- Client通过Tracker server查找要下载文件所在的的Storage server。
- Tracker server向Client返回包含指定文件的某个Storage server的IP地址和端口号。
- Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并指定要下载文件。
- 下载文件成功。
4. FastDFS安装
注意:
安装过程中,下载的源码包,均放在 /usr/local/src
4.1 安装依赖
4.1.1 安装GCC依赖
FastDFS是C编写的,我们进行编译安装需要下载gcc:
yum -y install gcc-c++
4.1.2 安装libevent
FastDFS依赖libevent,需要安装:
yum -y install libevent
4.1.3 安装libfastcommon
libfastcommon是FastDFS官方提供的,libfastcommon包含了FastDFS运行所需要的一些基础库。
下载地址: https://github.com/happyfish100/libfastcommon/releases 选择合适的版本
#切换到下载目录
cd /usr/local/src/
#下载(如果下载慢 可以将下载好的文件上传到此目录)
wget -O libfastcommon-1.0.39.tar.gz https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.39
#解压
tar -zxvf libfastcommon-1.0.39.tar.gz
#进入目录
cd libfastcommon-1.0.39/
#编译安装
./make.sh
./make.sh install
注意:这里推荐下载依赖,然后上传到服务器。
到这里为止,所有依赖都已经安装完毕,接下来我们安装FastDFS:
4.2 安装FastDFS
下载地址:https://github.com/happyfish100/fastdfs/releases 选择合适的版本
#切换到下载目录
cd /usr/local/src/
#下载(如果下载慢 可以将下载好的文件上传到此目录)
wget -O fastdfs-5.11.tar.gz https://codeload.github.com/happyfish100/fastdfs/tar.gz/V5.11
#解压
tar -zxvf fastdfs-5.11.tar.gz
cd fastdfs-5.11/
#编译安装
./make.sh
./make.sh install
注意:
1)安装完成,我们应该能在/etc/init.d/
目录,看到FastDFS提供的启动脚本:
-
fdfs_trackerd
是tracker启动脚本 -
fdfs_storaged
是storage启动脚本
2)我们可以在 /etc/fdfs
目录,通过命令查看到以下配置文件模板:
-
tarcker.conf.sample
是tracker的配置文件模板 -
storage.conf.sample
是storage的配置文件模板 -
client.conf.sample
是客户端的配置文件模板
4.3 配置tracker
FastDFS的tracker和storage在刚刚的安装过程中,都已经被安装了,因此我们安装这两种角色的方式是一样的。不同的是,两种需要不同的配置文件。
我们要启动tracker,就修改刚刚看到的tarcker.conf
,并且启动fdfs_trackerd
脚本即可。
-
进入 /etc/fdfs,复制 FastDFS 跟踪器样例配置文件 tracker.conf.sample,并重命名为 tracker.conf。
cd /etc/fdfs/ cp tracker.conf.sample tracker.conf vim tracker.conf
-
编辑tracker.conf ,标红的需要修改下,其它的默认即可。
# 配置文件是否不生效,false 为生效 disabled=false # 提供服务的端口 port=22122 # Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建) base_path=/fastdfs/tracker # HTTP 服务端口 默认8080 ,建议修改 防止冲突 http.server_port=9080
-
创建tracker基础数据目录,即base_path对应的目录
mkdir -p /fastdfs/tracker
-
在防火墙中开启端口(默认22122),启动tracker
初次成功启动,会在 /fdfsdfs/tracker/ (配置的base_path)下创建 data、logs 两个目录。
我们可以使用
sh /etc/init.d/fdfs_trackerd
启动,不过安装过程中,fdfs已经被设置为系统服务,我们可以采用熟悉的服务启动方式:注意:
此处必须先使用原始方式打开该服务
/etc/init.d/fdfs_trackerd start
接下来才可以使用以下方式:
#启动服务 systemctl start fdfs_trackerd.service #关闭服务 systemctl stop fdfs_trackerd.service #开机自动启动 systemctl enable fdfs_tracked.service
-
查看状态
systemctl status fdfs_tracker
-
tracker server
目录及文件结构${base_path} |__data | |__storage_groups.dat:存储分组信息 | |__storage_servers.dat:存储服务器列表 |__logs | |__trackerd.log: tracker server 日志文件
4.4 配置storage
-
进入 /etc/fdfs 目录,复制 FastDFS 存储器样例配置文件 storage.conf.sample,并重命名为 storage.conf
cd /etc/fdfs cp storage.conf.sample storage.conf vim storage.conf
-
编辑storage.conf
# 配置文件是否不生效,false 为生效 disabled=false # 指定此 storage server 所在 组(卷) group_name=group1 # storage server 服务端口 port=23000 # 心跳间隔时间,单位为秒 (这里是指主动向 tracker server 发送心跳) heart_beat_interval=30 #Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成) (注 :这里不是上传的文件存放的地址,之前版本是的,在某个版本后更改了) base_path=/fastdfs/storage/base # 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。 store_path_count=1 # 逐一配置 store_path_count 个路径,索引号基于 0。 #storage的上传文件存放路径 如果不配置 store_path0,那它就和 base_path 对应的路径一样。 store_path0=/fastdfs/storage # tracker的地址,有多个 tracker server 时,每个 tracker server 写一行 tracker_server=192.168.11.66:22122 # 访问端口 默认80 建议修改 防止冲突 http.server_port=9888
-
创建Storage基础数据目录,对应base_path目录
#对应base_path mkdir -p /fastdfs/storage/base #这是配置的store_path0路径,有多个要创建多个 mkdir -p /fastdfs/storage/
-
在防火墙中开启端口(默认23000),启动tracker
启动Storage前确保Tracker是启动的。初次启动成功,会在
/fastdfs/storage/base(base_path)
目录下创建 data、 logs 两个目录。注意:
此处必须先使用原始方式打开该服务
/etc/init.d/fdfs_storaged start
接下来才可以使用以下方式:
#启动方式 systemctl start fdfs_storaged.service #开机自启 systemctl enable fdfs_storaged.service #查看状态 systemctl status fdfs_storaged.service
-
Storage目录
Storage 目录
同 Tracker,Storage 启动成功后,在base_path 下创建了data、logs目录,记录着 Storage Server 的信息。
在 store_path0/data 目录下,创建了N*N个子目录:[root@localhost ~]# ls /fastdfs/storage/data/ 00 05 0A 0F 14 19 1E 23 28 2D 32 37 3C 41 46 4B 50 55 5A 5F 64 69 6E 73 78 7D 82 87 8C 91 96 9B A0 A5 AA AF B4 B9 BE C3 C8 CD D2 D7 DC E1 E6 EB F0 F5 FA FF 01 06 0B 10 15 1A 1F 24 29 2E 33 38 3D 42 47 4C 51 56 5B 60 65 6A 6F 74 79 7E 83 88 8D 92 97 9C A1 A6 AB B0 B5 BA BF C4 C9 CE D3 D8 DD E2 E7 EC F1 F6 FB 02 07 0C 11 16 1B 20 25 2A 2F 34 39 3E 43 48 4D 52 57 5C 61 66 6B 70 75 7A 7F 84 89 8E 93 98 9D A2 A7 AC B1 B6 BB C0 C5 CA CF D4 D9 DE E3 E8 ED F2 F7 FC 03 08 0D 12 17 1C 21 26 2B 30 35 3A 3F 44 49 4E 53 58 5D 62 67 6C 71 76 7B 80 85 8A 8F 94 99 9E A3 A8 AD B2 B7 BC C1 C6 CB D0 D5 DA DF E4 E9 EE F3 F8 FD 04 09 0E 13 18 1D 22 27 2C 31 36 3B 40 45 4A 4F 54 59 5E 63 68 6D 72 77 7C 81 86 8B 90 95 9A 9F A4 A9 AE B3 B8 BD C2 C7 CC D1 D6 DB E0 E5 EA EF F4 F9 FE
5. 上传测试
-
修改Tracker服务器中的客户端文件
cd /etc/fdfs cp client.conf.sample client.conf vim client.conf
-
修改如下配置即可,其它默认。
# Client 的数据和日志目录 base_path=/fastdfs/client # Tracker端口 tracker_server=192.168.11.66:22122
注意:
此处只需配置tracker_server的ip、端口即可。因为client访问tracker服务,tracker服务返回给client一个storage的ip、端口。
-
创建client基础数据目录,对应base_path目录
#对应base_path mkdir -p /fastdfs/client
-
在linux内部执行如下命令上传 namei.jpeg 图片
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf namei.jpeg
上传成功后返回文件ID号:group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg
返回的文件ID由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
6. 安装配置Nginx,http访问文件
上面将文件上传成功了,但我们无法下载。因此安装Nginx作为服务器以支持Http方式访问文件。同时,后面安装FastDFS的Nginx模块也需要Nginx环境。
Nginx只需要安装到StorageSe rver所在的服务器即可,用于访问文件。安装Nginx详见博客:
6.1 配置nginx
vim /usr/local/nginx/conf/nginx.conf
#配置如下
server {
listen 8081;
server_name 192.168.11.66;
location /group1/M00{
alias /fastdfs/storage/data/;
autoindex on;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
重启nginx
systemctl restart nginx.service
在浏览器访问之前上传的图片 http://192.168.11.66:8081/group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg
7. FastDFS配置nginx模块
7.1 fastdfs-nginx-module 模块说明
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储, 但是同组存储服务器之间需要进行文件复制, 有同步延迟的问题。
假设 Tracker 服务器将文件上传到了 192.168.51.128,上传成功后文件 ID已经返回给客户端。
此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.51.129,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.51.129 上取文件,就会出现文件无法访问的错误。
而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
7.2 下载fastdfs-nginx-module
#进入目录
cd /usr/local/src
#下载文件
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/master.zip
#解压
unzip master.zip
注意:
下载方式可能随着时间失效,请查看最新下载方式。
7.3 配置nginx,添加fastdfs-nginx-module 模块
#停止nginx
systemctl stop nginx
#进入nginx源码目录
cd /usr/local/src/nginx-1.15.12/
#添加fastdfs-nginx-module模块
./configure --add-module=/usr/local/src/fastdfs-nginx-module-master/src
#重新编译安装nginx
make
make install
#验证是否加载fastdfs-nginx-module模块是否 ,有如下部分表示成功
/usr/local/nginx/sbin/nginx -V
如下显示:
nginx version: nginx/1.15.12
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
configure arguments: --add-module=/usr/local/src/fastdfs-nginx-module-master/src
复制 fastdfs-nginx-module 源码中的配置文件 mod_fastdfs.conf 到/etc/fdfs 目录, 并修改
cp /usr/local/src/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf
#修改如下配置,其它默认
# 连接超时时间
connect_timeout=10
# Tracker Server
tracker_server=192.168.11.66:22122
# StorageServer 默认端口
storage_server_port=23000
# 如果文件ID的uri中包含/group**,则要设置为true
url_have_group_name = true
# Storage 配置的store_path0路径,必须和storage.conf中的一致
store_path0=/fastdfs/storage
复制 FastDFS 的部分配置文件到/etc/fdfs 目录
cd /usr/local/src/fastdfs-6.03/conf
cp anti-steal.jpg http.conf mime.types /etc/fdfs/
配置nginx,修改nginx.conf
vim /usr/local/nginx/conf/nginx.conf
#修改配置,其它的默认
#在80端口下添加fastdfs-nginx模块
location ~/group([0-9])/M00 {
ngx_fastdfs_module;
}
nginx的完整配置:
user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 192.168.11.66;
# location /group1/M00{
# alias /fastdfs/storage/data/;
# autoindex on;
#}
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
启动nginx
systemctl start nginx.service
在地址栏访问。
注意:
和之前直接使用nginx路由访问不同的是,这里配置 fastdfs-nginx-module 模块,可以重定向文件链接到源服务器取文件。