JavaEE 企业级分布式高级架构师(十五)FastDFS分布式文件服务器(1)

FastDFS介绍

传统文件存储弊端

单体架构 ⇒ 互联网文件存储 ⇒ 集群&高可用

  • 单体架构
    在这里插入图片描述
  • 改进方案:分布式文件系统(引入主题)
    在这里插入图片描述

FastDFS是什么

  • FastDFS是一个使用C语言编写的开源的高性能的分布式文件系统(Distributed File System,简称DFS)。
  • FastDFS由淘宝开发平台资深架构师余庆开发,专门为互联网量身定制,充分考虑了冗余备份负载均衡线性扩容等机制,并注重高可用高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务,功能包括:文件存储文件同步文件访问(文件上传、文件下载)等,解决了大容量存储负载均衡的问题。
  • FastDFS特别适合以中小文件(建议范围:4KB < file_size < 500MB)为载体的在线文件服务。
  • FastDFS孵化平台(ChinaUnix)版本:http://bbs.chinaunix.net/forum-240-1.html
  • 注意:FastDFS 存储的文件都是完整的一个独立文件;而 HDFS 是将一个 大文件进行切割,在每个存储点中存储一块数据。

为什么使用FastDFS

  • 互联网环境中的文件如何存储?(待完善)
不能存储本地、NFS(mount挂载)、HDFS、FastDFS、云存储(图床等)
  • 互联网环境中的文件如何进行Http访问?(待完善)
web服务器:Nginx、Apache等

FastDFS架构原理分析

架构整体分析

FastDFS系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。
在这里插入图片描述

Tracker Server跟踪服务器

  • Tracker Server 跟踪服务器,主要做调度工作,并对 Storage Server 起到负载均衡的作用;它负责管理所有的 Storage Server 和 group,每个 Storage Server 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳。
  • Tracker Server 集群包含多台服务器,集群内 Tracker Server 之间是相互平等关系同时提供服务,Tracker Server 不存在单点故障。客户端请求 Tracker Server 采用轮询方式,如果请求 Tracker 无法提供服务则换另一个 Tracker。

Storage Server存储服务器

  • Storage Server存储服务器,主要提供容量和备份服务。
  • Storage Server 集群以 group 为单位,这种存储策略的特点如下:
分组策略
  • 组与组之间的文件是相互独立的。
  • 整个存储系统中的文件容量就是所有组的文件容量累加
  • 分组策略的优势就是扩容,当系统容量不足时,可以增加来扩充存储容量(横向扩容)。
  • 采用分组存储方式的好处是灵活、可控性较强。
  • 比如上传文件时,可以由客户端直接指定上传到的组(【不建议】),也可以由 Tracker 进行调度选择。
同组策略
  • 同一个卷下的多个存储服务器的文件都是相同的
  • 同一个卷下的对个存储服务器中的文件,会由后台线程完成文件同步
  • 同组策略的好处是冗余备份负载均衡的作用。
  • 一个分组的存储服务器访问压力较大时,可以在该组增加存储服务器来扩充服务能力(纵向扩容)。
  • 注意:由于存储大小受最小存储量的服务器决定,同一个组内的存储容量最好一样,否则就是浪费空间。

Client客户端

  • Client客户端,作为业务请求的发起地,通过专有接口,使用 TCP/IP 协议与跟踪服务器或存储节点进行数据交互。
  • 它会使用 FastDFS 提供的 API 完成文件的上传和下载等操作,其实说的也是我们自己的项目号所部署的服务器。
  • 由于 FastDFS 客户端的实现中,StorageClient、TrackerClient 和 StorageClient 都不是线程安全的,而且每次调用都会 new 一个 socket 连接,调用完成后会关闭,所以不能复用
  • 在 5.05 版本中,storage 和 tracker 的默认最大连接数(max_connentions)为256,访问量一大就会超出报错,所以要根据场景,适当调整该值的大小。

文件上传流程分析

流程图

在这里插入图片描述
在这里插入图片描述

流程说明

  • tracker server 收集 storage server 的状态信息:storage server 定时向已知的 tracker server(可以多个)发送磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。storage server 会连接整个集群中所有的 tracker server,向他们报告自己的状态。
  • 选择 tracker server:当集群中不止一个 tracker server 时,由于 tracker 之间是完全对等的关系,客户端在 upload 文件时可以任意选择一个 tracker。
  • 选择存储的 group:当 tracker 接收到 upload file 的请求时,会为该文件分配一个可以存储文件的 group,支持如下选择 group 的规则
* Round robin:所有的 group 件轮询
* Specified group:指定某一个确定的 group
* Load balance:剩余存储空间多的 group 优先
  • 选择 storage server:当选定 group 后,tracker 会在 group 内选择一个 storage server 给客户端,支持如下选择 storage 的规则
* Round robin:在 group 内的所有 storage 间轮询
* First server ordered by ip:按 ip 排序
* First server ordered by priority:按优先级排序(优先级在 storage 上配置)
  • 选择 storage path:当分配好 storage server 后,客户端将向 storage 发送写文件请求,storage 将会为文件分配一个数据存储目录,支持一下规则(在 storage 配置文件中可以通过配置 store_path* 参数来设置,该参数可以设置多个,通 过 * 来区别)
