文章目录
- 1. FastDFS简介
- 2. 相关术语
- 3. 同步机制
- 4. FastDFS上传文件交互过程
- 5. FastDFS下载文件交互过程
- 6. 运行时目录结构
- 7. 网上资源
- 8. 单节点安装方式
- 9. 文件上传测试
- 10. 在每个存储节点上安装 nginx
- 11. FastDFS Java客户端使用
1. FastDFS简介
FastDFS
是一个开源的分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件
访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服
务,如相册网站、视频网站等等。
FastDFS
服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在
访问上起负载均衡的作用。存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口。
FastDFS
同时对文件的 meta data 进行管理。所谓文件的 meta data 就是文件的相关属性,以键值对(key
value pair)方式表示,如:width=1024,其中的 key 为 width,value 为 1024。文件 meta data 是文件属
性列表,可以包含多个键值对。FastDFS 系统结构如下图所示:
跟踪器
和存储节点
都可以由一台多台服务器构成。
跟踪器
和存储节点
中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。
为了支持大容量,存储节点
(服务器)采用了分卷
(或分组
)的组织方式。
存储系统由一个或多个卷
组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。
一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS
中的文件标识分为两个部分:卷名和文件名,二者缺一不可。
2. 相关术语
Tracker Server
:跟踪服务器,主要做调度工作,在访问上起负载均衡的作用。记录storage server的状态,是连接Client和Storage server的枢纽。Storage Server
:存储服务器,文件和meta data都保存到存储服务器上group
:组,也可称为卷。同组内服务器上的文件是完全相同的
文件标识:包括两部分:组名和文件名(包含路径)meta data
:文件相关属性,键值对(Key Value Pair)方式,如:width=1024,heigth=768
3. 同步机制
- 同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行;
- 文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器;
- 源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了;
- 上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。
4. FastDFS上传文件交互过程
-
client 询问 tracker 上传到的 storage,不需要附加参数;
-
tracker 返回一台可用的 storage;
-
client 直接和 storage 通讯完成文件上传。
客户端 client 发起对 FastDFS 的文件传输动作,是通过连接到某一台 Tracker Server 的指定端
口来实现的,Tracker Server 根据目前已掌握的信息,来决定选择哪一台 Storage Server ,然后将这个
Storage Server 的地址等信息返回给 client,然后 client 再通过这些信息连接到这台 Storage Server,
将要上传的文件传送到给 Storage Server 上。
5. FastDFS下载文件交互过程
-
client 询问 tracker 下载文件的 storage,参数为文件标识(卷名和文件名);
-
tracker 返回一台可用的 storage;
-
client 直接和 storage 通讯完成文件下载。
6. 运行时目录结构
6.1 Tracker server (跟踪服务器)
6.2 Storage server (存储服务器)
7. 网上资源
8. 单节点安装方式
Tracker server和Storage server 执行相同的操作
8.1 编译和安装所需的依赖包
[root@localhost ~]# yum install make cmake gcc gcc-c++
8.2 安装 libfastcommon
-
上传或下载 libfastcommon-master.zip 到/usr/local/src 目录
-
解压
[root@localhost ~]# cd /usr/local/src [root@localhost src]# unzip libfastcommon-master.zip [root@localhost src]# cd libfastcommon-master
- 编译、安装
[root@localhost libfastcommon-master]# ./make.sh
[root@localhost libfastcommon-master]# ./make.sh install
libfastcommon 默认安装到了:
/usr/lib64/libfastcommon.so
/usr/lib64/libfdfsclient.so
- 因为 FastDFS 主程序设置的 lib 目录是/usr/local/lib,所以需要创建软链接
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
8.3 安装 FastDFS
- 上传或下载 FastDFS 源码包(FastDFS_v5.05.tar.gz)到 /usr/local/src 目录
- 解压
# cd /usr/local/src/
# tar -zxvf FastDFS_v5.05.tar.gz
# cd FastDFS
- 编译、安装(编译前要确保已经成功安装了 libfastcommon)
# ./make.sh
# ./make.sh install
采用默认安装的方式安装,安装后的相应文件与目录:
A、服务脚本在:
/etc/init.d/fdfs_storaged
/etc/init.d/fdfs_tracker
B、配置文件在(样例配置文件):
/etc/fdfs/client.conf.sample
/etc/fdfs/storage.conf.sample
/etc/fdfs/tracker.conf.sample
C、命令工具在/usr/bin/目录下的:
fdfs_appender_test
fdfs_appender_test1
fdfs_append_file
fdfs_crc32
fdfs_delete_file
fdfs_download_file
fdfs_file_info
fdfs_monitor
fdfs_storagedfdfs_test
fdfs_test1
fdfs_trackerd
fdfs_upload_appender
fdfs_upload_file
stop.sh
restart.sh
-
因为 FastDFS 服务脚本设置的 bin 目录是/usr/local/bin,但实际命令安装在/usr/bin,可以进入
/user/bin 目录使用以下命令查看 fdfs 的相关命令:
# cd /usr/bin/ # ls | grep fdfs
因此需要修改 FastDFS 服务脚本中相应的命令路径,也就是把/etc/init.d/fdfs_storaged
和/etc/init.d/fdfs_tracker
两个脚本中的/usr/local/bin
修改成/usr/bin
:
# vi fdfs_trackerd
使用查找替换命令进统一修改(vi/vim命令):
%s+/usr/local/bin+/usr/bin
# vi fdfs_storaged
使用查找替换命令进统一修改:
%s+/usr/local/bin+/usr/bin
8.4 配置跟踪器
-
复制FastDFS跟踪器样例配置文件,并重命名
# cd /etc/fdfs/
# cp tracker.conf.sample tracker.conf
- 编辑跟踪器配置文件:
# vi /etc/fdfs/tracker.conf
修改如下内容:
disabled=false
port=22122
base_path=/fastdfs/tracker
其它参数保留默认配置。
- 创建基础数据目录(参考基础目录base_path的配置)
mkdir -p /fastdfs/tracker
- 防火墙中打开跟踪器端口(设置的22122)
firewall-cmd --zone=public --add-port=22122/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-prots #查看端口是否开放成功
CentOS6(iptables防火墙方式)下设置方式
vi /etc/sysconfig/iptables
#添加如下端口行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT
重启防火墙:
service iptables restart
- 启动Tracker跟踪服务器
/etc/init.d/fdfs_trackerd start
初次成功启动,会在/fastdfs/tracker 目录下创建 data、logs 两个目录
查看 FastDFS Tracker 是否已成功启动:
ps -ef | grep fdfs
- 关闭Tracker跟踪服务器
/etc/init.d/fdfs_trackerd stop
-
设置 FastDFS 跟踪器开机启动:
vi /etc/rc.d/rc.local
添加以下内容:
/etc/init.d/fdfs_trackerd start
8.5 配置存储器
-
复制 FastDFS 存储器样例配置文件,并重命名:
cd /etc/fdfs/
# cp storage.conf.sample storage.conf
-
编辑存储器样例配置文件
# vi /etc/fdfs/storage.conf
修改如下内容:
disabled=false port=23000 base_path=/fastdfs/storage store_path0=/fastdfs/storage tracker_server=192.168.4.121:22122 #跟踪服务器地址及端口 http.server_port=8888
其它参数保留默认配置。
-
创建基础数据目录(参考基础目录 base_path 配置)
mkdir -p /fastdfs/storage
-
防火墙中打开存储器端口(默认为23000)
firewall-cmd --zone=public --add-port=23000/tcp --permanent firewall-cmd --reload firewall-cmd --list-ports #查看端口是否开放成功
CentOS6(iptables防火墙方式)下设置方式
vi /etc/sysconfig/iptables #添加如下端口行: -A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT 重启防火墙: service iptables restart
-
启动Storage存储服务器
# /etc/init.d/fdfs_storaged start
初次成功启动,会在/fastdfs/tracker 目录下创建 data、logs 两个目录
查看 FastDFS Tracker 是否已成功启动:
ps -ef | grep fdfs
-
关闭Storage存储服务器
/etc/init.d/fdfs_storaged stop
-
设置FastDFS存储服务器开机启动
# vi /etc/rc.d/rc.local
添加如下行:
/etc/init.d/fdfs_storaged start
9. 文件上传测试
-
修改 Tracker 服务器中的客户端配置文件
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf vi /etc/fdfs/client.conf
base_path=/fastdfs/tracker tracker_server=192.168.4.121:22122
-
执行文件上传命令:
# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/FastDFS_v5.05.tar.gz
返回 ID 号:group1/M00/00/00/wKgEfVUYNYeAb7XFAAVFOL7FJU4.tar.gz
能返回以上文件 ID,说明文件上传成功。
10. 在每个存储节点上安装 nginx
-
fastdfs-nginx-module 作用说明
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。假设 Tracker 服务器将文件上传到了 192.168.4.125,上传成功后文件 ID已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.4.126,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.4.126 上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module 可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
(解压后的 fastdfs-nginx-module 在 nginx 安装时使用)
-
上传 fastdfs-nginx-module_v1.16.tar.gz 到 /usr/local/src
-
执行解压
cd /usr/local/src/ tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
-
修改 fastdfs-nginx-module 的 config 配置文件
# cd fastdfs-nginx-module/src # vi config CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/" 修改为: CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/" (注意:这个路径修改是很重要的,不然在 nginx 编译的时候会报错的)
-
上传 Nginx(nginx-1.6.2.tar.gz)到
/usr/local/src
目录 -
安装编译 Nginx 所需的依赖包
yum install gcc gcc-c++ make automake autoconf libtool pcre* zlib openssl openssl-devel
-
编译安装 Nginx(添加 fastdfs-nginx-module 模块)
cd /usr/local/src/ tar -zxvf nginx-1.6.2.tar.gz cd nginx-1.6.2 ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src make && make install
-
复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录,并修改
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/ vi /etc/fdfs/mod_fastdfs.conf 修改以下配置: connect_timeout=10 base_path=/tmp tracker_server=192.168.4.121:22122 storage_server_port=23000 group_name=group1 url_have_group_name = true store_path0=/fastdfs/storage
-
复制 FastDFS 的部分配置文件到/etc/fdfs 目录
cd /usr/local/src/FastDFS/conf cp http.conf mime.types /etc/fdfs/
-
在/fastdfs/storage 文件存储目录下创建软连接,将其链接到实际存放数据的目录
ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00
-
配置 Nginx
简洁版 nginx 配置样例:
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 8888; server_name localhost; location ~/group([0-9])/M00 { #alias /fastdfs/storage/data; ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
注意、说明:
A、8888端口值是要与/etc/fdfs/storage.conf 中的 http.server_port=8888 相对应,因为 http.server_port 默认为 8888,如果想改成 80,则要对应修改过来。 B、Storage 对应有多个 group 的情况下,访问路径带 group 名,如/group1/M00/00/00/xxx, 对应的 Nginx 配置为: location ~/group([0-9])/M00 { ngx_fastdfs_module; } C、如查下载时如发现404错误,将 nginx.conf 第一行 user nobody 修改为 user root 后重新启动
-
防火墙中打开 Nginx 的 8888 端口
firewall-cmd --zone=public --add-port=8888/tcp --permanent firewall-cmd --reload firewall-cmd --list-ports #查看端口是否开放成功
CentOS6(iptables防火墙方式)下设置方式
vi /etc/sysconfig/iptables #添加如下端口行: -A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT 重启防火墙: service iptables restart
-
启动 Nginx
/usr/local/nginx/sbin/nginx
(重启 Nginx 的命令为:/usr/local/nginx/sbin/nginx -s reload)
-
通过浏览器访问测试时上传的文件
http://192.168.4.125:8888/group1/M00/00/00/wKgEfVUYNYeAb7XFAAVFOL7FJU4.tar.gz
注意:千万不要使用 kill -9 命令强杀 FastDFS 进程,否则可能会导致 binlog 数据丢失