Github仓库
Github介绍: https://github.com/happyfish100/fastdfs
Github文档: https://github.com/happyfish100/fastdfs/wiki
FastDFS介绍
FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS 架构包括 Tracker server 和 Storage server。客户端请求 Tracker server 进行文 件上传、下载,通过 Tracker server 调度最终由 Storage server 完成文件上传和下载。
Tracker server 作用是负载均衡和调度,通过 Tracker server 在文件上传时可以根据一些 策略找到 Storage server 提供文件上传服务。可以将 tracker 称为追踪服务器或调度服务 器。
Storage server 作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上, Storageserver 没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将 storage 称为存储服务器。
服务端两个角色:
- Tracker:管理集群,tracker 也可以实现集群。每个 tracker 节点地位平等。收集 Storage 集群的状态。
- Storage:实际保存文件 Storage 分为多个组,每个组之间保存的文件是不同的。每 个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有 主从的概念。
文件上传流程
客户端上传文件后存储服务器将文件 ID 返回给客户端,此文件 ID 用于以后访问该文 件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
group1/M00/00/00/wKgrgF1Rp8uAeU2IAA-itrfn0m4.tar.gz
group1
组名:文件上传后所在的 storage 组名称,在文件上传成功后有 storage 服务器返回, 需要客户端自行保存。 虚拟磁盘路径:storage 配置的虚拟路径,与磁盘选项 store_path*对应。如果配置了/M00
: store_path0 则是 M00,如果配置了 store_path1 则是 M01,以此类推。/00/00
:数据两级目录:storage 服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据 文件。/wKgrgF1Rp8uAeU2IAA-itrfn0m4.tar.gz
文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储 服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
文件下载流程
FastDFS安装
使用的系统软件
名称 | 说明 |
---|---|
centos | 7.x |
libfatscommon | FastDFS分离出的一些公用函数包 |
FastDFS | FastDFS本体 |
fastdfs-nginx-module | FastDFS和nginx的关联模块 |
nginx | nginx1.15.4 |
编译环境
yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y
磁盘目录
说明 | 位置 |
---|---|
所有安装包 | /usr/local/src |
数据存储位置 | /home/dfs/ |
#这里我为了方便把日志什么的都放到了dfs |
#创建数据存储目录 [root@server01 ~]# mkdir -p /home/dfs #切换到安装目录准备下载安装包 [root@server01 ~]# cd /usr/local/src
组件下载与安装
下面的步骤安装切换到安装目录下cd /usr/local/src
进行开始。
安装libfatscommon
git clone https://github.com/happyfish100/libfastcommon.git --depth 1 cd libfastcommon/ ./make.sh && ./make.sh install #编译安装
安装FastDFS
cd ../ #返回上一级目录 git clone https://github.com/happyfish100/fastdfs.git --depth 1 cd fastdfs/ ./make.sh && ./make.sh install #编译安装 #配置文件准备 cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf #客户端文件,测试用 cp /usr/local/src/fastdfs/conf/http.conf /etc/fdfs/ #供nginx访问使用 cp /usr/local/src/fastdfs/conf/mime.types /etc/fdfs/ #供nginx访问使用
安装fastdfs-nginx-module
cd ../ #返回上一级目录 git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1 cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
安装nginx
wget http://nginx.org/download/nginx-1.15.4.tar.gz #下载nginx压缩包 tar -zxvf nginx-1.15.4.tar.gz #解压 cd nginx-1.15.4/ #添加fastdfs-nginx-module模块 ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src/ make && make install #编译安装
单机部署
部署拓扑图
按照上面的命令就可用安装好相应的各个组件,那么下面来进行单机部署的配置。
关闭防火墙
service firewalld stop
tracker服务
tracker配置
#服务器ip为 192.168.43.128 vim /etc/fdfs/tracker.conf #需要修改的内容如下 port=22122 # tracker服务器端口(默认22122,一般不修改) base_path=/home/dfs # 存储日志和数据的根目录
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 #自启动tracker服务
启动tracker服务
[root@server01 src]# /etc/init.d/fdfs_trackerd start Reloading systemd: [ OK ] Starting fdfs_trackerd (via systemctl): [ OK ] [root@server01 src]#
storage服务
storage配置
vim /etc/fdfs/storage.conf #需要修改的内容如下 port=23000 # storage服务端口(默认23000,一般不修改) base_path=/home/dfs # 数据和日志文件存储根目录 store_path0=/home/dfs # 第一个存储目录 tracker_server=192.168.43.128:22122 # tracker服务器IP和端口 http.server_port=8888 # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)
启动storage服务相关命令
/etc/init.d/fdfs_storaged start #启动storage服务 /etc/init.d/fdfs_storaged restart #重动storage服务 /etc/init.d/fdfs_storaged stop #停止动storage服务 chkconfig fdfs_storaged on #自启动storage服务
启动storage服务
[root@server01 src]# /etc/init.d/fdfs_storaged start Starting fdfs_storaged (via systemctl): [ OK ] [root@server01 src]#
client测试上传文件
vim /etc/fdfs/client.conf #需要修改的内容如下 base_path=/home/dfs tracker_server=192.168.43.128:22122 #tracker服务器IP和端口 #保存后测试,返回ID表示成功 如:group1/M00/00/00/xx.tar.gz fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz
执行如下:
nginx服务
配置nginx访问
vim /etc/fdfs/mod_fastdfs.conf #需要修改的内容如下 tracker_server=192.168.43.128:22122 #tracker服务器IP和端口 url_have_group_name=true store_path0=/home/dfs #配置nginx.config vim /usr/local/nginx/conf/nginx.conf #添加如下配置 server { listen 8888; ## 该端口为storage.conf中的http.server_port相同 server_name localhost; location ~/group[0-9]/ { ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } # 启动nginx服务 /usr/local/nginx/sbin/nginx #启动nginx /usr/local/nginx/sbin/nginx -s reload #重启nginx #测试下载 wget http://192.168.43.128:8888/group1/M00/00/00/wKgrgF1Rp8uAeU2IAA-itrfn0m4.tar.gz
启动nginx服务以及测试下载文件
[root@server01 src]# /usr/local/nginx/sbin/nginx ngx_http_fastdfs_set pid=4818 [root@server01 src]# wget http://192.168.43.128:8888/group1/M00/00/00/wKgrgF1Rp8uAeU2IAA-itrfn0m4.tar.gz --2019-08-12 14:03:36-- http://192.168.43.128:8888/group1/M00/00/00/wKgrgF1Rp8uAeU2IAA-itrfn0m4.tar.gz Connecting to 192.168.43.128:8888... connected. HTTP request sent, awaiting response... 200 OK Length: 1024694 (1001K) [application/octet-stream] Saving to: ‘wKgrgF1Rp8uAeU2IAA-itrfn0m4.tar.gz’ 100%[=================================================================================================================================>] 1,024,694 --.-K/s in 0.02s 2019-08-12 14:03:36 (40.9 MB/s) - ‘wKgrgF1Rp8uAeU2IAA-itrfn0m4.tar.gz’ saved [1024694/1024694] [root@server01 src]# [root@server01 src]# ls fastdfs fastdfs-nginx-module libfastcommon nginx-1.15.4 nginx-1.15.4.tar.gz wKgrgF1Rp8uAeU2IAA-itrfn0m4.tar.gz [root@server01 src]#
可用看到已经下载成功,FastDFS的单机部署已完成。
分布式部署
分布式部署拓扑
分别在两台服务器都安装上Tacker以及Storage服务,在第一台服务安装Nginx进行下载服务的反向代理。 按照前面的步骤对两台服务器进行安装,安装完毕之后,下面来进行分布式配置。
tracker配置
配置每台服务器的tracker配置,都按照以下配置进行。
#服务器ip为 192.168.196.132,192.168.196.133 vim /etc/fdfs/tracker.conf #需要修改的内容如下 port=22122 # tracker服务器端口(默认22122,一般不修改) base_path=/home/dfs # 存储日志和数据的根目录 # 启动服务 /etc/init.d/fdfs_trackerd start
storage配置
配置每台服务器的storage配置,都按照以下配置进行。
vim /etc/fdfs/storage.conf #需要修改的内容如下 port=23000 # storage服务端口(默认23000,一般不修改) base_path=/home/dfs # 数据和日志文件存储根目录 store_path0=/home/dfs # 第一个存储目录 tracker_server=192.168.196.132:22122 # 服务器1 tracker_server=192.168.196.133:22122 # 服务器2 http.server_port=8888 # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致) # 启动服务 /etc/init.d/fdfs_storaged start
client测试上传文件
两台服务器都配置一个client进行测试。
vim /etc/fdfs/client.conf #需要修改的内容如下 base_path=/home/dfs tracker_server=192.168.196.132:22122 # 服务器1 tracker_server=192.168.196.133:22122 # 服务器2 #保存后测试,返回ID表示成功 fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz
执行上传文件的返回结果:
[root@centos7-server02 nginx-1.15.4]# fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz group1/M00/00/00/wKjEhF1SQHKAEN6aAA-itrfn0m4.tar.gz [root@centos7-server02 nginx-1.15.4]#
[root@server03 src]# fdfs_upload_file /etc/fdfs/client.conf 1.txt group1/M00/00/00/wKjEhV1SQLCAbAWtAAAABFqC_Qg891.txt [root@server03 src]#
配置nginx访问
在其中一台配置nginx即可,如果要做负载均衡,可用两台都配置nginx,然后F5或者haproxy负载均衡。
vim /etc/fdfs/mod_fastdfs.conf #需要修改的内容如下 tracker_server=192.168.196.132:22122 # 服务器1 tracker_server=192.168.196.133:22122 # 服务器2 url_have_group_name=true store_path0=/home/dfs #配置nginx.config vim /usr/local/nginx/conf/nginx.conf #在上方添加如下配置 server { listen 8888; ## 该端口为storage.conf中的http.server_port相同 server_name localhost; location ~/group[0-9]/ { ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } # 启动nginx服务 /usr/local/nginx/sbin/nginx #启动nginx /usr/local/nginx/sbin/nginx -s reload #重启nginx
测试通过nginx下载文件
wget http://192.168.196.132:8888/group1/M00/00/00/wKjEhF1SQHKAEN6aAA-itrfn0m4.tar.gz wget http://192.168.196.132:8888/group1/M00/00/00/wKjEhV1SQLCAbAWtAAAABFqC_Qg891.txt
这是刚才测试上传的两个文件,通过nginx的8888端口 + File ID进行下载,下载成功则安装完成。
检测集群
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf # 会显示会有几台服务器 有2台就会 显示 Storage 1-Storage 2的详细信息
相关说明
配置文件
tracker_server #有几台服务器写几个 group_name #地址的名称的命名 bind_addr #服务器ip绑定 store_path_count #store_path(数字)有几个写几个 store_path(数字) #设置几个储存地址写几个 从0开始
可能遇到的问题
如果不是root 用户 你必须在除了cd的命令之外 全部加sudo 如果不是root 用户 编译和安装分开进行 先编译再安装 如果上传成功 但是nginx报错404 先检查mod_fastdfs.conf文件中的store_path0是否一致 如果nginx无法访问 先检查防火墙 和 mod_fastdfs.conf文件tracker_server是否一致 如果不是在/usr/local/src文件夹下安装 可能会编译出错