* Round robin:多个存储目录间轮询
* 剩余存储空间最多的优先
  • 生成文件名:选定存储目录后,storage 会为文件生成一个文件名称,由源 storage server ip、文件创建时间、文件大小、文件 crc32 和一个随机数拼接而成,然后将这个二进制串进行 base64 编码,转换为可打印的字符串。
  • 选择两级目录:两级目录啥时候创建的?第一次连接上 tracker 时,创建 65536个目录。 当选定存储目录之后,storage 会为文件分配一个 fileid,每个存储目录下有两级 256*256 的子目录,storage 会按文件名称进行两次 hash,路由到其中一个子目录,然后将文件以 fileid 为文件名存储到该子目录下。
  • 生成 fileId:当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由 group、存储目录、两级子目录、文件名、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
    在这里插入图片描述

文件同步分析

  • 文件同步时机: 客户端将文件上传至 group 内一个 storage server 即认为写文件成功,Storage Server 写完文件后,会由后台线程去完成文件同步
  • 同步线程何时开启?: 从 Tracker Server 获取到同组 storage server 集合后,就会为除了自己之外的其他同组 storage server 分别开启同步线程。如果组内有三个 Storage Server,那么每台 Storage Server 都应该开启两个独立同步线程。
  • 同步规则总结如下
* 只在本组内的 storage server 之间进行同步。
* 源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了。
* 同步采取 push 方式,即源服务器同步给同组其他服务器。
* 上述第二条规则有个例外,就是新增加一台 storage server 时,由已有的一台 storage server 将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。

当一个文件上传成功后,客户端马上发起对该文件的下载请求(或删除请求)时,tracker是如何选定一个适用的存储服务器呢?
答:其实每个存储服务器都需要定时将自身的信息上报给tracker,这些信息就包含了本地同步时间(即:同步到的最新文件的时间戳)。
而 tracker 根据各个存储服务器的上报情况,就能够知道刚刚上传的文件,在该存储组中是否已完成了同步,在 storage server 中这些信息是以 Binlog 文件的形式存在的。

Binlog目录结构

  • 当 Storage server 启动时会创建一个 base_path/data/sync 同步目录,该目录中的文件都是和同组内的其它 Storage server 之间的同步状态文件,如:
192.168.1.2_33450.mark
192.168.1.3_33450.mark
binlog.000
binlog.index
  • 文件说明
* 192.168.1.2_33450.mark:同步状态文件,记录本机到 192.168.1.2_33450 的同步状态
* binlog.000:真实地 binlog 文件
* binlog.index:记录当前使用的 binlog 文件序号,如为10,则表示使用 binlog.010

Mark文件

  • 在 Mark 文件中内容:由 binlog_indexbinlog_offset 两项组成
binlog_index = 0
binlog_offset = 1000
  • 文件说明
以 192.168.1.2_33450.mark 为例,其中 binlog_index 表示上次同步 192.168.1.2 机器的最后一条 binlog 文件索引,binlog_offset 表示上次同步 192.168.1.2 机器的最后一条 binlog 偏移量,如果程序重启了,也只要从这个位置开始向后同步。

Binlog文件

Binlog 文件内容

在该文件中是以 binlog 日志组成,比如:

1470292943 c M00/03/61/QkIPAFdQCL-AQb_4AAIAi4iqLzk223.jpg
1470292948 C M00/03/63/QkIPAFdWPUCAfiraAAG93gO_2Ew311.png
1470292954 d M00/03/62/QkIPAFdWOyeAO3eUAABvALuMG64183.jpg
1470292959 C M00/01/23/QUIPAFdVQZ2AL_o-AAAMRBAMk3s679.jpg
1470292964 c M00/03/62/QkIPAFdVOsCAcxeQAAGTdbQsdVs062.jpg
1470292969 c M00/03/62/QkIPAFdVOnKAXu1NAABq9pkfsms63.jpeg
1470293326 D M00/03/62/QkIPAFdVMnGAZYSZAABq9pkfsms33.jpeg
文件说明

其中的每一条记录都是使用【空格符】分成三个字段,分别为:

  • 第一个字段,表示文件 upload 时间戳 如:1470292943
  • 第二个字段,表示文件执行操作,值为下面几种(其中源表示客户端直接操作的那个 Storage 即为源,其他的 Storage 都为副本)
C 表示源创建、c 表示副本创建
A 表示源追加、a 表示副本追加
D 表示源删除、d 表示副本删除
T 表示源Truncate、t 表示副本Truncate
  • 第三个字段,表示文件,如 M00/03/61/QkIPAFdQCL-AQb_4AAIAi4iqLzk223.jpg

Binlog同步过程

从 fastdfs 文件同步原理中我们知道 Storaged server 之间的同步都是由一个独立线程负责的,这个线程中的所有操作都是以同步方式执行的。比如一组服务器有 A、B、C 三台机器,那么在每台机器上都有两个线程负责同步,如 A 机器,线程 1 负责同步数据到 B,线程 2 负责同步数据到 C。每个同步线程负责到一台 Storage 的同步,以阻塞方式进行。

获取组内的其它 Storage 信息,并启动同步线程

