Fastdfs分布式文件存储系统架构剖析及分布式集群环境的配置

===============分布式文件存储系统Fastdfs架构解析========================node

FastDFS是一款类Google FS的开源分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。它只能经过专有API对文件进行存取访问,不支持POSIX接口方式,不能mount使用。准确地讲,Google FS以及FastDFS、mogileFS、HDFS、TFS等类Google FS都不是系统级的分布式文件系统,而是应用级的分布式文件存储服务。nginx

  FastDFS的设计理念git

  FastDFS是为互联网应用量身定作的分布式文件系统,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标。和现有的类Google FS分布式文件系统相比,FastDFS的架构和设计理念有其独到之处,主要体如今轻量级、分组方式和对等结构三个方面。github

  • 轻量级

  FastDFS只有两个角色:Tracker server和Storage server。Tracker server做为中心结点,其主要做用是负载均衡和调度。Tracker server在内存中记录分组和Storage server的状态等信息,不记录文件索引信息,占用的内存量不多。另外,客户端(应用)和Storage server访问Tracker server时,Tracker server扫描内存中的分组和Storage server信息,而后给出应答。由此能够看出Tracker server很是轻量化,不会成为系统瓶颈。web

  FastDFS中的Storage server在其余文件系统中一般称做Trunk server或Data server。Storage server直接利用OS的文件系统存储文件。FastDFS不会对文件进行分块存储,客户端上传的文件和Storage server上的文件一一对应。数据库

  众所周知,大多数网站都须要存储用户上传的文件,如图片、视频、电子文档等。出于下降带宽和存储成本的考虑,网站一般都会限制用户上传的文件大小,例如图片文件不能超过5MB、视频文件不能超过100MB等。我认为,对于互联网应用,文件分块存储没有多大的必要。它既没有带来多大的好处,又增长了系统的复杂性。FastDFS不对文件进行分块存储,与支持文件分块存储的DFS相比,更加简洁高效,而且彻底能知足绝大多数互联网应用的实际须要。apache

  在FastDFS中,客户端上传文件时,文件ID不是由客户端指定,而是由Storage server生成后返回给客户端的。文件ID中包含了组名、文件相对路径和文件名,Storage server能够根据文件ID直接定位到文件。所以FastDFS集群中根本不须要存储文件索引信息,这是FastDFS比较轻量级的一个例证。而其余文件系统则须要存储文件索引信息,这样的角色一般称做NameServer。其中mogileFS采用MySQL数据库来存储文件索引以及系统相关的信息,其局限性显而易见,MySQL将成为整个系统的瓶颈。vim

  FastDFS轻量级的另一个体现是代码量较小。最新的V2.0包括了C客户端API、FastDHT客户端API和PHP extension等,代码行数不到5.2万行。浏览器

  • 分组方式

  类Google FS都支持文件冗余备份,例如Google FS、TFS的备份数是3。一个文件存储到哪几个存储结点,一般采用动态分配的方式。采用这种方式,一个文件存储到的结点是不肯定的。举例说明,文件备份数是3,集群中有A、B、C、D四个存储结点。文件1可能存储在A、B、C三个结点,文件2可能存储在B、C、D三个结点,文件3可能存储在A、B、D三个结点。缓存

  FastDFS采用了分组存储方式。集群由一个或多个组构成,集群存储总容量为集群中全部组的存储容量之和。一个组由一台或多台存储服务器组成,同组内的多台Storage server之间是互备关系,同组存储服务器上的文件是彻底一致的。文件上传、下载、删除等操做能够在组内任意一台Storage server上进行。相似木桶短板效应,一个组的存储容量为该组内存储服务器容量最小的那个,因而可知组内存储服务器的软硬件配置最好是一致的。

  采用分组存储方式的好处是灵活、可控性较强。好比上传文件时,能够由客户端直接指定上传到的组。一个分组的存储服务器访问压力较大时,能够在该组增长存储服务器来扩充服务能力(纵向扩容)。当系统容量不足时,能够增长组来扩充存储容量(横向扩容)。采用这样的分组存储方式,可使用FastDFS对文件进行管理,使用主流的Web server如Apache、nginx等进行文件下载。

  • 对等结构

  FastDFS集群中的Tracker server也能够有多台,Tracker server和Storage server均不存在单点问题。Tracker server之间是对等关系,组内的Storage server之间也是对等关系。传统的Master-Slave结构中的Master是单点,写操做仅针对Master。若是Master失效,须要将Slave提高为Master,实现逻辑会比较复杂。和Master-Slave结构相比,对等结构中全部结点的地位是相同的,每一个结点都是Master,不存在单点问题。

  FastDFS的架构

  图1展现的是FastDFS的系统架构。

