fastdfs的概念及原理

FastDFS

一、基本介绍

1.含义

FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理。

2.功能

文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。 FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

3.适用场景

特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

4.角色分配及作用

1)跟踪器:(tracker)

做调度工作,在访问上起负载均衡的作用。

2)存储节点:(storage server)

完成文件管理的所有功能。就是这样的存 储、同步和提供存取接口,FastDFS同时对文件的metadata进行管理。 所谓文件的meta data就是文件的相关属性,以键值对(key value)方式表示,如:width=1024,其中的key为width,value为1024。 文件metadata是文件属性列表,可以包含多个键值对。

3)二者的部署

跟踪器和存储节点:可以由一台或者多台服务器构成。可随时增加或者减少数量,而不影响线上服务。

5.存储节点的组成【storage server】

为支持大容量,采用分卷【分组:group volume】的组织方式。

存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。

一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。

在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。

6.如何进行扩大容量

当存储空间不足或即将耗尽时,可以动态添加卷。 只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。

7.文件标识

分为两种:卷名+文件名【缺一不可】

8.上传交互过程

  1. client询问tracker上传到的storage,不需要附加参数;

  2. tracker返回一台可用的storage;

  3. client直接和storage通讯完成文件上传。

9.下载交互过程

  1. client询问tracker下载文件的storage,参数为文件标识(卷名和文件名);

  2. tracker返回一台可用的storage;

  3. client直接和storage通讯完成文件下载。

#####需要说明的是,client为使用FastDFS服务的调用方,client也应该是一台服务器,它对tracker和storage的调用均为服务器间的调用。

二、fastdfs的应用

1.架构

FastDFS服务有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)

 

1)跟踪服务器,tracker server

主要做调度工作,起到均衡的作用;负责管理所有的 storage server 和 group,每个 storage 在启动后会连接 Tracker,告知自己所属 group 等信息,并保持周期性心跳, Tracker根据storage心跳信息,建立group--->[storage server list]的映射表;tracker管理的元数据很少,会直接存放在内存;tracker 上的元信息都是由 storage 汇报的信息生成的,本身不需要持久化任何数据,tracker 之间是对等关系,因此扩展 tracker 服务非常容易,之间增加 tracker服务器即可,所有tracker都接受stroage心跳信息,生成元数据信息来提供读写服务(与 其他 Master-Slave 架构的优势是没有单点,tracker 也不会成为瓶颈,最终数据是和一个可用的 Storage Server进行传输的)

2)存储服务器storage server

主要提供容量和备份服务;以 group 为单位,每个 group 内可以包含多台storage server,数据互为备份,存储容量空间以group内容量最小的storage为准;建 议group内的storage server配置相同;以group为单位组织存储能够方便的进行应用隔离、负载均衡和副本数定制;

缺点是 group 的容量受单机存储容量的限制,同时 group 内机器坏掉,数据 恢复只能依赖 group 内其他机器重新同步(坏盘替换,重新挂载重启 fdfs_storaged 即可)

3)客户端client

主要是上传下载数据的服务器,也就是我们自己的项目所部署在的服务器。每个客户端服务器都需要安装Nginx

3)多个group之间的存储策略

有3种策略:round robin(轮询)、load balance(选择最大剩余空 间的组上传文件)、specify group(指定group上传)

group 中 storage 存储依赖本地文件系统,storage 可配置多个数据存储目录,磁盘不做 raid, 直接分别挂载到多个目录,将这些目录配置为 storage 的数据目录即可。 storage 接受写请求时,会根据配置好的规则,选择其中一个存储目录来存储文件;为避免单个目录下的文件过多,storage 第一次启时,会在每个数据存储目录里创建 2 级子目录,每级 256 个,总共 65536 个,新写的文件会以 hash 的方式被路由到其中某个子目录下,然后将文件数据直 接作为一个本地文件存储到该目录中

总结:1.高可靠性:无单点故障 2.高吞吐性:只要Group足够多,数据流量是足够分散的。

2.工作流程

fastdfs提供基本的文件访问接口,如:upload、download、append、delete等

1)上传

0.storage server会周期性的向tracker 发送状态信息。

1.客户端发送上传请求到tracker

2.tracker 向storage进行筛选,筛选完成后选择分配group和storage传给tracker

3.tracker会返回给clientstorage的地址和端口

4.client上传文件【file content和metadata】给storage

5.storage生成file_id将上传内容写入磁盘

6.storage返回file_id【路径信息和文件名】给client

