FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。它只能通过 专有API对文件进行存取访问,不支持POSIX接口方式,不能mount使用。准确地讲,Google FS以及FastDFS、mogileFS、 HDFS、TFS等类Google FS都不是系统级的分布式文件系统,而是应用级的分布式文件存储服务。
FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。
1.2 FastDFS架构FastDFS架构包括 Tracker server和Storage server。客户端请求Tracker server进行文件上传、下载,通过Trackerserver调度最终由Storage server完成文件上传和下载。
FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。
Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。通过Trackerserver在文件上传时可以根据一些策略找到Storageserver提供文件上传服务。
Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。Storage server没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。
Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。
(1) 安装FastDFS之前必须先安装libfastcommon依赖。
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
tar -zxvf V1.0.7.tar.gz
cd libfastcommon-1.0.7
./make.sh
./make.sh install
(2) 建立软链接
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
2.2 下载安装FastDFS。
(1) fastdfs 下载链接: https://github.com/happyfish100/fastdfs/releases, 我下载的是最新版6.06。解压之后进入目录。
./make.sh
./make.sh install
2.3 配置FastDFS 中 Tracker。
(1) 先将配置文件复制到/etc/fdfs目录。
sudo cp /home/rookie/fastdfs-6.06/conf/* /etc/fdfs
(2)配置Tracker服务器.
cd /etc/fdfs
sudo gedit tracker.conf
----------------------------
# Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建)
base_path=/home/rookie/fastdfs-6.06/fdfs_tracker
# 建议修改 防止冲突, 配置之后,记住不能和Storage的端口冲突。
http.server_port = 8888
-------------------------------------
# 保存之后创建文件夹
mkdir -p /home/rookie/fastdfs-6.06/fdfs_tracker
--------------------------------------------------------------
# 控制tracker的几个命令
fdfs_trackerd /etc/fdfs/tracker.conf start # 开启
fdfs_trackerd /etc/fdfs/tracker.conf stop # 关闭
fdfs_trackerd /etc/fdfs/tracker.conf restart # 重启
netstat -unltp|grep fdfs # 开启之后开启监听
(3) 配置好之后开启在base_path 会自动创建data、logs 两个目录, 查看监听。有信息则说明tracker开启成功
rookie@rookie-B360M-GAMING-HD:/etc/fdfs$ netstat -unltp|grep fdfs
(并非所有进程都能被检测到,所有非本用户的进程信息将不会显示,如果想看到所有信息,则必须切换到 root 用户)
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 9547/fdfs_trackerd
2.4 配置FastDFS 中 Storage。
(1)配置Tracker服务器.
cd /etc/fdfs/
sudo gedit storage.conf
--------------------------------------
# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)
base_path=/home/rookie/fastdfs-6.06/fdfs_storage
#文件保存地质 我只配置了一台服务器, 如果不止配置一个,则按照配置文件往下加, 我这里和base_path放在一起。
store_path0=/home/rookie/fastdfs-6.06/fdfs_storage
# tracker_server 会主动连接 tracker_server
tracker_server=192.168.101.95:22122
# 建议修改 防止冲突, 别于tracker冲突。
http.server_port=8889
----------------------------------------------
# 对应base_path和store_path, 如果路径不一致,则还需创建文件夹。
mkdir -p /home/rookie/fastdfs-6.06/fdfs_storage
--------------------------------------------
# 操作storage的命令
fdfs_storaged /etc/fdfs/storage.conf start # 开启
fdfs_storaged /etc/fdfs/storage.conf stop # 关闭
fdfs_storaged /etc/fdfs/storage.conf restart # 重启
netstat -unltp|grep fdfs # 开启之后开启监听
(2) 启动Storage前确保Tracker是启动的。初次启动成功,会在base_path目录下创建 data、 logs 两个目录。开启监听若有信息则开启成功。
rookie@rookie-B360M-GAMING-HD:/etc/fdfs$ netstat -unltp|grep fdfs
(并非所有进程都能被检测到,所有非本用户的进程信息将不会显示,如果想看到所有信息,则必须切换到 root 用户)
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 9547/fdfs_trackerd
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 3716/fdfs_storaged
2.5 上传测试
(1)修改client配置。
cd /etc/fdfs
sudo gedit client.conf
---------------------
# Client 的数据和日志目录
base_path = /home/rookie/fastdfs-6.06/fdfs_client
# Tracker服务器
tracker_server = 192.168.101.95:22122
----------------------------------------------------
# 创建base_path(创建了运行也没有日志,奇怪, 但是不创建就会报错。)
mkdir -p /home/rookie/fastdfs-6.06/fdfs_client
-----------------------------------------------------------
fdfs_test /etc/fdfs/client.conf upload /etc/fdfs/*.jpg 上传图片
(2)上传测试, 若出现, 则证明成功了。
rookie@rookie-B360M-GAMING-HD:/etc/fdfs$ fdfs_test /etc/fdfs/client.conf upload /etc/fdfs/*.jpg
This is FastDFS client test program v6.06
Copyright (C) 2008, Happy Fish / YuQing
FastDFS may be copied only under the terms of the GNU General
Public License V3, which may be found in the FastDFS source kit.
Please visit the FastDFS Home Page http://www.fastken.com/
for more detail.
[2020-02-19 15:29:34] DEBUG - base_path=/home/rookie/fastdfs-6.06/fdfs_client, connect_timeout=5, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0
tracker_query_storage_store_list_without_group:
server 1. group_name=, ip_addr=192.168.101.95, port=23000
group_name=group1, ip_addr=192.168.101.95, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKhlX15M496AKS82AABdreSfEnY252.jpg
source ip address: 192.168.101.95
file timestamp=2020-02-19 15:29:34
file size=23981
file crc32=3835630198
example file url: http://192.168.101.95:8888/group1/M00/00/00/wKhlX15M496AKS82AABdreSfEnY252.jpg
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/wKhlX15M496AKS82AABdreSfEnY252_big.jpg
source ip address: 192.168.101.95
file timestamp=2020-02-19 15:29:34
file size=23981
file crc32=3835630198
example file url: http://192.168.101.95:8888/group1/M00/00/00/wKhlX15M496AKS82AABdreSfEnY252_big.jpg
----------------------------------------------------------------------
# http://192.168.101.95:8888/group1/M00/00/00/wKhlX15M496AKS82AABdreSfEnY252_big.jpg
(组名)(磁盘)(目录) (文件名)
#可以在/home/rookie/fastdfs-6.06/fdfs_storage/data 找到储存的文件。
3、安装配置Nginx ,http访问文件。
现在fastDFS服务器已经成功搭建了,但是还无法下载。FastDFS 高版本之后(之前看哪篇博客好像是4.05版本,忘记了)已经移除http服务器。必须使用nginx解决http下载文件。
3.1安装配置fastdfs-nginx-module模块
FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。假如Tracker 服务器将文件上传到192.168.0.3,上传成功后文件ID已经返回给客户端。此时FastDFS存储集群机制会将这个文件同步到同组存储 192.168.0.4,在文件还没有复制完成的情况下,客户端如果用这个文件ID192.168.0.4上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
注: 看这里的作用,如果只有一台服务器的话,如果不配置fastdfs-nginx-module模块,不也可以运行么? 但是我试过了不行,感觉作用不止这么点,CSDN就是相互复制粘贴结果重要信息丢失,结果每次看别人博客都需要踩坑,真TM扯淡。可能有人看到这篇博客,踩到坑的话求轻喷,毕竟我也只是彩笔中的一员。。。
(1)fastdfs-nginx-module模块下载链接: https://github.com/happyfish100/fastdfs-nginx-module/releases
之前不知道在哪里下载了个魔鬼版本,一直编译不过去。去github下载就好了,我下载的是1.22版本, 解压之后进入,需要修改下配置。
cd fastdfs-nginx-module-1.22/src
gedit config
--------------------------------
# 修改这两行, 可以去/usr/include/看下是否有这两个文件夹。
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
---------------------------------
3.2 编译安装nginx。
(1)下载安装
apt-get install build-essential
apt-get install libtool
apt-get install libpcre3 libpcre3-dev
apt-get install zlib1g-dev
apt-get install openssl
wget http://nginx.org/download/nginx-1.11.7.tar.gz
tar -zxvf nginx1.11.7
cd nginx1.11.7
./configure --prefix=/usr/local/nginx --add-module=/home/rookie/fastdfs-nginx-module-1.22/src
(2)这里还有一个坑, 需要先修改之后才能进行编译安装。
sudo gedit /home/rookie/nginx-1.11.7/objs/Makefile
----------------------------------------------
把-Werror 选项去掉,如果不去掉他会编译停止。
----------------------------------------------
-Werror,它要求GCC将所有的警告当成错误进行处理
(3)编译安装
sudo make && make install
(4) 如果之前已经安装了nginx, 可以重新编译安装。
cd nginx1.11.7
# ./configure 加上你之前还需要增加的模块
./configure --prefix=/usr/local/nginx --add-module=/home/rookie/fastdfs-nginx-module-1.22/src ....
# 再向上面修改Makefile
# 然后make, 记住不要make install
# 编译之后在./obj/ 中得到nginx,先备份再代替/usr/local/nginx/sbin/
sudo mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
sudo cp ./obj/nginx /usr/local/nginx/sbin/
(5) nginx 命令
sudo /usr/local/nginx/sbin/nginx # 启动
sudo /usr/local/nginx/sbin/nginx -s reload # 重启
sudo /usr/local/nginx/sbin/nginx -s stop # 关闭
(6) 修改配置文件, 注意listen 必须与storage的端口相对应。
cd /usr/local/nginx/conf
sudo gedit nginx.conf
----------------------------------
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 8889 ;
server_name 192.168.101.95;
location ~/group1/M00 {
root /home/rookie/fastdfs-6.06/fdfs_storage/data;
ngx_fastdfs_module;
}
}
}
------------------------------------------
# 主要还是这里,如果配置过,可以补充这些。
server {
listen 8889 ;
server_name 192.168.101.95;
location ~/group1/M00 {
root /home/rookie/fastdfs-6.06/fdfs_storage/data;
ngx_fastdfs_module;
}
}
(7) 重启nginx之后即可下载图片了, 浏览器打开。
http://192.168.101.95:8888/group1/M00/00/00/wKhlX15M496AKS82AABdreSfEnY252_big.jpg
4、python调用
pip install py3Fdfs
from fdfs_client.client import *
client_conf_obj = get_tracker_conf('/etc/fdfs/client.conf')
client = Fdfs_client(client_conf_obj)
ret = client.upload_by_filename('lib.py')
print(ret)
作者:weixin_41869700