关于Linux操作系统中FastDFS部署手册

 

1.       部署环境

关于本次FastDFS_3.11版本的部署实验环境如下表所示:

                                                                            FastDFS部署环境

类别

OS

FastDFS

机器台数

备注

版本

RedHat_Linux.5.4-x86_64

FastDFS_v3.11

2


表格 1

2.       组件和包安装

  • 安装开发工具和所需的开发包

配置yum升级服务或安装系统时选择安装相关的依赖组件,这里使用yum对包进行安装,如下所示:

yum groupinstall-y "development tools"

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

  • 检查libevent状态并卸载之(所有服务器上都需要执行)

查询系统已安装的libevent版本并卸载

rpm -qa libevent

libevent-1.4.13-1.el6.x86_64

rpm -e --nodeps libevent

  • 安装libevent(所有服务器上都需要执行)

tar xvzf libevent-2.0.21-stable.tar.gz

cdlibevent-2.0.21-stable

./configure;make;make install

通软连接将库文件链接到/lib64

ln -s /usr/local/lib/libevent-2.0.so.5 /lib64/libevent-2.0.so.5  64位操作系统必须32位不需要)

3.       FastDFS安装

3.1.    安装

关于FastDFS的安装在所有的的服务器(tracker、storage)上都要执行此操作。

  • 解压缩安装包

cd ~

tar xvzf FastDFS_v3.11.tar.gz

cd FastDFS

  • 修改 make.sh中下述两个选项

#WITH_HTTPD=1  àWITH_HTTPD=1

#WITH_LINUX_SERVICE=1 àWITH_LINUX_SERVICE=1 [去掉前面的#号即可]

  • 编译安装

./make.sh;./make.sh install

3.2.    Tracker部署配置

  • 创建日志存储目录/home/iflytek/fastdfs(该目录可自定义)

mkdir -p /home/iflytek/fastdfs  

  • 修改tracker.conf配置

vi /etc/fdfs/tracker.conf

base_path=/home/yuqing/fastdfs -> base_path=/home/iflytek/fastdfs

store_group=group2àstore_group=group1

##include http.conf  à#includehttp.conf

  • 启动tracker

/usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf

重新启动tracker命令如下:

/usr/local/bin/restart.sh /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf

3.3.    Storage部署配置

安装libevent和FastDFS的步骤与tracker是一样的。先安装libevent和FastDFS组件,再依照下面的步骤安装其他的组件:

  • 创建FastDFS数据存储目录/home/iflytek/fastdfs(该目录可自定义)

mkdir -p /home/iflytek/fastdfs  

  • 修改storage.conf配置

# vi /etc/fdfs/storage.conf

base_path=/home/yuqing/fastdfs --> /home/iflytek/fastdfs

store_path0=/home/yuqing/fastdfs --> store_path0=/home/iflytek/fastdfs

group_name=group1

tracker_server=192.168.209.121:22122 --> tracker_server=192.168.12.193:22122

##include http.conf --> #include http.conf

  • 取消storage默认的http服务

#HTTPsettings

http.disabled=true

  • 启动storage

/usr/local/bin/fdfs_storaged/etc/fdfs/storage.conf

重新启动storage命令如下:

/usr/local/bin/restart.sh /usr/local/bin/fdfs_storaged/etc/fdfs/storage.conf

此时确保可以与tracker通讯,关闭tracker服务器的防火墙或添加入站规则。如果此时出现异常请检查/home/iflytek/fastdfs/logs/storage.log文件的相关内容。

4.       Nginx安装部署

下述关于nginx的部署安装都是在storage服务器上进行的

  • 安装fastdfs-nginx-module和nginx组件

  • 解压fastdfs-nginx-module模块

cd ~

tar xvzf fastdfs-nginx-module_v1.10.tar.gz

  • 安装nginx

cd ~

tar xvzf nginx-1.5.1.tar.gz

cd nginx-1.5.1

make clean

./configure  --prefix=/usr/local/nginx --add-module=/root/fastdfs-nginx-module/src