图1 FastDFS的系统架构

  从图1能够看出,Tracker server之间相互独立,不存在直接联系。

  客户端和Storage server主动链接Tracker server。Storage server主动向Tracker server报告其状态信息,包括磁盘剩余空间、文件同步情况、文件上传下载次数等统计信息。Storage server会链接集群中全部的Tracker server,向他们报告本身的状态。Storage server启动一个单独的线程来完成对一台Tracker server的链接和定时报告。须要说明的是,一个组包含的Storage server不是经过配置文件设定的,而是经过Tracker server获取到的。

  不一样组的Storage server之间不会相互通讯,同组内的Storage server之间会相互链接进行文件同步。

  Storage server采用binlog文件记录文件上传、删除等更新操做。binlog中只记录文件名,不记录文件内容。

  文件同步只在同组内的Storage server之间进行,采用push方式,即源头服务器同步给目标服务器。只有源头数据才须要同步,备份数据并不须要再次同步,不然就构成环路了。有个例外,就是新增长一台Storage server时,由已有的一台Storage server将已有的全部数据(包括源头数据和备份数据)同步给该新增服务器。

  Storage server中由专门的线程根据binlog进行文件同步。为了最大程度地避免相互影响以及出于系统简洁性考虑,Storage server对组内除本身之外的每台服务器都会启动一个线程来进行文件同步。

  文件同步采用增量同步方式,系统记录已同步的位置(binlog文件偏移量)到标识文件中。标识文件名格式:{dest storage IP}_{port}.mark,例如:192.168.1.14_23000.mark。

  文件上传和下载的交互过程

  接下来咱们一块儿看一下文件上传和下载的交互过程。文件上传和下载流程分别如图二、图3所示。文件上传流程的步骤以下:

图2 文件上传流程

图3 文件下载流程

  1. Client询问Tracker server上传到的Storage server;

  2. Tracker server返回一台可用的Storage server,返回的数据为该Storage server的IP地址和端口;

  3. Client直接和该Storage server创建链接,进行文件上传,Storage server返回新生成的文件ID,文件上传结束。

  文件下载流程的步骤以下:

  1. Client询问Tracker server能够下载指定文件的Storage server,参数为文件ID(包含组名和文件名);

  2. Tracker server返回一台可用的Storage server;

  3. Client直接和该Storage server创建链接,完成文件下载。

  文件同步延迟问题的提出

  客户端将一个文件上传到一台Storage server后,文件上传工做就结束了。由该Storage server根据binlog中的上传记录将这个文件同步到同组的其余Storage server。这样的文件同步方式是异步方式,异步方式带来了文件同步延迟的问题。新上传文件后,在还没有被同步过去的Storage server上访问该文件,会出现找不到文件的现象。FastDFS是如何解决文件同步延迟这个问题的呢?

  文件的访问分为两种状况:文件更新和文件下载。文件更新包括设置文件附加属性和删除文件。文件的附加属性包括文件大小、图片宽度、图片高度等。FastDFS中,文件更新操做都会优先选择源Storage server,也就是该文件被上传到的那台Storage server。这样的作法不只避免了文件同步延迟的问题,并且有效地避免了在多台Storage server上更新同一文件可能引发的时序错乱的问题。

  那么文件下载是如何解决文件同步延迟这个问题的呢?

  要回答这个问题,须要先了解文件名中包含了什么样的信息。Storage server生成的文件名中,包含了源Storage server的IP地址和文件建立时间等字段。文件建立时间为UNIX时间戳,后面称为文件时间戳。从文件名或文件ID中,能够反解出这两个字段。

  而后咱们再来看一下,Tracker server是如何准确地知道一个文件已被同步到一台Storage server上的。前面已经讲过,文件同步采用主动推送的方式。另外,每台storage server都会定时向tracker server报告它向同组的其余storage server同步到的文件时间戳。当tracker server收到一台storage server的文件同步报告后,它会依次找出该组内各个storage server(后称做为S)被同步到的文件时间戳最小值,做为S的一个属性记录到内存中。

  FastDFS对文件同步延迟问题的解决方案

  下面咱们来看一下FastDFS采起的解决方法。

  一个最简单的解决办法,和文件更新同样,优先选择源Storage server下载文件便可。这能够在Tracker server的配置文件中设置,对应的参数名为download_server。

  另一种选择Storage server的方法是轮流选择(round-robin)。当Client询问Tracker server有哪些Storage server能够下载指定文件时,Tracker server返回知足以下四个条件之一的Storage server:

  • 该文件上传到的源Storage server,文件直接上传到该服务器上的;
  • 文件建立时间戳 < Storage server被同步到的文件时间戳,这意味着当前文件已经被同步过来了;
  • 文件建立时间戳=Storage server被同步到的文件时间戳,且(当前时间—文件建立时间戳) > 一个文件同步完成须要的最大时间(如5分钟);
  • (当前时间—文件建立时间戳) > 文件同步延迟阈值,好比咱们把阈值设置为1天,表示文件同步在一天内确定能够完成。

 

