1.FastDFS介绍
1.1FastDFS构成
image.pngFastDFS由存储服务器(Storage Server)、 跟踪服务器(Tracker Server)和客户端(Client)构成。
-
storage server:storage以组(卷,group或volume)为单位组织,一个group内包含多台storage机器,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。
group内每个storage的存储依赖于本地文件系统,storage可配置多个数据存储目录。storage接受到写文件请求时,会根据配置好的规则,选择其中一个存储目录来存储文件。为了避免单个目录下的文件数太多,在storage第一次启动时,会在每个数据存储目录里创建2级子目录,默认每级256个,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。 -
group :组,也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。
-
tracker server:跟踪服务器,主要做调度工作,起负载均衡的作用。集群中所有存储组和存储服务器的状态信息记录在内存中,所以占用内存很小。
storage在启动后会连接tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表。
由于tracker上的元信息都是由storage汇报的信息生成的,不需要持久化任何数据,所以tracker非常容易扩展,直接增加tracker机器即可。 -
client:作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互,以客户端库的方式提供给用户使用。
1.2 FastDFS特性
- 分组存储,灵活简洁、对等结构,不存在单点
- 文件不分块存储,上传的文件和OS文件系统中的文件一一对应
- 文件ID由FastDFS生成,作为文件访问凭证,FastDFS不需要传统的name server
- 和流行的web server无缝衔接,FastDFS已提供apache和nginx扩展模块
- 中、小文件均可以很好支持,支持海量小文件存储
- 支持多块磁盘,支持单盘数据恢复
- 支持相同内容的文件只保存一份,节约磁盘空间
- 支持在线扩容 支持主从文件
- 存储服务器上可以保存文件属性(meta-data)V2.0网络通信采用libevent,支持大并发访问,整体性能更好
- 下载文件支持多线程方式,支持断点续传
2. Linux下FastDFS的安装
- 安装编译环境
yum install git gcc gcc-c++ make automake vim wget libevent -y
- 安装libfastcommon 基础库
mkdir /usr/local/src/fastdfs
cd /usr/local/src/fastdfs
git clone https://github.com/happyfish100/libfastcommon.git -depth 1
cd libfastcommon/
./make.sh && ./make.sh install
- 安装FastDFS
cd /usr/local/src/fastdfs
wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
tar -zxvf V5.11.tar.gz
cd fastdfs-5.11
./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 /root/fastdfs/fastdfs-5.11/conf/http.conf /etc/fdfs
cp /root/fastdfs/fastdfs-5.11/conf/mime.types /etc/fdfs
vim /etc/fdfs/tracker.conf
#需要修改的内容如下
port=22122
base_path=/home/fastdfs
vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000
base_path=/home/fastdfs # 数据和日志文件存储根目录
store_path0=/home/fastdfs # 第一个存储目录
tracker_server=192.168.32.128:22122 #当前服务器的ip地址
http.server_port=8888 #http访问端口,看情况修改
- 启动tracker和storage服务
mkdir /home/fastdfs -p
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
#查看所有运行的端口
netstat -ntlp #启动正常会显示22122和23000端口
- 测试上传
vim /etc/fdfs/client.conf
#需要修改的内容如下
base_path=/home/fastdfs
#tracker服务器IP和端口
tracker_server=192.168.32.128:22122
#保存后测试,返回ID表示成功 如:group1/M00/00/00/xxx.png temp.png是我预先准备的图片
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/fastdfs/temp.png
group1/M00/00/00/wKjTiF7h5EWASb5aAACGZa9JdFo611.png
- 安装fastdfs-nginx-module模块(为了使用nginx访问fastdfs上传的文件)
cd /usr/local/src/fastdfs
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz
tar -xvf V1.20.tar.gz
cd fastdfs-nginx-module-1.20/src
vim config
修改第5 行 和 15 行 修改成
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
修改完成后保存
cp mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=192.168.32.128:22122
url_have_group_name=true
store_path0=/home/fastdfs
修改完成后保存退出
mkdir -p /var/temp/nginx/client
- 安装nginx
yum -y install pcre-devel openssl openssl-devel
cd /usr/local/src/fastdfs
wget http://nginx.org/download/nginx-1.15.6.tar.gz
tar -zxvf nginx-1.15.6.tar.gz
cd nginx-1.15.6/
# 添加fastdfs-nginx-module模块
./configure --add-module=/usr/local/src/fastdfs/fastdfs-nginx-module-1.20/src
编译安装
make && make install
查看模块是否安装上
/usr/local/nginx/sbin/nginx -V
nginx配置文件添加server
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;
}
}
#修改后保存退出,启动nginx
/usr/local/nginx/sbin/nginx
访问上传的图片
关闭防火墙
systemctl stop firewalld
http://192.168.32.128:8888/group1/M00/00/00/xxx.png
3. FastDFS 功能原理
3.1 文件上传内部原理
image.png-
选择tracker server和group
tracker接收到upload_file的请求时,会为该文件分配一个可以存储该文件的group,使用store_lookup(tracker.conf中的配置)配置group的规则:
- 0、Round robin,所有的group间轮询
- 1、Specified group,指定某一个确定的group
- 2、Load balance,剩余存储空间多的group优先
-
选择storage server
选择group后,tracker在group中选择一个storage给客户端,使用store_server(tracker.conf中的配置)配置storage的规则:
- 0、Round robin,在group内的所有storage间轮询
- 1、First server ordered by ip,按ip排序
- 2、First server ordered by priority,按优先级排序(优先级在storage上配置)
-
选择storage path
客户端向storage发送写请求,storage会为文件分配一个数据存储目录,使用store_path(storage.conf中的配置)配置存储规则:
- 0、Round robin,多个存储目录间轮询
- 2、剩余存储空间最多的优先
-
生成文件名
由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。 -
返回文件id
由group、存储目录、两级子目录、内部文件名、文件后缀名拼接而
成
group1/M00/00/00/xxx.png
3.2 文件下载
image.png- 客户端可以选择任意tracker server。
- 客户端发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后使用download_server 规则为该请求选择一个storage用来服务读请求。如下:
- 0: 轮询方式,可以下载当前文件的任意一个 storage server进行轮询
- 1: 哪个为源storage server 就用哪个
由于group内的文件同步时在后台异步进行的,所以有可能出现在读到时候,文件还没有同步到某些storage server ,为了尽量避免访问到这样的storage,会有相应的文件同步规则。
3.2 文件同步
storage写完文件后,会由后台线程将文件同步至同group内其他的storage。
每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,storage会以时间戳的方式记录向group内其他storage同步的进度。tracke在选择storage的时候会以同步进度作为参考
3.4 文件删除
删除处理流程与文件下载类似
- Client询问Tracker server可以删除指定文件的Storage server,参数为文件ID(包含组名和文件名)。
- Tracker server返回一台可用的Storage server。
- Client直接和该Storage server建立连接,完成文件删除。
3.5 断点续传
通过upload_appender_file接口完成,与普通文件不同的是,appender file不能被合并存储到trunk file。续传流程与文件上传类似,先定位到源storage,完成完整或部分上传,再通过binlog进行同group内server文件同步。
3.6 文件HTTP访问支持
FastDFS的tracker和storage都内置了http协议的支持。tracker在接收到请求时,通过http的redirect机制将请求重定向至文件所在的storage上
4.FastDFS 集群配置
192.168.32.128 | 192.168.32.129 | 92.168.32.130 |
---|---|---|
tracker | tracker | tracker |
storage(group1) | storage(group1) | storage(group2) |
nginx | nginx | nginx |
-
配置tracker集群
为了方便测试集群效果,将选择group的规则(server_lookup)改为轮询(此处只是为了查看集群效果,可按自己需求配置)
vim /etc/fdfs/tracker.conf
store_lookup=0 # 0是轮询,1是指定组,2是剩余存储空间多的group优先
- 配置storage集群
vim /etc/fdfs/storage.conf
tracker_server=192.168.32.128:22122
tracker_server=192.168.32.129:22122
tracker_server=192.168.32.120:22122
group_name=group1 #注意组名 192.168.32.130 配置是 group2
port=23000 #storage 的端口号,同一个组的 storage 端口号必须相同
#配置完成后保存配置,然后重启tracker和storage服务
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
- 查看storage的日志 查看tracker集群信息
cat /usr/local/src/fastdfs/logs/storaged.log
如果报错可以先关闭防火墙
systemctl stop firewalld
- 查看存储集群信息
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
- 更改client配置
vim /etc/fdfs/client.conf
tracker_server=192.168.32.128:22122
tracker_server=192.168.32.129:22122
tracker_server=192.168.32.130:22122
-
Nginx 和 FastDFS集群结合
更改mod_fastdfs插件配置
vim /etc/fdfs/mod_fastdfs.conf
tracker_server=192.168.32.128:22122
tracker_server=192.168.32.129:22122
tracker_server=192.168.32.130:22122
group_name=group1 #注意组名 如果是group2 则一定要改
nginx配置参考单机搭建
最后 可以通过nginx访问任意一台服务器
5 FastDFS优化
5.1 最大连接数设置
配置文件:tracker.conf 和 storage.conf
参数名:max_connections
缺省值:256
说明:fastdfs的老版本会分配 max_connections 个buffer,在设置过大的情况下浪费内存。v5.0.4对预分配使用增量方式。tracker一次预分配1024
个,storage一次预分配256个。
使用v5.04及后续版本,可以根据实际需要将 max_connections 设置为一个较大的数值,比如 10240甚至更大。
注意此时需要将一个进程允许打开的最大文件数调大到超过max_connections否则FastDFS server启动会报错。
vi /etc/security/limits.conf 重启系统生效
soft nofile 65535
hard nofile 65535
另外,对于32位系统,请注意使用到的内存不要超过3GB
5.2 工作线程数设置
配置文件:tracker.conf 和 storage.conf
参数名: work_threads
缺省值:4
说明:为了避免CPU上下文切换的开销,以及不必要的资源消耗,不建议将本参数设置得过大。为了发挥出多个CPU的效能,系统中的线程数总和,应等于CPU总数。
对于tracker server,公式为:
work_threads + 1 = CPU数
对于storage,公式为:
work_threads + 1 + (disk_reader_threads + disk_writer_threads) *
store_path_count = CPU数
5.3 storage磁盘读写线程设置
配置文件: storage.conf
参数名:disk_rw_separated:磁盘读写是否分离
参数名:disk_reader_threads:单个磁盘读线程数
参数名:disk_writer_threads:单个磁盘写线程数
如果磁盘读写混合,单个磁盘读写线程数为读线程数和写线程数之和,对于单盘挂载方式,磁盘读写线程分别设置为1即可
如果磁盘做了RAID,那么需要酌情加大读写线程数,这样才能最大程度地发挥磁盘性能
5.4 storage同步延迟相关设置
配置文件: storage.conf
参数名:sync_binlog_buff_interval:将binlog buffer写入磁盘的时间间隔,取值大于0,缺省值为60s
参数名:sync_wait_msec:如果没有需要同步的文件,对binlog进行轮询的时间间隔,取值大于0,缺省值为200ms
参数名:sync_interval:同步完一个文件后,休眠的毫秒数,缺省值为0
为了缩短文件同步时间,可以将上述3个参数适当调小即可
网友评论