make;make install

  • 在nginx的server配置段中增加M00的location声明

  • vi/usr/local/nginx/conf/nginx.conf

 location /group1/M00 {    

           root /home/iflytek/fastdfs/data;   
            ngx_fastdfs_module; 

     }   

  • 修改nginx默认工作端口

修改nginx默认工作端口80为8888,如下图所示

 wKiom1X7eUPCvpbDAADkR5MCfio039.jpg

  • 创建M00目录的软连接

  • mkdir-p /home/iflytek/fastdfs/data/M00

  • ln-s /home/iflytek/fastdfs/data  /home/iflytek/fastdfs/data/M00

  • nginx启动和开机自启动

  • /usr/local/nginx/sbin/nginx

  • echo"/usr/local/nginx/sbin/nginx" >> /etc/rc.local

  • 修改mod_fastdfs.conf

  • cp/root/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

  • vi /etc/fdfs/mod_fastdfs.conf

# the base path to store log files

base_path=/home/storage 改为base_path=/home/iflytek/fastdfs====> 放置log的目录

# FastDFS tracker_server can ocur more than once, andtracker_server format is

#  "host:port",host can be hostname or ip address

tracker_server=192.168.12.193:22122 ====>tracker server的ip和端口,此处可以写多个tracker server,每行一个

# the group name of storage server

group_name=group1 ====> 此台storage server所属的服务器组名

# if uri including group name

# default value is false

url_have_group_name = true ====> 在URL中包含group名称

# store_path#, based 0, if store_path0 not exists, it'svalue is base_path

# the paths must be exist

store_path0=/home/iflytek/fastdfs ====> 放置文件的目录

5.       上传测试

5.1.    配置client

在FastDFS的tracker或者storage节点上都可以承担client的角色。只需要配置一下client即可(本例在tracker节点上配置client),详细配置如下:

  • 修改client.conf

# vi /etc/fdfs/client.conf

base_path=/home/yuqing/fastdfs-> base_path=/home/iflytek/fastdfs

tracker_server=192.168.209.121:22122 -> tracker_server=192.168.12.193:22122  

##include http.conf ->#include http.conf

5.2.    上传文件验证

  • 上传文件之前需先将工作目录切换到文件所在的目录中去(本例所上传的文件在/root目录下)

  • cd /root

  • 文件上传

  • usr/local/bin/fdfs_test /etc/fdfs/client.conf upload  install.log

/usr/local/bin/fdfs_test /etc/fdfs/client.conf upload install.log

1.      This is FastDFS client test program v3.11

2.        

3.      Copyright (C) 2008, Happy Fish / YuQing

4.        

5.      FastDFS may be copied only under the terms of the GNU General

6.      Public License V3, which may be found in the FastDFS source kit.

7.      Please visit the FastDFS Home Page http://www.csource.org/

8.      for more detail.  

9.        

10.    [2012-09-12 15:43:03] DEBUG - base_path=/home/iflytek/fastdfs, connect_timeout=30, network_timeout=60, tracker_server_count=1, anti_steal_token=0, anti_steal_secret_key length=0  

11.      

12.    tracker_query_storage_store_list_without_group:   

13.            server 1. group_name=group1, ip_addr=192.168.0.11, port=23000  

14.      

15.    group_name=group1, ip_addr=192.168.0.11, port=23000  

16.    storage_upload_by_filename  

17.    group_name=group1, remote_filename=M00/00/00/CAAAC1BQPQqy0zXVAAWp7X_1XGc.tar.gz  

18.    source ip address: 192.168.0.11  

19.    file timestamp=2012-09-12 15:43:06  

20.    file size=371181  

21.    file crc32=2146786407  

22.    file url: http://192.168.12.193:8080/group1/M00/00/00/CAAAC1BQPQqy0zXVAAWp7X_1XGc.tar.gz   

23.    storage_upload_slave_by_filename  

24.    group_name=group1, remote_filename=M00/00/00/CAAAC1BQPQqy0zXVAAWp7X_1XGc_big.tar.gz  

