部署FastDFS分布式文件系统

FastDFS简介

FastDFS 是一个开源的高性能分布式文件系统(DFS)。 它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

FastDFS架构的原理图:

FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

 Tracker Server:跟踪服务器,主要做调度工作,起到均衡的作用;负责管理所有的 storage server和 group,每个 storage 在启动后会连接 Tracker,告知自己所属group 等信息,并保持周期性心跳。

 Storage Server:存储服务器,主要提供容量和备份服务;以 group 为单位,每个 group 内可以有多台 storage server,数据互为备份。

 Client:客户端,上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。比如c、java、php等客户端

FastDFS的存储策略

为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。

在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

FastDFS的上传过程

FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。

Storage Server会定期的向Tracker Server发送自己的存储信息。当Tracker Server Cluster中的Tracker Server不止一个时,各个Tracker之间的关系是对等的,所以客户端上传时可以选择任意一个Tracker。

fdfs文件上传原理图:

当Tracker收到客户端上传文件的请求时,会为该文件分配一个可以存储文件的group,当选定了group后就要决定给客户端分配group中的哪一个storage server。当分配好storage server后,客户端向storage发送写文件请求,storage将会为文件分配一个数据存储目录。然后为文件分配一个fileid,最后根据以上的信息生成文件名存储文件。

FastDFS的文件下载

客户端uploadfile成功后,会拿到一个storage生成的文件名,接下来客户端根据这个文件名即可访问到该文件。

fdfs文件下载原理图:

跟upload file一样,在downloadfile时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。

FastDFS的文件同步

写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。

每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。

storage的同步进度会作为元数据的一部分汇报到tracker上,tracke在选择读storage的时候会以同步进度作为参考。

FastDFS部署

部署环境如下

主机名 IP地址 角色
linux-node1 192.168.80.171 fdfs_trackerd 
linux-node2 192.168.80.172 fdfs_trackerd  fdfs_storaged
linux-node3 192.168.80.173 fdfs_storaged
linux-node4 192.168.80.174 fdfs_storaged
linux-node5 192.168.80.175 fdfs_storaged
linux-node6 192.168.80.190 fdfs_storaged  fdfs_client

 

 

 

 

 

 

 

1、安装fastdfs和fastdfs依赖的内部库,所有的设备都要做同样的安装操作。下面以linux-node1部署fdfs为例

[root@linux-node1 ~]# cd  /tools/
#安装fastdfs依赖的基础库
[root@linux-node1 tools]# git clone https://github.com/happyfish100/libfastcommon.git
[root@linux-node1 tools]# cd  libfastcommon/
[root@linux-node1 libfastcommon]# ./make.sh 
[root@linux-node1 libfastcommon]# ./make.sh  install
#安装fastdfs
[root@linux-node1 tools]# git  clone https://github.com/happyfish100/fastdfs.git
[root@linux-node1 tools]# cd fastdfs/
[root@linux-node1 fastdfs]# ./make.sh
[root@linux-node1 fastdfs]# ./make.sh install

2、创建存储日志和数据目录

#在fdfs_trackerd 服务器上创建存储追踪服务的日志和数据目录
[root@linux-node1 fdfs]# mkdir  -p  /data/fdfs/tracker
#在fdfs_storaged 服务器上创建存储村粗服务器的日志和数据目录
[root@linux-node2 ~]# mkdir -p /data/fdfs/storage/base
[root@linux-node2 ~]# mkdir -p /data/fdfs/storage/store

3、部署fdfs_trackerd服务

 在linux-node1和linux-node2节点部署dfs_trackerd服务

