FastDFS集群部署和使用
2018年02月26日


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)。