25.    source ip address: 8.0.0.11  

26.    file timestamp=2012-09-12 15:43:06  

27.    file size=371181  

28.    file crc32=2146786407  

29.    file url: http://192.168.12.193:8080/group1/M00/00/00/CAAAC1BQPQqy0zXVAAWp7X_1XGc_big.tar.gz  

通过浏览器访问上述标红的文件地址,如果浏览器返回文件的内容则说明部署成功。


6.       附录

6.1.    Group中设置多存储路径

在FastDFS的一个Group中可以设置多个存储路径,这样就可以使数据存储到多个存储目录中。设置多路径后至于数据存储到哪个目录中是由FastDFS随机分配的,关于Group中多存储路径的设置详细信息如下所述:

  • 修改storage服务器上的storage.conf

  • 编辑storage.conf

Vi /etc/fdfs/storage.conf

  • 修改存储路径节点数

# path(disk or mount point) count, default value is 1

store_path_count=3  //根据实际情况修改配置的路径数,我这里配置了三个路径,默认是1

  • 添加存储路径

# store_path#, based 0, if store_path0 not exists, it'svalue is base_path

# the paths must be exist

store_path0=/iflytek/fastdfs      //第一个数据存储路径

store_path1=/home/iflytek/fastdfs  //第二个存储路径

store_path2=/opt/iflytek/fastdfs   //第三个存储路径

#store_path1=/home/yuqing/fastdfs2

备注:上面的三个存储路径必须事先提前建立好,否则在重启storage服务时会提示找不到路径。路径的命名规则需遵守store_pathN的方式其中N代表1,2,3.N

  • 在nginx的server配置段中增加location声明

在storage.conf中增加了多个路径后需要在nginx的配置中对该配置进行声明,否则存储的数据将无法下载,这里以增加两个路径为例。

  • 编辑nginx.conf增加如下配置项

Vi /usr/local/nginx/conf/nginx.conf

 wKioL1X7e5Gjh98gAAGWVO0SjGQ517.jpg

备注:必须在nginx的配置文件中作上述声明,否则上传的文件将无法通过返回的url地址进行下载。在此声明中store_path0对应M00,store_path1对应M01,以此类推。

  • 对新增加目录创建软连接

ln s /home/iflytek/fastdfs/data  /home/iflytek/fastdfs/data/M01

ln s /opt/iflytek/fastdfs/data  /opt/iflytek/fastdfs/data/M02

  • 修改storage服务器上的mod_fastdfs.conf文件

  • 修改存储路径节点数

#path(disk or mount point) count, default value is 1

store_path_count=3

  • 添加存储路径

#store_path#, based 0, if store_path0 not exists, it's value is base_path

#the paths must be exist

store_path0=/iflytek/fastdfs

store_path1=/home/iflytek/fastdfs

store_path2=/opt/iflytek/fastdfs

备注:在mod_fastdfs.conf中添加文件目录和storage.conf中增加的目录是相同的。

 

 

 

 

 

 

 

 

 

 

 

 

 

FAQ:

 

一个 tracker 可以有多个 stroage,一个 storage 也可以有多个 tracker

 

trackerip 必须全部写进 client 配置文件中,同时每次改变 client 配置文件,必须重启 php 加载新增 tracker 时,需 PHP 重启加载。

 

想要把fastDFS产生的记录清空,再重新搭建一次,应该删除哪些文件

 

停止storage server 和tracker server,删除base_path下的data 子目录即可

 

如何删除无效的 storage server?

 

可以使用 fdfs_monitor 来删除,命令行如下:

 

/usr/local/bin/fdfs_monitor<config_filename>delete <group_name><storage_ip>

 

例如:

 

/usr/local/bin/fdfs_monitor/etc/fdfs/client.conf delete group1 192.168.1.84

 

注意:如果被删除的 storage server 的状态是 ACTIVE,也就是该 storage server 还在线上服务的情况下,是无法删除掉的。

 

