2 Star 1 Fork 0

zhrun8899 / learning-notes

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
fastdfs-centos7.md 45.46 KB
一键复制 编辑 原始数据 按行查看 历史
zhrun8899 提交于 2019-08-15 14:35 . 20190815 commit

fastdfs 安装配置

跟踪器和存储节点都可以由一台多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。

为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,**所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,**卷中的多台存储服务器起到了冗余备份和负载均衡的作用。在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。 FastDFS 中的文件标识分为两个部分:卷名和文件名,二者缺一不可。

在一个group内的storage Server之间的数据会互为备份,这一功能是由后台线程完成的。当客户端将一个文件写入group内的一个storage Server,则会认为文件写入成功,后台线程便会将文件同步到该group内的storage Server。注意:由于一个group内的storage Server数据互为备份,所以存储空间的容量由该group内的最小容量的storage Server决定。

同一个group内的storage Server在写文件后,会写一份binlog,这个binlog记录着文件名等元信息,它用于后台的同步,每个storage Server会记录向该group内其他storage Server的同步进度,记录进度的方式是时间戳,为的是避免机器down掉失去同步进度,以便在机器重启后接着进度继续同步。同时storage Server的同步进度会以元数据发送给tracker Server,以便在client访问文件时,作为tracker Server选择服务的storage Server的参考(即哪台strong Server上有该文件)。

1.环境准备

yum install git gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl-devel wget vim -y

# 2.说明

说明 位置
所有安装包 /usr/local/src
数据存储位置 /home/dfs/
mkdir /home/dfs #创建数据存储目录

## 2.1 安装libfatscommon

git clone https://github.com/happyfish100/libfastcommon.git --depth 1
cd libfastcommon/
./make.sh && ./make.sh install #编译安装

安装FastDFS

cd ../ #返回上一级目录
git clone https://github.com/happyfish100/fastdfs.git --depth 1
cd fastdfs/
./make.sh && ./make.sh install #编译安装
#配置文件准备
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf #客户端文件,测试用
cp /usr/local/src/fastdfs/conf/http.conf /etc/fdfs/ #供nginx访问使用
cp /usr/local/src/fastdfs/conf/mime.types /etc/fdfs/ #供nginx访问使用

安装fastdfs-nginx-module

cd ../ #返回上一级目录
git clone https://github.com/happyfish100/fastdfs-nginx-module.git --depth 1
cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs

安装nginx

wget http://nginx.org/download/nginx-1.15.4.tar.gz #下载nginx压缩包
tar -zxvf nginx-1.15.4.tar.gz #解压
cd nginx-1.15.4/
#添加fastdfs-nginx-module模块
./configure --add-module=/usr/local/src/fastdfs-nginx-module/src/ 
make && make install #编译安装

单机部署

tracker配置

#服务器ip为 192.168.52.1
#我建议用ftp下载下来这些文件 本地修改
vim /etc/fdfs/tracker.conf
#需要修改的内容如下
port=22122  # tracker服务器端口(默认22122,一般不修改)
base_path=/home/dfs  # 存储日志和数据的根目录

storage配置

vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000  # storage服务端口(默认23000,一般不修改)
base_path=/home/dfs  # 数据和日志文件存储根目录
store_path0=/home/dfs  # 第一个存储目录
tracker_server=192.168.52.1:22122  # tracker服务器IP和端口
http.server_port=8888  # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)

配置nginx访问

vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=192.168.52.1:22122  #tracker服务器IP和端口
url_have_group_name=true
store_path0=/home/dfs
#配置nginx.config
vim /usr/local/nginx/conf/nginx.conf
#添加如下配置
server {
    listen       8888;    ## 该端口为storage.conf中的http.server_port相同
    server_name  localhost;
    location ~/group[0-9]/ {
        ngx_fastdfs_module;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
    root   html;
    }
}
#测试下载,用外部浏览器访问刚才已传过的nginx安装包,引用返回的ID
http://192.168.52.1:8888/group1/M00/00/00/wKgAQ1pysxmAaqhAAA76tz-dVgg.tar.gz
#弹出下载单机部署全部跑通

启动

防火墙

#不关闭防火墙的话无法使用
systemctl stop firewalld.service #关闭
systemctl restart firewalld.service #重启

tracker

/etc/init.d/fdfs_trackerd start #启动tracker服务
/etc/init.d/fdfs_trackerd restart #重启动tracker服务
/etc/init.d/fdfs_trackerd stop #停止tracker服务
chkconfig fdfs_trackerd on #自启动tracker服务

storage

/etc/init.d/fdfs_storaged start #启动storage服务
/etc/init.d/fdfs_storaged restart #重动storage服务
/etc/init.d/fdfs_storaged stop #停止动storage服务
chkconfig fdfs_storaged on #自启动storage服务

nginx

/usr/local/nginx/sbin/nginx #启动nginx
/usr/local/nginx/sbin/nginx -s reload #重启nginx
/usr/local/nginx/sbin/nginx -s stop #停止nginx

client测试

