FasteDFS

分布式文件系统 

q  mogileFSKey-Value型元文件系统,不支持FUSE,应用程序访问它时需要API,主要用在web领域处理海量小图片,效率相比mooseFS高很多。

q  fastDFS:国人在mogileFS的基础上进行改进的key-value型文件系统,同样不支持FUSE,提供比mogileFS更好的性能(小文件存储)。

q  mooseFS:支持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国内用的人比较多

q  glusterFS:支持FUSE,比mooseFS庞大,这个主要做大文件存储。

q  ceph:支持FUSE,客户端已经进入了linux-2.6.34内核,也就是说可以像ext3/rasierFS一样,选择ceph为文件系统。彻底的分布式,没有单点依赖,用C编写,性能较好。基于不成熟的btrfs,其本身也非常不成熟。

q  lustreOracle公司的企业级产品,非常庞大,对内核和ext3深度依赖

q  NFS:老牌网络文件系统,NFS最近几年没发展,肯定不能用,性能比较差。

FasteDFS介绍

FastDFS是一个开源的,高性能的的分布式文件系统,他主要的功能包括:文件存储,同步和访问,设计基于高可用和负载均衡,FastDFS非常适用于基于文件服务的站点,例如图片分享和视频分享网站

FastDFS有两个角色:跟踪服务(tracker)和存储服务(storage),跟踪服务控制,调度文件以负载均衡的方式访问;存储服务包括:文件存储,文件同步,提供文件访问接口,同时以key value的方式管理文件的元数据

跟踪和存储服务可以由1台或者多台服务器组成,同时可以动态的添加,删除跟踪和存储服务而不会对在线的服务产生影响,在集群中,tracker服务是对等的

存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

FasteDFS特性

q  C实现,支持LinuxFreeBSDUNIX系统

q  googleFS,不是通用的文件系统,只能通过专有API访问,目前提供了C,Java,PHP API

q  为互联网应用量身定做,追求高性能和高扩展性

q  FastDFS可以看作是基于文件的key value pair存储系统,是分布式文件存储服务

FastDFS  适合4k<文件<500M 大小的文件存储

 

FasteDFS架构图

                                              image.png

1.       Tracker cluster中各个tracker server相互独立,不进行相互通信。

2.       Storage cluster中各个storage组(group1,group2...)相互独立,不进行相互通信,也就是说各个组之间保存的数据是不相同的。但是各个组中的storage server之间是属于互相备份的关系,也就是说storage server之间保存相同的数据

3.       每个storage server会启动一个单独的线程主动向Tracker cluster中每个tracker server报告其状态信息,包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息。

image.png

q  上传

1.      Client通过Tracker server将文件上传到Storage server

2.      Tracker serverClient返回一台可用的Storage serverIP地址和端口号。

3.      Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。

4.      上传完成,Storage server返回Client一个文件ID,文件上传结束。

q  下载

1.     Client通过Tracker server下载指定Storage组中某个Storage server上的某个文件(文件名包括Storage组名称)。

2.     Tracker serverClient返回一台可用的Storage serverIP地址和端口号。

3.     Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件下载

 

上传文件时,文件IDstorage server生成并返回给client

文件ID包含了组名和文件名,storage server 可以直接根据该文件名定位到文件。

image.png

FasteDFS安装

所有节点都需要按照如下步骤安装

libfastcommon

yum install gcc gcc-c++ make -y
cd /usr/local/src/
wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
tar xf V1.0.7
cd libfastcommon-1.0.7/
./make.sh
./make.sh install
cd ../
# 文件名可能有时候不太一样。

FastDFS

wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
tar xf V5.05
cd fastdfs-5.05/
./make.sh
./make.sh install
# 文件名可能有时候不太一样。

 

FasteDFS配置

         这里需要注意的是,我的storagetracker在一台机器上如果是分开的做的话,就是修改单独的,然后启动tracker或者storage就可以了。

修改启动脚本

ls -l /etc/init.d/fdfs*
sed -i 's#/usr/local/bin#/usr/bin#g'  /etc/init.d/fdfs_storaged
sed -i 's#/usr/local/bin#/usr/bin#g'  /etc/init.d/fdfs_trackerd

创建存储和跟踪目录

mkdir /data/fdfs_tracker -p
mkdir /data/fdfs_storage -p
cd /data/fdfs_storage/
mkdir -p base store

修改配置文件

q  复制默认的配置文件

cd /etc/fdfs
cp storage.conf.sample storage.conf
cp tracker.conf.sample  tracker.conf

q  修改tracker.conf配置文件

vim /etc/fdfs/tracker.conf
 
base_path=/data/fdfs_tracker
# the method of selecting group to upload files               ###文件上传方式
# 0: round robin                                           ###轮询                   
# 1: specify group                                          ###指定组
# 2: load balance, select the max free space group to upload file ###负载均衡,选择剩余存储空间最大的机器存储,为默认选项
store_lookup=2
# which storage server to upload file                       ###选择哪个存储server上传文件
# 0: round robin (default)                                   ###轮询
# 1: the first server order by ip address                     ###指定IP
# 2: the first server order by priority (the minimal)           ###权重
store_server=0                                          ###默认为0

q  修改storage.conf配置文件

vim /etc/fdfs/storage.conf


base_path=/data/fdfs_storage/base
store_path0=/data/fdfs_storage/store
tracker_server=192.168.56.15:22122, 192.168.56.16:22122

创建client文件

cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf
vim /etc/fdfs/client.conf
 
