FastDFS 快速开始

一、什么是FastDFS

FastDFS是用c语言编写的一款开源的分布式文件系统。 FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。

它解决了大数据量存储和负载均衡等问题。特别适合以中小文件(建议范围:4KB< file_size< 500MB)为载体的在线服务,如相册网站、视频网站等等。

通过线性的添加新的逻辑存储组,从容实现存储容量的线性扩容。

文件下载上,除了支持通过API方式,目前还提供了apache和nginx的插件支持,同时也可以不使用对应的插件,直接以Web静态资源方式对外提供下载。

1. FastDFS功能以及优点

FastDFS主要解决了大容量的文件存储和高并发访问的问题,文件存取时实现了负载均衡
FastDFS实现了软件方式的RAID,可以使用廉价的IDE硬盘进行存储
支持存储服务器在线扩容
支持存储服务器在线扩容
支持相同内容的文件只保存一份,节约磁盘空间
FastDFS特别适合大中型网站使用,用来存储资源文件(如:图片、文档、音频、视频等等)
FastDFS是一个开源的轻量级分布式文件系统,由跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)三个部分组成,主要解决了海量数据存储问题,特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

2. FastDFS缺点

1)不支持断点续传,对大文件将是噩梦(FastDFS不适合大文件存储)
2)不支持POSIX通用接口访问,通用性较低
3)对跨公网的文件同步,存在较大延迟,需要应用做相应的容错策略
4)同步机制不支持文件正确性校验,降低了系统的可用性
5)通过API下载,存在单点的性能瓶颈

二、FastDFS架构

1. 组成角色

FastDFS服务端有三个角色:跟踪服务器(tracker server)、存储服务器(storage server)和客户端(client)。

  • tracker server
    跟踪服务器,主要做调度工作,起负载均衡的作用。在内存中记录集群中所有存储组和存储服务器的状态信息,是客户端和数据服务器交互的枢纽。相比GFS中的master更为精简,不记录文件索引信息,占用的内存量很少。

Tracker是FastDFS的协调者,负责管理所有的storage server和group,每个storage在启动后会连接Tracker,告知自己所属的group等信息,并保持周期性的心跳,tracker根据storage的心跳信息,建立group[storage server list]的映射表。

  • storage server
    存储服务器(又称:存储节点或数据服务器),文件和文件属性(meta data)都保存到存储服务器上。Storage server直接利用OS的文件系统调用管理文件。

Storage server(后简称storage)以组(卷,group或volume)为单位组织,一个group内包含多台storage机器,数据互为备份,存储空间以group内容量最小的storage为准,所以建议group内的多个storage尽量配置相同,以免造成存储空间的浪费。

以group为单位组织存储能方便的进行应用隔离、负载均衡、副本数定制(group内storage server数量即为该group的副本数),比如将不同应用数据存到不同的group就能隔离应用数据,同时还可根据应用的访问特性来将应用分配到不同的group来做负载均衡;缺点是group的容量受单机存储容量的限制,同时当group内有机器坏掉时,数据恢复只能依赖group内地其他机器,使得恢复时间会很长。

group内每个storage的存储依赖于本地文件系统,storage可配置多个数据存储目录,比如有10块磁盘,分别挂载在 /data/disk1-/data/disk10,则可将这10个目录都配置为storage的数据存储目录。

storage接受到写文件请求时,会根据配置好的规则(后面会介绍),选择其中一个存储目录来存储文件。为了避免单个目录下的文件数太多,在storage第一次启动时,会在每个数据存储目录里创建2级子目录,每级256个,总共65536个文件,新写的文件会以hash的方式被路由到其中某个子目录下,然后将文件数据直接作为一个本地文件存储到该目录中。

  • client
    客户端,作为业务请求的发起方,通过专有接口,使用TCP/IP协议与跟踪器服务器或存储节点进行数据交互。

FastDFS向使用者提供基本文件访问接口,比如upload、download、append、delete等,以客户端库的方式提供给用户使用。

2. 基本概念

  • group
    组, 也可称为卷。 同组内服务器上的文件是完全相同的 ,同一组内的storage server之间是对等的, 文件上传、 删除等操作可以在任意一台storage server上进行 。

  • meta data
    文件相关属性,键值对( Key Value Pair) 方式,如:width=1024,heigth=768 。

  • storage_id
    指storage server的id,从FastDFS4.x版本开始,tracker可以对storage定义一组ip到id的映射,以id的形式对storage进行管理。而文件名写入的不再是storage的ip而是id,这样的方式对于数据迁移十分有利。

  • storage_sync_file_max_delay
    指storage节点同步一个文件最大的时间延迟,是一个阈值;如果当前时间与文件创建时间的差距超过该值则认为同步已经完成。

  • anti_steal_token
    指文件ID防盗链的方式,FastDFS采用token认证的方式进行文件防盗链检查。

