天天看点

分布式文件系统FastDFS如何做到高可用

FastDFS是用C语言编写的一款开源的轻量级分布式文件系统。它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。  FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

  Hadoop也是一个分布式文件系统,hadoop是处理大数据的,什么是大数据呢?就是海量数据。海量数据你一块磁盘估计存不下,那么就需要把数据存到多个磁盘上,还得统一管理,这时就需要一个分布式文件系统来管理。FastDFS同样也是这么一个意思,图片我们有很多,但容量有上限,所以我们要把这些所有的图片存储到多台服务器上,还要进行统一管理,那么就需要一个分布式文件系统,很显然那就是FastDFS了,FastDFS适合于存取图片(建议范围:4KB < file_size <500MB)。

  FastDFS其实很早开始使用,但这次要作内训,因此下面借鉴网友的部份内容结合实践作总结,有些出处可能忘了 请多担待。

  下面来看一张FastDFS的架构图,如下图所示。

  FastDFS架构包括Tracker server和Storage server。

  客户端请求Tracker server进行文件上传、下载,通过Tracker server调度最终由Storage server完成文件上传和下载。Tracker server的作用是负载均衡和调度,通过Tracker server在文件上传时可以根据一些策略找到Storage server提供文件上传服务,可以将tracker称为追踪服务器或调度服务器。Tracker server跟踪器和存储节点都可以由一台或多台服务器构成,跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务,其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。Tracker负责管理所有的Storage和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group==>[storage server list]的映射表,Tracker需要管理的元信息很少,会全部存储在内存中;另外tracker上的元信息都是由storage汇报的信息生成的,本身不需要持久化任何数据,这样使得tracker非常容易扩展,直接增加tracker机器即可扩展为tracker cluster来服务,cluster里每个tracker之间是完全对等的,所有的tracker都接受stroage的心跳信息,生成元数据信息来提供读写服务。

  Storage server作用是文件存储,客户端上传的文件最终存储在Storage服务器上,Storage server没有实现自己的文件系统而是利用操作系统的文件系统来管理文件,可以将storage称为存储服务器。存储系统由一个或多个组组成,组与组之间的文件是相互独立的,所有组的文件容量累加就是整个存储系统中的文件容量。一个卷[Volume](组[group])可以由一台或多台存储服务器组成,一个组中的存储服务器中的文件都是相同的,组中的多台存储服务器起到了冗余备份和负载均衡的作用,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。

分布式文件系统FastDFS如何做到高可用

  我们从上图还能看到,Client端可以有多个,也就是同时支持多个客户端对FastDFS集群服务进行访问,Tracker是跟踪器,负责协调Client与Storage之间的交互,为了实现高可用性,需要用多个Tracker来作为跟踪器。Storage是专门用来存储东西的,而且是分组进行存储的,每一组可以有多台设备,这几台设备存储的内容完全一致,这样做也是为了高可用性,当现有分组容量不够时,我们可以水平扩容,即增加分组来达到扩容的目的。另外需要注意的一点是,如果一组中的设备容量大小不一致,比如设备A容量是80G,设备B的容量是100G,那么这两台设备所在的组的容量会以小的容量为准,也就是说,当存储的东西大小超过80G时,我们将无法存储到该组中了。Client端在与Storage进行交互的时候也与Tracker cluster进行交互,说的通俗点就是Storage向Tracker cluster进行汇报登记,告诉Tracker现在自己哪些位置还空闲,剩余空间是多大。

  现给出一张文件上传的时序图,如下图所示:

分布式文件系统FastDFS如何做到高可用

  从中可以看到,Client想上传图片,它先向Tracker进行询问,Tracker查看一下登记信息之后,告诉Client哪个storage当前空闲,Tracker会把IP和端口号都返回给Client,Client在拿到IP和端口号之后,便不再需要通过Tracker,直接便向Storage进行上传图片,Storage在保存图片的同时,会向Tracker进行汇报,告诉Tracker它当前是否还留有剩余空间,以及剩余空间大小。汇报完之后,Storage将服务器上存储图片的地址返回给Client,Client可以拿着这个地址进行访问图片。说得更加细致一点,客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名,如下所示:

分布式文件系统FastDFS如何做到高可用
组名:文件上传后所在的storage组名称,在文件上传成功后由storage服务器返回,需要客户端自行保存。 虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。 数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。 文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。

  现给出一张文件下载的时序图,如下图所示:

分布式文件系统FastDFS如何做到高可用

文件下载的步骤可以是:

1. client询问tracker下载文件的storage,参数为文件标识(组名和文件名)。 2. tracker返回一台可用的storage。 3. client直接和storage通讯完成文件下载。

安装组件

nginx+FastDFS+fastdfs-nginx-module

下载下列最新的安装包: 

fastdfs-master.zip:FastDFS源码 

libfastcommon-master.zip:(从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库) 

fastdfs-nginx-module-master.zip:storage节点http服务nginx模块 

nginx.tar.gz:Nginx安装包

防火墙中打开tracker服务器端口( 默认为 22122) 

shell> vi /etc/sysconfig/iptables 

添加如下端口行:

storage服务器需要添加端口

重启防火墙: 

shell> service iptables restart

