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