7.client端完成存储文件信息

2)下载

0.storge会定期向tracker上传状态信息

1.client发出下载链接请求给tracker

2.tracker检查可用的storage【检查同步状态】

3.tracker返回信息给client【包括storage的IP和端口】

4.client收到后,直接跟storage端发送所要下载的file_id【组名、路径、文件名】

5.storage收到来自client端的信息后,查找文件

6.将查找到的文件file_content返回给client

3)生成的文件诠释

FastDFS生成的一个文件ID示例:

图片

  磁盘部分M后面的两位数字,表示基于0的磁盘序号。
文件名(不含后缀名)采用Base64编码,包含如下5个字段(每个字段均为4字节整数):
* 源storage server ID或IP地址
* 文件创建时间戳
* 文件大小
* 文件内容CRC32校验码
* 随机数
引入随机数的目的是防止生成重名文件。

如果采用了合并存储,生成的文件ID将变长,文件名后面多了16个字节。
这部分同样采用Base64编码,包含如下3个字段(每个字段均为4字节整数):
  * 存放到的trunk file ID
  * 文件偏移量(offset)
  * 占用的空间大小
根据前两个字段,可以知道文件存放的trunk file及偏移位置。

FastDFS不需要文件索引,省掉了传统的name server角色,使得FastDFS更加简洁高效。

 

3.命令的使用

#基础命令:
/usr/local/fastdfs-5.05/stop.sh|start.sh  /etc/fdfs/storage.conf   开启关闭
/usr/local/fastdfs-5.05/stop.sh|start.sh  /etc/fdfs/tracker.conf   开启关闭
/etc/init.d/fdfs_trackerd stop|start|restart           开启关闭
/etc/init.d/fdfs/fdfs_storaged stop|start|restart       开启关闭
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf         重读配置
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf         重读配置
/usr/bin/fdfs_monitor /etc/storage.conf             查看状态
/usr/bin/fdfs_upload_file /etcc/fdfs/storage.conf xxx.txt     上传文件
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf delete group1 ip   删除节点

INIT      :初始化,尚未得到同步已有数据的源服务器

WAIT_SYNC :等待同步,已得到同步已有数据的源服务器

SYNCING   :同步中

DELETED   :已删除,该服务器从本组中摘除

OFFLINE   :离线

ONLINE    :在线,尚不能提供服务

ACTIVE    :在线,可以提供服务

4.如何解决数据一致性的问题

FastDFS以简洁高效著称,适用于轻量级定位以及应用场景。因此FastDFS放弃强一致性,采用弱一致性和最终一致的做法。

  FastDFS的文件ID是服务端生成的,其中包含了storage ID或IP地址、文件创建时间、CRC32校验码、文件大小和随机数等字段。FastDFS文件ID的生成机制决定了可以在任意一台storage server上传文件而不用担心文件名和同组的其他storage server生成的文件冲突。

  出于性能和简洁考虑,FastDFS复制文件采用异步方式,这是保证数据最终一致的做法。

  FastDFS为了支持文件修改,引入了appender这一文件类型。FastDFS支持对appender类型的文件进行修改和追加等操作。如果在两台storage server上修改同一个appender文件(即使在顺序修改的情况下),可能就会因为时序问题导致数据不一致的现象发生。为了解决这个问题,FastDFS采取的做法是,对appender文件的修改以及对文件的删除只能在源storage server上进行。

  FastDFS直接借助底层文件系统来存储和管理文件。在文件复制过程中,为了避免应用端读到不完整的数据,storage server采用先写临时文件,完成后再改名的做法。为了保证数据完整性以及在异常情况下不覆盖上个版本的数据,tracker server和storage server写入重要的数据文件时,均采用了先写临时文件,然后改名的做法。

5.fastdfs的误解

#误解一 、FastDFS不能存储大文件
因为FastDFS没有对大文件做特殊处理和支持,FastDFS非常适合存储小文件(10MB以下),也适合存储中型文件(小于1GB),可以存储大文件(小于10GB),不太适合存储超大文件(大于10GB)。

FastDFS上传大文件时,可以先上传appender类型的文件,然后以分片方式(比如每次64MB)调用append方法,完成上传后可以调用V6.02开始支持的regenerate_appender_filename方法将文件改名为普通文件。

FastDFS支持指定文件偏移量和下载的内容大小,使用这一特性可以支持大文件断点续传,也可以支持多线程方式下载大文件。