查看 tracker_server 及 storage_server 状态

 

/usr/local/bin/fdfs_monitor/etc/fdfs/client.conf

 

重启 tracker server 命令:

 

sh/data/soft/FastDFS/restart.sh /usr/local/bin/fdfs_trackerd/etc/fdfs/tracker.conf

 

重启 storage server 命令:

 

sh/data/soft/FastDFS/restart.sh /usr/local/bin/fdfs_storaged/etc/fdfs/storage.conf

 

 

FastDFS配置详解之Storage配置

 

1 基本配置

disabled

 

#func:该配置文件是否生效

#valu

##true:无效

##false:生效

disabled=false

group_name

 

#func;本storage server所属组名

group_name=group1

bind_addr

 

#func:绑定本storage server的IP

bind_addr=

client_bind

 

#func:bind_addr是针对server的,当指定bind_addr时,本参数才有效。

#valu

##true:绑定bind_addr所指定的IP

##false:绑定本机的任意IP

client_bind=true

port

 

#func:storage server端口

port=23000

connect_timeout

 

#func:连接超时

connect_timeout=30

network_timeout

 

#func:网络超时

network_timeout=60

heart_beat_interval

 

#func:本storage向tracker发送心跳时间间隔

heart_beat_interval=30

stat_report_interval

 

#func:硬盘存储空间使用情况检测时间间隔

stat_report_interval=60

base_path

 

#func:base_path

base_path=/home/michael/fdfs/base4storage

max_connections

 

#func:本storage server支持的最大并发连接数

max_connections=256

buff_size

 

#func:buff size to recv/send data

buff_size=256KB

work_thread

 

#func:work thread count, should <= max_connections

#valu:默认为4

#sinc:v2.0

work_thread=4

store_path_count/ store_path

 

#func:storage path的个数

#valu:默认为1

store_path_count=1

 

#func:根据store_path_count的值,如果是N个,就要有store_path0, store_path1 ... store_path(N-1)

#valu

store_path0=/home/michael/fdfs/storage0

subdir_count_per_path

 

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

subdir_count_per_path=32

tracker_server

 

#func:tracker_server 的列表 要写端口号

tracker_server=192.168.6.188:22122

tracker_server=192.168.6.189:22122

tracker_server=192.168.6.190:22122

log_level

 

#func

log_level=info

run_by_group

 

#func

run_by_group

run_by_user

 

#func

run_by_user

allow_hosts

 

#func:允许连接的客户端IP列表

allow_hosts=*

file_distribute_path_mode

 

#func:文件分布到data path的方式

#valu

## 0:轮询

## 1:随机,根据哈希code

file_distribute_path_mode=0

file_distribute_rotate_count

 

#func:当file_distribute_path_mode设置为0(轮询)时,该值才有效。功能是,当写文件计数打到该值时,转至下一个path。

file_distribute_rotate_count=100

thread_stack_size

 

#func:线程栈大小

#valu:要求至少512KB

thread_stack_size=512KB

upload_priority

 

#func:上传优先级。只有tracker.conf中store_server=2时,才有效。

#valu:值约小,优先级越高。默认为10.

upload_priority=10

if_alias_prefix

 

#func

#valu

if_alias_prefix=

check_file_duplicate

 

#func:是否检查file重复。但为1时,使用FastDHT存储文件索引

#valu:默认为0

##1, yes, true or on:check

##0, no, false or off:不check

check_file_duplicate=0

key_namespace

 

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

key_namespace=FastDFS

keep_alive

 

#func:与FastDHT的连接方式

#valu:默认为0,短连接

## 0:短连接(short connection)

## 1:长连接(persistent connection)

keep_alive=0

2 IO

disk_rw_separated

 

#func:是否I/O分离

#valu:默认为true

##true:分离

##false:不分离

disk_rw_separated=true

disk_rw_direct

 

#func:是否直接写,不使用cache

#value

##true:直接写

##false:不直接写

disk_rw_direct=false

disk_reader_threads

 