vim /etc/fdfs/client.conf
#需要修改的内容如下
base_path=/home/dfs
tracker_server=192.168.52.1:22122    #tracker服务器IP和端口
#保存后测试,返回ID表示成功 如:group1/M00/00/00/xx.tar.gz
fdfs_upload_file /etc/fdfs/client.conf /usr/local/src/nginx-1.15.4.tar.gz
fdfs_upload_file /etc/fdfs/client.conf ./readme.md
返回ID: fdfs_file_info /etc/fdfs/client.conf group2/M00/00/00/wKgAMFwJ4ZCAP043AAAArRzxU942998.md
如果安装了nginx:则为
http://192.168.0.48:8888/group2/M00/00/00/wKgAMFwKHmOAFjbBAAACQLJbbRA5117.md
返回:

source storage id: 0
source ip address: 192.168.0.48
file create timestamp: 2018-12-07 10:57:20
file size: 173
file crc32: 485577694 (0x1CF153DE)

分布式部署

tracker配置

#服务器ip为 192.168.52.2,192.168.52.3,192.168.52.4
#我建议用ftp下载下来这些文件 本地修改
vim /etc/fdfs/tracker.conf
#需要修改的内容如下
port=22122  # tracker服务器端口(默认22122,一般不修改)
base_path=/home/dfs  # 存储日志和数据的根目录

storage配置

vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000  # storage服务端口(默认23000,一般不修改)
base_path=/home/dfs  # 数据和日志文件存储根目录
store_path0=/home/dfs  # 第一个存储目录
tracker_server=192.168.52.2:22122  # 服务器1
tracker_server=192.168.52.3:22122  # 服务器2
tracker_server=192.168.52.4:22122  # 服务器3
http.server_port=8888  # http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)

fdfs命令

fdfs_appender_test fdfs_appender_test1 fdfs_append_file fdfs_crc32 fdfs_delete_file fdfs_download_file fdfs_file_info fdfs_monitor fdfs_storaged fdfs_test:

fdfs_test /etc/fdfs/client.conf upload readme.md

fdfs_test1 fdfs_trackerd fdfs_upload_appender fdfs_upload_file stop.sh

restart.sh

trackerd.conf 详解

# is this config file disabled  

# false for enabled  

# true for disabled  

disabled=false  

#当前配置是否不可用false可用,true不可用  

  

# bind an address of this host  

# empty for bind all addresses of this host  

bind_addr=  

#是否绑定IP如果一个服务器上有多个IP则设置哪个IP可用,如果不设置则不限制  

 

# the tracker server port  

port=22122

 

#默认端口为22122 如果不冲突,则尽量不要修改

# connect timeout in seconds  

# default value is 30s  

connect_timeout=30  

#针对socket套接字函数connect的连接超时时间设置  

  

# network timeout in seconds  

# default value is 30s  

network_timeout=60  

#设置网络超时,单位秒,发送或接收数据时,如果在超时时间之后依然不能进行,则本次网络通讯失败  

  

# the base path to store data and log files  

base_path=/home/dfs  

#配置保存根目录地址,这个目录必须存在,子目录将自动创建,保存数据和日志文件呢 

  

# max concurrent connections this server supported  

max_connections=256  

#服务器支持的最大连接数  

  

# work thread count, should <= max_connections  

# default value is 4  

# since V2.00  

work_threads=1  

#工作线程数,通常设置为CPU数量  

  

# the method of selecting group to upload files  

# 0: round robin  

# 1: specify group  

# 2: load balance, select the max free space group to upload file  

store_lookup=2  

#上传组(卷)的方式:0轮询,1:指定,2:负载平衡(剩余空间最大选择)  

  

# which group to upload file  

# when store_lookup set to 1, must set store_group to the group name  

store_group=group2  

#如果上一参数选择1方式,即制定组名,当前参数用来设置指定的组,如果选择其他方式,当前参数无效  

  

# which storage server to upload file  

# 0: round robin (default)  

# 1: the first server order by ip address  

# 2: the first server order by priority (the minimal)  

store_server=0  

#同组推送方式0.轮询方式,1.根据ip地址进行排序选择第一个服务器,2.根据优先级进行排序(优先级由storeServer的配置文件中upload_priority属性设置)  

  

# which path(means disk or mount point) of the storage server to upload file  

# 0: round robin  

# 2: load balance, select the max free space path to upload file  

store_path=0  

#选择哪个文件目录进行上传(一个StoreServer上面可以有多个base_path)0.轮询,2.剩余空间最大  

  

# which storage server to download file  

# 0: round robin (default)  

# 1: the source storage server which the current file uploaded to  

download_server=0  

#选择哪个storeServer最为下载服务器,0.轮询,1.哪个为源则哪个下载  

  

# reserved storage space for system or other applications.  

# if the free(available) space of any stoarge server in   

# a group <= reserved_storage_space,   

# no file can be uploaded to this group.  

# bytes unit can be one of follows:  

### G or g for gigabyte(GB)  

### M or m for megabyte(MB)  

### K or k for kilobyte(KB)  

### no unit for byte(B)  

### XX.XX% as ratio such as reserved_storage_space = 10%  

reserved_storage_space = 10%  

#系统保留空间大小,用来保证系统和其他应用的正常运行  

  

#standard log level as syslog, case insensitive, value list:  