#误解二、FastDFS限制存储的文件数
为了防止一个目录下的文件数过多影响访问性能,FastDFS采用两级目录来保存文件。每一级目录最大256个子目录(默认配置为256,可以酌情改小),两级目录对应的存储目录数为 256 * 256 = 65536。如果平均一个目录下保存1k个文件,那么存储的文件总数将超过6kw。

为什么大家会认为FastDFS将限制存储的文件数呢?是因为FastDFS的一种做法让大家产生了误解,这就是默认的按目录轮流存储方式(参数file_distribute_to_path为0,即轮流存储方式,默认设置就是0)。此时还有一个参数file_distribute_rotate_count来设置存储到多少个文件后轮转到下一个目录。需要澄清的是,轮转到下一个目录的依据,不是当前目录已存储的文件数(实际存放文件数),而是本轮已存储的文件数。这是个内存计数器,在有更新的情况下会定期刷到文件中。引入这两个参数的目的,是让存储目录下的文件尽可能分散(防止文件过度集中),但又不保证绝对平均分布。比如可能一个目录下存在的文件数为200(两台storage server均可以上传文件的情况下),但另外一个目录下的文件数却只有180(本来存放了200个文件,其中20个文件后来被删除了)。

6.特点

##FastDFS特点如下:
   1)分组存储,简单灵活;
   2)对等结构,不存在单点;
   3)文件ID由FastDFS生成,作为文件访问凭证。FastDFS不需要传统的name server或meta server;
   4)大、中、小文件均可以很好支持,可以存储海量小文件;
   5)一台storage支持多块磁盘,支持单盘数据恢复;
   6)提供了nginx扩展模块,可以和nginx无缝衔接;
   7)支持多线程方式上传和下载文件,支持断点续传;
   8)存储服务器上可以保存文件附加属性。

7.专业术语

1、tracker server:中心服务器,FastDFS server端两大主角之一。tracker server作为FastDFS集群管理中心,管理集群拓扑结构,对storage server文件上传和文件下载起到负载均衡调度作用。使用命令fdfs_monitor可以查看集群状态。

2、storage server:存储服务器,FastDFS server端两大主角之二。文件相关功能都通过storage server来完成,包括文件上传、下载、文件同步等等。

3、合并存储:为了防止文件系统inode耗尽,若干小文件合并存储到一个大文件(trunk file)中。V3开始支持合并存储特性,如果单台storage server存储的文件数超过一千万,可以考虑开启合并存储功能。

4、trunk server:V3合并存储引入了trunk server这一角色。trunk server用于管理trunk文件可用空间,由一个group的一台storage server兼任,trunk server由tracker leader指定。

5、base_path:FastDFS基路径,配置文件tracker.conf和storage.conf中均需要配置。fastdfs运行时不会自动创建base_path目录,需要事先建好。FastDFS自身的数据文件存储在$base_path/data目录下,日志文件存储在 $base_path/logs目录下。storage server在$base_path/data/sync目录下存放文件上传、删除等更改操作的binglog,可能会占用base_path较大的存储空间。

6、store_path:存储路径,通常对应一块硬盘或RAID盘。FastDFS支持多个存储路径,最多支持256个。多个store_path配置在storage.conf中,第一个为store_path0,第二个为store_path1,以此类推。多个store_path的顺序很重要,一个group的多台storage server的store_path是按顺序对应的,并且生成的文件ID中包含了store_path顺序号,因此不要随意调整配置文件中的store_path顺序。

7、文件ID:上传文件时由storage server生成访问该文件的凭证,包括group名称、存储路径顺序号以及包含两级目录的文件名,应用程序(调用方)需要将文件ID保存到数据库等存储介质中。一个文件ID示例:group1/M00/01/32/wKgCaFx1982ENxLWAAAAAA0e5-o982.txt

8、主从文件:文件名存在关联的一组文件。从文件名在主文件名的基础上增加后缀。
  主文件:组名 + 带路径的文件名 + 文件后缀
  从文件:组名 + 带路径的文件名 + 从文件后缀名 + 文件后缀
从文件与主文件的组名、带路径的文件名 以及 文件后缀均相同。
友情提示:从文件后缀名最长为16字节,文件后缀最长为6,比如.tar.gz。
例如:
  主文件:
group1/M00/00/00/oYYBAF25iTmIYXVYAAAIF0b_gq8AAAAVgAAAAAAAAgv40322.jpg
  从文件:
group1/M00/00/00/oYYBAF25iTmIYXVYAAAIF0b_gq8AAAAVgAAAAAAAAgv40322_big.jpg

9、appender类型文件:FastDFS将上传文件分为普通文件和appender类型文件。普通文件上传后不能被修改,而针对appender类型文件后续可以进行append和modify等修改操作。使用合并存储特性的情况下,FastDFS依然会将一个appender类型文件保存为一个单独的文件。

8.使用的注意事项

1. FastDFS适用的场景以及不适用的场景
  FastDFS是为互联网应用量身定做的一套分布式文件存储系统,非常适合用来存储图片、音频、视频、文档等文件。对于互联网应用,简洁高效的FastDFS和其他分布式文件系统相比,优势非常明显。具体情况大家可以查阅相关介绍文档,如:FastDFS架构设计文档等等。
  出于简洁考虑,FastDFS没有对文件做分块存储,因此不太适合分布式计算场景。

2. 服务器时间必须保持一致
  因为FastDFS的精巧设计不需要存储文件索引,FastDFS通过比较时间戳来判断文件是否同步完成。因此集群内的服务器时间要保持一致,各台服务器的时间差值不要超过1秒。建议采用NTP对时服务。

3. too many open files错误解决方法
  日志中报打开文件过多的错误,是因为系统允许一个进程打开的文件数设置太小了。Linux环境下的解决办法,修改文件/etc/security/limits.conf,在文件尾部添加如下代码(如果已经存在则修改相应数值):
root soft nofile 65535
root hard nofile 65535
* soft nofile 65535
* hard nofile 65535
  注:只配置最后两行不就可以了吗,为啥还要单独为root用户配置呢?查了网上资料,说是*这样的通配符对root用户无效,所以root需要单独配置(嗯,阿里云ECS就配置了上面这4行)。

4. FastDFS服务启停
  FastDFS server程序自带start、stop和restart指令,命令行示例如下:
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf [start | stop | restart]
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf [start | stop | restart]

   ###可以使用kill或者killall正常杀掉 fdfs_trackerd 和 fdfs_storaged 进程,但
千万不要加上-9参数强杀,否则可能会导致binlog数据丢失等问题。

5. FastDFS支持断点续传吗?
  上传和下载文件均可支持。
  对于文件上传,需要先上传appender类型的文件,然后使用apend方法。
  如果要上传超过1GB的大文件,建议采用append方式分多次上传,比如每次上传64MB。需要先创建appender类型的文件,可以创建空的appender文件。
    对于超大文件,如果想支持多线程上传以加快上传速度,可以采用如下3个步骤实现:
     1)上传appender类型的文件;
     2) 调用truncate方法将该appender文件设置为最终文件大小;
     3)调用modify方法并发上传文件分片。

  对于文件下载,FastDFS可以指定文件偏移量和获取的文件内容大小。利用这个特性,文件下载可以实现断点续传以及多线程下载。

6. Java SDK非线程安全
  FastDFS提供的Java SDK是非线程安全的,有人已经踩过这个坑了。包括负责与tracker server交互的TrackerClient、与storage server直接通信的StorageClient 和 StorageClient1 这三个类均是非线程安全的。
  为啥会出现两个StorageClient字样的类名呢?二者实现功能完全一样,StorageClient是group和filename分离的用法,StorageClient1是group和filename合体用法(文件ID)。通常使用StorageClient1就好。