三、centos7下 编译安装

1. yum安装依赖库

#yum -y install make cmake gcc gcc-c++ perl readline-devel pcre-devel openssl-devel automake autoconf libtool nasm

2. 安装libfastcommon

获取libfastcommon安装包:

wget https://github.com/happyfish100/libfastcommon/archive/V1.0.41.tar.gz

解压安装包:tar -zxvf V1.0.41.tar.gz

进入目录:cd libfastcommon-1.0.41

执行编译:./make.sh

安装:./make.sh install

install执行结果,如下我们可以看到它安装的位置信息。

[root@VM_0_14_centos libfastcommon-1.0.41]# ./make.sh install
mkdir -p /usr/lib64
mkdir -p /usr/lib
mkdir -p /usr/include/fastcommon
install -m 755 libfastcommon.so /usr/lib64
install -m 644 common_define.h hash.h chain.h logger.h base64.h shared_func.h pthread_func.h ini_file_reader.h _os_define.h sockopt.h sched_thread.h http_func.h md5.h local_ip_func.h avl_tree.h ioevent.h ioevent_loop.h fast_task_queue.h fast_timer.h process_ctrl.h fast_mblock.h connection_pool.h fast_mpool.h fast_allocator.h fast_buffer.h skiplist.h multi_skiplist.h flat_skiplist.h skiplist_common.h system_info.h fast_blocked_queue.h php7_ext_wrapper.h id_generator.h char_converter.h char_convert_loader.h common_blocked_queue.h multi_socket_client.h skiplist_set.h fc_list.h json_parser.h /usr/include/fastcommon
if [ ! -e /usr/lib/libfastcommon.so ]; then ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so; fi
[root@VM_0_14_centos libfastcommon-1.0.41]# 

3. 安装FastDFS

wget https://github.com/happyfish100/fastdfs/archive/V6.01.tar.gz

解压安装包:tar -zxvf V5.11.tar.gz

进入目录:cd fastdfs-6.01

执行编译:./make.sh

安装:./make.sh install

install执行结果,如下我们可以看到它安装的位置信息。

[root@VM_0_14_centos fastdfs-6.01]# ./make.sh install
mkdir -p /usr/bin
mkdir -p /etc/fdfs
cp -f fdfs_trackerd /usr/bin
if [ ! -f /etc/fdfs/tracker.conf.sample ]; then cp -f ../conf/tracker.conf /etc/fdfs/tracker.conf.sample; fi
if [ ! -f /etc/fdfs/storage_ids.conf.sample ]; then cp -f ../conf/storage_ids.conf /etc/fdfs/storage_ids.conf.sample; fi
mkdir -p /usr/bin
mkdir -p /etc/fdfs
cp -f fdfs_storaged  /usr/bin
if [ ! -f /etc/fdfs/storage.conf.sample ]; then cp -f ../conf/storage.conf /etc/fdfs/storage.conf.sample; fi
mkdir -p /usr/bin
mkdir -p /etc/fdfs
mkdir -p /usr/lib64
mkdir -p /usr/lib
cp -f fdfs_monitor fdfs_test fdfs_test1 fdfs_crc32 fdfs_upload_file fdfs_download_file fdfs_delete_file fdfs_file_info fdfs_appender_test fdfs_appender_test1 fdfs_append_file fdfs_upload_appender /usr/bin
if [ 0 -eq 1 ]; then cp -f libfdfsclient.a /usr/lib64; cp -f libfdfsclient.a /usr/lib/;fi
if [ 1 -eq 1 ]; then cp -f libfdfsclient.so /usr/lib64; cp -f libfdfsclient.so /usr/lib/;fi
mkdir -p /usr/include/fastdfs
cp -f ../common/fdfs_define.h ../common/fdfs_global.h ../common/mime_file_parser.h ../common/fdfs_http_shared.h ../tracker/tracker_types.h ../tracker/tracker_proto.h ../tracker/fdfs_shared_func.h ../tracker/fdfs_server_id_func.h ../storage/trunk_mgr/trunk_shared.h tracker_client.h storage_client.h storage_client1.h client_func.h client_global.h fdfs_client.h /usr/include/fastdfs
if [ ! -f /etc/fdfs/client.conf.sample ]; then cp -f ../conf/client.conf /etc/fdfs/client.conf.sample; fi
[root@VM_0_14_centos fastdfs-6.01]# 

