fastdfs简介
介绍
FastDFS是一个开源的轻量级分布式文件系统,解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务,如相册网站、视频网站等等
相关概念
FastDFS服务端有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)。
tracker和storage可以是多台服务器。可以随时增加或下线而不会影响线上的服务
trackerserver:
1,跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息。
2,tracker server负责管理所有的storage和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表。
storage server:
1,实际存储数据,分成若干个组(group),实际traker就是管理的storage中的组,而组内则存储数据,group可以隔离不同应用的数据,不同应用的数据放在不同group里面。
client:
1,客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。FastDFS向使用者提供基本文件访问接口,upload、download、append、delete等,以客户端库的方式提供给用户使用
上传下载机制
上传机制
1, 客户端发起请求到Tracker server;
2, Tracker server返回一台可用的storage server,返回服务器的ip地址和端口;
3, 客户端根据返回的IP地址和端口号和storage server建立连接,进行上传文件,存储服务器接收到请求后上传文件,并且将文件内容写入磁盘并返回给客户端file_id、路径信息、文件名等信息。
tracker server
当集群状态下,存在多个sracker server,sracker之间是对等关系,客户端发起请求是可以选择任意一个tracker。当tracker接收到请求时会为该文件选择存储的group
1,Round robin,所有的group间轮询
2,Specified group,指定某一个确定的group
3,Load balance,剩余存储空间多的group优先
storage server
选定group后,tracker server会选择一个storage server返回给客户端
1,Round robin,在group内的所有storage间轮询
2,First server ordered by ip,按ip排序
3,First server ordered by priority,按优先级排序(优先级在storage上配置)
storage path
选择完storage server 后,客户端向服务器发送写请求时,storage会为文件分配一个存储目录
1、Round robin,多个存储目录间轮询
2、剩余存储空间最多的优先
生成Fileid
选定存储目录之后,storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。
下载机制
客户端发起下载请求,带上文件名信息请求Tracker服务获取到存储服务器的ip地址和端口,然后客户端根据返回的IP地址和端口号请求下载文件,存储服务器接收到请求后返回文件给客户端
1, 下载时客户端可以选择任意的tracker server,tracker从请求的文件名信息,解析出文件的group,大小等信息,然后为该请求选择一个storage server。
2, storage集群状态下,可能为该请求分配的storage server,文件还没有同步,为了避免访问到这样的storage,tracker按照规则选择group内可能的storage。
1、该文件上传到的源头storage - 源头storage只要存活着,肯定包含这个文件,源头的地址被编码在文件名中。
2、文件创建时间戳==storage被同步到的时间戳 且(当前时间-文件创建时间戳) > 文件同步最大时间(如5分钟) - 文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了。
3、文件创建时间戳 < storage被同步到的时间戳。 - 同步时间戳之前的文件确定已经同步了
4、(当前时间-文件创建时间戳) > 同步延迟阀值(如一天)。 - 经过同步延迟阈值时间,认为文件肯定已经同步了
安装
1,安装核心库libfastcommon
https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.36
yum install gcc-c++ perl-devel pcre-devel openssl-devel zlib-devel wget
cd/libfastcommon-1.0.36
./make.sh //编译
./make.sh install //安装
2,安装 fastdfs
https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
cd /fastdfs-5.05
./make.sh //编译
./make.sh install //安装
安装完成后文件所在位置
可执行文件命令所在位置/主程序代码所在位置,默认在/usr/bin
配置文件所在位置,默认/etc/fdfs
插件组所在位置,默认/usr/include/fastdfs
3,tracker.conf
cd /etc/fdfs
cp tracker.conf.sample tracker.conf
base_path=/home/yuqing/fastdfs 这个文件夹不存在的话,需要去手动创建
启动tracker
fdfs_trackerd /etc/fdfs/tracker.conf start #启动
fdfs_trackerd /etc/fdfs/tracker.conf stop #关闭
fdfs_trackerd /etc/fdfs/tracker.conf status#查看状态
ps -ef|grep fdfs #查看进程
设置开机启动
vi /etc/rc.local 添加 /etc/init.d/fdfs_trackerd start
4,storage.conf
cd /etc/fdfs
cp storage.conf.sample storage.conf
vi storage.conf
base_path=/home/yuqing/fastdfs #存储storage基础数据,日志
store_path0=/home/yuqing/fastdfs #存上传文件的数据
tracker_server=192.168.114.55.92.94:22122 #配置tracker地址,注册服务
启动storage
fdfs_storaged /etc/fdfs/storage.conf start #启动
fdfs_storaged /etc/fdfs/storage.conf stop #关闭
fdfs_storaged /etc/fdfs/storage.conf status#查看状态
ps -ef|grep fdfs #查看进程
5,client.conf
cd /etc/fdfs
cp client.conf.sample client.conf
vi client.conf
base_path=/home/yuqing/fastdfs #client运行时产生的基础数据
tracker_server=114.55.92.94:22122 # 配置tracker,客户端上传下载都需要先找到tracker
文件操作
cd /usr/bin
上传文件
fdfs_upload_file storage配置文件的绝对路径 要上传的本地文件
./fdfs_upload_file /etc/fdfs/client.conf /file.png
下载文件
./fdfs_download_file 配置文件 需要下载文件的路径 下载后改的名字
./fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/rBBN_WAGSCqAWrr-AACU_2BTWYM755.png /file.png
删除文件
./fdfs_delete_file 配置文件 需要删除的文件路径
./fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/rBBN_WAGSCqAWrr-AACU_2BTWYM755.png
6,安装nginx
http://nginx.org/download/nginx-1.16.1.tar.gz
https://codeload.github.com/YouGetHub/fastdfs-nginx-module/zip/master
让web应用使用http协议直接访问storage服务器里面存储的文件
-
配置nginx组件nginx-module
- cd fastdfs-nginx-module-master/src
- vi config
-
-
安装nginx
-
安装依赖
yum install -y gcc gcc-c++ make automake autoconf libtool pcre pcre-develzlib zlib-devel openssl openssl-devel -
安装
-
./configure --prefix=/usr/local/software/nginx --add-module=/usr/local/software/fastdfs-nginx-module/src
-
make & make install
-
复制文件并修改
-
mod_fastdfs.conf
-
cp /usr/local/software/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
-
指定tracker_server
-
tracker_server=114.55.92.94:22122
-
-
url中是否包含group
-
url_have_group_name = true
-
-
指定存放文件得目录
-
store_path0=/home/yuqing/fastdfs
-
-
-
复制文件
-
cp /usr/local/software/fastdfs/fastdfs-5.11/conf/mime.types /etc/fdfs/
-
cp /usr/local/software/fastdfs/fastdfs-5.11/conf/http.conf /etc/fdfs/
-
-
-
创建软连接
-
在上传文件到fastdfs后,fastdfs会返回ground1/M00/00/00/xxxx.xxx。其中ground1是卷名,url_have_group_name = true配置了包含卷名,其中M00是保存数据时得虚拟目录,需要将这个目录映射到真是数据目录上。
-
ln -s /home/yuqing/fastdfs/data/ /home/yuqing/fastdfs/data/M00
-
-
查看映射路径
-
cd /home/yuqing/fastdfs/data
-
-
-
-
-
nginx配置
-
vi /usr/local/software/nginx/conf/nginx.conf
-
server {
listen 8888; #监听storage http.server_port=8888
server_name zouhaoyu.com;
location ~/group[0-9]/M00 {
ngx_fastdfs_module; #ngx_fastdfs_module去找storage中存储文件
}
}
-
-
-
启动trackerd,storaged,nginx
-
./etc/fdfs/fdfs_trackerd start #trackerd
-
./etc/fdfs/fdfs_storaged start #storaged
-
启动nginx
-
nginx/sbin/nginx #启动
-
nginx/sbin/nginx -s stop # 关闭
-
nginx/sbin/nginx -s reload # 重启
-
ps -ef | grep nginx # 查看状态
-
-
-
上传文件
-
./fdfs_upload_file /etc/fdfs/client.conf /usr/local/software/app/images/1.jpg
group1/M00/00/00/rBBN_WAGm5iAbLf2AAE_AbmiEz0363.jpg -
测试 http://zouhaoyu.com:8888/group1/M00/00/00/rBBN_WAGm5iAbLf2AAE_AbmiEz0363.jpg
-
-
-