9.性能调优

   众所周知,软件性能调优不是一撮而就的事情,它是一个反复磨合的过程。下面介绍FastDFS几个性能调优相关的重要参数,供大家参考。

   1. 最大并发连接数
  配置文件:tracker.conf 和 storage.conf
  参数名:max_connections
  缺省值:256,默认配置:1024
  FastDFS为一个连接分配一个task buffer,为了提升分配效率,FastDFS采用内存池的做法。FastDFS老版本直接事先分配 max_connections 个buffer,这个做法显然不是太合理,在max_connections 设置过大的情况下太浪费内存。v5.04对预分配采用增量方式,tracker一次预分配1024个,storage一次预分配256个。task buffer实际内存占用情况测算如下:
  改进前:max_connections * buffer_size
  改进后:预分配buffer数 * buffer_size

  使用v5.04及后续版本,可以根据实际需要将 max_connections 设置为一个较大的数值,比如 10240 或65535 甚至更大。
  友情提示:此时需要将一个进程允许打开的最大文件数调大到超过max_connections,否则FastDFS server启动会报错。

   2. 工作线程数
  配置文件:tracker.conf 和 storage.conf
  参数名:work_threads
  缺省值:4
  work threads主要负责网络IO处理,一个线程通过epoll这样的机制处理若干个网络连接。work threads理论上不会消耗太多CPU,不建议配置得过大。
  为了减少CPU上下文切换的开销,以及不必要的资源消耗,不建议将本参数设置得过大。为了充分发挥出多个CPU的效能,系统中的线程数总和,建议不要超过CPU总数的2倍。

  对于tracker server,公式为:
    work_threads + 2 <= 2 * CPU总数

  对于storage server,公式为:
  work_threads + 1 + 本组storage server数 + (disk_reader_threads  + disk_writer_threads) * store_path_count <= 2 * CPU总数

   3. storage磁盘读写线程数
  配置文件:storage.conf
     1)disk_rw_separated:磁盘读写是否分离,缺省值为 true
     2)disk_reader_threads:单个磁盘文件读取线程数,缺省值为 1
     3)disk_writer_threads:单个磁盘文件写入线程数,缺省值为 1
  注:单个(或一个)磁盘对应storage server的一个store path。

  如果磁盘读写混合,单个磁盘读写线程总数为读取线程数 与 写入线程数之和。
  对于单盘挂载方式,磁盘读写线程分别设置为 1 即可。
  如果磁盘做了RAID,比如RAID5或RAID10,那么需要酌情加大读写线程数,这样才能最大程度地发挥磁盘IO能力。

   4. storage同步延迟相关设置
  配置文件:storage.conf
     1)sync_binlog_buff_interval:将binlog buffer写入磁盘的时间间隔,单位为秒,取值大于0,缺省值为60,建议设置为1。
     2)sync_wait_msec:如果没有需要同步的文件,对binlog进行轮询的时间间隔,单位为毫秒,取值大于0,缺省值为200,建议设置为50。
     3)sync_interval:同步完一个文件后,休眠的毫秒数,缺省值为0,通常设置为0即可。
  为了尽快完成文件同步,将上述3个参数适当调小即可。
  友情提示:上面给出的建议值基本就是最佳实践了。

三、实操

1.安装

1.1 *fasdfs部署*

1.1.1 *软件部署*

# 创建目录

mkdir /server/tools -p

mkdir /home/deploy -p

1.1.1.1 *安装 libfastcommon*

yum -y install cmake bison git ncurses-devel gcc gcc-c++

 

# 下载

mkdir -p /server/tools

cd /server/tools

wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz

# 解压

tar -zxvf V1.0.7.tar.gz

cd libfastcommon-1.0.7

# 编译安装

./make.sh

./make.sh install

# 创建软连接

ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so

ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so

ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so

ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so

1.1.1.2 *安装FastDFS*

# 下载

cd /server/tools

wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz

# 解压

tar -zxvf V5.05.tar.gz

cd fastdfs-5.05

# 编译安装

./make.sh

./make.sh install

# 配置变量:FastDFS 服务脚本设置的 bin 目录是 /usr/local/bin, 但实际命令安装在 /usr/bin/ 下

sed -i 's#/usr/local/bin#/usr/bin#g' /etc/init.d/fdfs_storaged

 

# vim /etc/init.d/fdfs_storaged

# 使用查找替换命令进统一修改

sed -i 's#/usr/local/bin#/usr/bin#g' /etc/init.d/fdfs_trackerd

 

# 创建软连接

ln -s /usr/bin/fdfs_trackerd /usr/local/bin

ln -s /usr/bin/fdfs_storaged /usr/local/bin

ln -s /usr/bin/stop.sh /usr/local/bin

ln -s /usr/bin/restart.sh /usr/local/bin

1.1.2 *软件配置*

1.1.2.1 *配置FastDFS跟踪器(Tracker)*

#进入 /etc/fdfs,复制 FastDFS 跟踪器样例配置文件 tracker.conf.sample,并重命名为 tracker.conf

cd /etc/fdfs

cp tracker.conf.sample tracker.conf

 

# 配置文件是否不生效,false 为生效

# disabled=false

# 提供服务的端口

# port=22122

# Tracker 数据和日志目录地址(根目录必须存在,子目录会自动创建)

sed -i 's#/home/yuqing/fastdfs#/home/fastdfs/tracker#g' tracker.conf

# HTTP 服务端口

sed -i 's#http.server_port=8080#http.server_port=80#g' tracker.conf

# 创建tracker基础数据目录,即base_path对应的目录