### emerg for emergency  

### alert  

### crit for critical  

### error  

### warn for warning  

### notice  

### info  

### debug  

log_level=info  

#日志级别  

  

#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。默认为启动线程的用户  

  

# allow_hosts can ocur more than once, host can be hostname or ip address,  

# "*" means match all ip addresses, can use range like this: 10.0.1.[1-15,20] or  

# host[01-08,20-25].domain.com, for example:  

# allow_hosts=10.0.1.[1-15,20]  

# allow_hosts=host[01-08,20-25].domain.com  

allow_hosts=*  

#设置可以连接当前tracker的IP范围,包括client和store_server,* 代表所有

  

# sync log buff to disk every interval seconds  

# default value is 10 seconds  

sync_log_buff_interval = 10  

#同步或刷新日志到本地硬盘的时间间隔,单位:秒  

  

# check storage server alive interval seconds  

check_active_interval = 120  

#检测storage_server的存活状态时间间隔,单位:秒,本参数要大于storage server的心跳包发送间隔一般为2-3倍  

  

# thread stack size, should >= 64KB  

# default value is 64KB  

thread_stack_size = 64KB  

#tracker server的线程栈大小,要求大于等于64K  

  

# auto adjust when the ip address of the storage server changed  

# default value is true  

storage_ip_changed_auto_adjust = true  

#当storage server的IP发生变化时集群是否自动调整。只有在storage server进程重启时才能完成自动调整  

  

# storage sync file max delay seconds  

# default value is 86400 seconds (one day)  

# since V2.00  

storage_sync_file_max_delay = 86400  

#存储服务器之间同步文件的最大延迟时间,缺省为1天,可以根据实际情况进行调整  

  

# the max time of storage sync a file  

# default value is 300 seconds  

# since V2.00  

storage_sync_file_max_time = 300  

#同步一个文件需要消耗的最大时间,缺省为300秒,即5分钟  

  

# if use a trunk file to store several small files  

# default value is false  

# since V3.00  

use_trunk_file = false   

#是否使用小文件合并存储特性,缺省关闭,打开时可以减少碎片文件的出现,但同时加大服务器的负载  

  

# the min slot size, should <= 4KB  

# default value is 256 bytes  

# since V3.00  

slot_min_size = 256  

#为trunk file分配的最小字节数,比如一个文件只有16字节,根据当前设置,也会为其分配256字节  

  

# the max slot size, should > slot_min_size  

# store the upload file to trunk file when it's size <=  this value  

# default value is 16MB  

# since V3.00  

slot_max_size = 16MB  

#为trunk file分配的最大字节数,如果文件小于大小则使用trunk方式存储,当文件大小大于这个数值是直接保存到一个文件中(不采用合并存储方式)  

  

# the trunk file size, should >= 4MB  

# default value is 64MB  

# since V3.00  

trunk_file_size = 64MB  

#trunk file的大小,不建议设置过大  

  

# if create trunk file advancely  

# default value is false  

# since V3.06  

trunk_create_file_advance = false  

#是否提前创建好trunk文件,只用当这个参数设置为true时下面的3个以trunk_create_file开头的参数将不用设置  

  

# the time base to create trunk file  

# the time format: HH:MM  

# default value is 02:00  

# since V3.06  

trunk_create_file_time_base = 02:00  

#创建trunk file的起始时间点,当前为凌晨2点开始  

  

# the interval of create trunk file, unit: second  

# default value is 38400 (one day)  

# since V3.06  

trunk_create_file_interval = 86400  

#提前创建trunk file的时间间隔,默认为1天  

  

# the threshold to create trunk file  

# when the free trunk file size less than the threshold, will create   

# the trunk files  

# default value is 0  

# since V3.06  

trunk_create_file_space_threshold = 20G  

#提前创建trunk file时,需要达到的空闲trunk大小  

#例如:当前配置为20G,现在空闲的trunk file大小为4G,那么只创建16G的trunk file  

  

# if check trunk space occupying when loading trunk free spaces  

# the occupied spaces will be ignored  

# default value is false  

# since V3.09  

# NOTICE: set this parameter to true will slow the loading of trunk spaces   

# when startup. you should set this parameter to true when neccessary.  

trunk_init_check_occupying = false  

#trunk file 初始化时,是否检查可用空间是否被占用  

  

# if ignore storage_trunk.dat, reload from trunk binlog  

# default value is false  

# since V3.10  

# set to true once for version upgrade when your version less than V3.10  

trunk_init_reload_from_binlog = false  

#是否无条件从trunk binlog中加载trunk可用空间信息  

  

# if use storage ID instead of IP address  

# default value is false  

# since V4.00  

use_storage_id = false  

#是否使用 serverID作为storage server标识  

  

# specify storage ids filename, can use relative or absolute path  

# since V4.00  

storage_ids_filename = storage_ids.conf  

#use_storage_id设置为true,才需要设置本参数,详见源码目录下的conf/storage_ids.conf  

#这个文件中设置组名、serverID和对应的IP地址  

  

# id type of the storage server in the filename, values are:  

## ip: the ip address of the storage server  

## id: the server id of the storage server  

# this paramter is valid only when use_storage_id set to true  

