fastdfs是一个开源的,高性能的的分布式文件系统,他主要的功能包括:文件存储,同步和访问,设计基于高可用和负载均衡,fastfd非常适用于基于文件服务的站点,例如图片分享和视频分享网站。
fastfds有两个角色:跟踪服务和存储服务,跟踪服务控制,调度文件以负载均衡的方式访问;存储服务包括:文件存储,文件同步,提供文件访问接口,同时以key value的方式管理文件的元数据跟踪和存储服务可以由1台或者多台服务器组成,同时可以动态的添加,删除跟踪和存储服务而不会对在线的服务产生影响,在集群中,tracker服务是对等的存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
上述文字是根据官方说明翻译过来的,以下文字说下我自己对fastdfs的见解。
1.fastdfs是一个轻量级的分布式文件系统,之所以轻量级,是因为“代码轻”,据统计这个用纯C开发的程序不到5.2万行,另外“组成轻”,由tracker和storage两部分组成。
2.tracker和storage两部分组成了fastdfs,他们的分工也十分明确,tracker(追踪器)负责调度,和负载均衡,因此集群中可以理解为相对对立的server,而storage则是充当文件管理的作用,同步上传下载等。集群中可以理解为相互依存(分布式冗余)。
3.fastdfs是一个应用级的分布式文件系统,为什么是应用级而非系统级?它只能使用专门的api访问,不支持posix管理,也不支持你直接挂载。
4.tracker在内存中记录分组和storage的状态等信息,不记录文件索引信息,占用的内存量很少,因此不会成为系统的瓶颈。
5.在fastdfs中,客户端上传文件时,文件ID不是由客户端指定,而是由storage生成后返回给客户端的。文件ID中包含了组名、文件相对路径和文件名,storage可以根据文件ID直接定位到文件。因此fastdfs集群中根本不需要存储文件索引信息。
6.fastdfs采用了分组存储方式。集群由一个或多个组构成,集群存储总容量为集群中所有组的存储容量之和。一个组由一台或多台存储服务器组成,同组内的多台storage之间是互备关系,同组存储服务器上的文件是完全一致的。文件上传、下载、删除等操作可以在组内任意一台storage上进行。
7.fastdfs中tracker和storage两部分都是采用对等结构的,集群中每台tracker不需要互相通信,而storage,为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起 到了冗余备份和负载均衡的作用。
8.fastdfs的storage采用binlog的方式记录文件的变更,以便文件的同步。文件的同步只在同组内的storage之间进行,采用push方式,即源头服务器同步给目标服务器。只有源头数据才需要同步,备份数据并不需要再次同步,否则就构成环路了。有个例外,就是新增加一台Storage server时,由已有的一台Storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器,Storage server中由专门的线程根据binlog进行文件同步。为了最大程度地避免相互影响以及出于系统简洁性考虑,Storage server对组内除自己以外的每台服务器都会启动一个线程来进行文件同步。文件同步采用增量同步方式,系统记录已同步的位置(binlog文件偏移量)到标识文件中。标识文件名格式:{dest storage IP}_{port}.mark,例如:xxx.xxx.xxx.xxx_2000.mark。
fastdfs系统结构图,以及上传下载原理图如下:
(一)编译安装
yum -y install ld*
cd /data/sofware
wget
tar -zxvf libevent-2.0.14-stable.tar.gz
cd libevent-2.0.14-stable
./configure --prefix=/usr/local/libevent-2.0.14 && make && make install
cd /data/software
wget
tar -zxvf FastDFS_v3.02.tar.gz
cd FastDFS
vi make.sh
TARGET_PREFIX=/usr/local/FastDFS
TARGET_CONF_PATH=/etc/fdfs
WITH_HTTPD=1
WITH_LINUX_SERVICE=1
./make.sh C_INCLUDE_PATH=/usr/local/libevent-2.0.14/include LIBRARY_PATH=/usr/local/libevent-2.0.14/lib
./make.sh install
ls /etc/fdfs/
client.conf http.conf mime.types storage.conf tracker.conf
(二)tracker配置文件
vi /etc/fdfs/tracker.conf
bind_addr=192.168.191.128
base_path=/home/data/fastdfs_tracker
vi /etc/fdfs/http.conf
grep -v '^#' /etc/fdfs/http.conf |grep -v '^$'
http.default_content_type = application/octet-stream
http.mime_types_filename=/etc/fdfs/mime.types
http.anti_steal.check_token=false
http.anti_steal.token_ttl=900
http.anti_steal.secret_key=FastDFS1234567890
http.anti_steal.token_check_fail=/home/data/fastdfs/conf/anti-steal.jpg
(三)启动tracker服务,需要注意tracker.conf文件最后一行为#include httpd.conf
echo '/usr/local/libevent-2.0.14/include/' >> /etc/ld.so.conf
echo '/usr/local/libevent-2.0.14/lib/' >> /etc/ld.so.conf
mkdir -p /home/data/fastdfs_tracker
vi /etc/fdfs/tracker.conf
把最后一行空格去掉,把##include http.conf 改成 #include http.conf
/usr/local/FastDFS/bin/fdfs_trackerd /etc/fdfs/tracker.conf
(四)启动storage服务,需要注意tracker.conf文件最后一行为#include httpd.conf
vi /etc/fdfs/storage.conf
base_path=/home/data/fastdfs_storage
store_path0=/home/data/fastdfs_storage
tracker_server=192.168.191.129:22122
mkdir -p /home/data/fastdfs_storage
echo '/usr/local/libevent-2.0.14/include/' >> /etc/ld.so.conf
echo '/usr/local/libevent-2.0.14/lib/' >> /etc/ld.so.conf
ldconfig
/usr/local/FastDFS/bin/fdfs_storaged /etc/fdfs/storage.conf
(五)修改client端的配置文件
vi /etc/fdfs/client.conf
base_path=/home/data/fastdfs_client
tracker_server=192.168.191.129:22122
mkdir -p /home/data/fastdfs_client
(六)上传下载测试
1、上传
/usr/local/FastDFS/bin/fdfs_test /etc/fdfs/client.conf upload /etc/passwd
This is FastDFS client test program v3.02
Copyright (C) 2008, Happy Fish / YuQing
FastDFS may be copied only under the terms of the GNU General
Public License V3, which may be found in the FastDFS source kit.
Please visit the FastDFS Home Page
for more detail.
[2014-02-21 00:47:29] INFO - base_path=/home/data/fastdfs, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0
tracker_query_storage_store_list_without_group:
server 1. group_name=group1, ip_addr=192.168.191.128, port=23000
group_name=group1, ip_addr=192.168.191.128, port=23000
storage_upload_by_filename
group_name=group1, remote_filename=M00/00/00/wKi_gFMGMaGcqsCOAAAGDfLMHzM0848429
source ip address: 192.168.191.128
file timestamp=2014-02-21 00:47:29
file size=1549
file crc32=4073463603
file url:
storage_upload_slave_by_filename
group_name=group1, remote_filename=M00/00/00/wKi_gFMGMaGcqsCOAAAGDfLMHzM0848429_big
source ip address: 192.168.191.128
file timestamp=2014-02-21 00:47:29
file size=1549
file crc32=4073463603
file url: _big
2、下载:
(1)直接在浏览器上输入:_big,如果无法下载尝试关闭服务器的防火墙
(2)命令输入:/usr/local/bin/fdfs_test /etc/fdfs/client.conf download group1 M00/00/00/wKi_gFMGMaGcqsCOAAAGDfLMHzM0848429_big