背景
    随着工作的推进,4月份我们会开始在公司海外的两个IDC中部署一套很重要的应用系统(又要拿奖了喔,哈哈...)。各方面的准备都已经就绪,但唯有一个问题,我们思考了很久。。在这套基于全球架构的系统当中,由于牵扯到一些特殊的需求,所以对数据状态的反馈要求非常高。。尽管前期海外IDC的基础网络架构已经设计得非常好,但我们毕竟不是老盖的公司,没有那么多钱到处拉T1的线路。。全球三个IDC仅仅通过法国电信运营商Orange公司的MPLS网络,实现了512K的物理链路带宽,加上服务商承诺的加速器,差不多也就1M多一点点。。当然,Orange的MPLS有一个很大的好处,就是能够把全球三个IDC连接成一个内部网络,而不需要通过走互联网的方式进行连接。。但是在相当低速的网络中,需要实现几乎实时的数据同步,还是相当困难的。。
 
思考
    为了解决这个问题我考虑过很多方案。第一个想到的是群集,第二个想到的是数据库镜像,还有负载均衡和数据库复制,也考虑过第三方产品。然后仔细分析了一下这几种方式的关键点,发现基本上都不太适用。考虑如下。
    群集——准确应该叫故障转移,需要共享存储,在WinSrv08中可以搭建非共享存储环境的故障转移。
        第一,如果搭建非共享存储的环境,那就没有意义了。因为我们需要的就是数据同步。
        第二,如果能够实现存储级的异地同步,那我们就没必要费那么大劲去做异地群集了,直接用异地存储进行数据库文件级别同步了。
        第三,即使能够以各种方式实现故障转移群集,也没用。由于群集节点中永远都有一个节点处于待机状态,是不接受服务响应的。所以这个节点放到哪个IDC,都会导致那个IDC所应该负责的用户,会将服务请求发回到中国。这是可怕的...
        所以群集方案,否决。其实理由还有很多,也不知道怎么就会第一个想到它的。。哎,估计是受MS忽悠太多。。
    数据库镜像——库级别的冗余功能,通过事务复制的方式将写入的数据同时写入到另外的镜像中。仔细研究其工作原理以后,发现问题
        第一,数据库镜像主要应用场景类似群集,是提高数据库服务的高可用性,而非偏重于性能。
        第二,数据虽然是在同时间写入两个数据库,但是实际上是有一个主备关系,某种层面说,实际上数据是单向。我们的要求是,三个SQL数据库提供的是同一套应用系统,不过面向的是三个不同的地区。收到的数据应该是不一样的,所以三个点都需要能够写入,并且同步来自其他节点的数据。
        第三,还有像需要搭建见证数据库等等其他问题,就无需多考虑了。数据库镜像方案,也否决。
    负载均衡——简称NLB,查了SQL文档以后发现,居然不支持。。不要笑,我以前没怎么搞SQL的。。而且这次上来就是SQL2008。。
    数据库复制——发现唯独这个方案还有点可行性。后来详细研究了一下,最终决定使用数据库复制这个方案了。当然,其过程也不是那么顺利的,后面慢慢说。。
    第三方产品——看了几个,一是考虑到咱穷,二是觉得,如果咱自己能够不花钱做出来,不是更有成就感么。。。哈哈。。
 
测试、选型
    仔细看了有关数据库复制的所有文档,当然也免不了问些兄弟。在此,向曾经的坑友,也是SQL方面的MVP,崔老板,说一声:谢谢了!
    在没问崔老板之前,把文档基本都看了一遍,但是没敢下手做。因为之前本来就对SQL不怎么熟悉,而且查了查网上的资料,都是一些很简单的需求。没有我现在碰到的要求和限制。所以网上基本上就是做个快照复制、合并复制之类的就OK了。。谈到这里,就又涉及到数据库复制的几种类别了。。继续依次分析。
    快照复制——适合在数据更改量很大,但很少发生更改时,且一般复制时间比较长。。不适用,我们需要几乎实时的数据同步。
    事务复制——使用发布和订阅的机制,将建立复制机制时的数据作为快照,将后续的所发生改变的增量数据从发布者传送到订阅者。默认情况订阅者是只读数据,但经过配置可以实现双向数据同步。。这个还比较靠谱。。
    合并复制——允许多个订阅在不同时间更新同一数据,咋一看好像就是我要的。但仔细研究以后发现,合并复制是适用于离线作业以后的数据同步。
    经过考虑以后,还是决定在事务复制上做些研究。不过由于才疏学浅,怎么都没想明白怎么搞。
因为开始的时候,我是考虑将每个节点的SQL都做一个发布,同时做其他两个点的订阅,等于就是三套发布和订阅。后来发现,针对某一个数据表,只能做一套发布和订阅,也就是说它要么是发布要么是订阅。又来研究了一下可更新的订阅,结果发现三个节点的没法做,太乱了。。
 
解决方案
    实在走头无路的情况下,给崔老板挂了一个电话,经他指点(一般我习惯只问个How,而不会问How to do,因为每个人的do都不一样,也不一定对),还有一种叫做点对点的事务复制。。回头仔细把联机丛书看了三遍,没发现有这么一个东西。。靠。。也不知道MS这丛书怎么写的。。最后多方搜索,在微软Library的犄角旮旯里面翻到这篇文档—— 《Peer-to-Peer Transactional Replication》
    扫了一眼,仅仅看到那几张示意图之后,就感觉前途一片光明,简直是得来全不费工夫啊。。。
 

    照着文档简单配了一下,,OK。。测试结果,同步时间仅仅5秒。。完全在可接受范围内。。而且可以实现三个SQL节点向各自的同一数据表写入不同数据,然后进行同步。。
    当然,等4月份海外服务器到位以后,还需要设计一套详尽的测试用例,进行详细的测试,特别是性能和可靠性,但感觉应该问题不大。
    特来此地炫耀一番...嚯嚯...