安装完成后,
查看可执行命令:ls -la /usr/bin/fdfs*

4. 配置Tracker服务

进入/etc/fdfs目录,有三个.sample后缀的文件(自动生成的fdfs模板配置文件),通过cp命令拷贝tracker.conf.sample,删除.sample后缀作为正式文件:

cp tracker.conf.sample tracker.conf

编辑tracker.conf:vi tracker.conf,修改相关参数
#tracker存储data和log的跟路径,必须提前创建好

mkdir -p /home/she/fastdfs/tracker
disabled=false  # 是否配置关闭
base_path=/home/she/fastdfs/tracker  #tracker存储data和log的跟路径,必须提前创建好
port=22122 #tracker端口
http.server_port=8080 #http端口,需要和nginx相同

这个http.server_port=8080 指的是在tracker服务器上启动http服务进程,如:apache或者nginx 启动时所监听的端口,这个似乎是可以不用管的,因为tracker本身就没有安装http服务。

启动tracker(支持start|stop|restart):

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

5. 配置storaged服务

进入/etc/fdfs目录,有cp命令拷贝storage.conf.sample,删除.sample后缀作为正式文件;

cp storage.conf.sample storage.conf
mkdir -p /home/she/fastdfs/storage

编辑storage.conf:vi storage.conf,修改相关参数:

base_path=/home/she/fastdfs/storage #storage存储data和log的跟路径,必须提前创建好
port=23000 #storge默认23000,同一个组的storage端口号必须一致
group_name=group1 #默认组名,根据实际情况修改
store_path_count=1 #存储路径个数,需要和store_path个数匹配
store_path0=/home/she/fastdfs/storage #如果为空,则使用base_path
tracker_server=10.122.149.211:22122 #配置该storage监听的tracker的ip和port

启动storage(支持start|stop|restart):

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

查看storage启动日志:进入刚刚指定的base_path(/home/fastdfs/storage)中有个logs目录,查看storage.log

6. 服务检测

查看端口情况:netstat -apn|grep fdfs
通过monitor来查看storage是否成功绑定:

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

四、FastDFS常用命令测试

1. 上传文件

进入/etc/fdfs目录,有cp命令拷贝client.conf.sample,删除.sample后缀作为正式文件;

cd /etc/fdfs
cp client.conf.sample client.conf
mkdir -p /home/she/fastdfs/client
vi  /etc/fdfs/client.conf

修改client.conf相关配置:

base_path=/home/she/fastdfs/client
tracker_server=10.122.149.211:22122 //tracker服务器IP地址和端口号
http.tracker_server_port=80 # tracker服务器的http端口号,必须和tracker的设置对应起来

新建一个测试文档test.txt,内容为abc

命令:

/usr/bin/fdfs_upload_file <config_file> <local_filename>

示例:

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf test.txt

它会返回file_id
group1/M00/00/00/rBUADl3DkzWAcAOTAAAABEeIgU4426.txt

2. 查看文件信息

执行命令:
···
/usr/bin/fdfs_file_info /etc/fdfs/storage.conf group1/M00/00/00/rBUADl3DkzWAcAOTAAAABEeIgU4426.txt
···
返回结果如下

vc796.txt
source storage id: 0
source ip address: 11.12.115.215
file create timestamp: 2019-09-25 16:34:02
file size: 5
file crc32: 1912009463 (0x71F6F2F7)

3. 计算文件crc32命令

/usr/bin/fdfs_crc32 test.txt

4. fdfs_monitor命令查看集群中的服务器列表和状态

通过monitor来查看storage是否成功绑定:

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

查看一个group内storage server的id列表(storage采用service id特性的情况下使用)

fdfs_monitor /etc/fdfs/storage.conf list group1 |grep '^\s*id'

查看一个group内storage service的IP地址及状态列表:

fdfs_monitor /etc/fdfs/storage.conf list group1 |grep ip_addr

如果出现废弃的storage servce而导致存储路径数量不一致,需要将其从集群中删除,命令如下:
为了防止误操作,不容许删除状态为ACTIVE的storage service。删除后storage server的状态变为DELETED。重启tracker service服务后该storage service将从集群中消失。