======================================================================

  • FastDFS安装
        FastDFS是一个国产开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以文件为载体的在线服务,如相册网站、视频网站等等.FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage).跟踪器主要作调度工做,在访问上起负载均衡的做用.
     
  • 下载地址
    http://sourceforge.net/projects/fastdfs/files/
    http://code.google.com/p/fastdfs/
     

     


    实现多服务器fastdfs 
     

     

  • 总体网络配置
    Tracker  Server    192.168.55.222         /home/tracker  端口:22122
    Tracker  Server    192.168.55.226         /home/tracker  端口:22122
    Storage1 Server    192.168.55.223  group1 /home/storage  端口:23000
    Storage4 Server    192.168.55.227  group1 /home/storage  端口:23000
    Storage2 Server    192.168.55.224  group2 /home/storage  端口:23000
    Storage3 Server    192.168.55.225  group2 /home/storage  端口:23000
    #Storage2为group2的源服务器
    注意:
    1.group2同组的Storage2和Storage3 FastDFS服务端口必须一致: port=23000。
    2.一台服务器能够装多个组(group)但不能装同组的多个Storage,日志会报错误,日志报错缘由是"注意1"
    3.Version 4.05以前fastdfs内部绑定了libevent做为http服务器.Version 4.05以后的版本删除了内置的web http服务,内置的web http服务是个累赘,不用也罢!
    4.启动storage server时,一直处于僵死状态.启动storage server,storage将链接tracker server,若是连不上,将一直重试。直到链接成功,启动才算真正完成!若是集群中有2台tracker server,而其中一台tracker没有启动,可能会致使storage server一直处于僵死状态
  • 系统操做环境的设置
    #软件安装包存储:
      /usr/local/src
      /usr/local/fastdfs  fastdfs安装目录
    
    #基本目录列表:
    #建立fastdfs用户
      /usr/sbin/groupadd fastdfs
      /usr/sbin/useradd -g fastdfs fastdfs
    #建立存储数据目录
      mkdir -p /home/fastdfs/tracker;#建立tracker目录保存运行日志
      mkdir -p /home/fastdfs/storage;#建立Storage目录保存运行日志及其data数据 
    # source .bashrc
  • 为方便查找目录,设置变量
    ################Tracker################
    # vi .bashrc
      alias  worksrc='cd /usr/local/src;ls'
      alias  workfastdfs='cd /usr/local/fastdfs;ls'
      alias  worktracker='cd /home/fastdfs/tracker;ls'
    #track启动 重启 中止
      alias  sertracker='service fdfs_trackerd'
    配置生效
    # source .bashrc
  • 为方便查找目录,设置变量
    ################Storage################
    # vi .bashrc
      alias  worksrc='cd /usr/local/src;ls'
      alias  workfastdfs='cd /usr/local/fastdfs;ls'
      alias  workstorage='cd /home/fastdfs/storage;ls'
      alias  workfastdfs='cd /usr/local/nginx;ls'
    #storage启动 重启 中止
      alias  serstorage='service fdfs_storaged'
    #nginx 启动 重启 中止
      alias  sernginx='service nginxd'
    配置生效
    # source .bashrc

