zoukankan      html  css  js  c++  java
  • 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;

    }

     

    }

  • 相关阅读:
    LeetCode算法第一题
    基础题整理
    MongoDB 之 Limit 选取 Skip 跳过 Sort 排序 MongoDB
    MongoDB 之 $关键字 及 $修改器 $set $inc $push $pull $pop MongoDB
    mongodb的数据类型
    mongodb的增删改查
    session与cookie之间的关系
    Python 格式化输出的3种方式
    判断python字典中key是否存在的两种方法
    python实现忽略大小写对字符串列表排序的方法
  • 原文地址:https://www.cnblogs.com/llddhh/p/14324138.html
Copyright © 2011-2022 走看看