fdfs_monitor /etc/fdfs/storage.conf delete <group> <id or ip>

五、nginx为FastDFS的storage server提供http访问接口

配置nginx为FastDFS的storage server提供http访问接口
参考URL: https://blog.csdn.net/WuLex/article/details/90140166

1. FastDFS的Nginx模块来源

我们在使用FastDFS部署一个分布式文件系统的时候,通过FastDFS的客户端API来进行文件的上传、下载、删除等操作。同时通过FastDFS的HTTP服务器来提供HTTP服务。但是FastDFS的HTTP服务较为简单,无法提供负载均衡等高性能的服务,所以FastDFS的开发者,为我们提供了Nginx上使用的FastDFS模块(也可以叫FastDFS的Nginx模块)。

FastDFS通过Tracker服务器,将文件放在Storage服务器存储,但是同组之间的服务器需要复制文件,有延迟的问题.假设Tracker服务器将文件上传到了192.168.128.131,文件ID已经返回客户端,这时,后台会将这个文件复制到192.168.128.131,如果复制没有完成,客户端就用这个ID在192.168.128.131取文件,肯定会出现错误。这个fastdfs-nginx-module可以重定向连接到源服务器取文件,避免客户端由于复制延迟的问题,出现错误。
正是这样,FastDFS需要结合nginx,所以取消原来对HTTP的直接支持。

Version 4.05之前fastdfs内部绑定了libevent作为http服务器.Version 4.05之后的版本删除了内置的web http服务

最新版的FastDFS已经取消了直接通过HTTP直连FastDFS的这种方式,因此需要在FastDFS增加Nginx的整合

2. 安装配置过程

1) 下载解压fastdfs-nginx-module源码

#下载解压fastdfs-nginx-module

wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.21.tar.gz
cd fastdfs-nginx-module-1.21

修改fastdfs-nginx-module/src/conf文件:这里主要根据你fastdfs、fastdfscommon安装的头文件、lib地址位置修改CORE_INCS、CORE_LIBS。默认这个文件不需要改。

ngx_addon_name=ngx_http_fastdfs_module

if test -n "${ngx_module_link}"; then
    ngx_module_type=HTTP
    ngx_module_name=$ngx_addon_name
    ngx_module_incs="/usr/local/include"
    ngx_module_libs="-lfastcommon -lfdfsclient"
    ngx_module_srcs="$ngx_addon_dir/ngx_http_fastdfs_module.c"
    ngx_module_deps=
    CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
    . auto/module
else
    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/include"
    CORE_LIBS="$CORE_LIBS -lfastcommon -lfdfsclient"
    CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
fi
2) openresty编译安装
# 安装依赖库
yum install readline-devel pcre-devel openssl-devel gcc cpan -y

# 下载及安装OpenResty
wget https://openresty.org/download/openresty-1.15.8.2.tar.gz
tar zxvf openresty-1.15.8.2.tar.gz
cd openresty-1.15.8.2/

openresty编译选项添加fastdfs-nginx-module

# 注意:使用--prefix指定安装目录
# 使用--add-module= 加入 fastdfs-nginx模块
./configure --prefix=/usr/local/openresty --with-luajit  --with-http_iconv_module --add-module=/root/code/fastdfs-nginx-module-1.21/src/


# 编译&编译安装
gmake 
gmake install
3) 配置Nginx和fastdfs-nginx-module模块

修改/etc/fdfs/mod_fastdfs.conf

cd fastdfs-nginx-module-1.21/src
cp mod_fastdfs.conf /etc/fdfs/
vi /etc/fdfs/mod_fastdfs.conf
# the base path to store log files
base_path=/tmp
tracker_server=10.122.149.211:22122 #tracker的地址
url_have_group_name=true #url是否包含group名称
storage_server_port=23000 #需要和storage配置的相同
#store_path_count=1  #存储路径个数,需要和store_path个数匹配
#store_path0=/home/mm/fastdfs/storage #文件存储的位置

配置nginx,8080端口server增加location如图:
映射到fastdfs的数据目录

vi /usr/local/openresty/nginx/conf/nginx.conf

# config for fastdfs-nginx-module
server {
    listen 8080;
    location ~/group[0-9]+/M00/ {
        root /home/she/fastdfs/storage/data;
        ngx_fastdfs_module;
    }
}