1.安装libevent 和 fastdfs

  • 首先安装libevent. fastdfs在编译源程序时fastdfs内部调用libevent的处理机制,,须要用到libevent一些依赖文件,不然编译fastdfs会出错
    #卸载系统自带libevent,自带版本太低,安装fastdfs会出错
      rpm -qa|grep libevent
    #  或者
      yum remove libevent*
    #下载安装libevent
    #worksrc;
      wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz;
      tar -zxvf libevent-2.0.19-stable.tar.gz;
      cd libevent-2.0.19-stable;
    #make clean;
      ./configure --prefix=/usr/local/libevent
      make && make install;
    #为libevent建立软连接到/lib库下,64位系统对应/lib64
      ln -s /usr/local/libevent/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5
      ln -s /usr/local/libevent/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
    #命令汇总:
      worksrc;wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.19-stable.tar.gz;tar -zxvf libevent-2.0.19-stable.tar.gz;cd libevent-2.0.19-stable;make clean;./configure --prefix=/usr/local/libevent;make && make install;cd ../
  • 安装fastdfs的步骤
     
    worksrc;
    # 自行下载 4.07  http://sourceforge.net/projects/fastdfs/files/ 
    # wget http://fastdfs.googlecode.com/files/FastDFS_v4.06.tar.gz
      tar -zxvf FastDFS_v4.07.tar.gz
      cd FastDFS
    
    #因为定义/usr/local/fastdfs为fastdfs安装目录,因此须要修改make.sh
      vim make.sh
    #/etc/fdfs 所有替换为 /usr/local/fastdfs/conf
      %s/\/etc\/fdfs/\/usr\/local\/fastdfs\/conf/g
    
    # TARGET_PREFIX=/usr/local 修改成 /usr/local/fastdfs
      sed -i 's:TARGET_PREFIX=.*:TARGET_PREFIX=/usr/local/fastdfs:g' make.sh
    
    # TARGET_CONF_PATH=/etc/fdfs 修改成 /usr/local/fastdfs/conf
      sed -i 's:TARGET_CONF_PATH=.*:TARGET_CONF_PATH=/usr/local/fastdfs/conf:g' make.sh
    
    #安装
      ./make.sh C_INCLUDE_PATH=/usr/local/libevent/include LIBRARY_PATH=/usr/local/libevent/lib
      ./make.sh install
    修改 fastdfs 启动文件
    # 修改 fdfs_trackerd 配置文件
      vim /etc/init.d/fdfs_trackerd
    #替换
      %s/usr\/local/usr\/local\/fastdfs/g
      %s/etc\/fdfs/usr\/local\/fastdfs\/conf/g
    #增长x权限
      chmod a+x /etc/init.d/fdfs_trackerd
    
    # 修改 fdfs_storaged 配置文件
      vim /etc/init.d/fdfs_storaged
    #替换
      %s/usr\/local/usr\/local\/fastdfs/g
      %s/etc\/fdfs/usr\/local\/fastdfs\/conf/g
    #增长x权限
      chmod a+x /etc/init.d/fdfs_storaged


2.安装Tracker Server - 192.168.55.222

  • 引用上例中安装libevent 和 fastdfs步骤
  • 配置及启动Tracker Server,端口:22122
     
    #修改tracker.conf配置
      vim /usr/local/fastdfs/conf/tracker.conf
    # the tracker server port
      port=22122
    # the base path to store data and log files
      base_path=/home/yuqing/fastdfs -> base_path=/home/fastdfs/tracker #日志目录
    # sed -i 's:base_path=.*:base_path=/home/fastdfs/tracker:g' tracker.conf
      reserved_storage_space = 4GB -> reserved_storage_space = 1GB
    # sed -i 's:reserved_storage_space=.*:reserved_storage_space = 1GB:g' tracker.conf
    #unix group name to run this program,
    #not set (empty) means run by the group of current user
      run_by_group= -> fastdfs
    #unix username to run this program,
    #not set (empty) means run by current user
      run_by_user= -> fastdfs
    #开启自定义server ID取代ip形式,方便内部网络服务器更换ip#**此方式要重点理解,4.0之后新特性
      use_storage_id = true #使用server ID做为storage server标识
      storage_ids_filename = storage_ids.conf #<id> <group_name> <ip_or_hostname>
      id_type_in_filename = id #文件名反解析中包含server ID,之前是ip
    复制storage_ids.conf文件
    cp -r /usr/local/src/FastDFS/conf/storage_ids.conf /usr/local/fastdfs/conf/
    #编辑storage服务器ID与IP地址的对应关系
      vim /usr/local/fastdfs/conf/storage_ids.conf
    #<id> <group_name> <ip_or_hostname>
    # 100001          group1           192.168.55.223
  • 设置 Tracker Server 用户及组
     
    chown -R fastdfs:fastdfs /home/fastdfs
    增长x权限
    chmod a+x /etc/init.d/fdfs_trackerd
    启动 Tracker
     
    service fdfs_trackerd start
    #启动过程当中出现的错误
      ./fdfs_trackerd: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory
    #解决办法
      ln -s /usr/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
    #查看日志
      vim /home/fastdfs/tracker/logs/trackerd.log
    #启动后成功的日志
    #[2013-10-03 20:50:08] INFO - FastDFS v4.07, base_path=/home/fastdfs/tracker, run_by_group=fastdfs, run_by_user=fastdfs, connect_timeout=30s, network_timeout=60s, port=22122, bind_addr=, max_connections=256, accept_threads=1, work_threads=4, store#_lookup=2, store_group=, store_server=0, store_path=0, reserved_storage_space=10.00%, download_server=0, allow_ip_count=-1, sync_log_buff_interval=10s, check_active_interval=120s, thread_stack_size=64 KB, storage_ip_changed_auto_adjust=1, storage_sy#nc_file_max_delay=86400s, storage_sync_file_max_time=300s, use_trunk_file=0, slot_min_size=256, slot_max_size=16 MB, trunk_file_size=64 MB, trunk_create_file_advance=0, trunk_create_file_time_base=02:00, trunk_create_file_interval=86400, trunk_create_file_sp#ace_threshold=20 GB, trunk_init_check_occupying=0, trunk_init_reload_from_binlog=0, use_storage_id=1, id_type_in_filename=id, storage_id_count=1, rotate_error_log=0, error_log_rotate_time=00:00, rotate_error_log_size=0, store_slave_file_use_link=0, use_con#nection_pool=0, g_connection_pool_max_idle_time=3600s
    设置开机启动 Tracker
    vim /etc/rc.d/rc.local
      service fdfs_trackerd start
    附目录说明
    #  tracker server目录及文件结构:
    #  ${base_path}
    #    |__data
    #    |     |__storage_groups.dat:存储分组信息
    #    |     |__storage_servers.dat:存储服务器列表
    #    |__logs
    #          |__trackerd.log:tracker server日志文件


