`
sealbird
  • 浏览: 586439 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

FastDFS HOWTO - 同步机制

阅读更多
引用
happy_fish100 发表于 2009-02-19 10:25

FastDFS HOWTO - 同步机制
在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。
runch 发表于 2009-03-10 09:58

在FastDFS的服务器端配置文件中,bind_addr这个参数用于需要绑定本机IP地址的场合。

请问什么场合下需要绑定IP地址?什么场合下不需要绑定IP地址?
happy_fish100 发表于 2009-03-10 11:36

回复 #2 runch 的帖子
通常是不需要绑定本机IP地址的。
如果有多个IP地址,只想让其中的一个IP提供服务(tracker或storage),就可以通过本参数来实现。
crastyl 发表于 2009-05-27 16:24

请问一下hapyfish 。客户端怎末挂载这些目录呢。。具体现在还不是很明白。客户端怎末访问数据?
happy_fish100 发表于 2009-06-01 12:27

回复 #4 crastyl 的帖子
FastDFS不是一个通用的文件系统,它是专用的文件系统,不能moint使用,只能通过API进行文件上传、下载等操作。
happy_fastdfs 发表于 2009-07-27 15:29

回复 #1 happy_fish100 的帖子
请问文件同步过程中,用户请求下载该文件时,会得到什么结果?
例如文件F在storage A上传OK,问题1,是先返回OK,然后再来同步给同组的storage B吧?这个同步是立即开始,还是由专门的线程异步处理?

问题2,猜的是异步处理的,如果在A-->B同步文件F的过程中,用户请求下载文件F,tracker会把B返回给用户来请求下载吗?是否这种情况会存在下载不到完整文件的问题?
happy_fish100 发表于 2009-07-27 22:54

回复 #6 happy_fastdfs 的帖子
>> 例如文件F在storage A上传OK,问题1,是先返回OK,然后再来同步给同组的storage B吧?这个同步是立即开始,还是由专门的线程异步处理?
文件同步是异步的。由专门的线程做同步工作。

>> 问题2,猜的是异步处理的,如果在A-->B同步文件F的过程中,用户请求下载文件F,tracker会把B返回给用户来请求下载吗?是否这种情况会存在下载不到完整文件的问题?

的确是异步的。如果下载的文件还在同步过程中,tracker只会返回服务器A,不会返回服务器B。
happy_fastdfs 发表于 2009-07-28 15:12

回复 #7 happy_fish100 的帖子
>> 问题2,猜的是异步处理的,如果在A-->B同步文件F的过程中,用户请求下载文件F,tracker会把B返回给用户来请求下载吗?是否这种情况会存在下载不到完整文件的问题?

的确是异步的。如果下载的文件还在同步过程中,tracker只会返回服务器A,不会返回服务器B。

-----
谢谢你这么快就回复。
有一点还没明白:
tracker怎么知道storage还没同步完呢?
在一个storage已经加入group并开始对外服务后,storage的心跳信息不会那么快上报,storage也不会针对每个文件同步OK后给tracker报告状态吧。

从协议HOW TO文档没能串起来理清这个流程。当然,上传文件F成功后瞬间就来下载文件F,这种情况可以在
应用中设法避免。
happy_fish100 发表于 2009-07-28 22:39

回复 #8 happy_fastdfs 的帖子
>>tracker怎么知道storage还没同步完呢?
storage server会定时向tracker server报告同步到其他服务器的状态,tracker server会记录同步到一台storage server的文件的最旧创建时间。如果要下载的文件创建时间比同步到该storage server的文件时间要新,那么就返回上传该文件的源storage server;否则返回当前storage server。

>>在一个storage已经加入group并开始对外服务后,storage的心跳信息不会那么快上报,storage也不会针对每个文件同步OK后给tracker报告状态吧。
是的。由storage server定期报告给tracker server,比如30秒报告一次。
happy_fastdfs 发表于 2009-07-29 11:36

回复 #9 happy_fish100 的帖子
哥们,你这个系统做得貌似简单其实精巧!

仔细看了下机制,明白文件命名的好处了:
数据文件名由系统自动生成,包括4部分:存储服务器IP地址、当前时间(Unix时间戳)、文件大小(字节数)和随机数。文件名长度为22字节。

step1,tracker收到下载文件的请求时,从v1.2开始就可以直接从请求的文件名内解析出storage_ip和文件上传时间(Unix时间戳)、结合请求传来的的group;

step2.然后从该group存活的storage列表中找这个storage_ip(即该文件原来上传的ip,源ip),要是这个storage_ip停掉了即查找失败,则取该group内的存活的下一个storage_ip1并且比较文件上传时间和该storage_ip1同步时间戳,没有符合条件的好像会取该group内一个存活的ip给客户端。代码内这个机制要是注释清楚一些就更好了:)

step3,storage定期向tracker通报自己的最新做完的文件同步时间戳,这个时间戳需要退出tracker时才flush到storage_servers.dat,运行时我等了十来分钟都没看到更新进去。
storage_servers.dat中记录storage server相关信息,字段依次为:
……
16. stat.last_source_update:最近一次源头更新时间(更新操作来自客户端)
17. stat.last_sync_update:最近一次同步更新时间(更新操作来自其他storage server的同步)

非常感谢快乐鱼!
wgcno7 发表于 2009-11-26 16:13

问一个弱问题:
同一组内的storage server之间的关系是什么?
happy_fish100 发表于 2009-11-26 18:46

回复 #11 wgcno7 的帖子
冗余备份关系。同一组storage server上的文件完全相同的。
zhengwei_zw 发表于 2010-01-28 17:23

按楼上说的
意思就是
同组内无副本数设置?
全部一样?
happy_fish100 发表于 2010-01-29 09:08

引用
原帖由 zhengwei_zw 于 2010-1-28 17:23 发表
按楼上说的
意思就是
同组内无副本数设置?
全部一样?


是的。一个组的机器数,就是文件副本数。
一个组至少有一台机器,可以有两台、三台等等。通常一个组有两台机器就可以了,具体需要几台服务器,取决于存储服务器的访问压力。
分享到:
评论

相关推荐

    fastdfs-client-java-1.29-SNAPSHOT.jar

    解决 Maven 无法下载 fastdfs-client-java-1.29-SNAPSHOT 依赖,直接下载之后用maven命令存储到本地maven仓库即可。 maven命令 mvn install:install-file -DgroupId=org.csource -DartifactId=fastdfs-client-java ...

    fastdfs-client-1.27.2-API文档-中文版.zip

    赠送jar包:fastdfs-client-1.27.2.jar; 赠送原API文档:fastdfs-client-1.27.2-javadoc.jar; 赠送源代码:fastdfs-client-1.27.2-sources.jar; 赠送Maven依赖信息文件:fastdfs-client-1.27.2.pom; 包含翻译后...

    fastdfs-nginx-module-正版V1.19-亲测可用 .zip

    《FastDFS-Nginx-Module V1.19:构建高效稳定的文件服务器系统》 FastDFS-Nginx-Module V1.19 是一个专为Nginx设计的FastDFS扩展模块,它允许Nginx直接与FastDFS进行交互,从而实现高效的文件上传和下载服务。...

    fastdfs-nginx-module-1.22.zip

    《FastDFS-Nginx-Module 1.22:构建高效Web服务器的融合解决方案》 在互联网服务领域,Nginx以其高效的性能和强大的反向代理能力被广泛应用于Web服务器,而FastDFS作为轻量级的分布式文件系统,能够有效地解决...

    fastdfs-nginx-module-1.24

    《FastDFS-Nginx-Module 1.24:高效文件服务器集成详解》 FastDFS-nginx-module 1.24 是一个针对 FastDFS 文件系统的 Nginx 模块,它使得 Nginx 可以无缝地与 FastDFS 集成,提供了高效的文件上传、下载服务。这一...

    fastdfs安装包(fastdfs-6.06,fastdfs-nginx-module-1.22,nginx-1.16.1)

    在本教程中,我们将详细探讨如何利用FastDFS-6.06、fastdfs-nginx-module-1.22和nginx-1.16.1这三个组件来搭建一套完整的FastDFS系统。 首先,我们来看FastDFS-6.06。这是FastDFS的主要部分,负责文件的存储和管理...

    fastdfs-client-javajar1.27-SNAPSHOT.zip

    标题中的"fastdfs-client-javajar1.27-SNAPSHOT.zip"是一个Java库的压缩包,它对应的是FastDFS客户端的Java版本。FastDFS是一个开源的、高性能的分布式文件系统,主要解决海量数据存储和负载均衡的问题。在这个特定...

    fastdfs-nginx-module_v1.16.tar.gz源码包,nginx支

    标题中的"fastdfs-nginx-module_v1.16.tar.gz"是一个开源项目,它是一个用于Nginx服务器的模块,旨在使Nginx能够与FastDFS文件存储系统无缝集成。FastDFS是一个轻量级的开源分布式文件系统,适用于互联网和企业内部...

    fastdfs-nginx-module_master.zip

    总结来说,`fastdfs-nginx-module-master.zip`提供的FastDFS-nginx-module是实现Nginx与FastDFS集成的重要桥梁,它简化了文件服务的部署和管理,提高了文件服务的性能。通过理解和掌握这个模块的使用,开发者可以...

    fastdfs-client-java-1.27-RELEASE

    fastdfs-client-java-1.27-RELEASE 版本 很实用 spring boot整合fastdfs

    fastdfs-client-java-1.27-SNAPSHOT.zip

    在此次提及的压缩包"fastdfs-client-java-1.27-SNAPSHOT.zip"中,包含了两个关键文件:"fastdfs-client-java-1.27-SNAPSHOT.jar"和"fastdfs-client-java-1.27-SNAPSHOT.pom"。 1. **fastdfs-client-java-1.27-...

    fastdfs-nginx-module1.20

    《FastDFS-Nginx-Module V1.20详解及应用实践》 FastDFS-Nginx-Module是针对FastDFS分布式文件系统的一款扩展模块,它主要用于整合Nginx web服务器,实现通过Nginx直接访问FastDFS存储的文件,极大地提高了文件服务...

    fastdfs-nginx-module_v1.16.tar.gz

    《深入解析fastdfs-nginx-module_v1.16.tar.gz:构建高效文件服务器的利器》 在现代互联网应用中,文件存储与传输是不可或缺的一部分。FastDFS作为一个轻量级、高性能的分布式文件系统,因其简单易用、稳定可靠的...

    fastdfs-nginx-module.zip

    5. **性能优化**:`fastdfs-nginx-module`支持缓存机制,可以在Nginx层面缓存热门文件,减少对FastDFS服务器的请求压力。同时,Nginx自身的异步非阻塞I/O模型也保证了高并发下的优秀性能。 6. **监控与维护**:通过...

    最新版linux fastdfs-nginx-module-1.22.tar.gz

    Linux FastDFS-Nginx-Module 1.22 是一个专为Linux系统设计的高性能、高可用性的文件存储和分发系统,它结合了FastDFS文件服务器和Nginx网络服务器的功能,使得在Web环境中部署文件服务变得更为便捷。这个版本的模块...

    fastdfs-nginx-module-1.20.zip

    本文将详细解析如何将FastDFS的Nginx模块(fastdfs-nginx-module-1.20.zip)安装并配置到Nginx中,实现高效、稳定的服务。 首先,确保你已经安装了FastDFS和Nginx的基础环境。FastDFS提供了数据存储和文件管理的...

    fastdfs-client-javajar1.29-SNAPSHOT.zip

    标题中的"fastdfs-client-javajar1.29-SNAPSHOT.zip"指的是FastDFS客户端Java版的1.29-SNAPSHOT版本的压缩包文件。FastDFS是一个开源的、高性能的分布式文件系统,主要解决大容量存储和负载均衡的问题,尤其适合图片...

    fastdfs-client-java-1.27.zip

    1. **fastdfs-client-java-1.27-SNAPSHOT.jar**:这是FastDFS Java客户端的实现库,包含了所有与FastDFS通信的Java类和方法。开发者可以使用这个库来实现文件的上传、下载、删除等操作。它提供了易于使用的API,使得...

    fastdfs-client-java-1.29.jar

    mvn install:install-file -DgroupId=org.csource -DartifactId=fastdfs-client-java -Dversion=1.29 -Dpackaging=jar -Dfile=fastdfs-client-java-1.29.jar <groupId>org.csource <artifactId>fastdfs-...

Global site tag (gtag.js) - Google Analytics