Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4065986
  • 博文数量: 251
  • 博客积分: 11197
  • 博客等级: 上将
  • 技术积分: 6862
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-05 14:41
个人简介

@HUST张友东 work@taobao zyd_com@126.com

文章分类

全部博文(251)

文章存档

2014年(10)

2013年(20)

2012年(22)

2011年(74)

2010年(98)

2009年(27)

分类: 大数据

2013-06-05 20:27:44


TFS集群支持异地机房容灾,一个逻辑集群包含分布在多个机房的物理集群,其中一个物理集群是主,其他的物理集群是备。客户端写数据时会先写到主集群,主集群的Dataserver异步将数据同步到多个备集群;客户端在读取数据时,会选择离自己最近的物理集群读取数据,如果读不到数据,就重试逻辑集群里的其他物理集群。

对集群同步的期望

  • 所有的文件都能被同步到备集群
  • 文件尽快同步到备集群
  • 文件尽量从DS本地同步到备集群
  • 文件在多个集群中保持一致

同步实施方案

  • 写文件时,master DS会记录同步日志(binlog),DS 后台线程不断重放日志,将文件同步到备集群,同步日志记录在DS本地系统盘。日志本身是不可靠的存储,可能出现同步日志丢失的情况,每天夜间对整个集群会有一次定期的增量同步,以确保所有的文件都写到备集群。
  • 由于文件数据通常很大,所以不能像mysql那样,能把所有的数据都记录在binlog,binlog里只包含文件的blockid、fileid等信息,而不包含文件的实际数据,重放日志时,DS先尝试从本地读取文件,并写到备集群;block可能在同步前被迁移到其他DS上,故如果本地读取不到,需要通过网络尝试读取其他副本来同步数据。
  • 为每个集群单独维护一份同步日志,避免多个备集群上的同步相互影响。如果某个文件同步失败,为了让其后续写的文件同步不受影响,将同步失败的文件加入到错误队列,每隔一段时间重试一下错误队列里的文件,直到成功为止。在备集群升级的过程中,同步的失败率的文件会比较多,由于备集群恢复的时间点不确定,如果刚开始就一直重试,会导致后续的文件也堵住了;另外,除文件在主集群上丢失(block丢失,文件被删并且被压缩等)这种特殊情况外,同步最终一定是能成功的,故错误队列里的文件将不断被重试,直到成功。
  • 由于内部的特殊需求,TFS提供隐藏文件的接口(隐藏了,文件读不到,但其空间不会被回收掉,规则是隐藏的文件可以删除、但删除的文件不能被隐藏,隐藏和删除操作都是给文件设置一个特殊的状态标记),实际运行过程中经常出现文件在多个集群状态不一致的情况,为此,对于内部同步,采用单独的协议,可以强制在写(更新、删除、隐藏)文件时将文件在源集群的状态标记直接应用到备集群,以保证文件在多个集群里处于一致的状态。
阅读(6302) | 评论(0) | 转发(1) |
1

上一篇:fsync性能问题

下一篇:分布式工程经验

给主人留下些什么吧!~~