-
从应用层面详解fastdfs各组件
-
fastdfs的多服务器场景使用及部署配置说明
相关的文章
1、单体安装教程 https://blog.csdn.net/suoyanming/article/details/88797360
2、开源中国fastdfs主页 p/fastdfs
3、github主页(不确定是否是原作者维护) happyfish100/fastdfs
4、对fastdfs-nginx-module 实现原理讲的非常清楚 https://www.cnblogs.com/littleatp/p/4361318.html
一、FastDFS
1、FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
2、FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
二、深入认识FastDFS
- 任何一个中间件的应用,都必须深入了解该中间件内部各组件的承担的功能角色、运行机制,能深入了解各组件的实现原理更好。这样才能灵活应对实际应用场景、多变的业务需求、生产环境应急等问题,快速实施架构调整。
- 我们一直在使用FastDFS作为图片文件数据库,部署架构为单体(即:一个tracker、一个storage、一个group),由于本次用于部署fastdfs的服务器硬盘空间报警,当务之急必须更改fastdfs部署架构,扩展存储。
- 下面从项目总体情况、tracker 、storage、fastdfs-nginx-module 、group 组件详细说明其功能角色及运行机制
1、项目总体情况
- fastdfs是开源的项目
- 通过github源码可看出,该项目是基于C语言开发的
- fastdfs是基于操作系统OS的文件管理系统功能之上进行分布式文件管理(Linux、FreeBSD等),通过看文件在硬盘的保存方式也可以得出
- 提供C、Java和PHP API接口
2、tracker跟踪器
-
主要做调度工作, 起负载均衡的作用
-
在内存中记录集群中所有存储组group和存储服务器storage 的状态信息, 是客户端和数据服务器交互的枢纽
-
tracker的核心工作内容:
(1) 记录集群中有多少个group(group1\group2....)
(2) 每个group 分布在那个几个storage上,以及storage所在机器的ip,端口等信息,group之间的同步由tracker 和storage一起完成(后面细讲)
(3)如果同一个group 存在多个storage, 而这些storage又被分布在一台或多台机器上,那么对该group上传或读取文件具体落到那个机器上(即那个storage)?(有点绕)
tracker完美的解决了这个问题,即对分布式部署架构下:多group、多storage的上传和下载做负载均衡策略,通过配置tracker.conf可实现具体负载均衡策略
(4) tracker 可部署多台,多个tracker在服务器内存中记录的信息是一样的,通过nginx对tracker做负载均衡,以提高并发性能及容灾能力
(5)tracker 不去主动读取storage的相关信息,而是由storage主动推送给tracker (这也是为什么必须先启动tracker的原因)
(6)以下图片摘自网上 : 上传文件过程 、下载文件过程,通过图片可以看到,tracker的核心工作是为客户端找到一个storage, client客户端和storage进行上传下载通信。
-
tracker.conf (在分布式部署架构下,通过tracker负载均衡给client端返回特定storage信息,而负载均衡的策略配置主要在tracker.conf中)
-
1)核心参数配置说明
(1)disabled=false
#配置文件是否失效
# is this config file disabled
# false for enabled
# true for disabled disabled=false
# is this config file disabled # false for enabled # true for disabled
(2)port=22122
#服务端口
# the tracker server port
(3) base_path=/data/fastdfs/tracker
# 存放track 数据及日志文件目录
# the base path to store data and log files
(4)work_threads=4
#时线程数:一般和cpu的个数设为同一个值
# work thread count, should <= max_connections
# default value is 4
# since V2.00
(4)(重要) store_lookup=1
# 上传文件选择哪个一个group 的 策略:0:轮询;1:指定组 ; 2: 负载均衡,选择剩余存储空间最大的组group 上传文件
# 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
(5)(重要) store_group=group2
# 当 store_lookup=1 时,该配置有效,指定存储的组名
# which group to upload file
# when store_lookup set to 1, must set store_group to the group name
(6)(重要) store_server=0
# 应用场景: 存在多个相同的组,例如group1 , 在多个storage 服务器上 例如:192.168.0.171 、,
当上传文件时优先选择那个storage的策略配置:~ 0:轮询 ;1:按ip升序排序后选择第一个ip,即最小的那个ip (192.168.0.164);2:按优先级排列的第一个服务器顺序,数字越小优先级越 高,storage服务器的优先在storage.conf中配置 upload_priority 参数
# which storage server to upload file
# 0: round robin (default)
# 1: the first server order by ip address
# 2: the first server order by priority (the minimal)
(7)(重要) store_path=0
# 应用场景:选择具体一个组的那一条存储路径(一个group有多条存储路径,一般一个服务器有两块大硬盘挂载到了两个路径下,专门用来存放文件),~0:轮询,2:负载均衡,选择剩余空间最大的路径
(逻辑~重要) 通过上面的配置参数确定了3件事的基础上,该配置才会起作用:
(1)确定了要存储在那个group上,例如group1;(2)确定上传文件要保存在那一台storage 中的group1,假如是192.168.0.171;(3) 此时如果 192.168.0.171 上的storage server中group1 有两个存储路径,即store_path0,store_path1,(对应的文件路径即M00,M01)
# which path(means disk or mount point) of the storage server to upload file
# 0: round robin
# 2: load balance, select the max free space path to upload file
(8)download_server=0
# 下载文件时存储服务器的选择策略; 应用场景:要下载的文件所在group 存在多个storage 服务器上, ~0:轮询 ;1:当前文件上载到的源存储服务器
# which storage server to download file
# 0: round robin (default)
# 1: the source storage server which the current file uploade