# default value is ip  

# since V4.03  

id_type_in_filename = ip  

#use_storage_id设置为true时才需要设置本参数  

  

  

# if store slave file use symbol link  

# default value is false  

# since V4.01  

store_slave_file_use_link = false  

#存储从文件是否采用symbol link(符号链接)方式  

#如果设置为true,一个从文件将占用两个文件:原始文件及指向它的符号链接  

  

# if rotate the error log every day  

# default value is false  

# since V4.02  

rotate_error_log = false  

#是否定期轮转error log,目前仅支持一天轮转一次  

  

# rotate error log time base, time format: Hour:Minute  

# Hour from 0 to 23, Minute from 0 to 59  

# default value is 00:00  

# since V4.02  

error_log_rotate_time=00:00  

#error log定期轮转的时间节点,rotate_error_log参数设置为true时,本参数有效  

  

# rotate error log when the log file exceeds this size  

# 0 means never rotates log file by log file size  

# default value is 0  

# since V4.02  

rotate_error_log_size = 0  

#error log按大小进行轮转 0代表不按大小进行轮转,否则当error log文件达到大小则轮转  

  

# if use connection pool  

# default value is false  

# since V4.05  

use_connection_pool = false  

#是否使用连接池  

  

# connections whose the idle time exceeds this time will be closed  

# unit: second  

# default value is 3600  

# since V4.05  

connection_pool_max_idle_time = 3600  

#连接池链接的最大生存时间,单位秒,use_connection_pool设置为true时有效  

  

# HTTP port on this tracker server  

http.server_port=8888  

#http服务端口,默认情况下V4.06是不安装http服务的,详见INSTALL文件  

  

# check storage HTTP server alive interval seconds  

# <= 0 for never check  

# default value is 30  

http.check_alive_interval=30  

#检查长链接的存活时间30秒  

  

# check storage HTTP server alive type, values are:  

#   tcp : connect to the storge server with HTTP port only,   

#   do not request and get response  

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

# default value is tcp  

http.check_alive_type=tcp  

#长链接的存在方式,当前配置为tcp方式  

  

# check storage HTTP server alive uri/url  

# NOTE: storage embed HTTP server support uri: /status.html  

http.check_alive_uri=/status.html  

#利用什么标识进行检查  

tracker.conf

2、storage Server配置详解

#这个配置文件是否失效

disabled=false

#false为有效 true为无效

 

# 本storage server所属的group名

group_name=group1

 

# 可以版定一个ip,默认为空,绑定所有ip

bind_addr=

 

# 本配置只有在bind_addr设置以后才生效

# 本机作为客户端访问其他服务时,是否使用绑定的ip去访问其他服务器

client_bind=true

# storage server监听端口

port=23000

#默认23000,如果不冲突,尽量不修改

 

# 连接超时时间,针对socket套接字函数connect,默认为30秒

connect_timeout=30

 

# 网络通讯超时时间,默认是60秒

network_timeout=60

 

# 向tracker server发送心跳时间间隔,默认30秒

heart_beat_interval=30

 

# 向tracker server汇报磁盘使用情况时间间隔,默认为60秒

stat_report_interval=60

 

# 工作文件夹,日志也存在此(这里不是上传的文件存放的地址)

base_path=/home/yuqing/fastdfs

 

# 本traceserver最大连接数

max_connections=256

 

# 发送或接收数据的buffer大小,工作队列消耗的内存大小 = buff_size * max_connections

# 建议这个设置大于8k,默认256k

buff_size = 256KB

 

# 接收数据的线程数

# 默认1个

# since V4.07

accept_threads=1

 

# 工作线程数,小于max_connections

# 默认4个,通常设置为CPU核数,效率最高

work_threads=4

 

# 磁盘读写是否分离,默认为true

disk_rw_separated = true

 

# 磁盘读取的线程数(每个工作文件夹)

# 对于磁盘读写不分离的模式,这个参数可以设置为0

# 默认为1

disk_reader_threads = 1

 

# 磁盘写的线程数(每个工作文件夹)

# 对于磁盘读写不分离的模式,这个参数可以设置为0

# 默认为1

disk_writer_threads = 1

 

# 当发现没有需要同步的文件时,需要等待sync_wait_msec毫秒再去binlog中检查

# 不能设置为0,默认为50毫秒

sync_wait_msec=50

 

# 同步完一个文件后,休眠sync_interval毫秒后继续同步下一个文件

sync_interval=0

 

# 允许存储同步的开始时间

# Hour from 0 to 23, Minute from 0 to 59

sync_start_time=00:00

 

# 允许存储同步的结束时间,也就是说,storage server只能在sync_start_time到sync_end_time这段时间内同步数据

# 默认是全天都可以同步

# Hour from 0 to 23, Minute from 0 to 59

sync_end_time=23:59

#由开始时间和结束时间,指定了同步时间的范围

 

# 同步完write_mark_file_freq个文件后,如果markfile有变化,将mark file写入磁盘

write_mark_file_freq=500

 

# 工作路径个数(可以挂载多个磁盘),默认是1个

store_path_count=1

 

# 工作路径列表,如果store_path0不设置,那么使用base_path存储