#func:每个storage base path的读线程数。对于disk_rw_separated=true的方式该值为0.

#valu:默认为1

disk_reader_threads=1

disk_writer_threads

 

#func:每个storage base path的写线程数。对于disk_rw_separated=true的方式该值为0.

#valu:默认为1

disk_writer_threads=1

3 同步

#func:同步文件时,如果从binlog中没有读到要同步的文件,休眠N毫秒后重新读取。

#valu:单位为毫秒。0表示不休眠,立即再次尝试读取。

sync_wait_msec=50

sync_interval

 

#func:同步一个文件后,在下次进行同步前的休息时间

#valu:单位为毫秒

sync_interval=0

sync_start_time

 

#func:每天存储同步的开始时间。

#valu:HH:mm

sync_start_time=00:00

sync_end_time

 

#func:每天存储同步的结束时间。

#valu:HH:mm

sync_end_time=23:59

write_mark_file_freq

 

#func:把storage的mark文件定期同步到磁盘的时间间隔

#valu:单位为秒

write_mark_file_freq=500

fsync_after_written_bytes

 

#func:当写大文件时,每写入N个字节,调用一次系统函数fsync将内容强行同步到硬盘。

#valu:0表示从不调用fsync

fsync_after_written_bytes=0

sync_log_buff_interval

 

#func:同步或刷新日志信息到硬盘的时间间隔

#valu:单位为秒

sync_log_buff_interval=10

sync_binlog_buff_interval

 

#func:同步binlog(更新操作日志)到硬盘的时间间隔

#valu:单位为秒

sync_binlog_buff_interval=60

sync_stat_file_interval

 

#func:把storage的stat文件同步到磁盘的时间间隔

#valu:单位为秒

sync_stat_file_interval=300

4HTTP 相关

是否启用 HTTP

 

#func:是否开启HTTP

http.disabled

domain

 

#func:如果将该项留空,则使用IP,否则可以通过tracker来redirect。

http.domain_name=

serverport

 

#func:HTTP端口号

http.server_port

trunksize

 

#func:trunk file size

http.trunk_size=256KB

否需要从文件扩展名确定文件内容

 

#func:是否需要从文件扩展名确定文件内容

http.need_find_content_type=true

 

 

 

FastDFS配置详解之Tracker配置

1 基本配置

disable

 

#func:配置是否生效

#valu:true、false

disable=false

bind_addr

 

#func:绑定IP

#valu:IP地址

bind_addr=192.168.6.102

port

 

#func:服务端口

#valu:端口整数值

port=22122

connect_timeout

 

#func:连接超时

#valu:秒单位正整数值

connect_timeout=30

network_timeout

 

#func:网络超时

#valu:秒单位正整数值

network_timeout=60

base_path

 

#func:Tracker数据/日志目录地址

#valu:路径

base_path=/home/michael/fdfs/base4tracker

max_connections

 

#func:最大连接数

#valu:正整数值

max_connections=256

work_threads

 

#func:线程数,通常设置CPU数

#valu:正整数值

work_threads=4

store_lookup

 

#func:上传文件的选组方式。

#valu:0、1或2。

# 0:表示轮询

# 1:表示指定组

# 2:表示存储负载均衡(选择剩余空间最大的组)

store_lookup=2

store_group

 

#func:指定上传的组,如果在应用层指定了具体的组,那么这个参数将不会起效。另外如果store_lookup如果是0或2,则此参数无效。

#valu:group1等

store_group=group1

store_server

 

#func:上传服务器的选择方式。(一个文件被上传后,这个storage server就相当于这个文件的storage server源,会对同组的storage server推送这个文件达到同步效果)

#valu:0、1或2

# 0:轮询方式(默认)

# 1:根据ip 地址进行排序选择第一个服务器(IP地址最小者)

# 2:根据优先级进行排序(上传优先级由storage server来设置,参数名为upload_priority),优先级值越小优先级越高。

store_server=0

store_path

 

#func:上传路径的选择方式。storage server可以有多个存放文件的base path(可以理解为多个磁盘)。