在 Storage.conf 配置文件中,只配置了 Tracker 的 IP 地址,并没有配置组内其他的 Storage。因此同组的其他 Storage 必须从 Tracker 获取。具体过程如下:

  • Storage 启动时为每一个配置的 Tracker 启动一个线程负责与该 Tracker 的通讯。
  • 默认每间隔 30 秒,与 Tracker 发送一次心跳包,在心跳包的回复中,将会有该组内的其他 Storage 信息。
  • Storage 获取到同组的其他 Storage 信息之后,为组内的每个其他 Storage 开启一个线程负责同步。
同步线程执行过程

每个同步线程负责到一台 Storage 的同步,以阻塞方式进行。

  • 打开对应 Storage 的 mark 文件,如负责到 10.0.1.1 的同步则打开 10.0.1.1_23000.mark 文件,从中读取 binlog_index、binlog_offset 两个字段值,如取到值为:1、100,那么就打开 binlog.001 文件,seek 到 100 这个位置。
  • 进入一个 while 循环,尝试着读取一行,若读取不到则睡眠等待。若读取到一行,并且该行的操作方式为源操作,如C、A、D、T(大写的都是),则将该行指定的操作同步给对方(非源操作不需要同步),同步成功后更新 binlog_offset 标志,该值会定期写入到 10.0.1.1_23000.mark 文件之中。
同步前删除

假如同步较为缓慢,那么有可能在开始同步一个文件之前,该文件已经被客户端删除,此时同步线程将打印一条日志,然后直接接着处理后面的 Binlog。

文件同步时间戳

举个例子:一组内有 Storage-A、Storage-B、Storage-C 三台机器。对于 A 这台机器来说,B 与 C 机器都会同步 Binlog(包括文件)给他,A 在接受同步时会记录每台机器同步给他的最后时间(也就是 Binlog 中的第一个字段 timpstamp)。比如 B 最后同步给 A 的 Binlog-timestamp 为 100,C 最后同步给 A 的 Binlog-timestamp 为 200,那么 A 机器的最后最早被同步时间就为100。
这个值的意义在于,判断一个文件是否存在某个 Storage 上。比如这里 A 机器的最后最早被同步时间为 100,那么如果一个文件的创建时间为 99,就可以肯定这个文件在 A 上肯定有。为什呢?一个文件会 Upload 到组内三台机器的任何一台上:

  • 若这个文件是直接 Upload 到 A 上,那么 A 肯定有。
  • 若这个文件是 Upload 到 B 上,由于 B 同步给 A 的最后时间为 100,也就是说在 100 之前的文件都已经同步 A 了,那么 A 肯定有。
  • 同理 C 也一样。

Storage 会定期将每台机器同步给他的最后时间告诉给 Tracker,Tracker 在客户端要下载一个文件时,需要判断一个 Storage 是否有该文件,只要解析文件的创建时间,然后与该值作比较,若该值大于创建创建时间,说明该 Storage 存在这个文件,可以从其下载。
Tracker 也会定期将该值写入到一个文件之中,storage_sync_timestamp.dat,内容如下:

group1,10.0.0.1,0,1408524351,1408524352
group1,10.0.0.2,1408524353,0,1408524354
group1,10.0.0.3,1408524355,1408524356,0

每一行记录了,对应 Storage 同步给其他 Storage 的最后时间,如第一行表示 10.0.0.1 同步给 10.0.0.2 的最后时间为 1408524351,同步给 10.0.0.3 的最后时间为 1408524352;同理可以知道后面两行的含义了。每行中间都有一个 0,这个零表示自己同步给自己,没有记录。按照纵列看,取非零最小值就是最后最早同步时间了,如第三纵列为 10.0.0.1 被同步的时间,其中 1408524353 就是其最后最早被同步时间。

文件下载流程分析

流程图

客户端 upload le 成功后,会拿到一个 storage 生成的文件名,接下来客户端根据这个文件名即可访问到该文件。
在这里插入图片描述

流程说明

  • tracker server 收集 storage server 的状态信息: storage server 会连接整个集群中所有的 Tracker server,会向他们定时报告自己的状态:磁盘剩余空间、文件同步状况、文件上传下载次数等统计信息。
  • 选择 tracker server: 跟 upload file 一样,在 download file 时客户端可以选择任意 tracker server。
  • 选择可用的 storage server:client 发送 download 请求给某个 tracker,必须带上 fileid 信息,tracker 从 fileid 中解析出文件的 group、路径信息、文件大小、文件创建时间戳、源storage server ip 等信息,然后为该请求选择一个 storage 用来服务读请求。

由于 group 内的文件同步是在后台异步进行的,所以有可能出现在读的时候,文件还没有同步到某些 storage server 上,为了尽量避免访问到这样的 storage,tracker 按照如下规则选择 group 内可读的storage(任意满足其一即可):

  • 文件创建时间戳 == storage 被同步到的时间戳,且(当前时间-文件创建时间戳) > 文件同步最大时间(如5分钟) - 文件创建后,认为经过最大同步时间后,肯定已经同步到其他 storage了。
  • 文件创建时间戳 < storage 被同步到的时间戳。- 同步时间戳之前的文件确定已经同步了。
  • (当前时间-文件创建时间戳) > 同步延迟阀值(如一天)。 - 经过同步延迟阈值时间,认为文件肯定已经同步了。
  • 该文件上传到的源头 storage - 源头 storage 只要存活着,肯定包含这个文件,源头的地址被编码在文件名中。