# 设置的路径一定是存在的文件夹

# 需要配置store_path_count个

store_path0=/home/yuqing/fastdfs

#store_path1=/home/yuqing/fastdfs2

 

# FastDFS是通过二级目录来存储文件的,该配置是每级目录的文件夹数据

# 如果设置为256,那么会生成256*256=65535个文件夹

# 这个值默认大小256,可以设置区间1-256

subdir_count_per_path=256

 

# tracer server列表,多个tracer server的话,分行列出

tracker_server=192.168.209.121:22122

 

#日志级别

### emerg for emergency

### alert

### crit for critical

### error

### warn for warning

### notice

### info

### debug

log_level=info

 

# 运行本进程的Unix用户组,如果不设置,默认是当前用户所在的group

run_by_group=

 

# 运行本进程的用户名,如果不设置,默认是当前用户的用户名

run_by_user=

 

# 可以连接到本机的主机ip范围,*代表允许所有服务器

# 支持这样的表达式:10.0.1.[1-15,20] or host[01-08,20-25].domain.com

allow_hosts=*

 

# 文件分布式存储策略

# 0: 轮询

# 1: 根据文件名hash结果随机存储

file_distribute_path_mode=0

# 本配置在 file_distribute_path_mode=0 时有效

 

# 当写文件数据达到file_distribute_rotate_count值时,换轮换到另外一个路径继续写入

# 本配置默认值是100

file_distribute_rotate_count=100

 

# 是否在写大文件的时候,调用fsync落地文件

# 0:永远不调用

# 其他数值:每写入fsync_after_written_bytes个字节,调用一次fsync

# 默认为0

fsync_after_written_bytes=0

 

# 将缓存中的日志落地到磁盘的间隔时间,默认是10秒

sync_log_buff_interval=10

 

# 将缓存中的binlog落地到磁盘的间隔时间,默认是10秒

sync_binlog_buff_interval=10

 

# 将storage server缓存中的状态数据落地到磁盘的间隔时间,默认是10秒

sync_stat_file_interval=300

 

# 线程栈大小,默认64k,不建议设置小于64k,默认512k

thread_stack_size=512KB

 

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

# tracker.conf 中store_server参数的描述:

# 上传文件选择服务器的规则:

# 0:轮询(默认)

# 1:按照IP排序,排在第一的server

# 2:按照优先级排序,最小的server

upload_priority=10

 

# 网卡别名,用ifconfig -a可以看到很多本机的网卡别名,类似eth0,eth0:0等等

# 多个网卡别名使用逗号分割,默认为空,让系统自动选择

if_alias_prefix=

 

# 是否检查重复文件,如果设置成true,使用FastDHT来存储文件索引

# 1 or yes: 需要检查

# 0 or no: 不需要检查

# 默认值是 0

check_file_duplicate=0

 

# 文件签名形式,hash或md5,用来做文件排重,默认为hash

file_signature_method=hash

 

# 存储文件索引的命名空间(在check_file_duplicate=1是生效)

key_namespace=FastDFS

 

# 是否和FastDHT之间使用长连接

# 0代表短链接,1代表长连接

# 默认值为0

keep_alive=0

 

# 可以使用#include filename来加载FastDHT服务器列表,filename可以是相对路径(基于base_path)

# 在check_file_duplicate=1时有效

 

# 更多信息参见FastDHT的安装须知

##include /home/yuqing/fastdht/conf/fdht_servers.conf

 

# 是否记录访问日志

use_access_log = false

 

# 是否定期轮转访问日志,目前仅支持一天轮转一次

rotate_access_log = false

 

# 如果按天轮转访问日志,具体生成新错误日志文件的时间

# Hour from 0 to 23, Minute from 0 to 59

access_log_rotate_time=00:00

 

# 是否定期轮转错误日志,目前仅支持一天轮转一次

rotate_error_log = false

 

# 如果按天轮转错误日志,具体生成新错误日志文件的时间

# Hour from 0 to 23, Minute from 0 to 59

error_log_rotate_time=00:00

 

# 是否在错误访问文件达到一定大小时生成新的访问日志文件

# 0代表对日志文件大小不敏感

rotate_access_log_size = 0

 

# 是否在错误日志文件达到一定大小时生成新的错误日志文件

# 0代表对日志文件大小不敏感

rotate_error_log_size = 0

 

# 日志文件保存日期

# 0表示永久保存,不删除

# 默认为0

log_file_keep_days = 0 

 

# if skip the invalid record when sync file

# default value is false

# since V4.02

file_sync_skip_invalid_record=false

 

# 是否使用连接池

use_connection_pool = false

 

# 连接闲置超时时间,连接如果闲置的时间超过本配置,则关闭次连接,单位秒

connection_pool_max_idle_time = 3600

# storage server的http访问方式的域名,如果域名为空,则只能使用ip访问

http.domain_name=

 

# HTTP端口

http.server_port=8888

storage.conf

3、client的配置文件详解

# 连接超时时间

# 默认30秒

connect_timeout=30

 

# 网络超时时间

# default value is 30s

network_timeout=60

 

# 工作文件夹,日志存在此

base_path=/home/dfs

 

