Installation
参考文档:
https://github.com/happyfish100/fastdfs/wiki(官网 Wiki)
https://www.cnblogs.com/cnmenglang/p/6731209.html
http://blog.csdn.net/xyang81/article/details/52928230
集群服务器规划(示例):
跟踪服务器1【主机】(Tracker Server):192.100.139.121
跟踪服务器2【备机】(Tracker Server):192.100.139.122
存储服务器1(Storage Server):192.100.139.121
存储服务器2(Storage Server):192.100.139.123
存储服务器3(Storage Server):192.100.139.124
一、FastDFS集群原理
FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。
Storage server
Storage server(后简称storage)以组(卷,group或volume)为单位组织,一个group内包含多台storage机器,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。
以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制(group内storage server数量即为该group的副本数),比如将不同应用数据存到不同的group就能隔离应用数据,同时还可根据应用的访问特性来将应用分配到不同的group来做负载均衡;缺点是group的容量受单机存储容量的限制,同时当group内有机器坏掉时,数据恢复只能依赖group内地其他机器,使得恢复时间会很长。
group内每个storage的存储依赖于本地文件系统,storage可配置多个数据存储目录,比如有10块磁盘,分别挂载在/data/disk1-/data/disk10,则可将这10个目录都配置为storage的数据存储目录。
storage接受到写文件请求时,会根据配置好的规则(后面会介绍),选择其中一个存储目录来存储文件。为了避免单个目录下的文件数太多,在storage第一次启动时,会在每个数据存储目录里创建2级子目录,每级256个,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。
Tracker server
Tracker是FastDFS的协调者,负责管理所有的storage server和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表。
Tracker需要管理的元信息很少,会全部存储在内存中;另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务。
Upload file
FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。
更多细节参考文章:
http://blog.chinaunix.net/uid-20196318-id-4058561.html
https://www.linuxidc.com/Linux/2014-10/107591.htm
二、生产部署规划
从负载的角度来看,压力主要在storage server,因为它实际承担了文件上传、下载的服务,而tracker server只是协调组,压力会很小。
从容灾的角度来看,
1)tracker server全都是对等的节点,一个节点挂掉后,直接切到另一个节点即可。所以,生产部署两个tracker server独立节点,使用vip连接即可。
2)storage server全都是对等的节点,每个storage sever上都有文件的副本,所以,从容灾角度考虑,至少要部署2个。
综上,生产可以部署:2个tracker server + 1个group(2~3个storage),妥妥的。具体情况,后面还将进一步分析。
三、安装步骤
本文以 CentOS/ RHEL 为例:
【步骤一: 安装准备】
所需安装文件:
libfatscommon(下载地址:https://github.com/happyfish100/fastdfs-nginx-module.git)
FastDFS(包含了tracker和storage)(下载地址:https://github.com/happyfish100/fastdfs.git)
Nginx (为FastDFS提供HTTP下载支持,下载地址:nginx官网,比如 http://nginx.org/download/nginx-1.12.2.tar.gz)
fastdfs-nginx-module (下载地址:https://github.com/happyfish100/libfastcommon.git)
注意:Nginx 和 fastdfs-nginx-module是用来支持HTTP访问的,是可选的,下面会提到。
安装目录规划【示例】:
说明 | 位置 |
---|---|
所有安装包 | /usr/local/src |
tracker跟踪服务器数据 | /fastdfs/tracker |
storage存储服务器数据 | /fastdfs/storage |
把相关文件 源码 下载解压到相应目录
如下:
/usr/local/src/libfastcommon
/usr/local/src/fastdfs
/usr/local/src/fastdfs-nginx-module
【步骤二、FastDFS安装】
安装libfatscommon
cd libfastcommon/
./make.sh && ./make.sh install
安装FastDFS
cd fastdfs/
./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 /usr/local/src/fastdfs/conf/http.conf /etc/fdfs/ #供nginx访问使用 cp /usr/local/src/fastdfs/conf/mime.types /etc/fdfs/ #供nginx访问使用 cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs
【步骤三、修改配置并启动集群】
tracker配置
vim /etc/fdfs/tracker.conf
#需要修改的内容如下 port=22122 # tracker服务器端口(默认22122,一般不修改) base_path=/fastdfs/tracker # 存储日志和数据的根目录
#保存后启动
/etc/init.d/fdfs_trackerd start #启动tracker服务
chkconfig fdfs_trackerd on #自启动tracker服务
storage配置
vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000 # storage服务端口(默认23000,一般不修改) base_path=/fastdfs/storage # 数据和日志文件存储根目录 store_path0=/fastdfs/storage # 第一个存储目录 tracker_server=192.168.0.xxx:22122 # tracker服务器IP和端口 http.server_port=8888 # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致) (如果有多个tracker_server,就多增加一行tracker_server配置)
#保存后启动
/etc/init.d/fdfs_storaged start #启动storage服务
chkconfig fdfs_storaged on #自启动storage服务
client测试
vim /etc/fdfs/client.conf
#需要修改的内容如下
base_path=/fastdfs/tracker tracker_server=192.168.1.xxx:22122 #tracker IP地址
#保存后测试,返回ID表示成功 eg:group1/M00/00/00/wKgAQ1pysxmAaqhAAA76tz-dVgg.tar.gz
fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.12.2.tar.gz
【步骤四、HTTP访问支持】
FastDFS的tracker和storage都需要http协议的支持,使客户端可以通过http协议来下载文件。
tracker在接收到请求时,通过http的redirect机制将请求重定向至文件所在的storage上;
较新版本的FastDFS已经放弃了内置的http协议模块,需要通过nginx扩展模块,来提供对下载文件的支持。
Nginx作用说明
1、早期的FastDFS版本,自带了HTTP服务能力,后面作者把自带的HTTP服务去掉了,直接依赖Nginx来提供HTTP服务。
2、HTTP服务是可选的,不是必须的,FastDFS提供的上传和下载服务,都是用的TCP协议,而非HTTP协议。HTTP服务(Nginx)是用来提供静态文件浏览的,如果不需要静态文件服务,就不需要安装Nginx。
fastdfs-nginx-module作用说明
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入文件复制流程,有同步延迟的问题。
假设 Tracker 服务器将文件上传到了 192.168.1.202,上传成功后文件 ID已经返回给客户端。
此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.1.203,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.1.203上取文件,就会出现文件无法访问的错误。
而 fastdfs-nginx-module 可以重定向文件连接到源服务器(192.168.1.202)上取文件,避免客户端由于复制延迟导致的文件无法访问错误。
也就是说,fastdfs-nginx-module 会识别 当前文件能够访问的位置,并重定向到该服务器上去。
总结:fastdfs-nginx-module是FastDFS提供的Nginx插件,其作用是在提供静态文件服务时 ,如果当前storage节点上没有该文件(通常是没来得及同步,或者该storage因为挂了、网络等原因未同步成功),这种情况下,会自动去其他节点上寻找,以便访问任何一个nginx,都可以保证拿到文件。
Nginx的安装,并添加fastdfs-nginx-module模块
此处给出示例:(Nginx的安装是一个单独的安装过程,建议参考 专业的Nginx安装手册)
需要先安装所需lib,命令如下:
yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel -y
获取安装包:
wget http://nginx.org/download/nginx-1.12.2.tar.gz tar -zxvf nginx-1.12.2.tar.gz
# 然后添加fastdfs-nginx-module模块
cd nginx-1.12.2/(Nginx的源码目录) ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src/ make && make install
(在Storage服务器上)安装配置Nginx 和 fastdfs-nginx-module
vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=192.168.0.xxx:22122 url_have_group_name=true store_path0=/fastdfs/storage (如果有多个tracker_server,就多增加一行tracker_server配置)
#配置nginx.config
cd /usr/local/nginx(Nginx安装目录)
vi conf/nginx.conf
#添加如下配置
server { listen 8888; ## 该端口为storage.conf中的http.server_port相同 server_name localhost; location ~/group[0-9]/M00 { ngx_fastdfs_module; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
注意:
1、8888 端口值要与/etc/fdfs/storage.conf 中的 http.server_port=8888 相对应,因为 http.server_port 默认为 8888,如果想改成 80,则要对应修改过来。
2、如下载时如发现老报 404,将nginx.conf第一行user nobody;修改为user root;后重新启动。
创建数据存放目录的软链接
ln -s /fastdfs/storage/data/ /fastdfs/storage/data/M00
#测试下载,用外部浏览器访问刚才已传过的nginx安装包,引用返回的ID
http://192.168.0.xxx:8888/group1/M00/00/00/wKgAQ1pysxmAaqhAAA76tz-dVgg.tar.gz
#如果不能下载,可以检查防火墙,再检查其他配置。
(在Tracer服务器上)安装配置Nginx
在 tracker 上安装的 nginx 主要为了提供 http 访问的反向代理、负载均衡以及缓存服务。
示例如下:
#设置 group1 的服务器 upstream storage_server_group1 { server 192.100.139.121:8888 weight=10; server 192.100.139.123:8888 weight=10; server 192.100.139.124:8888 weight=10; } server { listen 8888; server_name 192.100.139.121; location ~/group1/M00 { proxy_pass http://storage_server_group1; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
其他一些运维操作:
1、关闭FastDFS
tracker: /usr/bin/stop.sh fdfs_tracker
storage: /usr/bin/stop.sh fdfs_storage
或者
killall fdfs_trackered
killall fdfs_storaged
注意,千万不要使用kill-9强行杀死进程。
2、重启FastDFS
tracker: /usr/bin/restart.sh fdfs_trackered
storage: /usr/bin/restart.sh fdfs_storaged
3、查看集群情况
在任意一台storage
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
附: FastDFS的一些缺点(可能需要注意)
参见:这篇文章。
四、生产部署(建议)
Tracer 一主一从部署,避免单点故障。
group主要做应用隔离和负载均衡,从目前的现状来看,暂时用不着,只用一个group即可。
(如果要区分上传的文件,例如group1存放证件照、人脸识别照片、合同、公司内部资料等敏感文件,group2存放对外网公开的APP活动图片、网页静态图片、文章图片等非敏感文件)。group1,因为是比较重要的文件,storage节点建议用3个,group2相对来说没这么重要,2个storage节点即可。
暂时,只部署group1。
HTTP访问的负载:
所有HTTP请求走一个VIP,后面两个nginx一主一从,然后转发(upstream)到 Storage节点的nginx上(storage的Nginx上要装fastdfs-nginx-module插件)。
五、测试环境部署(建议)
一个Tracer,一个Storage节点即可,HTTP直接访问这个Storage节点的Nginx(无需装fastdfs-nginx-module)。