mkdir -p /home/fastdfs/tracker

# 启动Tracker

# 初次成功启动,会在 /home/fastdfs/tracker (配置的base_path)下创建 data、logs 两个目录

/etc/init.d/fdfs_trackerd start

# 检查是否启动:22122端口正在被监听,则算是Tracker服务安装成功

netstat -unltp|grep fdfs

# 设置Tracker开机启动

chkconfig fdfs_trackerd on

1.1.2.2 配置 FastDFS 存储 (Storage)

# 进入 /etc/fdfs 目录,复制 FastDFS 存储器样例配置文件 storage.conf.sample,并重命名为 storage.conf

cd /etc/fdfs

cp storage.conf.sample storage.conf

 

# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)

sed -i 's#base_path=/home/yuqing/fastdfs#base_path=/home/fastdfs/storage#g' storage.conf

# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)

sed -i 's#store_path0=/home/yuqing/fastdfs#store_path0=/home/fastdfs/file#g' storage.conf

# tracker_server 的列表 ,会主动连接 tracker_server

# 有多个 tracker server 时,每个 tracker server 写一行,本机ip地址

IP_ADDR=$(hostname -I|grep -v '127.0.0.1'|awk '{print $1}')

sed -i "s#192.168.209.121#$IP_ADDR#g" /etc/fdfs/storage.conf

# 访问端口

sed -i 's#http.server_port=8888#http.server_port=80#g' storage.conf

 

 

*storage.conf* *配置文件讲解*

 

*#* *编辑storage.conf: 标红的需要修改,其它的默认即可。*

*# 配置文件是否不生效,false 为生效*

*disabled=false*

 

*# 指定此 storage server 所在 组(卷)*

*group_name=group1*

 

*# storage server 服务端口*

*port=23000*

 

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

*heart_beat_interval=30*

 

*# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)*

*base_path=/home/fastdfs/storage*

 

*# 存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。*

*store_path_count=1*

 

 

*# 逐一配置 store_path_count 个路径,索引号基于 0。*

*# 如果不配置 store_path0,那它就和 base_path 对应的路径一样。*

*store_path0=/home/fastdfs/file*

 

*# FastDFS 存储文件时,采用了两级目录。这里配置存放文件的目录个数。*

*# 如果本参数只为 N(如: 256),那么 storage server 在初次运行时,会在 store_path 下自动创建 N * N 个存放文件的子目录。*

*subdir_count_per_path=256*

 

*# tracker_server 的列表 ,会主动连接 tracker_server*

*# 有多个 tracker server 时,每个 tracker server 写一行**,本机ip地址*

*tracker_server=59.188.82.54:22122** ** **# 允许系统同步的时间段 (默认是全天) 。一般用于避免高峰同步产生一些问题而设定。** **sync_start_time=00:00** **sync_end_time=23:59*

*# 访问端口** **http.server_port=80*

 

# 创建Storage基础数据目录,对应base_path目录

mkdir -p /home/fastdfs/storage

# 这是配置的store_path0路径

mkdir -p /home/fastdfs/file

mkdir /home/fastdfs/client -p

# 启动 Storage:启动Storage前确保Tracker是启动的。初次启动成功,会在 /ljzsg/fastdfs/storage 目录下创建 data、 logs 两个目录。

# 可以用这种方式启动

/etc/init.d/fdfs_storaged start

# 也可以用这种方式,后面都用这种

service fdfs_storaged restart

查看 Storage 是否成功启动,23000 端口正在被监听,就算 Storage 启动成功。

netstat -unltp|grep fdfs

# 查看Storage和Tracker是否在通信:

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

# 设置 Storage 开机启动

chkconfig fdfs_storaged on

1.1.2.3 *文件上传测试*

# 修改 Tracker 服务器中的客户端配置文件

cd /etc/fdfs

cp client.conf.sample client.conf

#修改如下配置即可,其它默认。

# Client 的数据和日志目录

sed -i 's#/home/yuqing/fastdfs#/home/fastdfs/client#g' client.conf

# Tracker端口,本机ip

IP_ADDR=$(hostname -I|grep -v '127.0.0.1'|awk '{print $1}')

sed -i "s#192.168.0.197#$IP_ADDR#g" client.conf

# 上传测试

# 在linux内部执行如下命令上传 namei.jpeg 图片

#cd /home/fastdfs/file/

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf 图片名

上传成功后返回文件ID号:group1/M00/00/00/wKgz6lnduTeAMdrcAAEoRmXZPp870.jpeg