# tracer server列表,多个tracer server的话,分行列出

tracker_server=192.168.0.37:22122
tracker_server=192.168.0.47:22122
tracker_server=192.168.0.48:22122 

#日志级别

### emerg for emergency

### alert

### crit for critical

### error

### warn for warning

### notice

### info

### debug

log_level=info

 

# 是否使用连接池

use_connection_pool = false

 

# 连接闲置超时时间,连接如果闲置的时间超过本配置,则关闭次连接,单位秒

connection_pool_max_idle_time = 3600

 

# 是否从tracer server读取fastdfs的参数,默认为false

load_fdfs_parameters_from_tracker=false

 

 

 

# 是否使用storage id 替换 ip,默认为false

# 和tracker.conf该参数含义一样

# 本配置只有在load_fdfs_parameters_from_tracker=false时生效

# 本配置默认为false

use_storage_id = false

 

# 指定storage id的文件名,允许使用绝对路径

# 和tracker.conf该参数含义一样

# 本配置只有在load_fdfs_parameters_from_tracker=false时生效

storage_ids_filename = storage_ids.conf

 

 

#HTTP settings

http.tracker_server_port=8888

 

#引入HTTP相关配置

##include http.conf

client.conf

Q and A

Q1、

fastDFS是分组管理的,每个组存贮的数据一样,一个或者多个服务器组成的Tracker server可以控制多个组,组与组之间存贮的数据是不一样的。但是这个操作应该如何配置呢?我现在的Traker server 下面有控制了几台的Storage server 它配置是这样的:store_group=group2,如果我想把这个Tracker server 可控制多个组那么应该如何配置呢?是不是简单的store_group=group1就可以了?

A1: 在storage server上配置它要连接的tracker server,可以配置1个或多个。 ​ 组名在storage server上配置的。由storage server主动向tracker server报告其组名和存储空间等信息。

Q2、

一些实际的问题:由于fastDFS的存贮特点,它组内的Store server 存贮的数据是一样的。那么如果我同组内的Store server 贮放的地方不一样,比如一台放在上海、一台放在广州、一台在深圳。我在存贮跟数据的时候它必须是要同步的,然后我存贮很大的数据或者并发有很多用户同时上传数据,那么各地方的数据同步肯定也就很大量了,如果机房是共享网络的时候,管理员看到你数据传输量那么大,把它的带宽都吃完了,那么肯定对我的服务器做限制或者什么的。我想问一下,如果是这种情况下,楼主有没有一些好的建议呢?或者能不能做得到每个Store server之间的同步能不能我设定一个时间来做呢?比如是深夜之类的?

A2: FastDFS早就支持同步时间段设置了。在storage.conf中设置参数sync_start_time和sync_end_time。

Q3、

我想问一下,我怎看一台Store server 的硬盘存贮的大少呢?这样我才知道什么时候要加硬件了。还有一个问题,我看到一些DFS它的存贮是把一个数据来拆开存贮的,用户要下载的时候再把它结合在一起成了一个完整的文件下载,这样硬盘的利用就很高了,而且数据访问量也相对少很多。

A3:  直接使用FastDFS带的monitor程序:fdfs_monitor来查看storage状态。
     文件分块存储会增加系统的复杂性。出于简洁考虑,FastDFS不支持文件分块存储。

Q4

除了在storage.conf里的tracker_server增加tracker的ip和端口,其他地方要注意什么?

恩,tracker server ip和端口,肯定是要正确设置的。支持多tracker server,每行设置一个tracker。
另外,base_path也要正确设置。
其余参数,通常采用缺省配置即可。你可以看一下配置说明那个帖子。

Q5

每台tracker和storage的启动有没有先后关系?

正常情况下,应该先启动tracker。

FastDFS不会有这样的要求,你要启动storage也是没有任何问题的。

Q6

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

停止storage server和tracker server,删除base_path下的data子目录即可。
注意:storage 的data目录下保存了上传文件,删除时请慎重。

Q7

[2010-12-15 15:51:35] ERROR - file: ../common/pthread_func.c, line: 163, create thread failed, startup threads: 2173, errno: 11, error info: Resource temporarily unavailable

最后这一行已经说明问题了,创建的线程太多,使用的资源已经达到系统上限。
解决方法:继续使用现有版本,调小max_connections这个参数,比如调整为1024。
另外一个方法,升级到2.x,比如2.05。2.x采用异步IO模型,可以使用有限的几个线程,支持大量的并发连接。
比如,线程数可以配置为4,支持的最大连接数可以配置为1024或者更高。
昨天看了代码发现程序会在启动服务的时候,会创建设置的连接数,用来检验服务器是否能够支持使用者设置的最大连接。

Q8

程序中要访问,比如上传文件,可以使用FastDFS提供的java API。 客户端通过HTTP下载文件时,可以走web server,如apache、nginx等。

Q 9

请问通过http下载文件时,能否让下载的文件名称自动变成原文件名称?

可以使用文件附加属性来存储该文件的原文件名。在apache或nginx扩展模块中,可以在HTTP Header中输出原文件名。