storage状态收集

Storage Server 会通过配置连接集群中所有的 Tracker Server,定时向他们报告自己的状态,包括磁盘剩余空状态、服务器状态(比如文件同步状况)、文件上传下载次数等统计信息
storage server 有 7 个状态,如下:

  • FDFS_STORAGE_STATUS_INIT:初始化,尚未得到同步已有数据的源服务器
  • FDFS_STORAGE_STATUS_WAIT_SYNC:等待同步,已得到同步已有数据的源服务器
  • FDFS_STORAGE_STATUS_SYNCING:同步中
  • FDFS_STORAGE_STATUS_DELETED:已删除,该服务器从本组中摘除(注:本状态的功能尚未实现)
  • FDFS_STORAGE_STATUS_OFFLINE:离线
  • FDFS_STORAGE_STATUS_ONLINE:在线,尚不能提供服务
  • FDFS_STORAGE_STATUS_ACTIVE:在线,可以提供服务

当 storage server 的状态为 FDFS_STORAGE_STATUS_ONLINE 时,此时该 storage server 向 tracker server 发起一次 heart beat 时,tracker server 将其状态更改为 FDFS_STORAGE_STATUS_ACTIVE

新增storage server分析

组内新增加一台 storage server A 时,由系统自动完成已有数据同步,处理逻辑如下:

  • storage server A 连接 tracker server,tracker server 将 storage server A的状态设置为 FDFS_STORAGE_STATUS_INIT。storage server A 询问【追加同步】的源服务器和【追加同步】截止时间点
* 如果该组内只有 storage server A 或该组内已成功上传的文件数为 0,则没有数据需要同步,storage server A 就可以提供在线服务,此时 tracker 将其状态设置为 FDFS_STORAGE_STATUS_ONLINE
* 否则 tracker server 将其状态设置为 FDFS_STORAGE_STATUS_WAIT_SYNC,进入第二步的处理
  • 假设 tracker server 分配向 storage server A 同步已有数据的源storage server 为 B。
* 同组的 storage server 和 tracker server 通讯得知新增了 storage server A,将启动【同步线程】,并向 tracker server 询问向storage server A【追加同步】的源服务器和截止时间点。
* storage server B 将把截止时间点之前的所有数据同步给 storage server A。
* 而其余的 storage server 从截至时间点之后进行【正常同步】,只把源头数据同步给 storage server A。
* 到了截至时间点之后,storage server B 对 storage server A 的同步将由【追加同步】切换为【正常同步】,只同步源头数据。
  • storage server B 向 storage server A 同步完所有数据,暂时没有数据要同步时,storage server B 请求 tracker server 将 storage server A 的状态设置为 FDFS_STORAGE_STATUS_ONLINE
  • 当 storage server A 向 tracker server 发起 heart beat 时,tracker server将其状态更改为 FDFS_STORAGE_STATUS_ACTIVE

FastDFS安装与使用

机器配置:需要一个 tracker server 和 两个 storage server。

* Tracker Server:192.168.254.128
* Storage Server:
		group1:192.168.254.130
		group2:192.168.254.129、192.168.254.132

下载安装

wget https://github.com/happyfish100/libfastcommon/archive/V1.0.39.tar.gz
wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
  • 安装:前提要安装 gcc 环境,和 libevent,然后将压缩包解压到 /usr/apps/fastdfs 目录
cd libfastcommon-1.0.39/
./make.sh && ./make.sh install

在这里插入图片描述

cd fastdfs-5.11/
./make.sh && ./make.sh install
cp  /usr/lib64/libfastcommon.so  /usr/lib/
  • 拷贝 /usr/apps/fastdfs/fastdfs-5.11/conf 目录下的文件到 /etc/fdfs 目录下
