生怕错过任何小细节导致大家安装过程出现问题,故文章扣的比较细,上的图也比较多自然文章也会比较长看的会相对累一些,但是敢保证这是目前网上最详细的教程,希望跟着操作后的你能有所收获。
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS构成:
(1)Tracker Server:跟踪服务器。主要起到负载均衡和调度作用。在客户端上传文件时通过策略找到storage server提供上传服务。每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
(2)Storage Server:存储服务器。主要提供容量和备份服务。以 group 为单位,每个 group 内可以有多个 storage server,数据互为备份。
(3)Client:客户端。通过接口,使用 TCP/IP 协议与跟踪器服务器或存储节点进行数据交互。
存储节点(服务器)为了支持大容量采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS提供了基本文件访问接口,如:upload、download、append、delete等。Storage Server会定期的向 Tracker Server发送自己的存储信息。当Tracker集群中的 Tracker Server不止一个时,各个Tracker之间的关系是对等的,所以客户端上传时可以选择任意一个Tracker。当 Tracker 收到客户端上传文件连接请求时,会为该文件分配一个可以存储文件的group,接着给客户端分配group中的具体的 storage server 并返回 storage 相关信息(ip与端口) 给客户端。接着客户端向 storage 发送写文件请求后 storage 将会为文件分配一个数据存储目录,然后为文件分配一个file_id并写入磁盘之后返回给客户端。
文件同步只能在同组内的storage之间进行,采用push方式, 即源服务器同步到目标服务器。在storage server 写完文件后同时刷入binlog,binlog里不包含文件数据,只包含文件名等元信息,并由后台线程将binlog 文件同步至同group内其他的storage server。同时storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步。进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。storage的同步进度会作为元数据的一部分汇报到tracker,tracke在选择读storage 的时候会以同步进度作为参考。
客户端上传文件成功后,会拿到一个storage生成的file_id,客户端根据这个file_id即可访问到该文件。跟上传一样,在下载文件时客户端可以选择任意 tracker server。客户端发送下载连接请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group,大小和创建时间等信息,然后为该请求选择一个storage用来服务读请求。
yum -y install gcc gcc-c++ perl zlib-devel
yum -y install unzip
(1)下载存储路径选择如下:
名称 | 路径 |
---|---|
源码包下载(上传)目录 | /usr/local/src |
数据存储目录 | /home/fastdfs/ |
(2)安装涉及组件如下:
# FastDFS下载
wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
# Nginx fastdfs插件包下载
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
# FastDFS依赖源码下载
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
# Nginx包下载
wget -c https://nginx.org/download/nginx-1.12.1.tar.gz
# 1.进入usr/local/src目录
cd /usr/local/src
# 2.解压
tar -zxvf libfastcommon-1.0.7.tar.gz
# 3.进入解压后目录
cd libfastcommon-1.0.7
# 4.编译
./make.sh
# 5.安装
./make.sh install
# libfastcommon.so 默认安装目录为 /usr/lib64/libfastcommon.so,由于后续FastDFS主程序设置的lib目录是/usr/local/lib,所以这里需要创建软链接
ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
# 1.进入usr/local/src目录
cd /usr/local/src
# 2.解压
tar -zxvf fastdfs-5.05.tar.gz
# 3.进入解压后目录
cd fastdfs-5.05
# 4.编译
./make.sh
# 5.安装
./make.sh install
操作过程依次如下图所示:
# fastdfs服务脚本,配置文件所在路径
etc/
├── init.d/ # 服务脚本所在路径
│ ├── fdfs_storaged
│ └── fdfs_tracker
│
└── fdfs/ # 配置文件(样例模板)所在路径
├── client.conf.sample
├── storage.conf.sample
└── tracker.conf.sample
# fastdfs 命令工具所在路径
usr/
└── bin/
├── fdfs_appender_test
├── fdfs_appender_test1
├── fdfs_append_file
├── fdfs_crc32
├── fdfs_delete_file
├── fdfs_download_file
├── fdfs_monitor
├── fdfs_storaged
├── fdfs_test
├── fdfs_test1
├── fdfs_trackerd
├── fdfs_upload_appender
├── fdfs_upload_file
├── stop.sh
└── restart.sh
# FastDFS 服务脚本 bin 目录是 /usr/local/bin, 但实际命令安装在 /usr/bin/ 下。我们需要建立 /usr/bin 到 /usr/local/bin 的软链接
ln -s /usr/bin/fdfs_trackerd /usr/local/bin
ln -s /usr/bin/fdfs_storaged /usr/local/bin
ln -s /usr/bin/stop.sh /usr/local/bin
ln -s /usr/bin/restart.sh /usr/local/bin
# 1.进入 fastdfs 的服务脚本目录
cd /etc/fdfs
# 2.复制 fastdfs 跟踪器样例配置文件 tracker.conf.sample,并重命名为 tracker.conf
cp tracker.conf.sample tracker.conf
# 3.编辑配置 tracker.conf
vi tracker.conf
# 4.修改以下两个配置(1) tracker存储数据和日志根路径(配置后需要提前创建好);(2)http端口(需要和nginx配置相同)。其它保持默认,保存退出
base_path=/home/fastdfs/tracker
http.server_port=80
# 5.创建tracker存储数据和日志目录(base_path对应的目录)
mkdir -p /home/fastdfs/tracker
附:tracker.conf配置文件解析(红色为上文修改过的配置项)
# 配置文件是否不生效,false 为生效
disabled=false
# 提供服务的端口
port=22122
# Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建)
base_path=/home/fastdfs/tracker
# HTTP 服务端口
http.server_port=80
# 1.启动 tracker(初次启动会在 base_path 路径下自动创建data、logs目录)
/etc/init.d/fdfs_trackerd start
# 2.查看 tracker 是否启动成功,22122端口正在被监听,则Tracker服务安装成功
netstat -unltp|grep fdfs
# 3.查看 base_path 目录结构确认已经创建data,logs目录
ls /home/fastdfs/tracker/
这里简单的认识下base_path目录下data,logs结构:
base_path/
├── data/ # tracker数据存储目录
│ ├── fdfs_trackerd.pid # 记录程序运行的pid
│ ├── storage_changelog.dat # 记录更新的stroage情况
│ ├── storage_groups.dat # 存储分组信息
│ └── storage_servers.dat # 存储服务器(storage)列表
│
└── logs/ # 配置文件(样例模板)所在路径
└── trackerd.log # 日志文件,记录启动停止等信息
附:tracker服务常用命令
# 启动tracker服务
/etc/init.d/fdfs_trackerd start
# 重启动tracker服务
/etc/init.d/fdfs_trackerd restart
# 停止tracker服务
/etc/init.d/fdfs_trackerd stop
# 自启动tracker服务
chkconfig fdfs_trackerd on
# 1.进入 fastdfs 的服务脚本目录
cd /etc/fdfs
# 2.复制 fastdfs 存储器样例配置文件 storage.conf.sample,并重命名为 storage.conf
cp storage.conf.sample storage.conf
# 3.编辑配置 storage.conf
vi storage.conf
# 4.修改以下配置(包括注释掉配置)tracker_server配置为你安装的tracker服务所在ip。其它保持默认,保存退出
base_path=/home/fastdfs/storage
#store_path0=/home/yuqing/fastdfs
tracker_server=192.168.36.100:22122
http.server_port=80
# 5.创建storage存储数据和日志目录(base_path对应的目录)
mkdir -p /home/fastdfs/storage
附:storage.conf 配置文件解析(红色为上文修改过的配置项)
# 配置文件是否不生效,false 为生效
disabled=false
# 指定此 storage server 所在 组(卷)
group_name=group1
# storage server 服务端口
port=23000
# 心跳间隔时间,单位为秒 (这里是指主动向 tracker server 发送心跳)
heart_beat_interval=30
# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)
base_path=/home/fastdfs/storage
# 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。
store_path_count=1
# 逐一配置 store_path_count 个路径,索引号基于 0。
# 如果不配置 store_path0,那它就和 base_path 对应的路径一样,此处直接注释掉。
#store_path0=/home/yuqing/fastdfs
# FastDFS 存储文件时,采用了两级目录。这里配置存放文件的目录个数。
# 如果本参数只为 N(如: 256),那么 storage server 在初次运行时,会在 store_path 下自动创建 N * N 个存放文件的子目录。
subdir_count_per_path=256
# tracker_server 的列表 ,会主动连接 tracker_server
# 有多个 tracker server 时,每个 tracker server 写一行
tracker_server=192.168.36.100:22122
# 允许系统同步的时间段 (默认是全天) 。一般用于避免高峰同步产生一些问题而设定。
sync_start_time=00:00
sync_end_time=23:59
# 访问端口
http.server_port=80
# 1.启动 storage(初次启动会在 base_path 路径下自动创建data、logs目录)
/etc/init.d/fdfs_storaged start
# 2.查看 storage是否启动成功,23000端口正在被监听,则storage服务安装成功
netstat -unltp|grep fdfs
# 3.查看 storage 是否和 tracker在通信
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
操作过程依次如下图所示:
同样Storage 启动成功后,在base_path 下创建了data、logs目录,且在 store_path0 目录下创建了N*N个子目录用来存放文件,由于配置文件store_path0 上文注释了,所以其路径默认为 base_path 路径。如下图所示:
附:storage服务常用命令
# 启动storage服务
/etc/init.d//etc/init.d/fdfs_storaged start
# 重启动storage服务
/etc/init.d//etc/init.d/fdfs_storaged restart
# 停止storage服务
/etc/init.d//etc/init.d/fdfs_storaged stop
# 自启动storage服务
chkconfig fdfs_storaged on
# 1.进入 fastdfs 的服务脚本目录
cd /etc/fdfs
# 2.复制 client 样例配置文件 client.conf.sample,并重命名为 client.conf
cp client.conf.sample client.conf
# 3.编辑配置 client.conf
vi client.conf
# 4.修改以下配置(包括注释掉配置)tracker_server配置为你安装的tracker服务所在ip。其它保持默认,保存退出
base_path=/home/fastdfs/client
tracker_server=192.168.36.100:22122
# 5.创建client存储数据和日志目录(base_path对应的目录)
mkdir -p /home/fastdfs/client
# 1.在当前操作目录下准备一张图片(我这里是在 /usr/local/src/images/ 路径下)执行以下命令上传,上传成功后返回文件id。文件id由 group+存储目录+两级子目录+文件名+文件后缀名构成
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf xxx.jpeg
# 1.进入usr/local/src目录
cd /usr/local/src
# 2.解压
tar -zxvf nginx-1.12.1.tar.gz
# 3.进入解压后目录
cd nginx-1.12.1
# 4.使用默认配置
./configure
# 5.编译
make
# 6.安装
make install
# 1.进入安装目录
cd /usr/local/nginx/sbin/
# 2.启动 nginx
./nginx
# 3.查看nginx版本信息(确认是否启动成功)
/usr/local/nginx/sbin/nginx -V
# 停止nginx服务(快速关闭,不管有没有正在处理的请求)
/usr/local/nginx/sbin/nginx -s stop
# 退出nginx服务(在退出前完成已经接受的连接请求)
/usr/local/nginx/sbin/nginx -s quit
# 重启nginx服务
/usr/local/nginx/sbin/nginx -s reload
# 查看日志
tail -200f /usr/local/nginx/logs/error.log
# 1.修改nginx.conf配置
vi /usr/local/nginx/conf/nginx.conf
添加以下配置:
location /group1/M00 {
alias /home/fastdfs/storage/data;
}
# 2.重启nginx
/usr/local/nginx/sbin/nginx -s reload
# 3.浏览器访问文件之前上传的文件.如果加载不出来可能是防火墙原因,需要关闭防火墙:systemctl stop firewalld.service
http://192.168.36.100/group1/M00/00/00/wKgkZGDKDv6AJpmKAAClHSIxoaA50.jpeg
fastdfs 通过 tracker 服务器上传文件是存储在存储服务storage 中。而在集群环境下,势必会有多个存储服务storage存在,由于同组存储服务器之间需要进行文件复制, 有同步延迟的问题。假设目前有192.138.36.100与192.168.36.103两台服务器,客户端通过tracker 服务器将文件上传到了192.168.36.100服务器上,上传成功后文件 id返回给客户端。此时由于 fastdfs 存储集群机制,会将这个文件同步到同组存储 192.168.36.103,在文件还没有复制完成的情况下,客户端如果用这个文件 id 在 192.168.36.103 上访问文件就会因为同步延迟问题出现文件无法访问的情况。而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于同步复制延迟导致的文件无法访问的问题。
# 1.进入usr/local/src目录
cd /usr/local/src
# 2.解压
unzip fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip
# 3.重命名(名字太长改短一点)
mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1 fastdfs-nginx-module
# 1.先停止nginx服务
/usr/local/nginx/sbin/nginx -s stop
# 2.进入nginx解压包目录
cd /usr/local/src/nginx-1.12.1
# 3.添加插件
./configure --add-module=/usr/local/src/fastdfs-nginx-module/src
# 4.重新编译和安装
make && make install
# 5.查看Nginx的版本模块(用来确认插件添加是否成功)有如下图表示插件安装成功
/usr/local/nginx/sbin/nginx -V
# 6.进入 fastdfs-nginx-module/src 源码目录
cd /usr/local/src/fastdfs-nginx-module/src
# 7. 复制 fastdfs-nginx-module 源码中的配置文件到 /etc/fdfs 目录
cp mod_fastdfs.conf /etc/fdfs/
# 8. 配置下刚拷贝的 /etc/fdfs/ 目录下的 mod_fastdfs.conf 文件,修改以下配置,其它默认
vi /etc/fdfs/mod_fastdfs.conf
# 连接超时时间
connect_timeout=10
# Tracker Server
tracker_server=192.168.36.100:22122
# 如果文件ID的uri中包含/group**,则要设置为true
url_have_group_name = true
# Storage 配置的store_path0路径,必须和storage.conf中的一致
store_path0= /home/fastdfs/storage
# 9. 进入fastdfs配置文件目录
cd /usr/local/src/fastdfs-5.05/conf/
# 10. 拷贝配置文件到 /etc/fdfs 目录
cp anti-steal.jpg http.conf mime.types /etc/fdfs/
# 11. 修改nginx.conf 配置,在80端口监听下添加fastdfs-nginx 插件配置(修改匹配路径为 /group1/M00/00 ,以及增加配置 ngx_fastdfs_module),其他默认
vi /usr/local/nginx/conf/nginx.conf
# 12. 启动 nginx,出现以下提示则启动成功
/usr/local/nginx/sbin/nginx
# 1. 执行文件上传,成功打印文件id且能在浏览器访问,则表示插件安装成功
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf xxx.jpg
这里搭建两台机器的集群,多台机器无非就是多加而已,所以就以最简单的两台机器进行实践。集群搭建其实非常简单,只需要按照以上步骤新搭建出一整套fastdfs的单击环境然后修改配置就好了,如果你是虚拟机直接深度克隆一套直接完事。如我这里克隆后一共两台分别是:192.168.36.100 , 192.168.36.103。
由上图可知,我们只需要
(1)启动 192.168.36.100 机器上的 tracker,storage,nginx服的3个服务
(2)修改 192.168.36.103 机器上 /etc/fdfs/ 目录下的相关配置,并且启动 storage 服务。而修改的配置只有下图红色选框中的两个文件:
(3)分别修改两个配置文件中的 tracker_server 值为192.168.36.100:22122(由于我是克隆虚拟机,所以103机器上的配置正好是需要修改的值就不用改了,这里根据自己实际情况修改配置)
(1)启动 192.168.36.100 机器上的3个服务(并确认正常启动,可以访问之前上传的图片,不能访问要先关闭防火墙,或开启权限)
# 1. 启动 tracker
/etc/init.d/fdfs_trackerd start
# 2. 启动 storage
/etc/init.d/fdfs_storaged start
# 3. 启动 nginx
/usr/local/nginx/sbin/nginx
(2)启动 192.168.36.103 机器上的 storage 服务
在集群下由于同组的 storage 会自动进行同步复制文件,即我们在 192.168.36.100 机器上上传文件后,此时存储服务通过 tracker 通信同组下的其它存储服务并同步复制到 192.168.36.103 机器上,为了验证我们需要现在192.168.36.100上上传文件并观察是否被同步到 192.168.36.103 机器上,以下做了简单的测试:
(1)查看 192.168.36.103 机器上当前文件(目前只有3个文件)
(2)在 192.168.36.100 机器上上传文件
# 1. 执行文件上传
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf xxx.jpg
(3)在 192.168.36.103 机器上查看当前文件
发现了刚上传的文件信息,为此 storage 同步复制功能测试成功。
集群就是为了提升服务高可用,即storage集群下一台storage宕机了要不影响文件的访问。为此我们这里测试下当 192.168.36.100 机器上的 storage 宕机了此时文件是否还依然可以访问,测试过程如下:
(1)首先服务还正常时我们访问上一环节上传的图片
(2)模拟宕机,这里我把 192.168.36.100 中的 storage 停止了
(3)重新访问文件
发现文件依然可以正常访问,为此测试 storage 集群高可用成功。
tracker集群架构如下图所示:
tracker 集群配置一样非常简单,由上图可知同 storage 集群配置类似,只需要分别修改如下图所示的两个配置文件
(1)分别先停止两台机器上的 tracker 和 storage 服务
# 1. 停止 storage 服务
/etc/init.d/fdfs_storaged stop
# 2. 停止 tracker 服务
/etc/init.d/fdfs_trackerd stop
(2)分别进入 192.168.36.100 与 192.168.36.103 两台机器上 /etc/fdfs/ 目录下的两个配置文件,逐一的在配置文件中并列配置两条 tracker_server 如下:
# 1. 进入 /etc/fdfs/ 目录下, 分别vi 编辑 mod_fastdfs.conf,storage.conf 两个文件,增加如下配置
cd /etc/fdfs/
tracker_server=192.168.36.100:22122
tracker_server=192.168.36.103:22122
(1)分别先启动两台机器上的 tracker 和 storage 服务
# 1. 启动 storage 服务
/etc/init.d/fdfs_storaged start
# 2. 启动 tracker 服务
/etc/init.d/fdfs_trackerd start
# 3. 查看 tracker 服务日志
tail -200f /home/fastdfs/tracker/logs/trackerd.log
通过查看 tracker 日志发现, 当前的 leader(主节点)是192.168.36.100。至此集群启动成功
tracker 集群后优点体现在文件的上传上,因为文件的上传是与 tracker 打交道的,故如集群中的 tracker 有一台宕机了,那么另外一台仍可以支持上传文件,为此通过以下操作来测试 tracker 集群的高可用
(1)准备工作
首先为了测试上传,这里是利用 client 上传所以需要先修改下 client 的配置文件,如同上一环节的配置一样,我这里选择 192.168.36.100 机器,在 /etc/fdfs/ 目录下修改 client.conf 配置文件,一样增加两条 tracker_server 配置。
tracker_server=192.168.36.100:22122
tracker_server=192.168.36.103:22122
(2)模拟宕机,停止 192.168.36.100 机器上的 tracker 服务
# 1. 停止 tracker 服务
/etc/init.d/fdfs_trackerd stop
# 2. 确认当前机器上 tracker 服务已经停止,只剩下 storage 服务
netstat -unltp|grep fdfs
# 3. 查看 192.168.36.103 机器上 tracker 日志,确认其由于100机器上原先为leader的 tracker的停止已经成为当前的leader
tail -200f /home/fastdfs/tracker/logs/trackerd.log
(3)在 192.168.36.100 机器上上传文件
# 1. 执行文件上传
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf xxx.jpg
通过上图发现,日志打印 192.168.36.100 tracker 已经连接不上了,但是文件还是通过集群的另外一个 192.168.36.103 机器上的 tracker 上传成功并且返回文件id
(4)访问刚上传的文件
可以成功访问,至此测试 tracker 集群成功。综上所述在 tracker 集群中,其中一个 tracker 宕机时,文件仍然可以通过另外一个存活的 tracker 成功上传。
为了能更详细的展示给大家关于如何安装fastdfs 到集群安装,文章修修补补陆陆续续用了好几天,尽可能详细的上图,文章也是比较长就怕大家不能耐心看完。希望通过这篇手把手的教程能让你更深刻了解fastdfs,这样这些辛苦就值得了。