#valu

# 0:轮流方式,多个目录依次存放文件

# 2:存储负载均衡。选择剩余空间最大的目录存放文件(注意:剩余磁盘空间是动态的,因此存储到的目录或磁盘可能也是变化的)

store_path=0

download_server

 

#func:下载服务器的选择方式。

#valu

# 0:轮询(默认)

# 1:IP最小者

# 2:优先级排序(值最小的,优先级最高。)

download_server=0

reserved_storage_space

 

#func:保留空间值。如果某个组中的某个服务器的剩余自由空间小于设定值,则文件不会被上传到这个组。

#valu

# Gor g for gigabyte

# Mor m for megabyte

# Kor k for kilobyte

reserved_storage_space=1GB

log_level

 

#func:日志级别

#valu

#emerg for emergency

#alert

#crit for critical

#error

#warn for warning

#notice

#info for information

#debug for debugging

log_level=info

run_by_group/ run_by_user

 

#func:指定运行该程序的用户组

#valu:用户组名或空

run_by_group=

 

#func

#valu

run_by_user=

allow_hosts

 

#func:可以连接到tracker server的ip范围。可设定多个值。

#valu

allow_hosts=

check_active_interval

 

#func:检测 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

thread_stack_size

 

#func:设定线程栈的大小。 线程栈越大,一个线程占用的系统资源就越多。

#      如果要启动更多的线程(V1.x对应的参数为max_connections,V2.0为work_threads),可以适当降低本参数值。

#valu:如64KB,默认值为64,trackerserver线程栈不应小于64KB

thread_stack_size=64KB

storage_ip_changed_auto_adjust

 

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

#valu:true或false

storage_ip_changed_auto_adjust=true

2 同步

storage_sync_file_max_delay

 

#func:同组storage服务器之间同步的最大延迟时间。存储服务器之间同步文件的最大延迟时间,根据实际情况进行调整

#valu:秒为单位,默认值为1天(24*3600)

#sinc:v2.0

storage_sync_file_max_delay=86400

storage_sync_file_max_time

 

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

#sinc:v2.0

storage_sync_file_max_time=300

sync_log_buff_interval

 

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

#valu:以秒为单位

sync_log_buff_interval=10

3trunk 和 slot

#func:是否使用trunk文件来存储几个小文件

#valu:true或false

#sinc:v3.0

use_trunk_file=false

 

#func:最小slot大小

#valu:<= 4KB,默认为256字节

#sinc:v3.0

slot_min_size=256

 

#func:最大slot大小

#valu:>= slot_min_size,当小于这个值的时候就存储到trunk file中。默认为16MB。

#sinc:v3.0

slot_max_size=16MB

 

#func:trunk file的size

#valu:>= 4MB,默认为64MB

#sinc:v3.0

trunk_file_size=64MB

4HTTP 相关

是否启用 HTTP

 

#func:HTTP是否生效

#valu:true或false

http.disabled=false

HTTP服务器端口号

 

#func:tracker server上的http port

#valu

#note:只有http.disabled=false时才生效

http.server_port=7271

检查Storage存活状态的间隔时间(心跳检测)

 

#func:检查storage http server存活的间隔时间

#valu:单位为秒

#note:只有http.disabled=false时才生效

http.check_alive_interval=30

心跳检测使用的协议方式

 

#func:检查storage http server存活的方式

#valu

#tcp:连接到storage server的http端口,不进行request和response。

#http:storage check alive url must return http status 200.

#note:只有http.disabled=false时才生效

http.check_alive_type=tcp

检查 Storage 状态的 URI

 

#func:检查storage http server是否alive的uri/url

#note:只有http.disabled=false时才生效

http.check_alive_uri=/status.html

need_find_content_type

 

#func:if need find content type form file extension name

#note:只有http.disabled=false时才生效

http.need_find_content_type=true

HTTP配置文件

 

#func:”#include http.conf“表示redirect to includeother settings

#includehttp.conf