3.安装Storage Server -192.168.55.223

  • 引用上例中安装libevent 和 fastdfs步骤
  • 修改storage.conf配置
     
    vim /usr/local/fastdfs/conf/storage.conf
    # the name of the group this storage server belongs to
      group_name=group1
    # the name of the group this storage server belongs to
    # the storage server port #the storage server port
      port=23000
    # the base path to store data and log files #日志目录
      base_path=/home/yuqing/fastdfs -> /home/fastdfs/storage
    # store_path#, based 0, if store_path0 not exists, it's value is base_path #data数据存储目录
    # the paths must be exist
      store_path0=/home/fastdfs/storage
    # 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.209.121:22122 ->192.168.55.222:22122
    #unix group name to run this program,
    #not set (empty) means run by the group of current user
      run_by_group= -> fastdfs   #这儿必定填写执行的用户名,否则会启动报错,测试环境填写的 root
    #unix username to run this program,
    #not set (empty) means run by current user
      run_by_user= -> fastdfs   #这儿必定填写执行的用户名,否则会启动报错,测试环境填写的 root
    设置 Storage Server 用户及组
     
    chown -R fastdfs:fastdfs /home/fastdfs
    增长x权限
    chmod a+x /etc/init.d/fdfs_storaged
    启动 Storage
    service fdfs_storaged start
    #接下来会出现不少mkdir data path,这是系统在建立数据目录
    #data path: /home/fastdfs/storage/data, mkdir sub dir...
    #mkdir data path: 00 ...
    #mkdir data path: 01 ...
    #mkdir data path: 02 ...
    #mkdir data path: 03 ...
    #.......................
    #data path: /home/fastdfs/storage/data, mkdir sub dir done.
    设置开机启动 Storage 
    vim /etc/rc.d/rc.local
      service fdfs_storaged start
    附目录说明
    #  storage server目录及文件结构:
    #  ${base_path}
    #    |__data
    #    |     |__storage_stat.dat:本地存储信息
    #    |     |__sync
    #    |           |__ binlog.000
    #    |           |__ binlog.index
    #    |__logs
    #          |__storaged.log:storage server日志文件
  • 安装fastdfs-nginx-module模块
     
    #建立相关用户和目录建立www用户和组
      /usr/sbin/groupadd www
      /usr/sbin/useradd -g www www
    #建立nginx日志目录
      mkdir -p /home/www/logs
      chmod a+w /home/www/logs
      chown -R www:www /home/www/logs
    安装nginx
     
    cd /usr/local/src
    #下载 nginx
    #wget http://nginx.org/download/nginx-1.5.4.tar.gz
      tar -zxvf nginx-1.5.4.tar.gz
      cd nginx-1.5.4/
      ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module
      make && make install
    #--with-http_stub_status_module 用来监控nginx的当前状态
    安装fastdfs-nginx-module插件
     
    #worksrc;
      cd /usr/local/src
    # wget http://fastdfs.googlecode.com/files/fastdfs-nginx-module_v1.15.tar.gz
      tar -zxvf fastdfs-nginx-module_v1.15.tar.gz
    #修改插件配置文件
      vim /usr/local/src/fastdfs-nginx-module/src/config
    ngx_addon_name=ngx_http_fastdfs_module
    HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
    CORE_INCS="$CORE_INCS /usr/local/fastdfs/include/fastdfs /usr/local/fastdfs/include/fastcommon/"
    CORE_LIBS="$CORE_LIBS -L/usr/local/fastdfs/lib -lfastcommon -lfdfsclient"
    CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/usr/local/fastdfs/conf/mod_fastdfs.conf\"'"
    #复制mod_fastdfs.conf到/usr/local/fastdfs/conf/目录下
      cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /usr/local/fastdfs/conf/
    上面编译时使用的动态连接库
     
    #启动nginx报错
    #./nginx: error while loading shared libraries: libfastcommon.so: cannot open shared object file: No such file or directory
    #解决办法 ---> 将/usr/local/fastdfs/lib 加入系统文件/etc/ld.so.conf中
      vim /etc/ld.so.conf
      /usr/local/fastdfs/lib
    #更新库文件缓存ld.so.cache
      /sbin/ldconfig -v
    编译fastdfs-nginx-module模块
     
    # 从新编译nginx  
      cd /usr/local/src/nginx-1.5.4
      ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src
      make; make install
    修改mod_fastdfs.conf配置
     
    vim /usr/local/fastdfs/conf/mod_fastdfs.conf
    # the base path to store log files
      base_path=/tmp
    # if load FastDFS parameters from tracker server
    # since V1.12
    # default value is false
      load_fdfs_parameters_from_tracker=true
    # FastDFS tracker_server can ocur more than once, and tracker_server format is
    #  "host:port", host can be hostname or ip address
    # valid only when load_fdfs_parameters_from_tracker is true
      tracker_server=192.168.55.222:22122
    # the port of the local storage server
    # the default value is 23000
      storage_server_port=23000
    # the group name of the local storage server
      group_name=group1
    # if the url / uri including the group name
    # set to false when uri like /M00/00/00/xxx
    # set to true when uri like ${group_name}/M00/00/00/xxx, such as group1/M00/xxx
    # default value is false
      url_have_group_name = true
    # path(disk or mount point) count, default value is 1
    # must same as storage.conf
      store_path_count=1
    # store_path#, based 0, if store_path0 not exists, it's value is base_path
    # the paths must be exist
    # must same as storage.conf
      store_path0=/home/fastdfs/storage
    # set the log filename, such as /usr/local/apache2/logs/mod_fastdfs.log
    # empty for output to stderr (apache and nginx error_log file)
      log_filename=/home/www/logs/mod_fastdfs.log
    nginx配置简洁版本
    #vim /usr/local/nginx/conf/nginx.conf
    user  www www;
    worker_processes  2;
    error_log  /home/www/logs/error.log  notice;
    pid        /home/www/logs/nginx.pid;
    
    worker_rlimit_nofile 5120;
    events {
        use epoll;
        worker_connections  5120;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        sendfile        on;
        tcp_nopush     on;
        keepalive_timeout  60;
        tcp_nodelay on;
    
        server {
            listen       80;
            server_name  localhost;
            location /group1/M00 {
                alias /home/fastdfs/storage/data;
                ngx_fastdfs_module;
            }
        }
    }
    
    #启动nginx
      /usr/local/nginx/sbin/nginx