先将fastdfs-master.zip和libfastcommon-master.zip 上传至所有服务器的/opt文件夹下

1. 解压缩 unzip libfastcommon-master.zip

编译安装

2. cd libfastcommon-master

3. ./make.sh

4. ./make.sh install

5. 把/usr/lib64/libfastcommon.so文件向/usr/lib/下复制一份 (32位才需要)

解压缩unzip fastdfs-master.zip

安装后在/usr/bin/目录下有以fdfs开头的文件都是编译出来的。

配置文件都放到/etc/fdfs文件夹

把/opt/fastdfs-master/conf目录下的所有的配置文件都复制到/etc/fdfs下。

cp -r /opt/fastdfs-master/conf/*  /etc/fdfs

修改/etc/fdfs/conf/tracker.conf文件。

其它内容默认,有关配置说明参考文章后面补充内容。

在2台storage服务器上配置storage服务,前题也是安装libfastcommon和fastdfs。

修改/etc/fdfs/conf/storage.conf文件。

只编辑tracker服务器上的client.conf

以上就是fastdfs的所有配置,下面分别启动32服务上的tracker、storage和30和31上的storage。

重启使用命令:

检查FastDFS Tracker Server是否启动成功: 

ps -ef | grep fdfs_trackerd

停止:

/etc/init.d/fdfs_trackerd stop

设置tracker服务开机启动

分布式文件系统FastDFS如何做到高可用

有以上返回内容说明已经上传成功,但我们将url 在浏览器上访问时会返回404 是不允许直接访问的,因此我们需要用到下面的nginx代理来作web服务访问。

fastdfs-nginx-module 作用说明 

FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储,但是同组存储服务器之间需要进入文件复制,有同步延迟的问题。

如果Tracker 服务器将文件上传到了 192.168.80.30,上传成功后文件ID已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储192.168.80.31,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.80.31 上取文件,就会出现文件无法访问的错误。

而 fastdfs-nginx-module 可以重定向文件连接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误

可以使用官方提供的nginx插件。要使用nginx插件需要重新编译。

上传fastdfs-nginx-module.tar.gz

1. 解压插件压缩包

2. 修改/opt/fastdfs-nginx-module/src/config文件,把其中的local去掉。(最新的没有local)

分布式文件系统FastDFS如何做到高可用

将mod_fastdfs.conf 拷贝到fdfs下进行配置

分布式文件系统FastDFS如何做到高可用
分布式文件系统FastDFS如何做到高可用

安装依赖包

上传解压nginx

cd nginx

分布式文件系统FastDFS如何做到高可用
分布式文件系统FastDFS如何做到高可用

 再进行

./make.sh && ./make.sh install 

配置nginx

 vim /opt/nginx/conf/nginx.conf

分布式文件系统FastDFS如何做到高可用
分布式文件系统FastDFS如何做到高可用

 但上面的内容已经固定死了group1的M00,Storage 对应有多个 group 的情况下,访问路径带 group 名,如/group1/M00/00/00/xxx,在这里改用:

location ~/group([0-9])/M00 {

ngx_fastdfs_module;

}

8888 端口值是要与/etc/fdfs/storage.conf 中的http.server_port=8888 相对应,因为 http.server_port 默认为 8888,如果想改成 80,则要对应修改过来。 

如查下载时如发现老报 404, 将 nginx.conf 第一行 user nobody 修改为 user root 后重新启动。

 防火墙中打开 Nginx 的 8888 端口 

vi /etc/sysconfig/iptables

添加:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8888 -j ACCEPT

重新启动防火墙:

即在rc.local增加启动代码就可以了。

vi /etc/rc.local

增加一行 /opt/nginx/sbin/nginx

设置执行权限:

chmod 755 rc.local

shell> /opt/nginx/sbin/nginx

ngx_http_fastdfs_set pid=xxx

nginx重启命令为:

/opt/nginx/sbin/nginx -s reload

  通过浏览器访问测试时上传的文件,测试上传后返回的文件ID为:group1/M00/00/00/wKhQIFoKF3KAfw8wAABdrZgsqUU551_big.jpg,用浏览访问的地址为:http://192.168.80.32:8888/group1/M00/00/00/wKhQIFoKF3KAfw8wAABdrZgsqUU551_big.jpg

注意: 千万不要使用 kill -9 命令强杀 FastDFS 进程,否则可能会导致 binlog 数据丢失。

   至此已经搭起了一个简单的集群模式,其中上面的配置需要根据实际情况进行调整。

tracker配置文件说明:

分布式文件系统FastDFS如何做到高可用
分布式文件系统FastDFS如何做到高可用

storage.conf配置说明:

分布式文件系统FastDFS如何做到高可用
分布式文件系统FastDFS如何做到高可用

编译安装nginx需要pcre包,未安装会有如下提示:

分布式文件系统FastDFS如何做到高可用

需要安装pcre的devel包,pcre-devel。使用yum安装即可:(以下命令还带有ssl、zlib等依赖的安装)

分布式文件系统FastDFS如何做到高可用

本文转自欢醉博客园博客,原文链接http://www.cnblogs.com/zhangs1986/p/8268927.html如需转载请自行联系原作者

欢醉

继续阅读