FastDFS存储系统
背景
FastDFS 是一个分布式文件存储系统,利用文件服务器集群提供文件上传下载等服务。其分成两部分:Tracker Server和Storage Server
- Tracker Server:负责负载和调度,文件上传/下载的时候,需要先将上传的请求发送给Tracker Server,Tracker与Storage Server联系沟通,确定好文件对应的ID(文件存储的网络地址信息),然后将该文件ID返回给客户端,该文件ID用于日后访问该文件的索引信息。当文件下载的时候,则需要由客户端(程序端)将文件的ID上传到Track Server,Track Server根据文件ID获取文件所在的Storage Server的IP和端口,然后将其返回给客户端。
- Storage Server:负责文件存储,服务端上传的文件都存放在Storage Server中,它是利用操作系统的文件管理来实现
Track Server和Storage Server都可以实现集群,且在各自的集群中每个节点的地位都是相等的,类似于redis中的集群。
文件上传的时候,会返回对应的文件索引信息(文件ID),需要客户端自行保存,如下:
- group1:文件上传后,该文件所在的组(storage server)信息。
- M00:Storage配置的虚拟路径。与磁盘选项store_path*对应。如果配置了store_path0,则为M00,若是store_path1,则为M01
- 02/44:数据两级目录。每个虚拟磁盘路径下都会创建两级目录,用于存储数据文件
- wKgDrE….sh:文件存储在服务器的名称。当文件上传到服务器的时候,Storage Server会根据Hash算法对文件的内容生成对应的Hash值,不同文件对应的Hash值不同(文件指纹),然后再结合Storage存储文件时的一些随机信息,生成文件名进行返回。该文件名中包含的内容:源存储服务器 IP 地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
FastDFS存储系统解决大量文件存储的问题,并且在文件服务器已经满的情况下,可以通过添加Storage Server组的方式快速拓展,而且FastDFS可以对重复的文件只存储一遍(貌似还得安装别的拓展)。
环境搭建
Libfastcommon
下载依赖包,该包是FastDFS的依赖环境,必须安装
1
2FastDFS官网:https://github.com/happyfish100/
wget https://github.com/happyfish100/libfastcommon/archive/master.zip解压并安装
1
2
3
4tar -zxvf master.zip
cd libfastcommon-master
./make.sh
./make.sh install
FastDFS
下载FastDFS包,该包是FastDFS的包
1
wget https://github.com/happyfish100/fastdfs/archive/master.zip
解压并安装
1
2
3
4tar -zxvf master.zip
cd fastdfs-master
./make.sh
./make.sh install
Nginx配置FastDFS
nginx手动编译的时候需要安装依赖环境,此处我们尝试用nginx加载动态模块的方式
1
2
3
4
5这里的安装包跟nginx提供的组件相关,视情况安装,因为我图简单直接apt install nginx
sudo apt-get install openssl libssl-dev
sudo apt-get install libpcre3 libpcre3-dev
sudo apt-get install zlib1g-dev libgd-dev
sudo apt-get install libxml2 libxml2-dev libxslt-dev拉取拓展插件,和自己服务器上对应版本的nginx包
1
2
3
4
5拉取nginx
wget http://nginx.org/download/nginx-1.18.0.tar.gz
拉取fastdfs-nginx-module拓展包
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/master.zip解压并编译
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17unzip nginx-1.18.0.tar.gz
unzip master.zip
查看当前nginx的配置,将configure部分的内容全部复制下来
nginx -V
获取fastdfs-nginx-module解压后的文件夹下src的绝对路径,因为编译动态模块文件的时候需要用到它
此处是/usr/home/shuai/fastdfs-nginx-module/src
编译nginx使用的文件的动态模块,configure的内容在原有配置的内容后,再追加fastdfs-nginx-module模块的路径
cd nginx-1.18.0
./configure ... --add-dynamic-module=/home/shuai/fastdfs-nginx-module/src
make
make module
执行完毕后,进入nginx-1.18.0/objs目录下,找到ngx_http_fastdfs_module.so文件
sudo cp ngx_http_fastdfs_module.so /usr/lib/nginx/modules/修改nginx配置文件,追加内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20修改的是/etc/nginx/nginx.conf
nginx在读取文件的时候是需要权限的,因此可能需要配置有读取图片文件夹内容的用户
此处我使用的是本机的用户
user shuai;
在配置文件顶部导入编译好的模块
load_module /usr/lib/nginx/modules/ngx_http_fastdfs_module.so;
在http配置项增加server配置信息
server {
listen 8888;
server_name localhost;
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}将第二步下载的fastdfs-nginx-module中src文件夹下的mod_fastdfs.conf复制到fdfs配置文件夹中
1
sudo cp /home/shuai/Desktop/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
修改mod_fastdfs.conf配置文件内容
1
2
3
4connect_timeout = 10
tracker_server = 192.168.85.129:22122 # tracker服务器所在的IP和端口
url_have_group_name = true # 配置返回的url中包含组的名称
store_path0 = /home/shuai/fastdfs/storage # storage存放的路径将下载的FastDFS解压包中的http.conf和mine.types复制到fdfs的配置文件夹中
1
2sudo cp ~/Desktop/fastdfs-master/conf/http.conf /etc/fdfs/
sudo cp ~/Desktop/fastdfs-master/conf/mime.types /etc/fdfs/配置完成后,重启nginx服务器
1
sudo nginx -s reload
上传文件,然后通过域名配置进行访问
1
https://127.0.0.1:8888/group1/M00/02/14/asdfhjalskdflaskhjdf.png
配置Tracker服务
创建Tracker日志文件及相关内容的存放目录
1
2这个目录随自己定
sudo makedir -p /home/shuai/fastdfs/tracker创建tracker的配置文件
1
sudo cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
修改tracker.conf配置文件的内容
1
2
3
4
5
6
7
8绑定tracker的IP地址,不设置则会绑定该服务器下所有的IP信息
bind-addr = 192.168.85.129
绑定服务的IP
port = 22122
配置Tracker服务时存放的一些文件的路径
base_path=/home/shuai/fastdfs/tracker启动服务,并查看以下端口运行情况
1
2sudo service fdfs_trackerd start
netstat -lntup | grep 22122
配置Storage服务
创建storage文件存放的目录
1
mkdir -p ~/fastdfs/storage
创建storage的配置文件
1
sudo cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
修改storage.conf配置文件的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15绑定storage的IP地址,不设置则会绑定该服务器下所有的IP信息
要是绑定了,你没法上传文件,那就先注释掉这个试试
bind-addr = 192.168.85.129
绑定服务的IP
port = 23000
配置Storage服务时存放的一些日志零碎文件的路径
base_path=/home/shuai/fastdfs/storage
配置Storage服务存放上传下载的文件路径
store_path0=/home/shuai/fastdfs/storage
配置Tracker服务所在的服务器IP和端口
tracker_server=192.168.85.129:22122运行服务,并查看运行情况
1
2sudo service fdfs_storaged start
netstat -lntup | grep 23000
配置Client
创建Client服务的配置文件
1
sudo cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
修改client.conf的配置内容
1
2
3
4
5tracker服务的路径
base_path=/home/python/fastdfs/tracker
连接tracker服务的服务器IP和端口号
tracker_server=192.168.85.129:22122测试文件上传是否存在问题:前提是fdfs_trackerd和fdfs_storaged服务都已经启动
1
2执行如下命令,只要能返回类似:group1/M00/02/14/asdfhjalskdflaskhjdf.png类似的,就表示服务正常启动了
fdfs_upload_file /etc/fdfs/client.conf 1.png然后将该文件复制到django项目中,用于django与fastdfs进行交互