4.安装Storage Server -192.168.55.224

  • 引用上例中安装libevent 和 fastdfs步骤
  • 修改storage.conf配置 
    vim /usr/local/fastdfs/conf/storage.conf
    # the name of the group this storage server belongs to
      group_name=group2
    # the name of the group this storage server belongs to
    # the storage server port #the storage server port
      port=23000
    # the base path to store data and log files #日志目录
      base_path=/home/yuqing/fastdfs -> /home/fastdfs/storage
    # store_path#, based 0, if store_path0 not exists, it's value is base_path #data数据存储目录
    # the paths must be exist
      store_path0=/home/fastdfs/storage
    #unix group name to run this program,
    #not set (empty) means run by the group of current user
      run_by_group= -> fastdfs    #这儿必定填写执行的用户名,否则会启动报错,测试环境填写的 root
    #unix username to run this program,
    #not set (empty) means run by current user
      run_by_user= -> fastdfs   #这儿必定填写执行的用户名,否则会启动报错,测试环境填写的 root
    # 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.xxx.xxxx:22122 -> tracker_server=192.168.55.222:22122
  • 引用上例中 "编辑启动脚本" 步骤
    #启动 Storage  
      service fdfs_storaged restart
    #接下来会出现不少mkdir data path,这是系统在建立数据目录
    #data path: /home/fastdfs/storage/data, mkdir sub dir...
    #mkdir data path: 00 ...
    #mkdir data path: 01 ...
    #mkdir data path: 02 ...
    #mkdir data path: 03 ...
    #.......................
    #data path: /home/fastdfs/storage/data, mkdir sub dir done.
  • 安装fastdfs-nginx-module插件
     
    #worksrc;
      cd /usr/local/src
    # wget http://fastdfs.googlecode.com/files/fastdfs-nginx-module_v1.15.tar.gz
      tar -zxvf fastdfs-nginx-module_v1.15.tar.gz
    #修改插件配置文件
      vim /usr/local/src/fastdfs-nginx-module/src/config
    ngx_addon_name=ngx_http_fastdfs_module
    HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
    NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
    CORE_INCS="$CORE_INCS /usr/local/fastdfs/include/fastdfs /usr/local/fastdfs/include/fastcommon/"
    CORE_LIBS="$CORE_LIBS -L/usr/local/fastdfs/lib -lfastcommon -lfdfsclient"
    CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/usr/local/fastdfs/conf/mod_fastdfs.conf\"'"
    #复制mod_fastdfs.conf到/usr/local/fastdfs/conf/目录下
      cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /usr/local/fastdfs/conf/
    上面编译时使用的动态连接库
     
    #将/usr/local/fastdfs/lib 加入系统文件/etc/ld.so.conf中
      vim /etc/ld.so.conf
      /usr/local/fastdfs/lib
    #更新库文件缓存ld.so.cache
      /sbin/ldconfig
    编译fastdfs-nginx-module模块
     
    # 从新编译nginx  
      cd /usr/local/src/nginx-1.5.4
      ./configure --add-module=/usr/local/src/fastdfs-nginx-module/src
      make; make install
    修改mod_fastdfs.conf配置
     
    vim /usr/local/fastdfs/conf/mod_fastdfs.conf
    # the base path to store log files
      base_path=/tmp
    # if load FastDFS parameters from tracker server
    # since V1.12
    # default value is false
      load_fdfs_parameters_from_tracker=true
    # FastDFS tracker_server can ocur more than once, and tracker_server format is
    #  "host:port", host can be hostname or ip address
    # valid only when load_fdfs_parameters_from_tracker is true
      tracker_server=192.168.25.11:22122
    # the port of the local storage server
    # the default value is 23000
      storage_server_port=23000
    # the group name of the local storage server
      group_name=group2
    # if the url / uri including the group name
    # set to false when uri like /M00/00/00/xxx
    # set to true when uri like ${group_name}/M00/00/00/xxx, such as group1/M00/xxx
    # default value is false
      url_have_group_name = true
    # path(disk or mount point) count, default value is 1
    # must same as storage.conf
      store_path_count=1
    # store_path#, based 0, if store_path0 not exists, it's value is base_path
    # the paths must be exist
    # must same as storage.conf
      store_path0=/home/fastdfs/storage
    # set the log filename, such as /usr/local/apache2/logs/mod_fastdfs.log
    # empty for output to stderr (apache and nginx error_log file)
      log_filename=/home/www/logs/mod_fastdfs.log
    nginx配置简洁版本
    #vim /usr/local/nginx/conf/nginx.conf
    user  www www;
    worker_processes  2;
    error_log  /home/www/logs/error.log  notice;
    pid        /home/www/logs/nginx.pid;
    
    worker_rlimit_nofile 5120;
    events {
        use epoll;
        worker_connections  5120;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        sendfile        on;
        tcp_nopush     on;
        keepalive_timeout  60;
        tcp_nodelay on;
    
        server {
            listen       80;
            server_name  localhost;
            location /group2/M00 {
                alias /home/fastdfs/storage/data;
                ngx_fastdfs_module;
            }
        }
    }
    
    #启动nginx
      /usr/local/nginx/sbin/nginx