base_path=/tmp/
tracker_server=192.168.56.15:22122

比对修改后的文件

q  client文件

cd /etc/fdfs/
diff client.conf client.conf.sample
10c10
< base_path=/tmp/
---
> base_path=/home/yuqing/fastdfs
14,15c14
< tracker_server=192.168.56.15:22122
---
> tracker_server=192.168.0.197:22122

q  tracker文件

diff tracker.conf tracker.conf.sample
22c22
< base_path=/data/fdfs_tracker
---
> base_path=/home/yuqing/fastdfs

q  storage文件

diff storage.conf storage.conf.sample
41c41
< base_path=/data/fdfs_storage/base
---
> base_path=/home/yuqing/fastdfs
109c109
< store_path0=/data/fdfs_storage/store
---
> store_path0=/home/yuqing/fastdfs
118,119c118
< tracker_server=192.168.56.15:22122
---
> tracker_server=192.168.209.121:22122

FasteDFS启动测试

启动


/etc/init.d/fdfs_trackerd start
/etc/init.d/fdfs_storaged start
netstat -lntup|grep 22122
netstat -lntup|grep 23000 #启动速度会比较慢。

测试

         上传

[root@local-test-node2 ~]# echo "123" >test.log
[root@local-test-node2 ~]# fdfs_upload_file /etc/fdfs/client.conf /root/test.log
group1/M00/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log
[root@local-test-node2 ~]# ll /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log
-rw-r--r-- 1 root root 4 May  3 02:41 /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log
[root@local-test-node2 ~]# cat /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log
123
[root@local-test-node2 ~]# md5sum /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log
ba1f2511fc30423bdbb183fe33f3dd0f  /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log
[root@local-test-node2 ~]# md5sum test.log
ba1f2511fc30423bdbb183fe33f3dd0f  test.log

下载

[root@local-test-node2 ~]# fdfs_download_file /etc/fdfs/client.conf  group1/M00/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log
[root@local-test-node2 ~]# ll
total 48
-rw-------. 1 root root  3604 Jan 10 10:57 anaconda-ks.cfg
-rw-r--r--. 1 root root 21569 Jan 10 10:57 install.log
-rw-r--r--. 1 root root  5820 Jan 10 10:56 install.log.syslog
-rw-r--r--  1 root root     4 May  3 02:41 test.log
-rw-r--r--  1 root root     4 May  3 02:42 wKg4D1kI0uKARKLQAAAABFqCAvc328.log
[root@local-test-node2 ~]# cat wKg4D1kI0uKARKLQAAAABFqCAvc328.log
123

查看文件信息

[root@local-test-node2 ~]# fdfs_file_info /etc/fdfs/client.conf group1/M00/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log
source storage id: 0
source ip address: 192.168.56.15
file create timestamp: 2017-05-03 02:41:38
file size: 4
file crc32: 1518469879 (0x5A8202F7)

删除上传文件

[root@local-test-node2 ~]# fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log
[root@local-test-node2 ~]# ll /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log
ls: cannot access /data/fdfs_storage/store/data/00/00/wKg4D1kI0uKARKLQAAAABFqCAvc328.log: No such file or directory

配合Nginx使用

安装配置

q  安装Nginx和模块

yum install pcre pcre-devel openssl openssl-devel git -y
cd /usr/local/src/
curl -O https://jaist.dl.sourceforge.net/project/fastdfs/FastDFS%20Nginx%20Module%20Source%20Code/fastdfs-nginx-module_v1.16.tar.gz
tar xf fastdfs-nginx-module_v1.16.tar.gz
sed -i 's#/local/in#/in#g'  /usr/local/src/fastdfs-nginx-module/src/config
cd /usr/local/src/
useradd -s /sbin/nologin -M www
wget http://nginx.org/download/nginx-1.8.1.tar.gz
tar xf nginx-1.8.1.tar.gz
cd  /usr/local/src/nginx-1.8.1
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --add-module=/usr/local/src/fastdfs-nginx-module/src/
make && make install

 

q  复制配置文件。

cd /usr/local/src/fastdfs-nginx-module/src/
cp mod_fastdfs.conf /etc/fdfs/
cd /usr/local/src/fastdfs-5.05/conf/
cp anti-steal.jpg mime.types http.conf /etc/fdfs/
/etc/init.d/fdfs_storaged restart
/etc/init.d/fdfs_trackerd restart

 

q  修改nginx配置文件


cd /usr/local/nginx/conf/
vim nginx.conf
 
location ~/group[0-9]/ {
            root   /data/fdfs_storage/store;
            ngx_fastdfs_module;
        }       
#把这段代码写到server标签内


 

q  修改mod_fastdfs配置文件

cd /etc/fdfs/
vim mod_fastdfs.conf
 
tracker_server=192.168.56.15:22122
url_have_group_name = true
store_path0=/data/fdfs_storage/store

参考:https://github.com/happyfish100/fastdfs-nginx-module/blob/master/INSTALL

启动测试

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx

上传

[root@local-test-node2 fdfs]# cat /root/test.log
1
fda
23
[root@local-test-node2 fdfs]# fdfs_upload_file /etc/fdfs/client.conf /root/test.log
group1/M00/00/00/wKg4D1kI5Y6AWjchAAAACQuiOt0462.log

访问

[root@local-test-node2 fdfs]# curl 192.168.56.15/group1/M00/00/00/wKg4D1kI5Y6AWjchAAAACQuiOt0462.log
1
fda
23