1.1.2.4 *安装Nginx*

上面将文件上传成功了,但我们无法下载。因此安装Nginx作为服务器以支持Http方式访问文件。同时,后面安装FastDFS的Nginx模块也需要Nginx环境。

Nginx只需要安装到StorageServer所在的服务器即可,用于访问文件。我这里由于是单机,TrackerServer和StorageServer在一台服务器上。

cd /server/tools/

yum -y install gcc gcc-c++ autoconf automake

yum -y install zlib zlib-devel openssl openssl-devel pcre-devel

tar -zxvf nginx-1.14.2.tar.gz #解压nginx代码

cd /server/tools/nginx-1.14.2/

#配置编译

./configure --prefix=/home/deploy/nginx --with-http_stub_status_module --with-http_ssl_module

make

make install

#添加环境变量

echo "#########set for nginx ###########" >>/etc/profile

echo "PATH=$PATH:/home/deploy/nginx/sbin/" >>/etc/profile

source /etc/profile

nginx -V

# 检查

 

# nginx.conf配置文件

##user www www;

worker_processes 1;

error_log /home/deploy/nginx/logs/error.log error;

pid /home/deploy/nginx/logs/nginx.pid;

worker_rlimit_nofile 65535;

events

{

use epoll;

worker_connections 65535;

}

 

http

