FastDFS简介
FastDFS是一个开源的分布式文件系统,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。存储节点存储文件,完成文件管理的所有功能:存储、同步和提供存取接口,FastDFS同时对文件的meta data进行管理。所谓文件的meta data就是文件的相关属性,以键值对(key value pair)方式表示,文件meta data是文件属性列表,可以包含多个键值对。跟踪器和存储节点都可以由一台多台服务器构成。跟踪器和存储节点中的服务器均可以随时增加或下线而不会影响线上服务。其中跟踪器中的所有服务器都是对等的,可以根据服务器的压力情况随时增加或减少。为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷 的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起 到了冗余备份和负载均衡的作用。在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可
client为使用FastDFS服务的调用方,client也应该是一台服务器,它对tracker和storage的调用均为服务器间的调用
系统结构如下图所示
上传文件交互过程:
- client询问tracker上传到的storage,不需要附加参数
- tracker返回一台可用的storage
- client直接和storage通讯完成文件上传
下载文件交互过程:
- client询问tracker下载文件的storage,参数为文件标识(卷名和文件名)
- tracker返回一台可用的storage
- client直接和storage通讯完成文件下载
FastDFS安装
Step 1:下载libfastcommon源码包并安装。地址:https://github.com/happyfish100/libfastcommon.git;使用命令解压:tar xzf libfastcommon_v1.x.tar.gz (包名使用自己下载的libfastcommon源码包实际名称)。进入解压后的包目录中:cd libfastcommon,执行make.sh,然后执行make.sh install如果存在访问权限问题,可使用sudo make.sh,sudo make.sh install进行安装。
Step 2:下载FastDFS源码包饼安装。https://sourceforge.net/projects/fastdfs/files/?source=navbar,或者通过翻墙google进行下载。使用命令解压:tar xzf FastDFSxxxx.tar.gz(包名根据自己下载的源码包名称而定),进入到解压后的目录中:cd FastDFS,执行sudo make.sh,之后执行make.sh install。
Step 3:编辑修改FastDFS的conf目录中的tracker.conf和storage.conf文件以及client.conf文件
Step 4:启动FastDFS服务,首先启动tracker:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart,然后启动storage:/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
Step 5:运行测试:/usr/bin/fdfs_test <client_conf_filename> <operation>,如:/usr/bin/fdfs_test conf/client.conf upload your file(你要上传的文件)
Step 6:运行监控:/usr/bin/fdfs_monitor <client_conf_filename>
FastDFS配置文件详解
Tracker:
disabled:配置文件是否生效
bind_addr:绑定固定IP地址,服务器多个IP时希望指定IP提供服务时指定,不指定为服务器所有IP
port:tracker服务端口
connect_timeout:套接字连接超时秒数,默认30秒
network_timeout:网络连接超时秒数,发送或接收数据时,超时后还不能发送或接收数据,则本次网络通信失败
base_path:存储数据和日志文件的基础目录地址(根目录必须存在,子目录会自动创建),tracker server目录及文件结构:
${base_path}
|__data
| |__storage_groups.dat:存储分组信息
| |__storage_servers.dat:存储服务器列表
| |__storage_sync_timestamp.dat:storage同步时间
| |__storage_changelog.dat:storage变更日志
| |__fdfs_trackerd.pid:tracker服务ID
|__logs
|__trackerd.log:tracker server日志文件
max_connections:系统提供服务时的最大连接数
accept_threads:线程总数
work_threads:工作线程数,通常为CPU数,应该不大于max_connections
store_lookup:选择哪个group存储上传的文件,0:轮询,1:指定组,2:负载均衡(最大剩余空间的group)
store_group:存储上传文件的group名称,store_lookup为1时,必须指定一个group名称
store_server:选择哪个storage进行上传操作,0:轮询(默认),1:根据IP地址选择一个最小的,2:storage服务设置的upload_priority优先级来选择
store_path:选择storage中的哪个目录进行上传,0:轮询,2:剩余空间最大的目录
download_server:选择哪个storage作为下载文件服务,0:轮询,1:与上传文件服务一致
reserved_storage_space:storage服务器为系统和其他应用保留的存储空间,支持百分比设置
log_level:日志级别
run_by_group:服务器运行FastDFS的用户组,不填为当前用户组
run_by_user:服务器运行FastDFS的用户,不填为当前用户
allow_hosts:可以连接此tracker服务的IP范围
sync_log_buff_interval:同步或刷新日志信息导磁盘的时间间隔单位为秒
check_active_interval:检测storage服务存活的时间间隔单位为秒,此参数应该大于storage服务配置的心跳时间间隔。
thread_stack_size:线程栈的大小
storage_ip_changed_auto_adjust:当storage服务的IP地址变更时是否自动调整
storage_sync_file_max_delay:storage服务之间同步文件的最大延迟秒数,本参数不影响文件同步过程,仅在下载文件时,判断文件是否已经被同步完成的一个阀值
storage_sync_file_max_time:存储服务器同步一个文件的最大秒数,本参数不影响文件同步过程,仅在下载文件时,判断文件是否已经被同步完成的一个阀值
use_trunk_file:是否使用小文件合并存储特性
slot_min_size:trunk文件分配的最小字节数
slot_max_size:trunk文件分配的最大字节数,只有文件大小不大于这个参数值,才会合并存储。如果大于,将不采用合并存储方式
trunk_file_size:合并存储的trunk文件的大小
trunk_create_file_advance:是否提前创建trunk文件。此值为真,trunk_create_file_XXX的参数才有效
trunk_create_file_time_base:提前创建trunck文件的起始时间点
trunk_create_file_interval:创建trunck文件的时间间隔,单位为秒
trunk_create_file_space_threshold:提前创建trunk文件需要达到的空闲trunk大小
trunk_init_check_occupying:trunk初始化时,是否检查可用空间是否被占用
trunk_init_reload_from_binlog:是否从trunk二进制日志中国年加载trunk可用空间信息
trunk_compress_binlog_min_interval:trunk二进制日志压缩的最小时间间隔
use_storage_id:是否使用storage ID作为storage服务标识
storage_ids_filename:storage ID文件地址,use_storage_id为真,才需设置次参数。
id_type_in_filename:storage ID文件中服务ID类型,支持IP和storage服务ID
store_slave_file_use_link:存储从文件是否采用符号链接方式
rotate_error_log:是否定期轮转错误日志
error_log_rotate_time:错误日志轮转时间点
rotate_error_log_size:错误日志按大小轮转
log_file_keep_days:日志文件保留天数。0:不删除老日志文件
use_connection_pool:使用连接池
connection_pool_max_idle_time:连接池连接最大时长
http.server_port:tracker服务的HTTP端口
http.check_alive_interval:检查storage HTTP服务存活时间间隔,单位为秒
http.check_alive_type:检查storage HTTP服务存活的服务协议类型
http.check_alive_uri:检查storage HTTP服务存活地址URI/URL
Storage:
disabled:配置文件是否生效
group_name:storage服务所属group名称
bind_addr:绑定指定IP地址提供服务
client_bind:storage作为客户端连接其他服务时,是否绑定地址
port:storage服务端口
connect_timeout:套接字连接超时秒数,默认30秒
network_timeout:网络连接超时秒数,发送或接收数据时,超时后还不能发送或接收数据,则本次网络通信失败
heart_beat_interval:主动向tracker发送心跳间隔时间,单位为秒
stat_report_interval:向tracker服务报告磁盘剩余空间时间间隔,单位为秒
base_path:存储数据和日志文件的基础目录地址(根目录必须存在,子目录会自动创
max_connections:系统提供服务时的最大连接数
buff_size:接收或发送数据的队列结点缓存大小,工作队列消耗内存大小=send * max_connections
accept_threads:线程总数
work_threads:工作线程数,通常为CPU数,应该不大于max_connections
disk_rw_separated:磁盘读写是否分离
disk_reader_threads:读写分离时,系统中的写线程数=disk_reader_threads * store_path_count,读写混合时线程数=(disk_reader_threads + disk_writer_threads) * store_path_count
disk_writer_threads:读写分离时,系统中的写线程数=disk_writer_threads * store_path_count
sync_wait_msec:同步文件时,尝试从二进制日志文件中不断读取的休眠毫秒数
sync_interval:同步完一个文件后继续同步的时间间隔,单位毫秒
sync_start_time:同步开始时间点
sync_end_time:同步结束时间点
write_mark_file_freq:同步完N个文件后,同步storage的mark文件到磁盘
store_path_count:storage服务存放文件的基路径数
store_path#:逐一配置store_path路径,索引号从0开始,store_path0不配置的话,与base_path路径保持一致
subdir_count_per_path:FastDFS存储文件的目录个数,会自动创建N * N个子目录
tracker_server:tracker服务列表,每个一行。格式为主机和端口号,主机可以是主机名称或IP地址
log_level:日志级别
run_by_group:服务器运行FastDFS的用户组,不填为当前用户组
run_by_user:服务器运行FastDFS的用户,不填为当前用户
allow_hosts:允许连接storage服务的IP地址列表
file_distribute_path_mode:文件在data目录下分布存储策略,0:轮询,1:随机根据文件名对应的hashcode存储
file_distribute_rotate_count:file_distribute_path_mode为0时有效,当一个目录下的文件存放的文件数达到本参数值时,后续上传的文件存储到下一个目录
fsync_after_written_bytes:写入大文件时,每N字节强行将内容同步到硬盘
sync_log_buff_interval:同步或刷新日志信息导磁盘的时间间隔单位为秒
sync_binlog_buff_interval:同步二进制日志到硬盘的时间间隔单位为秒
sync_stat_file_interval:storage的stat信息同步到硬盘的时间间隔单位为秒
thread_stack_size:线程栈的大小
upload_priority:上传文件的优先级,值越小,优先级越高。tracker配置文件中的store_server值为2时生效
if_alias_prefix:网络适配器的别名前缀,不填写会自动设置系统类型
check_file_duplicate:是否上传的文件已经存在,配合FastDHT使用
file_signature_method:重复文件内容的签名方式,支持hash和md5
key_namespace:在FastDHT中保存文件索引的命名空间
keep_alive:与FastDHT连接的方式。长连接和断连接
use_access_log:是否将文件操作记录到操作日志
rotate_access_log:是否定期轮询操作日志
access_log_rotate_time:操作日志定期轮询时间点
rotate_error_log:是否定期轮询错误日志
error_log_rotate_time:错误日志定期轮询时间点
rotate_access_log_size:按文件大小轮询操作日志
rotate_error_log_size:按文件大小轮询错误日志
log_file_keep_days:日志文件保存天数
file_sync_skip_invalid_record:文件同步时,是否忽略无效的记录
use_connection_pool:是否使用连接池
connection_pool_max_idle_time:连接池连接最大时长
http.domain_name:storage服务web服务域名,可以通过tracker服务重定向URL来访问,如果域名为空使用IP地址
http.server_port:storage提供web服务的端口号