#安装好fastdfs后,它的配置文件对应的目录为/etc/fdfs,启动的命令对应的目录为/usr/bin,服务的启动脚本对应的目录为/etc/init.d/下
#修改tracker.conf配置文件
[root@linux-node1 fdfs]# cp  tracker.conf.sample tracker.conf
#修改tracker.conf,主要修改base_path,其他暂时保持默认即可,当然也可设置日志轮询
[root@linux-node1 ~]# egrep  -v  "^#|^$"  /etc/fdfs/tracker.conf
disabled=false
bind_addr=
port=22122
connect_timeout=10
network_timeout=60
base_path=/data/fdfs/tracker
max_connections=1024
accept_threads=1
work_threads=4
min_buff_size = 8KB
max_buff_size = 128KB
store_lookup=2
store_group=group2
store_server=0
store_path=0
download_server=0
reserved_storage_space = 10%
log_level=info
run_by_group=
run_by_user=
allow_hosts=*
sync_log_buff_interval = 10
check_active_interval = 120
thread_stack_size = 64KB
storage_ip_changed_auto_adjust = true
storage_sync_file_max_delay = 86400
storage_sync_file_max_time = 300
use_trunk_file = false 
slot_min_size = 256
slot_max_size = 16MB
trunk_file_size = 64MB
trunk_create_file_advance = false
trunk_create_file_time_base = 02:00
trunk_create_file_interval = 86400
trunk_create_file_space_threshold = 20G
trunk_init_check_occupying = false
trunk_init_reload_from_binlog = false
trunk_compress_binlog_min_interval = 0
use_storage_id = false
storage_ids_filename = storage_ids.conf
id_type_in_filename = ip
store_slave_file_use_link = false
rotate_error_log = false
error_log_rotate_time=00:00
rotate_error_log_size = 0
log_file_keep_days = 0
use_connection_pool = false
connection_pool_max_idle_time = 3600
http.server_port=8080
http.check_alive_interval=30
http.check_alive_type=tcp
http.check_alive_uri=/status.html

#启动fdfs_trackerd服务,老版本要启动fdfs_trackerd服务的话,需要修改启动命令的位置,将/usr/local/bin改成/usr/bin
#我们这里使用的是新版本的fastdfs,官方已经做了调整,所以保持不变,直接启动fdfs_trackerd服务即可
[root@linux-node1 ~]# /etc/init.d/fdfs_trackerd start

4、部署fdfs_storaged服务

linux-node2和linux-node3作为group1提供存储服务,linux-node4、linux-node5和linux-node6作为group2提供存储服务。下面以linux-node2作为存储服务来部署,其他数据存储服务器配置类似

[root@linux-node2 ~]# cd  /etc/fdfs/
[root@linux-node2 fdfs]# cp  storage.conf.sample storage.conf
#修改storage.conf,主要对组的修改,存储日志和数据目录的修改,设定tracker服务的地址等
[root@linux-node2 fdfs]# vim  storage.conf
group_name=group1
base_path=/data/fdfs/storage/base
store_path0=/data/fdfs/storage/store
tracker_server=192.168.80.171:22122
tracker_server=192.168.80.172:22122
#启动存储服务器的存储服务
[root@linux-node2 fdfs]# fdfs_trackerd /etc/fdfs/storage.conf  start
[root@linux-node2 fdfs]# netstat -lntup
tcp        0      0 0.0.0.0:22122               0.0.0.0:*                   LISTEN      31877/fdfs_trackerd 
tcp        0      0 0.0.0.0:23000               0.0.0.0:*                   LISTEN      59209/fdfs_storaged

 Storage 启动成功后,在base_path 下创建了data、logs目录,记录着 Storage Server 的信息。

 对于上传的文件,会存储在存储服务器的/data/fdfs/storage/store/data/目录中,在这个目录中创建了N*N个子目录,上传的文件就存储在某个子目录中。