{

include mime.types;

default_type application/octet-stream;

 

server_names_hash_bucket_size 128;

client_header_buffer_size 32k;

large_client_header_buffers 4 32k;

client_max_body_size 50m;

 

sendfile on;

tcp_nopush on;

 

keepalive_timeout 60;

 

tcp_nodelay on;

 

fastcgi_connect_timeout 600;

fastcgi_send_timeout 600;

fastcgi_read_timeout 600;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 256k;

 

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.0;

gzip_comp_level 2;

gzip_types text/plain application/x-javascript text/css application/xml;

gzip_vary on;

gzip_proxied expired no-cache no-store private auth;

gzip_disable "MSIE [1-6].";

 

server_tokens off;

log_format access '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" $http_x_forwarded_for';

include vhost/*.conf;

}

# 创建目录

mkdir -p /home/deploy/nginx/conf/vhost

# fdfs.conf配置文件 ,将 /group1/M00 映射到 /home/fastdfs/file/data

server {

listen 80;

server_name localhost;

access_log /home/deploy/nginx/logs/fdfs.log combined;

# location ~/group([0-9])/M00 {

# ngx_fastdfs_module;

#}

location /group1/M00 {

#alias /home/fastdfs/storage/data;

alias /home/fastdfs/file/data;

}

}

 

# 重启nginx

/home/deploy/nginx/sbin/nginx -s reload

 

# 在浏览器访问之前上传的图片、成功。

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf 图片名

172.16.23.63/group1/M00/00/00/rBAIP12FmQmADCI4AALiJdG3JWQ829.jpg

 

1.1.2.5 *配置 Nginx 模块*

# 下载 fastdfs-nginx-module、解压

cd /server/tools

# 这里这么长一串,是因为最新版的master与当前nginx有些版本问题。

wget -c https://github.com/happyfish100/fastdfs-nginx-module/archive/5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip

# 解压

yum install -y unzip

unzip 5e5f3566bbfa57418b5506aaefbe107a42c9fcb1.zip

 

# 重命名

mv fastdfs-nginx-module-5e5f3566bbfa57418b5506aaefbe107a42c9fcb1 fastdfs-nginx-module-master

 

# 配置Nginx,在nginx中添加模块

# 先停掉nginx服务 /home/deploy/nginx/sbin/nginx -s stop # 进入解压包目录

cd /server/tools/nginx-1.14.2/

 

# 添加模块

#./configure --add-module=../fastdfs-nginx-module-master/src --prefix=/home/deploy/nginx/

/server/tools/nginx-1.14.2/configure \

--prefix=/home/deploy/nginx --error-log-path=/home/deploy/nginx/logs/error.log \

--group=www --user=www --with-http_ssl_module --with-http_flv_module \

--http-log-path=/home/deploy/nginx/logs/access.log \

--http-proxy-temp-path=/var/tmp/nginx/proxy \

--http-fastcgi-temp-path=/var/tmp/nginx/fcgi \

--with-http_gzip_static_module \

--with-http_stub_status_module \

--with-http_realip_module \

--add-module=../fastdfs-nginx-module-master/src

 

# 重新编译、安装

make && make install

# 查看Nginx的模块

/home/deploy/nginx/sbin/nginx -V

 

# 有下面这个就说明添加模块成功

 

# 复制 fastdfs-nginx-module 源码中的配置文件到/etc/fdfs 目录, 并修改

cd /server/tools/fastdfs-nginx-module-master/src cp mod_fastdfs.conf /etc/fdfs/

# 修改如下配置,其它默认

IP_ADDR=$(hostname -I|grep -v '127.0.0.1'|awk '{print $1}')

sed -i "s#=tracker:22122#=$IP_ADDR:22122#g" /etc/fdfs/mod_fastdfs.conf

sed -i 's#url_have_group_name = false#url_have_group_name = true#g' /etc/fdfs/mod_fastdfs.conf

sed -i 's#/home/yuqing/fastdfs#/home/fastdfs/file#g' /etc/fdfs/mod_fastdfs.conf

*#* *mod_fastdfs.conf**配置文件讲解*

*# Tracker Server*

*tracker_server=59.188.82.54:22122*

 

*#* *连接超时时间*

*connect_timeout=2** *

*# StorageServer 默认端口*

*storage_server_port=23000*

 

*# 如果文件ID的uri中包含/group**,则要设置为true*

*url_have_group_name = true*

 

*# Storage 配置的store_path0路径,必须和storage.conf中的一致*

*store_path0=* */home/fastdfs/storage*

 

# 复制 FastDFS 的部分配置文件到/etc/fdfs 目录

cd /server/tools/fastdfs-5.05/conf/

cp anti-steal.jpg http.conf mime.types /etc/fdfs/

# 配置nginx,修改fdfs.conf在80端口下添加fastdfs-nginx模块

server {

listen 80;

server_name _;

location ~/group([0-9])/M00 {

alias /home/fastdfs/file/data;

ngx_fastdfs_module;

}

}

# 启动nginx

useradd -s /sbin/nologin www

mkdir -p /var/tmp/nginx/proxy

/home/deploy/nginx/sbin/nginx

打印处如下就算配置成功

 

http://113.10.152.94/group1/M00/00/00/cQqYXltlLauAa8xBAAAwQWTCx2Q059.png

1.1.2.6 *配置文件*

# 创建目录

mkdir -p /home/deploy/nginx/conf/vhost

# nginx.conf配置文件

worker_processes 1;

#error_log /var/log/nginx/nginx_error.log error;

#pid /home/deploy/nginx/logs/nginx.pid;

worker_rlimit_nofile 65535;

events

{

use epoll;

worker_connections 65535;

}

 

http

{

include mime.types;

default_type application/octet-stream;

 

server_names_hash_bucket_size 128;

client_header_buffer_size 32k;

large_client_header_buffers 4 32k;

client_max_body_size 50m;

 

sendfile on;

tcp_nopush on;

 

keepalive_timeout 60;

 

tcp_nodelay on;

 

fastcgi_connect_timeout 600;

fastcgi_send_timeout 600;

fastcgi_read_timeout 600;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 256k;

 

gzip on;

gzip_min_length 1k;

gzip_buffers 4 16k;

gzip_http_version 1.0;

gzip_comp_level 2;

gzip_types text/plain application/x-javascript text/css application/xml;

gzip_vary on;

gzip_proxied expired no-cache no-store private auth;

gzip_disable "MSIE [1-6].";

 

server_tokens off;

log_format access '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" $http_x_forwarded_for';

include vhost/*.conf;

}

# 配置文件Fdfs

cat /home/deploy/nginx/conf/vhost/fdfs.conf

server {

listen 81;

server_name tfdfs.yygame.cloud;

access_log logs/fdfs.log combined;

rewrite ^(.*)$ https://$server_name$1 permanent;

}

server {

listen 443 ssl;

server_name tfdfs.yygame.cloud;

ssl on;

ssl_certificate /home/deploy/nginx/conf/https/STAR.yygame.cloud.crt;

ssl_certificate_key /home/deploy/nginx/conf/https/STAR.yygame.cloud.key;

ssl_session_cache shared:SSL:1m;

ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;

ssl_prefer_server_ciphers on;

location / {

proxy_pass http://10.3.81.215:80;

proxy_ignore_headers Expires Cache-Control;

proxy_set_header Host $host:$server_port;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

}

 

}

posted @ 2021-01-25 11:07  ld_001  阅读(586)  评论(0编辑  收藏  举报