@HUST张友东 work@taobao zyd_com@126.com
分类: 服务器与存储
2012-05-08 22:18:39
集群数据对比功能的添加对TFS DS做了修改,在把DS上到日常测试环境前对其进行了一次回归测试,测试用例都通过,但checkserver检查到有大量block未同步到辅集群,查看dataserver的日志发现同步队列已经阻塞住了,一直重复retry。
主备集群的数据同步是由主集群的DS在后台进行,其将成功的写、删等操作记录在本地日志,并启动后台线程将日志重放到备集群,DS没重放一条日志,如果失败会一直重试,这个重试会阻塞同步队列。理论上在主集群上能成功的操作序列,在辅集群上也能成功,但偶尔也会有一些特殊情况会导致同步一直不成功,从而阻塞同步队列,这时就需要进行人工干预,疏通同步队列。
分析主集群上DS的日志发现,DS阻塞在一个隐藏文件的操作上,往前看DS的日志,发现前面有写、读、删除等记录,综合分析得出如下结论:
同步写文件操作时,因为文件的删除标记,导致同步过程读不到源文件信息,则认为不需要同步了,并认为写文件同步成功。 此时,写文件的操作没有被同步到备集群。
接下来,同步线程同步隐藏操作,因为备集群上没有该文件,同步隐藏操作将失败,此时,会先把文件同步到备集群上去再隐藏,这里同步的效果跟上面同步写的过程是一样的,结果是写文件的操作没有被同步到备集群,并且认为同步成功了。接下来的隐藏操作仍会失败,因为文件并没有同步到备集群,这时返回错误,同步线程会重试,重复上述过程,从而阻塞同步队列。(问题主要出现在对同步隐藏操作的处理上.. 隐藏失败,并且结果为文件不存在,因直接忽略,返回成功,详细分析见解决方案)。
由于同步是异步进行的,如何能保证异步重放能和在主上一样成功,考虑文件可能被隐藏,可以在同步读时加强制标记。同时,文件可能被删除,删除后可能被压缩掉,这样就不能保证主上的序列一定能在备上重放成功。
日志同步的解决方案