部署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

浙公网安备 33010602011771号