最后需要拷贝fastdfs解压目录中的http.conf和mime.types:

cd fastdfs-6.01/conf
cp mime.types http.conf /etc/fdfs/

启动nginx

[root@VM_0_14_centos storage]# /usr/local/openresty/nginx/sbin/nginx
ngx_http_fastdfs_set pid=4338
[root@VM_0_14_centos storage]# 

3. 启动openresty 上传下载文件测试

/usr/local/openresty/nginx/sbin/nginx -s stop
/usr/local/openresty/nginx/sbin/nginx -c /root/conf/nginx.conf
/usr/bin/fdfs_upload_file  /etc/fdfs/client.conf 1.txt

4. 问题整理

1. nginx fastdfs 访问文件出现404

方法一:检测配置文件nginx.conf

配置文件加上一行 user root

检测配置文件:
vi /usr/local/openresty/nginx/conf/nginx.conf
在这里插入图片描述
方法二:配置 /etc/fdfs/mod_fastdfs.conf

url_have_group_name = false 改为true(使用组名访问)

方法三:查看nginx的错误日志
排查思路:查看nginx的错误日志,发现错误提示:[2019-11-08 09:00:44] ERROR - file: /root/code/fastdfs-nginx-module-1.21/src/common.c, line: 1094, file: /home/yuqing/fastdfs/data/00/00/rBUADl3Et9CAGQjMAAAABEeIgU4370.txt not exist

解决方法:
apache和nginx扩展模块版本v1.06及以上版本,需要在配置文件/etc/fdfs/fastdfs_mod.conf中设置storage server的存储路径信息。
一个示例如下所示:
store_path_count=1
store_path0=/home/yuqing/fastdfs
store_path_count和store_path#均需要正确设置,必须和storage.conf中的相应配置完全一致

5. 其他功能整合

Nginx-Lua-FastDFS-GraphicsMagick动态图片缩略图

Nginx-Lua-FastDFS-GraphicsMagick动态图片缩略图
参考URL: https://blog.csdn.net/danielzhou888/article/details/80563326

原理:使用lua脚本,调用GraphicsMagick的gm命令动态处理图片。

六、fastDFS文件服务器原理

fastDFS文件服务器(一):原理篇
参考URL: https://www.jianshu.com/p/f9cfab990eb6

1. 传统文件存储问题

单机存储不了,就将数据分散存储到多台机器,并通过在软件层做封装提供统一的存储接口,使得存储服务的使用者不需要关心数据是如何存储、存储在哪里的。

以磁盘为存储介质的单机文件系统(如ext4、xfs等),文件都是以目录树结构来组织的,当文件数很多时,目录内的文件数会很多、目录层次也会变深,使得路径查找是非常影响性能的,一次路径名查找可能需要多次磁盘IO。

2. 目前分布式文件存储系统的解决方案

TFS、FASTDFS、HDFS都是通过将数据分布到多个存储节点来解决问题
1、通过将多个文件打包存储到大文件(block)以及扁平化的目录结构来解决问题
2、通过block多副本以及按block复制的方式来解决问题。
3、block通常64MB大小,block内部存储的每个文件由一个fileid标识

3. 小文件合并存储

将小文件合并存储主要解决如下几个问题:

  1. 本地文件系统inode数量有限,从而存储的小文件数量也就受到限制。

  2. 多级目录+目录里很多文件,导致访问文件的开销很大(可能导致很多次IO)

  3. 按小文件存储,备份与恢复的效率低

FastDFS在新版本中,可将多个小文件存储到一个大的文件(trunk file),为了支持这个机制,FastDFS生成的文件fileid需要额外增加16个字节,每个trunk file由一个id唯一标识,trunk file由group内的trunk server负责创建(trunk server是tracker选出来的),并同步到group内其他的storage,文件存储合并存储到trunk file后,根据其offset就能从trunk file读取到文件。**文件在trunk file内的offset编码到文件名,决定了其在trunk file内的位置是不能更改的,**也就不能通过compact的方式回收trunk file内删除文件的空间。但当trunk file内有文件删除时,其删除的空间是可以被复用的,比如一个100KB的文件被删除,接下来存储一个99KB的文件就可以直接复用这片删除的存储空间。

4. 上传机制

在这里插入图片描述
1、选择tracker server
当集群中不止一个tracker server时,由于tracker之间是完全对等的关系,客户端在upload文件时可以任意选择一个trakcer。 选择存储的group 当tracker接收到upload file的请求时,会为该文件分配一个可以存储该文件的group,支持如下选择group的规则:

1、Round robin,所有的group间轮询
2、Specified group,指定某一个确定的group
3、Load balance,剩余存储空间多多group优先

2、选择storage server
当选定group后,tracker会在group内选择一个storage server给客户端,支持如下选择storage的规则:

1、Round robin,在group内的所有storage间轮询
2、First server ordered by ip,按ip排序
3、First server ordered by priority,按优先级排序(优先级在storage上配置)

3、选择storage path

当分配好storage server后,客户端将向storage发送写文件请求,storage将会为文件分配一个数据存储目录,支持如下规则:

1、Round robin,多个存储目录间轮询
2、剩余存储空间最多的优先
4、生成Fileid

选定存储目录之后,storage会为文件生一个Fileid,由storage server ip、文件创建时间、文件大小、文件crc32和一个随机数拼接而成,然后将这个二进制串进行base64编码,转换为可打印的字符串。 选择两级目录 当选定存储目录之后,storage会为文件分配一个fileid,每个存储目录下有两级256*256的子目录,storage会按文件fileid进行两次hash(猜测),路由到其中一个子目录,然后将文件以fileid为文件名存储到该子目录下。

5、生成文件名
当文件存储到某个子目录后,即认为该文件存储成功,接下来会为该文件生成一个文件名,文件名由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。

5. 下载机制

在这里插入图片描述
跟upload file一样,在download file时客户端可以选择任意tracker server。tracker发送download请求给某个tracker,必须带上文件名信息,tracke从文件名中解析出文件的group、大小、创建时间等信息,然后为该请求选择一个storage用来服务读请求。由于group内的文件同步时在后台异步进行的,所以有可能出现在读到时候,文件还没有同步到某些storage server上,为了尽量避免访问到这样的storage,tracker按照如下规则选择group内可读的storage

1、该文件上传到的源头storage - 源头storage只要存活着,肯定包含这个文件,源头的地址被编码在文件名中。

2、文件创建时间戳==storage被同步到的时间戳 且(当前时间-文件创建时间戳) > 文件同步最大时间(如5分钟) - 文件创建后,认为经过最大同步时间后,肯定已经同步到其他storage了。

3、文件创建时间戳 < storage被同步到的时间戳。 - 同步时间戳之前的文件确定已经同步了

4、(当前时间-文件创建时间戳) > 同步延迟阀值(如一天)。 - 经过同步延迟阈值时间,认为文件肯定已经同步了。

写文件时,客户端将文件写至group内一个storage server即认为写文件成功,storage server写完文件后,会由后台线程将文件同步至同group内其他的storage server。

每个storage写文件后,同时会写一份binlog,binlog里不包含文件数据,只包含文件名等元信息,这份binlog用于后台同步,storage会记录向group内其他storage同步的进度,以便重启后能接上次的进度继续同步;进度以时间戳的方式进行记录,所以最好能保证集群内所有server的时钟保持同步。

6. 快速定位文件

1、通过组名tracker能够很快的定位到客户端需要访问的存储服务器组,并将选择合适的存储服务器提供客户端访问;

2、存储服务器根据“文件存储虚拟磁盘路径”和“数据文件两级目录”可以很快定位到文件所在目录,并根据文件名找到客户端需要访问的文件。

七、fastdfs-client-java操作fastdfs

fastdfs-client-java操作fastdfs
参考URL: https://www.cnblogs.com/beyondcj/p/7160250.html

八、问题整理

1. 阿里云、腾讯云上传不了,java客户端上传,获取的storage的ip为内网ip

fastdfs 配置公网IP java客户端上传
参考URL: https://blog.csdn.net/u011209659/article/details/83828405

问题分析:
上传文件时,是先通过tracker获取storage的ip和端口,但是腾讯云环境下,storage在连接tracker用的内网ip,因此tracker中storage的ip也就是内网。

/usr/bin/fdfs_monitor /etc/fdfs/storage.conf

解决方法:
修改storage的配置文件,配置tracker的ip为外网ip。

vi /etc/fdfs/storage.conf

九、参考

FastDFS作者余庆谈真正的开源精神
参考URL: http://storage.it168.com/a2018/1210/5124/000005124788.shtml
分布式文件系统FastDFS详解
https://baijiahao.baidu.com/s?id=1588881983988039766&wfr=spider&for=pc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西京刀客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值