简介:
FastDFS是一款开源、C语言开发的分布式文件系统(Distributed File System),由淘宝开发平台部资深架构师余庆开发。作为一个分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题,特别适合中小文件(建议范围:4KB < file_size <500MB),对以文件为载体的在线服务,如相册网站、视频网站等等具有显著的效果。
场景:
FastDFS与HDFS区别:定位和应用场合不同。
Hadoop的文件系统HDFS主要解决并行计算中分布式存储数据的问题。其单个数据文件通常很大,采用了分块(切分)存储的方式;FastDFS主要用于大中网站,为文件上传和下载提供在线服务。所以在负载均衡、动态扩容等方面都支持得比较好,FastDFS不会对文件进行分快(切分)存储。
架构:
FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

安装:
1.软件说明
| 名称 | 版本 | 说明 |
|---|---|---|
| CentOS | CentOS Linux release 7.4.1708 (Core) | 发行版 |
| libfastcommon | libfastcommon-1.0.39.tar.gz | 包含了FastDFS运行所需要的一些基础库 |
| FastDFS | fastdfs-5.11.tar.gz | 核心安装包 |
| fastdfs-nginx-module | fastdfs-nginx-module-1.20.tar.gz | FastDFS和nginx的关联模块,解决组内同步延迟问题 |
| nginx | nginx-1.16.0.tar.gz | 反向代理、负载均衡 |
2.集群规划
同一个group之间的storage互为备份,所有group累积为全量数据
| 服务器 | 角色 | 分组 | 软件 |
|---|---|---|---|
| 192.168.1.1 | Tracker | FastDFS+libfastcommon+nginx | |
| 192.168.1.2 | Tracker | FastDFS+libfastcommon+nginx | |
| 192.168.1.3 | Storage1 | group1 | FastDFS+libfastcommon+nginx+fastdfs-nginx-module |
| 192.168.1.4 | Storage2 | group1 | FastDFS+libfastcommon+nginx+fastdfs-nginx-module |
| 192.168.1.5 | Storage3 | group2 | FastDFS+libfastcommon+nginx+fastdfs-nginx-module |
| 192.168.1.6 | Storage4 | group2 | FastDFS+libfastcommon+nginx+fastdfs-nginx-module |
| 192.168.1.7 | nginx |
3.安装软件
- 添加用户权限
# 创建一个gid为246的fdfs用户组
groupadd -g 246 fdfs
# 创建一个uid为246,gid为246的fdfs 用户
useradd -u 246 -g 246 fdfs
passwd fdfs [password]
# 查看用户uid
id fdfs
# 删除用户组
# userdel -rf fdfs
# 查看用户列表
# cut -d : -f 1 /etc/passwd
- 设置文件夹权限
chown -R fdfs /home/fdfs
chgrp -R fdfs /home/fdfs
1.安装FastDFS依赖(T&S)
FastDFS由C开发,所以依赖gcc
# 安装编译环境
yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y
2.安装libfatscommon(T&S)
libfatscommon包含了FastDFS运行所需要的一些基础库
# 上传解压
cd /home/fdfs
tar zxvf libfastcommon-1.0.39.tar.gz
cd libfastcommon-1.0.39
# 编译安装
./make.sh && ./make.sh install
3.安装FastDFS(T&S)
# 上传解压
cd /home/fdfs
tar zxvf fastdfs-5.11.tar.gz
cd fastdfs-5.11
# 编译安装
./make.sh && ./make.sh install
# 安装成功后,会在etc目录下生成fdfs配置文件目录
4.fastdfs-nginx-module(S)
1、fastdfs-nginx-module 作用说明
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储, 但是同组存储服务器之间需要进入文件复制, 有同步延迟的问题。假设 Tracker 服务器将文件上传到了 192.168.1.1,上传成功后文件 ID已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.1.2,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.1.2 上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module 可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。(解压后的 fastdfs-nginx-module 在 nginx 安装时使用)
FastDFS和nginx的关联模块,解决组内同步延迟问题
# 上传解压
cd /home/fdfs
tar zxvf fastdfs-nginx-module-1.20.tar.gz
高版本FastDFS将/usr/local/include改成了/usr/include,需要修改配置,否则nginx添加fastdfs-nginx-module模块时会报错
vi /home/fdfs/fastdfs-nginx-module-1.20/src/config
# 修改以下内容(高版本FastDFS将/usr/local/include改成了/usr/include)
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
5.安装nginx(T&S)
1.安装nginx依赖
# 上传解压
cd /home/fdfs
tar zxvf pcre-8.38.tar.gz
cd pcre-8.38
./configure
make -j4 && make install
2.安装nginx
# 上传解压
cd /home/fdfs
tar zxvf nginx-1.16.0.tar.gz
cd /home/fdfs/nginx-1.16.0
# 添加fastdfs-nginx-module模块
./configure --prefix=/home/fdfs/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre=/home/fdfs/pcre-8.38 --add-module=/home/fdfs/fastdfs-nginx-module-1.20/src
# -j4启用4个线程,-j8启用8个线程,加快安装速度
make -j4 && make install
# 启动nginx服务
cd /home/fdfs/nginx-1.16.0/nginx/sbin
./nginx
# 验证服务是否启动成功
netstat -ntlp | grep nginx
3.nginx自启
chmod +x /etc/rc.local
vi /etc/rc.local
# 在sleep 1s 后面加
# tracker上监听80端口,fdfs可能没有权限启动
sudo -u fdfs /home/fdfs/nginx/sbin/nginx
- sudo权限
# 编辑sudoers
visudo
# 注释掉 Default requiretty 一行
- 启动日志
systemctl status rc-local
配置:
1.准备配置文件
# 配置文件准备
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
# 供nginx访问使用
cp /home/fdfs/fastdfs-5.11/conf/http.conf /etc/fdfs/
# 供nginx访问使用
cp /home/fdfs/fastdfs-5.11/conf/mime.types /etc/fdfs/
2.配置Tracker(T:tracker.conf)
创建Tracker数据目录
# 用于保存tracker的data和log
mkdir /home/fdfs/fastdfs_tracker
配置tracker(tracker默认使用22122端口)
vi /etc/fdfs/tracker.conf
# 配置可用
disabled=false
# tracker服务器端口(默认22122,一般不修改)
port=22122
# 存储日志和数据的根目录
base_path=/home/fdfs/fastdfs_tracker
# 默认端口是8080(该端口要和tracker节点上nginx配置端口相同)
http.server_port=80
# 采用轮询策略进行存储(0:轮询,1:始终定向到某个group,2:负载进行存储文件(选择最大剩余空间的组上传))
# 轮询方便测试,负载均衡需要容量到一定大小数据才会到其他group
store_lookup=0
# 白名单配置,可以防止别人恶意上传文件(可以配置多行)
# allow_hosts=192.168.1.1
# 白名单配置本机IP,storage无法正常启动
# allow_hosts=192.168.1.[128-130]
启动tracker
/etc/init.d/fdfs_trackerd start
查看服务
netstat -unlpt | grep fdfs
ps aux | grep fdfs
查看日志
cat /home/fdfs/fastdfs_tracker/logs/trackerd.log
tracker自启动
service fdfs_trackerd start
service fdfs_trackerd restart
service fdfs_trackerd stop
chkconfig --add fdfs_trackerd
#自启动tracker服务
chkconfig fdfs_trackerd on
报错28:没有足够的存储空间
注意FastDFS中有预留空间的概念,在tracker.conf中设置,配置项为:reserved_storage_space,缺省值为4GB,即预留4GB的空间。请酌情设置reserved_storage_space这个参数,比如可以设置为磁盘总空间的20%左右。
3.配置Storage(S:storage.conf)
创建文件存储路径,用于保存storage的data和log
mkdir /home/fdfs/fastdfs_storage
mkdir /home/fdfs/fastdfs_storage_data
配置storage.conf(storage默认使用23000端口)
vi /etc/fdfs/storage.conf
# 配置当前storage节点属于的group
group_name=group1
# storage服务端口(默认23000,一般不修改)
port=23000
#################################################
## Storage3和Storage4修改为group_name=group2 ##
## Storage3和Storage4修改为port=23001 ##
#################################################
# 配置storage存放日志的路径
base_path=/home/fdfs/fastdfs_storage
# 配置storage文件存储路径
store_path0=/home/fdfs/fastdfs_storage_data
# 多个tracker服务器IP和端口换行
tracker_server=192.168.1.1:22122
tracker_server=192.168.1.2:22122
# http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)
http.server_port=8888
# 白名单配置,可以防止别人恶意上传文件(可以配置多个)
# allow_hosts=192.168.1.1
# allow_hosts=192.168.1.[128-130]
修复官方fdfs_storaged文件BUG
vi /etc/init.d/fdfs_storaged
# /usr/bin/fdfs_storaged执行文件需要加配置文件和命令
# /usr/bin/fdfs_storaged
# Usage: /usr/bin/fdfs_storaged <config_file> [start | stop | restart]
# 1.注释掉这一段,不同系统兼容有问题
# Source function library.
#if [ -f /etc/init.d/functions ]; then
# . /etc/init.d/functions
#fi
# 2.start方法中缺少start
start() {
echo -n "Starting FastDFS storage server: "
$CMD start &
RETVAL=$?
echo
return $RETVAL
}
启动storage
/etc/init.d/fdfs_storaged start
查看服务
netstat -unlpt | grep fdfs
ps aux | grep fdfs
查看日志
cat /home/fdfs/fastdfs_storage/logs/storaged.log
storage自启动
service fdfs_storaged start
service fdfs_storaged restart
service fdfs_storaged stop
chkconfig --add fdfs_storaged
#自启动storage服务
chkconfig fdfs_storaged on
4.配置nginx访问
1.配置fastdfs-nginx-module(T:mod_fastdfs.conf)
作用:重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
# 复制fastdfs-nginx-module配置文件
cp /home/fdfs/fastdfs-nginx-module-1.20/src/mod_fastdfs.conf /etc/fdfs
配置mod_fastdfs.conf
vi /etc/fdfs/mod_fastdfs.conf
# 配置storage存放日志的路径
base_path=/home/fdfs/fastdfs_storage
# tracker服务器IP和端口
tracker_server=192.168.1.1:22122
tracker_server=192.168.1.2:22122
# 当前机器的storage的端口
storage_server_port=23000
# 当前机器storage的group名称
group_name=group1
# 请求路径使用分组(默认为false)
url_have_group_name=true
# 配置storage文件存储路径
store_path0=/home/fdfs/fastdfs_storage_data
# 集群中group的数量
group_count=2
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/home/fdfs/fastdfs_storage_data
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/home/fdfs/fastdfs_storage_data
创建软连接:为了nginx能够访问储存路径的时候能直接访问到M00的数据
ln -s /home/fdfs/fastdfs_storage_data/data/ /home/fdfs/fastdfs_storage_data/data/M00
2.配置Storage上nginx(S:nginx.conf)
每个Storage节点上都可以在本机上通过nginx访问文件
vi /home/fdfs/nginx-1.16.0/nginx/conf/nginx.conf
监听8888 端口值是要与/etc/fdfs/storage.conf中的 http.server_port=8888 相对应,因为 http.server_port 默认为 8888,如果想改成 80,则要对应修改过来。
#添加如下配置
server {
# 该端口为storage.conf中的http.server_port相同
listen 8888;
server_name localhost;
location ~/group[1-2]/M00 {
ngx_fastdfs_module;
# 跨域配置
add_header Access-Control-Allow-Origin *;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
启动nginx
#启动nginx
/usr/local/nginx/sbin/nginx
#重启nginx
/usr/local/nginx/sbin/nginx -s reload
#停止nginx
/usr/local/nginx/sbin/nginx -s stop
# 验证服务是否启动成功
netstat -ntlp | grep nginx
# 查看本机端口监听情况
netstat -ntulp
3.配置Tracker上nginx(T:nginx.conf)
在tracker上安装的nginx主要为了提供http访问的反向代理、负载均衡以及缓存服务
vi /home/fdfs/nginx-1.16.0/nginx/conf/nginx.conf
#设置 group1 的服务器
upstream fdfs_group1 {
server 192.168.1.3:8888 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.4:8888 weight=1 max_fails=2 fail_timeout=30s;
}
#设置 group2 的服务器
upstream fdfs_group2 {
server 192.168.1.5:8888 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.6:8888 weight=1 max_fails=2 fail_timeout=30s;
}
server {
# 该端口为tracker.conf中的http.server_port相同
listen 80;
server_name localhost;
#设置 group 的负载均衡参数
location /group1/M00 {
proxy_pass http://fdfs_group1;
}
location /group2/M00 {
proxy_pass http://fdfs_group2;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
加入ngx_cache_purge(加入缓存模块)
TODO
启动nginx
#启动nginx
/usr/local/nginx/sbin/nginx
#重启nginx
/usr/local/nginx/sbin/nginx -s reload
#停止nginx
/usr/local/nginx/sbin/nginx -s stop
# 验证服务是否启动成功
netstat -ntlp | grep nginx
# 查看本机端口监听情况
netstat -ntulp
5.测试:
1.查看集群状态
在启动stroage的任意一台机器上都可以查看集群状态
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
# server_count:Tracker数量
# group count:group数量
2.测试文件上传
配置client
vi /etc/fdfs/client.conf
base_path=/home/fdfs/fastdfs_storage_data
# tracker服务器IP和端口
tracker_server=192.168.1.1:22122
tracker_server=192.168.1.2:22122
# 白名单配置,可以防止别人恶意上传文件(可以配置多个)
# allow_hosts=192.168.1.[128-130]
测试
# 上传文件
fdfs_upload_file /etc/fdfs/client.conf /home/fdfs/win.png
返回ID表示成功 如:
group1/M00/00/00/rBKje113a2SAIqQlAABBJ3Ss-7w749.png
在storage节点中查找文件,所有的group累加才是全量数据,同一个group中数据相同
# 文件先从这个路径开始存储:/home/fdfs/fastdfs_storage_data/data/00/00/
find /home/fdfs/ -name rBKje113BraAdeOvAAgy3XO_IeI058.pdf -print
find /home/fdfs/ -name rBKjdV13cRGAeCNXAABBJ3Ss-7w445.png -print
3.测试文件访问
Storage单节点测试
# 192.168.1.3
curl http://192.168.1.3:8888/group1/M00/00/00/rBKje113BraAdeOvAAgy3XO_IeI058.pdf
# 192.168.1.4
curl http://192.168.1.4:8888/group1/M00/00/00/rBKje113BraAdeOvAAgy3XO_IeI058.pdf
# 192.168.1.5
curl http://192.168.1.5:8888/group1/M00/00/00/rBKjdV13cRGAeCNXAABBJ3Ss-7w445.png
# 192.168.1.6
curl http://192.168.1.6:8888/group1/M00/00/00/rBKjdV13cRGAeCNXAABBJ3Ss-7w445.png
Tracker集群测试
# tracker1
http://172.18.1.1/group1/M00/00/00/rBKjGF3qDOaANIaXAAKoYfVqsM0836.png
http://172.18.1.1/group1/M00/00/00/rBKjGV3qDYaAcRZoAAKoYfVqsM0693.png
http://172.18.1.1/group1/M00/00/00/rBKjGF3qDd6AY_AGAAKoYfVqsM0000.png
http://172.18.1.1/group1/M00/00/00/rBKjGV3qDiiAOHEIAAKoYfVqsM0890.png
# tracker2
http://172.18.1.2/group1/M00/00/00/rBKjGF3qDOaANIaXAAKoYfVqsM0836.png
http://172.18.1.2/group1/M00/00/00/rBKjGV3qDYaAcRZoAAKoYfVqsM0693.png
http://172.18.1.2/group1/M00/00/00/rBKjGF3qDd6AY_AGAAKoYfVqsM0000.png
http://172.18.1.2/group1/M00/00/00/rBKjGV3qDiiAOHEIAAKoYfVqsM0890.png
6.其他:
FastDFS服务器端运行时目录结构如下:
${base_path}
|__data:存放数据文件
|__logs:存放日志文件
其中,${base_path}由配置文件中的参数“base_path”设定。
一、tracker server
tracker server目录及文件结构:
${base_path}
|__data
| |__storage_groups.dat:存储分组信息
| |__storage_servers.dat:存储服务器列表
|__logs
|__trackerd.log:tracker server日志文件
数据文件storage_groups.dat和storage_servers.dat中的记录之间以换行符(\n)分隔,字段之间以西文逗号(,)分隔。
storage_groups.dat中的字段依次为:
1. group_name:组名
2. storage_port:storage server端口号
storage_servers.dat中记录storage server相关信息,字段依次为:
1. group_name:所属组名
2. ip_addr:ip地址
3. status:状态
4. sync_src_ip_addr:向该storage server同步已有数据文件的源服务器
5. sync_until_timestamp:同步已有数据文件的截至时间(UNIX时间戳)
6. stat.total_upload_count:上传文件次数
7. stat.success_upload_count:成功上传文件次数
8. stat.total_set_meta_count:更改meta data次数
9. stat.success_set_meta_count:成功更改meta data次数
10. stat.total_delete_count:删除文件次数
11. stat.success_delete_count:成功删除文件次数
12. stat.total_download_count:下载文件次数
13. stat.success_download_count:成功下载文件次数
14. stat.total_get_meta_count:获取meta data次数
15. stat.success_get_meta_count:成功获取meta data次数
16. stat.last_source_update:最近一次源头更新时间(更新操作来自客户端)
17. stat.last_sync_update:最近一次同步更新时间(更新操作来自其他storage server的同步)
二、storage server
storage server目录及文件结构:
${base_path}
|__data
| |__.data_init_flag:当前storage server初始化信息
| |__storage_stat.dat:当前storage server统计信息
| |__sync:存放数据同步相关文件
| | |__binlog.index:当前的binlog(更新操作日志)文件索引号
| | |__binlog.###:存放更新操作记录(日志)
| | |__${ip_addr}_${port}.mark:存放向目标服务器同步的完成情况
| |
| |__一级目录:256个存放数据文件的目录,目录名为十六进制字符,如:00, 1F
| |__二级目录:256个存放数据文件的目录,目录名为十六进制字符,如:0A, CF
|__logs
|__storaged.log:storage server日志文件
.data_init_flag文件格式为ini配置文件方式,各个参数如下:
# storage_join_time:本storage server创建时间
# sync_old_done:本storage server是否已完成同步的标志(源服务器向本服务器同步已有数据)
# sync_src_server:向本服务器同步已有数据的源服务器IP地址,没有则为空
# sync_until_timestamp:同步已有数据文件截至时间(UNIX时间戳)
storage_stat.dat文件格式为ini配置文件方式,各个参数如下:
# total_upload_count:上传文件次数
# success_upload_count:成功上传文件次数
# total_set_meta_count:更改meta data次数
# success_set_meta_count:成功更改meta data次数
# total_delete_count:删除文件次数
# success_delete_count:成功删除文件次数
# total_download_count:下载文件次数
# success_download_count:成功下载文件次数
# total_get_meta_count:获取meta data次数
# success_get_meta_count:成功获取meta data次数
# last_source_update:最近一次源头更新时间(更新操作来自客户端)
# last_sync_update:最近一次同步更新时间(更新操作来自其他storage server)
binlog.index中只有一个数据项:当前binlog的文件索引号
binlog.###,###为索引号对应的3位十进制字符,不足三位,前面补0。索引号基于0,最大为999。一个binlog文件最大为1GB。记录之间以换行符(\n)分隔,字段之间以西文空格分隔。字段依次为:
1. timestamp:更新发生时间(Unix时间戳)
2. op_type:操作类型,一个字符
3. filename:操作(更新)的文件名,包括相对路径,如:5A/3D/FE_93_SJZ7pAAAO_BXYD.S
${ip_addr}_${port}.mark:ip_addr为同步的目标服务器IP地址,port为本组storage server端口。例如:10.0.0.1_23000.mark。文件格式为ini配置文件方式,各个参数如下:
# binlog_index:已处理(同步)到的binlog索引号
# binlog_offset:已处理(同步)到的binlog文件偏移量(字节数)
# need_sync_old:同步已有数据文件标记,0表示没有数据文件需要同步
# sync_old_done:同步已有数据文件是否完成标记,0表示未完成,1表示已完成
# until_timestamp:同步已有数据截至时间点(UNIX时间戳)
# scan_row_count:已扫描的binlog记录数
# sync_row_count:已同步的binlog记录数
本文详细介绍了FastDFS分布式文件系统的集群部署过程,包括软件安装、集群规划、配置步骤及测试方法,适合大中型网站文件上传和下载服务。
757

被折叠的 条评论
为什么被折叠?