1、简单看了下Java client的代码,看到可以通过client api获取上传文件的group name and filename,请问能否直接通过API获取http访问地址? A: 生成http访问地址,没有提供现成的方法,但提供了示例代码,在TestClient1.java和TestClient.java中均有。摘录一下TestClient.java中的代码如下: ​

                                  int ts;
            `            String token;
                    String file_url;
                        InetSocketAddress inetSockAddr;
                     System.err.println("file_id: " + file_id);
                      
                      inetSockAddr = trackerServer.getInetSocketAddress();
                      file_url = "http://" + inetSockAddr.getAddress().getHostAddress();
                      if (ClientGlobal.g_tracker_http_port != 80)
                      {
                               file_url += ":" + ClientGlobal.g_tracker_http_port;
                      }
                      file_url += "/" + file_id;
                      if (ClientGlobal.g_anti_steal_token)
                      {
                              ts = (int)(System.currentTimeMillis() / 1000);
                              token = ProtoCommon.getToken(file_id, ts, ClientGlobal.g_secret_key);
                              file_url += "?token=" + token + "&ts=" + ts;
                      }
                      System.err.println("file url: " + file_url);

Q10

还有一个问题,每一个group是否存储了所有的上传文件;还是说group A存储一部分,group B存储一部分,同一个group中的storage server存储的文件都相同。 A: 答案为后者。即:group A存储一部分,group B存储一部分,同一个group中的storage server存储的文件都相同。

FastDFS存储服务器的硬盘可以做RAID,比如RAID5等等,这样系统中的mount point只有一个。 也可以单个硬盘直接mount使用,这样系统中的mount point就是多个(多个硬盘的情况下)。 RAID5并不能充分发挥各个磁盘的最大吞吐量,出于磁盘IO效率考虑,建议采用第二种做法,这样磁盘整体IO吞吐量最理想的情况下,为各个硬盘IO吞吐量之和。 采用多个mount point的情况下,如果有一块硬盘损坏,可以有两种修复方法:

  1. 更换掉坏掉的硬盘,在服务停止的情况下,手工复制已有服务器上该路径的文件到该mount point,然后启动FastDFS服务程序fdfs_storaged;
  2. 更换一台同样配置的新服务器,或者更换掉坏的硬盘后,重做系统,然后启动FastDFS服务fdfs_storaged即可。 只要${base_path}这个路径所在硬盘没有坏,也就是系统数据文件(如${base_path}/data/sync/*)都在的情况下,文件自动同步是没有任何问题的。

重新启动: root@ubuntu:/# /usr/local/bin/restart.sh /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf

Q11

FastDFS系统中的文件ID与用户存储进去的逻辑文件是不同的,由于没有索引服务器,那么这种文件名映射关系不是要需要由用户自己来保存? 的确如此,目前的确需要由应用端来保存。 FastDFS系统中的文件ID与用户存储进去的逻辑文件是不同的,我有一个客户端,想通过文件名进行操作,不知该怎样实现?也就是说,文件名到ID的转换,我自己写的客户端该怎么转换呢? 像你这样的应用场合,再加一层好了,实现文件名到文件ID的转换。比如可以基于数据库来做,或者通过分布式kv系统,如TT、FastDHT等等来做。

Q12

这些Track Server的内容是对等的,还是分组,每个Track Server负责一部分Storage Server? 对等的。

Q13

Client是绑定一个Track Server,还是可以绑定多个或全部? 在一个集群中,应该绑定全部。

Storage Server也是同样的问题,是绑定一个Track Server,还是可以多个或者全部? 在一个集群中,应该绑定全部。

如果没有绑定全部Tracker Sever,那么Tracker Sever之间可能会出现不一致的情况。我看到文档说Tracker Sever之间不进行数据同步,这种问题如何解决呢? 应该绑定所有Tracker server啊。 万一有个别storage server没有绑定所有tracker server,也不会出现问题。 正确的做法是绑定所有tracker server。

定位问题首先要看日志文件。出现问题时,先检查返回的错误号和错误信息。然后查看服务器端日志,相信可以定位到问题所在。

Q14

FastDFS需要的编译和运行环境是怎样的?

FastDFS Server仅支持unix系统,在Linux和FreeBSD测试通过。在Solaris系统下网络通信方面有些问题。 编译需要的其他库文件有pthread和libevent。 pthread使用系统自带的即可。 对libevent的版本要求为1.4.x,建议使用最新的stable版本,如1.4.14b。 注意,千万不要使用libevent 2.0及以上版本。

Q15 有人在生产环境中使用FastDFS吗?

答案是肯定的。据我所知,至少有20家公司在使用FastDFS,其中有好几家是做网盘的公司。

Q16 启动storage server时,一直处于僵死状态。

A:启动storage server,storage将连接tracker server,如果连不上,将一直重试。直到连接成功,启动才算真正完成。 出现这样情况,请检查连接不上tracker server的原因。

Q17 执行fdfs_test或fdfs_test1上传文件时,服务器返回错误号2

错误号表示没有ACTIVE状态的storage server。可以执行fdfs_monitor查看服务器状态。

Q18 如何让server进程退出运行?

直接kill即可让server进程正常退出,可以使用killall命令,例如: killall fdfs_trackerd killall fdfs_storaged 也可以使用FastDFS自带的stop.sh脚本,如: /usr/local/bin/stop.sh /usr/local/bin/fdfs_storaged /etc/fdfs/storage.conf stop.sh只会停止命令行(包括参数)完全相同的进程。 千万不要使用-9参数强杀,否则可能会导致binlog数据丢失的问题。

Q19如何重启server进程?

可以kill掉server进程后,执行启动命令行。如: killall fdfs_trackerd /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf 或者直接使用FastDFS自带的restart.sh脚本,如: /usr/local/bin/restart.sh /usr/local/bin/fdfs_trackerd /etc/fdfs/tracker.conf

Q20 跨运营商通信异常问题

比如电信和网通机房相互通信,可能会存在异常,有两种表现:

1)不能建立连接,这个比较直接,肯定是网络连接的问题 2)可以正常建立连接,但接收和发送数据失败,这个问题比较隐蔽,正常网络环境下,不应该出现此类问题。 ​ 还有人碰到过从一个方向建立连接可以正常通信,但从另外一个方向就不能正常通信的情况。 解决办法: ​ 尝试将服务端口改小,建议将端口修改为1024以下。比如将storage服务端口由23000修改为873等,也可以试试修改为8080 ​ 如果问题还不能解决,请联系你的网络(机房)服务商。

Q22 fdfs_test和fdfs_test1是做什么用的?

这两个是FastDFS自带的测试程序,会对一个文件上传两次,分别作为主文件和从文件。返回的文件ID也是两个。 并且会上传文件附加属性,storage server上会生成4个文件。 这两个程序仅用于测试目的,请不要用作实际用途。 V2.05提供了比较正式的三个小工具: 上传文件:/usr/local/bin/fdfs_upload_file <config_file> <local_filename> 下载文件:/usr/local/bin/fdfs_download_file <config_file> <file_id> [local_filename] ​ 删除文件:/usr/local/bin/fdfs_delete_file <config_file> <file_id>

Q23

在FastDFS的服务器端配置文件中,bind_addr 这个参数用于需要绑定本机IP地址的场合。只有这个参数和主机特征相关,其余参数都是可以统一配置的。在不需要绑定本机的情况下,为了便于管理和维护,建 议所有tracker server的配置文件相同,同组内的所有storage server的配置文件相同。

tracker server的配置文件中没有出现storage server,而storage server的配置文件中会列举出所有的tracker server。这就决定了storage server和tracker server之间的连接由storage server主动发起,storage server为每个tracker server启动一个线程进行连接和通讯,这部分的通信协议请参阅《FastDFS HOWTO -- Protocol》中的“2. storage server to tracker server command”。

tracker server会在内存中 保存storage分组及各个组下的storage server,并将连接过自己的storage server及其分组保存到文件中,以便下次重启服务时能直接从本地磁盘中获得storage相关信息。storage server会在内存中记录本组的所有服务器,并将服务器信息记录到文件中。tracker server和storage server之间相互同步storage server列表: ​ 1. 如果一个组内增加了新的storage server或者storage server的状态发生了改变,tracker server都会将storage server列表同步给该组内的所有storage server。以新增storage server为例,因为新加入的storage server主动连接tracker server,tracker server发现有新的storage server加入,就会将该组内所有的storage server返回给新加入的storage server,并重新将该组的storage server列表返回给该组内的其他storage server; ​ 2. 如果新增加一台tracker server,storage server连接该tracker server,发现该tracker server返回的本组storage server列表比本机记录的要少,就会将该tracker server上没有的storage server同步给该tracker server。

同一组内的storage server之间是对等的,文件上传、删除等操作可以在任意一台storage server上进行。文件同步只在同组内的storage server之间进行,采用push方式,即源服务器同步给目标服务器。以文件上传为例,假设一个组内有3台storage server A、B和C,文件F上传到服务器B,由B将文件F同步到其余的两台服务器A和C。我们不妨把文件F上传到服务器B的操作为源头操作,在服务器B上的F文件 为源头数据;文件F被同步到服务器A和C的操作为备份操作,在A和C上的F文件为备份数据。同步规则总结如下: ​ 1. 只在本组内的storage server之间进行同步; ​ 2. 源头数据才需要同步,备份数据不需要再次同步,否则就构成环路了; ​ 3. 上述第二条规则有个例外,就是新增加一台storage server时,由已有的一台storage server将已有的所有数据(包括源头数据和备份数据)同步给该新增服务器。

  • storage server有7个状态,如下:

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

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

  • FDFS_STORAGE_STATUS_SYNCING :同步中

  • FDFS_STORAGE_STATUS_DELETED :已删除,该服务器从本组中摘除(注:本状态的功能尚未实现)

  • FDFS_STORAGE_STATUS_OFFLINE :离线

  • FDFS_STORAGE_STATUS_ONLINE :在线,尚不能提供服务

  • FDFS_STORAGE_STATUS_ACTIVE :在线,可以提供服务

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

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

1
https://gitee.com/zhrun8899/learning-notes.git
git@gitee.com:zhrun8899/learning-notes.git
zhrun8899
learning-notes
learning-notes
master

搜索帮助