5.安装Storage Server - 192.168.55.225

  • 参考 192.168.55.224 安装,不一样点就是192.168.55.224是group2的源服务,storage.conf配置不一样,须要注意。

6.测试及使用fastdfs-192.168.55.222

  • fastdfs之配置client
     
    #修改 client.conf
      vim /usr/local/fastdfs/conf/client.conf
      base_path=/home/yuqing/fastdfs-> base_path=/home/fastdfs/tracker
      tracker_server=192.168.209.121:22122 -> tracker_server=192.168.55.222:22122
    #或
      sed -i 's:base_path=.*:base_path=/home/fastdfs/tracker:g' /usr/local/fastdfs/conf/client.conf
      sed -i 's:tracker_server=.*:tracker_server=192.168.55.222\:22122:g' /usr/local/fastdfs/conf/client.conf
    #upload
      cd /usr/local/fastdfs/bin
      ./fdfs_upload_file /usr/local/fastdfs/conf/client.conf /tmp/t1.jpg 
    #-——————————————————————————————————————
    #group1/M00/00/00/oYYBAFJNRnGASWekAAAXkpktHxI423.jpg
    查看文件信息
     
    ./fdfs_file_info /usr/local/fastdfs/conf/client.conf group1/M00/00/00/oYYBAFJNQiiAYIXzAAAXkpktHxI095.jpg
    #————————————————————————————————————————
    source storage id: 100001
    source ip address: 192.168.55.223
    file create timestamp: 2013-10-03 18:26:57
    file size: 6034
    file crc32: 2569871122 (0x992D1F12)
    测试上传
     
    ./fdfs_test /usr/local/fastdfs/conf/client.conf upload /tmp/t1.jpg 
    #————————————————————————————————————————
    This is FastDFS client test program v4.07
    
    Copyright (C) 2008, Happy Fish / YuQing
    
    FastDFS may be copied only under the terms of the GNU General
    Public License V3, which may be found in the FastDFS source kit.
    Please visit the FastDFS Home Page http://www.csource.org/ 
    for more detail.
    
    [2013-10-04 02:20:19] DEBUG - base_path=/home/fastdfs/tracker, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0, use_connection_pool=0, g_connection_pool_max_idle_time=3600s, use_storage_id=0, storage server id count: 0
    
    tracker_query_storage_store_list_without_group: 
            server 1. group_name=, ip_addr=192.168.55.223, port=23000
    
    group_name=group1, ip_addr=192.168.55.223, port=23000
    storage_upload_by_filename
    group_name=group1, remote_filename=M00/00/00/oYYBAFJNRWeAHhGuAAAXkpktHxI578.jpg
    source ip address: 192.168.55.223
    file timestamp=2013-10-03 18:22:31
    file size=6034
    file crc32=2569871122
    example file url: http://192.168.55.223/group1/M00/00/00/oYYBAFJNRWeAHhGuAAAXkpktHxI578.jpg
    storage_upload_slave_by_filename
    group_name=group1, remote_filename=M00/00/00/oYYBAFJNRWeAHhGuAAAXkpktHxI578_big.jpg
    source ip address: 192.168.55.223
    file timestamp=2013-10-03 18:22:31
    file size=6034
    file crc32=2569871122
    example file url: http://192.168.55.223/group1/M00/00/00/oYYBAFJNRWeAHhGuAAAXkpktHxI578_big.jpg

    在浏览器中-->http://192.168.55.222/group1/M00/00/00/oYYBAFJNQiiAYIXzAAAXkpktHxI095.jpg
    输入上图中的url地址, tracker server 会自动重定向到存储文件的 storage server,文件下载成功。至此,已经成功搭建了fastdfs。弄了两天,终于好了 - 0-:

     
  • 常规命令范例:
    #监控storage
    /usr/local/fastdfs/bin/fdfs_monitor /usr/local/fastdfs/conf/storage.conf
    #若是存在多个多个组,只须要监控其中一个组,就能调出全部组的状态
    
    #删除组内服务器storage和查看各个组内服务器状态
    /usr/local/fastdfs/bin/fdfs_monitor /usr/local/fastdfs/conf/client.conf delete group2 192.168.55.223
    /usr/local/fastdfs/bin/fdfs_monitor /usr/local/fastdfs/conf/client.conf
    storage server有7个状态,以下(数值从1~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    :在线,能够提供服务
  • 经常使用操做命令
    #调整防火墙的规则,开放端口:22122
      iptables -I INPUT 5 -p tcp -m state --state NEW -m tcp --dport 22122 -j ACCEPT
      /etc/init.d/iptables save
    
    #调整防火墙的规则,开放端口:23000
      iptables -I INPUT 5 -p tcp -m state --state NEW -m tcp --dport 23000 -j ACCEPT
      /etc/init.d/iptables save
     
    #启动tracker进程:
      /etc/init.d/fdfs_trackerd start
    
    #查看trackerd状态:
      /etc/init.d/fdfs_trackerd status
    
    #查看trackerd监听的端口:
      netstat -plantu | grep tracker
    
    #启动Storage进程:
      /etc/init.d/fdfs_storaged start
    
    #查看Storage进程:
      ps -ef | grep storaged | grep -v grep

 

参考:http://my.oschina.net/shking/blog/165326

http://baike.sogou.com/h60583131.htm?sp=l60583132

相关文章
相关标签/搜索