[root@linux-node2 ~]# ls /data/fdfs/storage/store/data/
00  0D  1A  27  34  41  4E  5B  68  75  82  8F  9C  A9  B6  C3  D0  DD  EA  F7
01  0E  1B  28  35  42  4F  5C  69  76  83  90  9D  AA  B7  C4  D1  DE  EB  F8
02  0F  1C  29  36  43  50  5D  6A  77  84  91  9E  AB  B8  C5  D2  DF  EC  F9
03  10  1D  2A  37  44  51  5E  6B  78  85  92  9F  AC  B9  C6  D3  E0  ED  FA
04  11  1E  2B  38  45  52  5F  6C  79  86  93  A0  AD  BA  C7  D4  E1  EE  FB
05  12  1F  2C  39  46  53  60  6D  7A  87  94  A1  AE  BB  C8  D5  E2  EF  FC
06  13  20  2D  3A  47  54  61  6E  7B  88  95  A2  AF  BC  C9  D6  E3  F0  FD
07  14  21  2E  3B  48  55  62  6F  7C  89  96  A3  B0  BD  CA  D7  E4  F1  FE
08  15  22  2F  3C  49  56  63  70  7D  8A  97  A4  B1  BE  CB  D8  E5  F2  FF
09  16  23  30  3D  4A  57  64  71  7E  8B  98  A5  B2  BF  CC  D9  E6  F3
0A  17  24  31  3E  4B  58  65  72  7F  8C  99  A6  B3  C0  CD  DA  E7  F4
0B  18  25  32  3F  4C  59  66  73  80  8D  9A  A7  B4  C1  CE  DB  E8  F5
0C  19  26  33  40  4D  5A  67  74  81  8E  9B  A8  B5  C2  CF  DC  E9  F6

5、部署fastDFS的客户端

 这里以linux-node6为例部署客户端

