推荐给好友 上一篇 | 下一篇

镜像管理:保持怎样的同步(sync)频度

CollabNet的一个客户最近发布了这样一个问题:

我们为CollabNet主持的多个Subversion版本库设置了镜像,我有一个关于同步频率的问题,保持怎样的同步频率?在一些小的修改就同步还是在一些大的修改完成时再同步?

结果是我确实曾经考虑这个问题,Subversion的动态镜像管理非常有趣,所以这给了我机会来润色我的一些思考,因为这个客户的Subversion开发场景并不独特,所以您也能够从我的回复里得到益处。

我的回复是:

这是一个有趣的问题,我最近曾经认真思考过。如果你希望“每X分钟同步一次”之类的回答,那你不会满意的,答案需要你平衡镜像的作用和维护他们所经受的复杂度之间的关系。

让我们从最原始的同步方法开始,你每过几分钟同步一次。依赖于你如何使用镜像,精确的分钟可能会变化。如果是简单的夜间备份,60 x 24 = 1440分钟足够好,但是如果镜像会作为开发者使用的快速变化的代码基时,这就不够了。你也许需要每20,5或1分钟同步一次。当然你不希望因为太频繁的 同步影响服务器的性能(发起拒绝服务攻击(DoS)并不明智),但是尝试已经同步过的镜像的代价并不是那么大。

现在,如果版本变更数据是同步任务唯一维护的数据,选择svnsync sync会和上面一样简单。不幸的是,也有一些未版本化的属性也需要关注,因为当你同步Subversion版本库的时候,Subversion不会记录 你所做的事情,完整的Subversion版本库同步变得复杂起来。假如你在master版本库有100个修订版本,你保持了镜像的同步。之后,一个开发 者修改了修订版本50的日志信息,svnsync不会识别出发生的百年更,以后的svnsync sync只会同步修订版本的增加(r101或后面的),但是r50的日志在镜像中已经不同了。svnsync copy-revprops子命令可以弥补这个问题,但是你需要告诉这个子命令一些关于对于那个版本操作的信息。

所以修订版本同步增加了复杂性。大多数时候,开发者可以快速的识别日志信息的错误,并在提交后迅速修正这个问题,只要他们能在同步工作同步这个修订 版本之前执行修正,对镜像来说毫无问题。所以这让我们不要频繁的执行同步(只要修正发生在之前),但是多长是足够的呢?但是如果修改的日志信息是几个月以 前的修订时怎么办?这个问题需要根据镜像的目的来回答,在你的情况下,修订版本属性是否不同步是否很重要?也许不是,也许很久以前的修订版本属性不同步没 有关系。可能在你的情况下,是每10分钟的一个修订版本同步和一个每夜的全修订版本同步。

(我承诺过的,我会提供更多的答案。)

依我看来,最好的方法是多方面的,实时的事件驱动的触发器和预定的以防万一的同步工作。

第一部分的情况是,除非在master版本库和镜像之间发生通讯错误,都会尽可能保持同步。理想情况下,你的主版本库可以推出修改到镜像,或至少能 够推出变更的通知。例如,你的主版本库可能有post-commit和post-revprop-change钩子来运行svnsync 来直接同步镜像,如果由于防火墙或安全的原因这样做不到,,那么或许可以让post-commit 和post-revprop-change钩子至少发送变更的通知邮件,镜像主机有一些自动化的方法可以发现这些邮件并触发相关的sync任务,一个提交 邮件触发svnsync sync;,一个属性变更邮件触发修订版本的svnsync copy-revprops。

另一方面覆盖了万一的情况。如果镜像主机为能够获得提示邮件?或如果sync工作遭遇网络问题?为此,你或许需要一些有规律的计划任务,会尝试svnsync sync(可能没有同步的东西,因为事件驱动的属性同步工作正常),然后svnsync copy-revprops跨越多个修订版本(通常会重写相同的属性,因为同样的原因),当然需要避免的是防止svnsync任务对同一个版本库的资源争用。

也许不是完全的有指导意义,我希望你能够有足够的信息来决定如何实现最适合你的工作。
 

 About the Author

C. Michael (Mike) Pilato has been on the Subversion project as a committer since 2000. Mike is one of the co-authors of “Version Control with Subversion” and he is on the board of the non-profit Subversion Corporation.

Permalink




TAG: 管理 频度 sync 镜像
 

评分:0

我来说两句