cp /usr/apps/fastdfs/fastdfs-5.11/conf/* /etc/fdfs/

Tracker Server配置

  • 修改 /etc/fdfs/tracker.conf
    在这里插入图片描述
    在这里插入图片描述
  • base_path 目录要存在,创建 tracker 服务器上的目录:
mkdir /home/server/fastdfs/tracker -p

Storage Server配置

  • 修改 /etc/fdfs/storage.conf
    在这里插入图片描述
#指定storage的组名
group_name=group1 
base_path=/home/server/fastdfs/storage 
store_path0=/home/server/fastdfs/storage # M00虚拟磁盘路径 
#如果有多个挂载磁盘则定义多个store_path,如下 
#store_path1=...
#store_path2=...
#配置tracker服务器IP和端口 
tracker_Server=192.168.254.128:22122 
#如果有多个则配置多个tracker 
#tracker_Server=192.168.254.128:22122
  • base_path 和 store_path0 目录要存在,创建 tracker 服务器上的目录:
mkdir /home/server/fastdfs/storage -p

启动

  • 先关闭防火墙,并禁止防火墙开机启动
systemctl stop firewalld
systemctl disable firewalld
  • Tracker Server 启动命令
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
  • Storage Server 启动命令
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
  • 查看是否启动
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

常用命令

  • 集群状态检查命令
[root@localhost ~]# fdfs_monitor /etc/fdfs/storage.conf

在这里插入图片描述

  • 删除Storage
[root@localhost ~]# fdfs_monitor /etc/fdfs/storage.conf delete 组名 storage的ip
  • Tracker关闭命令:如果缺少 killall 命令,可以 yum install psmisc -y 进行安装
killall fdfs_trackerd
  • Storage关闭命令
killall fdfs_storaged
  • Tracker开机自启动
vim /etc/rc.d/rc.local
# 将运行命令行添加进文件
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
  • Storage开机自启动
vim /etc/rc.d/rc.local
# 将运行命令行添加进文件
/usr/bin/fdfs_trackerd /etc/fdfs/storage.conf

上传图片测试

FastDFS安装成功后可通过【fdfs_test】命令测试上传、下载等操作。

  • 修改 client.conf:vim /etc/fdfs/client.conf
    在这里插入图片描述
  • 创建 client 的数据目录
mkdir -p /home/server/fastdfs/client
  • 图片上传:使用 fdfs_test 命令将 /etc/fdfs/ 下的 anti-steal.jpg 上传到FastDFS中
/usr/bin/fdfs_test /etc/fdfs/client.conf upload /etc/fdfs/anti-steal.jpg

在这里插入图片描述

说明:http://192.168.254.132/group2/M00/00/00/wKj-hF0b_5eAMgA5AABdrSqbHGQ176_big.jpg 就是文件的访问路径。
对应 storage 服务器上的磁盘路径:/home/server/fastdfs/storage/data/00/00/wKj-hF0b_5eAMgA5AABdrSqbHGQ176_big.jpg
由于现在还没有和nginx整合无法使用http下载

tracker.conf

基本配置

# 该配置文件是否生效:true 生效,false 不生效
disabled=false

# 绑定IP:默认为空,绑定此主机的所有地址
bind_addr=

# tracker server 服务端口
port=22122

# 连接超时:默认 30 秒
connect_timeout=30

# 网路超时:默认 30 秒
network_timeout=60

# tracker server 数据和日志目录地址
base_path=/home/server/fastdfs/tracker

# 服务器支持的最大连接数:默认 256
max_connections=256

# 接受线程数:默认 1
# since V4.07
accept_threads=1

# 工作线程数:通常设置为CPU的核心数,应该小于等于最大连接数,默认 4
# since V2.00
work_threads=4

# 最小缓存大小:默认 8KB
min_buff_size = 8KB

# 最大缓存大小:默认 128KB
max_buff_size = 128KB

# 上传文件的选组方式:
# 0: round robin 轮询
# 1: specify group 指定组
# 2: load balance 存储负载均衡(选择剩余空间最大的组) 【默认】
store_lookup=2

# 指定上传的组,如果在应用层指定了具体的组,那么这个参数将不会起效。另外如果store_lookup是0或2,则此参数无效。如果store_lookup是1,必须设置store_group。
store_group=group2

# 上传文件选 storage server 的方式
# 0: round robin 轮询【默认】
# 1: the first server order by ip address 根据ip 地址进行排序选择第一个服务器(IP地址最小者)
# 2: the first server order by priority (the minimal) 根据优先级进行排序(上传优先级由storage Server来设置,参数名为upload_priority),优先级值越小优先级越高。
# 注意: if use_trunk_file 设置为 true, 必须设置 store_server 为 1 或 2
store_server=0

# 上传文件选择存储路径的方式:storage Server可以有多个存放文件的base path(可以理解为多个磁盘)。
# 0: round robin 轮流方式,多个目录依次存放文件
# 2: load balance 存储负载均衡。选择剩余空间最大的目录存放文件(注意:剩余磁盘空间是动态的,因此存储到的目录或磁盘可能也是变化的)
store_path=0

# 下载文件时 storage server 选择的方式
# 0: round robin 轮询【默认】
# 1: the source storage server which the current file uploaded to 源 storage 服务器下载
download_server=0

# 保留空间值。如果某个组中的某个服务器的剩余自由空间小于设定值,则文件不会被上传到这个组。
### G or g for gigabyte(GB)
### M or m for megabyte(MB)
### K or k for kilobyte(KB)
### no unit for byte(B)
### XX.XX% as ratio such as reserved_storage_space = 10%
reserved_storage_space = 10%

# 日志级别,不区分大小写:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info

# 指定运行该程序的用户组:设置为空则表示当前用户组
run_by_group=

# 指定运行该程序的用户:设置为空则表示当前用户组
run_by_user=

# 可以连接到 tracker server 的 IP 或域名,可设定多个值。"*"表示所有的IP
# we can use CIDR ips like 192.168.5.64/26
# and also use range like these: 10.0.1.[0-254] and host[01-08,20-25].domain.com
# for example:
# allow_hosts=10.0.1.[1-15,20]
# allow_hosts=host[01-08,20-25].domain.com
# allow_hosts=192.168.5.64/26
allow_hosts=*

# 检测 storage Server 存活的时间隔,单位为秒。
# storage server 定期向 tracker server 发心跳,如果 tracker server 在一个check_active_interval内还没有收到 storage server 的一次心跳,那么将认为该 storage server 已经下线。所以本参数值必须大于 storage server 配置的心跳时间间隔。通常配置为 storage server 心跳时间间隔的2倍或3倍。
check_active_interval = 120

# 设定线程栈的大小。 线程栈越大,一个线程占用的系统资源就越多。
# 如果要启动更多的线程(V1.x对应的参数为max_connections,V2.0为work_threads),可以适当降低本参数值。
thread_stack_size = 64KB

# 这个参数控制当 storage server IP地址改变时,集群是否自动调整。注:只有在 storage server 进程重启时才完成自动调整。
storage_ip_changed_auto_adjust = true

同步配置

# 同步或刷新日志信息到硬盘的时间间隔。注意:tracker server 的日志不是时时写硬盘的,而是先写内存。
sync_log_buff_interval = 10

# 同组storage服务器之间同步的最大延迟时间。存储服务器之间同步文件的最大延迟时间,根据实际情况进行调整。
# 秒为单位,默认值为1天(24*3600)
# since V2.00
storage_sync_file_max_delay = 86400

# 存储服务器同步一个文件需要消耗的最大时间,缺省为300s,即5分钟。
# since V2.00
storage_sync_file_max_time = 300

trunk和slot配置

# 是否使用trunk文件来存储几个小文件
# since V3.00
use_trunk_file = false 

# 最小slot大小:应该小于等于 4KB,默认为256字节
# since V3.00
slot_min_size = 256

# 最大slot大小:应该大于等于slot_min_size。当小于这个值的时候就存储到trunk file中,默认 16MB
# since V3.00
slot_max_size = 16MB

# trunk 文件的大小,应该大于等于 4MB。默认 64MB
# since V3.00
trunk_file_size = 64MB

# 是否提前创建trunk file。只有当这个参数为true,下面3个以trunk_create_file_打头的参数才有效。
# since V3.06
trunk_create_file_advance = false

# 提前创建trunk file的起始时间点(基准时间),02:00表示第一次创建的时间点是凌晨2点。
# since V3.06
trunk_create_file_time_base = 02:00

# 创建trunk file的时间间隔,单位为秒。如果每天只提前创建一次,则设置为86400
# since V3.06
trunk_create_file_interval = 86400

# 提前创建trunk file时,需要达到的空闲trunk大小
# 比如本参数为20G,而当前空闲trunk为4GB,那么只需要创建16GB的trunk file即可。
# since V3.06
trunk_create_file_space_threshold = 20G

# trunk初始化时,是否检查可用空间是否被占用
# since V3.09
# NOTICE: set this parameter to true will slow the loading of trunk spaces 
# when startup. you should set this parameter to true when neccessary.
trunk_init_check_occupying = false

# 是否无条件从trunk binlog中加载trunk可用空间信息
# FastDFS缺省是从快照文件storage_trunk.dat中加载trunk可用空间,该文件的第一行记录的是trunk binlog的offset,然后从binlog的offset开始加载
# since V3.10
# set to true once for version upgrade when your version less than V3.10
trunk_init_reload_from_binlog = false

# the min interval for compressing the trunk binlog file
# unit: second
# default value is 0, 0 means never compress
# FastDFS compress the trunk binlog when trunk init and trunk destroy
# recommand to set this parameter to 86400 (one day)
# since V5.01
trunk_compress_binlog_min_interval = 0

http相关配置

# HTTP服务是否不生效
http.disabled=false   
# HTTP服务端口
http.server_port=8080

# 检查 storage http server 存活的间隔时间
# 只有http.disabled=false时才生效
http.check_alive_interval=30

# 检查 storage http server 存活方式
#   tcp : 连接到 storage server 的 http 端口,不进行 request 和 response,[默认tcp]
#   http: 检查 storage 存活地址必须返回http状态码200
http.check_alive_type=tcp

# 检查 storage http server 是否存活的 uri/url
http.check_alive_uri=/status.html

其它

# 是否使用server ID作为storage server标识,而不是IP
# since V4.00
use_storage_id = false

# use_storage_id 设置为true,才需要设置本参数
# 在文件中设置组名、server ID和对应的IP地址,参见源码目录下的配置示例:conf/storage_ids.conf
# since V4.00
storage_ids_filename = storage_ids.conf

# 文件名中的id类型,有ip和id两种,只有当use_storage_id设置为true时该参数才有效,默认 ip
# since V4.03
id_type_in_filename = ip

# 存储从文件是否采用symbol link(符号链接)方式
# 如果设置为true,一个从文件将占用两个文件:原始文件及指向它的符号链接
# since V4.01
store_slave_file_use_link = false

# 是否定期轮转error log,目前仅支持一天轮转一次
# since V4.02
rotate_error_log = false

# error log定期轮转的时间点,只有当rotate_error_log设置为true时有效
# since V4.02
error_log_rotate_time=00:00

# error log按大小轮转
# 设置为0表示不按文件大小轮转,否则当error log达到该大小,就会轮转到新文件中
# since V4.02
rotate_error_log_size = 0

# keep days of the log files
# 0 means do not delete old log files
# default value is 0
log_file_keep_days = 0

# 是否使用连接池
# since V4.05
use_connection_pool = false

# 如果一个连接的空闲时间超过这个值将会被自动关闭,单位是:秒,默认 3600秒,即:1小时
# unit: second
# default value is 3600
# since V4.05
connection_pool_max_idle_time = 3600

storage.conf

# 该配置文件是否生效:true 生效,false 不生效
disabled=false

# 指定此 storage server 所在组(卷)
group_name=group1

# 是否绑定IP,如果不填则表示所有的(一般不填就OK)
bind_addr=

# bind_addr通常是针对server的。当指定bind_addr时,本参数才有效。
# 本storage server作为client连接其他服务器(如tracker server、其他storage server),是否绑定bind_addr。
client_bind=true

# storage server服务端口
port=23000

# 连接超时时间,针对socket套接字函数connect
connect_timeout=30

# storage server 网络超时时间,单位为秒。发送或接收数据时,如果在超时时间后还不能发送或接收数据,则本次网络通信失败。
network_timeout=60

# 心跳间隔时间,单位为秒 (这里是指主动向tracker server 发送心跳)
heart_beat_interval=30

# storage server向tracker server报告磁盘剩余空间的时间间隔,单位为秒
stat_report_interval=60

# 数据和日志目录地址,根目录必须存在,子目录会自动生成 (注:这里不是上传的文件存放的地址)
base_path=/home/server/fastdfs/storage

# 系统提供服务时的最大连接数
max_connections=256

# V2.0引入本参数。设置队列结点的buffer大小。工作队列消耗的内存大小 = buff_size * max_connections
# 设置得大一些,系统整体性能会有所提升。
# 消耗的内存请不要超过系统物理内存大小。另外,对于32位系统,请注意使用到的内存不要超过3GB
# since V2.00
buff_size = 256KB

# 工作线程的数量,工作线程用于处理网络IO,应当小于max_connections的值
# since V2.00
work_threads=4

# V2.0引入本参数。磁盘IO读写是否分离,缺省是分离的
# since V2.00
disk_rw_separated = true

# V2.0引入本参数。针对单个存储路径的读线程数,缺省值为1。
# 读写分离时,系统中的读线程数 = disk_reader_threads * store_path_count
# 读写混合时,系统中的读写线程数 = (disk_reader_threads + disk_writer_threads) * store_path_count
# since V2.00
disk_reader_threads = 1

# V2.0引入本参数。针对单个存储路径的写线程数,缺省值为1。
# 读写分离时,系统中的写线程数 = disk_writer_threads * store_path_count
# 读写混合时,系统中的读写线程数 = (disk_reader_threads + disk_writer_threads) * store_path_count
# since V2.00
disk_writer_threads = 1

# 同步文件时,如果从binlog中没有读到要同步的文件,休眠N毫秒后重新读取。0表示不休眠,立即再次尝试读取。
# 出于CPU消耗考虑,不建议设置为0。如何希望同步尽可能快一些,可以将本参数设置得小一些,比如设置为10ms
sync_wait_msec=50

# 同步上一个文件后,再同步下一个文件的时间间隔,单位为毫秒,0表示不休眠,直接同步下一个文件。
sync_interval=0

# 下面二个一起解释。允许系统同步的时间段 (默认是全天) 。一般用于避免高峰同步产生一些问题而设定,相信sa都会明白
sync_start_time=00:00

# storage sync end time of a day, time format: Hour:Minute
# Hour from 0 to 23, Minute from 0 to 59
sync_end_time=23:59

# 同步完N个文件后,把storage的mark文件同步到磁盘
# 注:如果mark文件内容没有变化,则不会同步
write_mark_file_freq=500

# 存放文件时storage server支持多个路径(例如磁盘)。这里配置存放文件的基路径数目,通常只配一个目录。
store_path_count=1

# 逐一配置store_path个路径,索引号基于0。注意配置方法后面有0,1,2 ......,需要配置0到store_path - 1。
# 如果不配置base_path0,那边它就和base_path对应的路径一样。
store_path0=/home/server/fastdfs/storage1
#store_path1=/home/server/fastdfs/storage2

# FastDFS存储文件时,采用了两级目录。这里配置存放文件的目录个数 (系统的存储机制,大家看看文件存储的目录就知道了)
# 如果本参数只为N(如:256),那么storage server在初次运行时,会自动创建 N * N 个存放文件的子目录。
subdir_count_per_path=256

# tracker_server 的列表 要写端口的哦 (再次提醒是主动连接tracker_server )
# 有多个tracker server时,每个tracker server写一行
tracker_server=192.168.254.128:22122

# 日志级别
#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info

# 操作系统运行FastDFS的用户组 (不填 就是当前用户组,哪个启动进程就是哪个)
run_by_group=

# 操作系统运行FastDFS的用户 (不填 就是当前用户,哪个启动进程就是哪个)
run_by_user=

# 允许连接本storage server的IP地址列表 (不包括自带HTTP服务的所有连接)
# 可以配置多行,每行都会起作用
allow_hosts=*

#  文件在data目录下分散存储策略。
# 0: 轮流存放,在一个目录下存储设置的文件数后(参数file_distribute_rotate_count中设置文件数),使用下一个目录进行存储。
# 1: 随机存储,根据文件名对应的hash code来分散存储。
file_distribute_path_mode=0

# 当上面的参数file_distribute_path_mode配置为0(轮流存放方式)时,本参数有效。
# 当一个目录下的文件存放的文件数达到本参数值时,后续上传的文件存储到下一个目录中。
file_distribute_rotate_count=100

# 当写入大文件时,每写入N个字节,调用一次系统函数fsync将内容强行同步到硬盘。0表示从不调用fsync 
fsync_after_written_bytes=0

# 同步或刷新日志信息到硬盘的时间间隔,单位为秒
# 注意:storage server 的日志信息不是时时写硬盘的,而是先写内存。
sync_log_buff_interval=10

# 同步binglog(更新操作日志)到硬盘的时间间隔,单位为秒
# 本参数会影响新上传文件同步延迟时间
sync_binlog_buff_interval=10

# 把storage的stat文件同步到磁盘的时间间隔,单位为秒。
# 注:如果stat文件内容没有变化,不会进行同步
sync_stat_file_interval=300

# 线程栈的大小。FastDFS server端采用了线程方式。
# 对于V1.x,storage server线程栈不应小于512KB;对于V2.0,线程栈大于等于128KB即可。
# 线程栈越大,一个线程占用的系统资源就越多。
# 对于V1.x,如果要启动更多的线程(max_connections),可以适当降低本参数值。
thread_stack_size=512KB

# 本storage server作为源服务器,上传文件的优先级,可以为负数。值越小,优先级越高。这里就和 tracker.conf 中store_server= 2时的配置相对应了 
upload_priority=10

# 网卡别名前缀,就像Linux中的eth,可以使用ifconfig -a命令来查看
# 多个别名之间使用逗号分隔,如果不设置这个值表示自动的被系统类型设置
if_alias_prefix=

# 是否检测上传文件已经存在。如果已经存在,则不存在文件内容,建立一个符号链接以节省磁盘空间。 
# 这个应用要配合FastDHT 使用,所以打开前要先安装FastDHT 
# 1或yes 是检测,0或no 是不检测
check_file_duplicate=0

# 文件去重时,文件内容的签名方式:
# hash: 4个hash code
# md5:MD5
# since V4.01
file_signature_method=hash

# 当上个参数设定为1 或 yes时 (true/on也是可以的) , 在FastDHT中的命名空间
key_namespace=FastDFS

# 与FastDHT servers 的连接方式 (是否为持久连接) ,默认是0(短连接方式)。可以考虑使用长连接,这要看FastDHT server的连接数是否够用。
keep_alive=0

# 下面是关于FastDHT servers 的设定 需要对FastDHT servers 有所了解,这里只说字面意思了
# 可以通过 #include filename 方式来加载 FastDHT servers  的配置,装上FastDHT就知道该如何配置啦。
# 同样要求 check_file_duplicate=1 时才有用,不然系统会忽略
# fdht_servers.conf 记载的是 FastDHT servers 列表 
##include /home/yuqing/fastdht/conf/fdht_servers.conf

# 是否将文件操作记录到access log
# since V4.00
use_access_log = false

# 是否定期轮转access log,目前仅支持一天轮转一次
# since V4.00
rotate_access_log = false

# access log定期轮转的时间点,只有当rotate_access_log设置为true时有效
# since V4.00
access_log_rotate_time=00:00

# 是否定期轮转error log,目前仅支持一天轮转一次
# since V4.02
rotate_error_log = false

# error log定期轮转的时间点,只有当rotate_error_log设置为true时有效
# since V4.02
error_log_rotate_time=00:00

# access log按文件大小轮转
# 设置为0表示不按文件大小轮转,否则当access log达到该大小,就会轮转到新文件中
# since V4.02
rotate_access_log_size = 0

# error log按文件大小轮转
# 设置为0表示不按文件大小轮转,否则当error log达到该大小,就会轮转到新文件中
# since V4.02
rotate_error_log_size = 0

# 文件同步的时候,是否忽略无效的binlog记录
# since V4.02
file_sync_skip_invalid_record=false

# 是否使用连接池
# since V4.05
use_connection_pool = false

# 如果一个连接的空闲时间超过这个值将会被自动关闭
# since V4.05
connection_pool_max_idle_time = 3600

# storage server上web server域名,通常仅针对单独部署的web server。这样URL中就可以通过域名方式来访问storage server上的文件了,
# 这个参数为空就是IP地址的方式。
http.domain_name=

# web server的端口
http.server_port=8888

client.conf

# 连接超时时间,针对socket套接字函数connect
connect_timeout=30

# client的网络超时,单位为秒。发送或接收数据时,如果在超时时间后还不能发送或接收数据,则本次网络通信失败
network_timeout=60

# 存储日志的根目录
base_path=/home/server/fastdfs/client

# tracker_server 的列表 要写端口
tracker_server=192.168.254.128:22122

# 日志的级别
#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level=info

# 是否使用连接池
# since V4.05
use_connection_pool = false

# 如果一个连接的空闲时间超过这个值将会被自动关闭
# since V4.05
connection_pool_max_idle_time = 3600

# 是否从FastDFS的tracker server加载参数
# since V4.05
load_fdfs_parameters_from_tracker=false

# 是否使用storage ID 代替IP,只有当load_fdfs_parameters_from_tracker为false时才有效
# since V4.05
use_storage_id = false

# 指定storage_ids的路径,可以使用绝对路径和相对路径,只有当load_fdfs_parameters_from_tracker为false时才有效
# since V4.05
storage_ids_filename = storage_ids.conf


# tracker server的http端口
http.tracker_server_port=8080

#use "#include" directive to include HTTP other settiongs
##include http.conf
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

讲文明的喜羊羊拒绝pua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值