[root@linux-node6 ~# cd  /etc/fdfs/
[root@linux-node6 fdfs]# cp  client.conf.sample client.conf
#主要修改客户端配置文件中的数据和日志存放目录和设定tracker服务对应的地址
[root@linux-node6 fdfs]# vim  client.conf
# the base path to store log files
base_path=/tmp/

# tracker_server can ocur more than once, and tracker_server format is
#  "host:port", host can be hostname or ip address
tracker_server=192.168.80.171:22122
tracker_server=192.168.80.172:22122

6、测试文件上传、下载、追加操作

#上传操作
[root@linux-node6 ~]# echo  "test fdfs-data" > goser.txt
[root@linux-node6 ~]# fdfs_upload_file  /etc/fdfs/client.conf  goser.txt 
group1/M00/00/00/wKhQrVuSK1qAQX9EAAAAD3jAmxg898.txt
#下载操作
[root@linux-node6 ~]# fdfs_download_file  /etc/fdfs/client.conf  group1/M00/00/00/wKhQrVuSK1qAQX9EAAAAD3jAmxg898.txt
#验证上传到fastdfs文件系统和源文件是否一致,通过MD5来验证
[root@linux-node6 ~]# md5sum   goser.txt 
13e6f54a824c62782be75d03385a7a05  goser.txt
[root@linux-node6 ~]# md5sum  wKhQrVuSK1qAQX9EAAAAD3jAmxg898.txt 
13e6f54a824c62782be75d03385a7a05  wKhQrVuSK1qAQX9EAAAAD3jAmxg898.txt
#追加操作
[root@linux-node6 ~]# echo  hello   test1.txt
hello test1.txt
[root@linux-node6 ~]# echo  world  test2.txt
world test2.txt
[root@linux-node6 ~]# fdfs_upload_appender /etc/fdfs/client.conf test1.txt
group1/M00/00/00/wKhQrVuSLq2EEjLeAAAAADY6MCA342.txt
KhQrVuSLq2EEjLeAAAAADY6MCA342.txt  test2.txt 
[root@linux-node6 ~]# fdfs_download_file /etc/fdfs/client.conf  group1/M00/00/00/wKhQrVuSLq2EEjLeAAAAADY6MCA342.txt
[root@linux-node6 ~]# cat wKhQrVuSLq2EEjLeAAAAADY6MCA342.txt 
hello
world
#还是通过监控命令来查看存储服务器的状态
[root@linux-node6 ~]# fdfs_monitor /etc/fdfs/client.conf

FastDFS配置 fastdfs-nginx-module模块

1、fastdfs-nginx-module 模块说明

  FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储, 但是同组存储服务器之间需要进行文件复制, 有同步延迟的问题。假设 Tracker 服务器将文件上传到了 192.168.80.172,上传成功后文件 ID已经返回给客户端,此时 FastDFS 存储集群机制会将这个文件同步到同组存储 192.168.80.173,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 192.168.80.173上取文件,就会出现文件无法访问的错误。

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

2、配置nginx服务添加fastdfs-nginx-module模块

#在fdfs_storaged服务器上下载fastdfs-nginx-module模块
[root@linux-node3 ~]# cd  /tools/
[root@linux-node3 tools]# git  clone https://github.com/happyfish100/fastdfs-nginx-module.git
[root@linux-node3 tools]# mv fastdfs-nginx-module  /application/nginx/extra/modules/
#如果fdfs_storaged服务器上已经部署nginx服务,需要重新编译安装nginx服务。
#在./configure时候添加fastdfs-nginx-module将fastdfs-nginx-module模块配置到nginx服务中。
[root@linux-node3 tools]# cd  nginx-1.12.2
[root@linux-node3 nginx-1.12.2]# ./configure --prefix=/application/nginx-1.12.2 --user=www --group=www --with-http_stub_status_module --with-http_ssl_module --add-module=/application/nginx/extra/modules/ngx_devel_kit/ --add-module=/application/nginx/extra/modules/lua-nginx-module/ --with-file-aio --with-http_dav_module --add-module=/application/nginx/extra/modules/fastdfs-nginx-module/src/
[root@linux-node3 nginx-1.12.2]# make  &&  make  install
#复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录,并做如下修改,其他参数保持默认
[root@linux-node3 nginx-1.12.2]# cd  /application/nginx/extra/modules/fastdfs-nginx-module/src/
[root@linux-node3 src]# cp  mod_fastdfs.conf /etc/fdfs/
[root@linux-node3 src]# cd  /etc/fdfs/
[root@linux-node3 fdfs]# vim mod_fastdfs.conf 
connect_timeout=10
group_name=group1                 #当前服务器的group名
url_have_group_name = true        #文件url中是否有group名
tracker_server=192.168.80.171:22122
tracker_server=192.168.80.172:22122
store_path0=/data/fdfs/storage/store   #数据存储路径
group_count = 2                   #设置组的个数
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/data/fdfs/storage/store

[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/data/fdfs/storage/store
#复制 FastDFS 的部分配置文件到/etc/fdfs 目录
[root@linux-node3 ~]# cd  /tools/fastdfs/conf/
[root@linux-node3 conf]# cp  anti-steal.jpg mime.types http.conf /etc/fdfs/
#配置nginx,修改nginx.conf
[root@linux-node3 conf]# cd  /application/nginx/conf/
[root@linux-node3 conf]# vim  extra/www.conf 
       #location 的配置,如果有多个group则配置location ~/group([0-9])/M00 ,没有则不用配group。
        location ~/group[1-9]/M00{
           root  /data/fdfs/storage/store/data;
           ngx_fastdfs_module;
        }

#启动nginx服务,启动成功会显示ngx_fastdfs模块的进程号
[root@linux-node3 conf]# /application/nginx/sbin/nginx  
ngx_http_fastdfs_set pid=6351

 通过fastdfs客户端上传一个图片,然后通过url查看fastdfs_nginx_module配置是否成功

[root@linux-node6 tools]# fdfs_upload_file   /etc/fdfs/client.conf server-error.jpg 
group1/M00/00/00/wKhQrVuWE7yAcnRPAAA3J09uDBA008.jpg

 

posted @ 2018-09-07 17:06  goser  阅读(255)  评论(0)    收藏  举报