3.1.1 主动容灾技术
这里有一点要指出的是,主动容灾只能在理想状态下才能达到,而在实际中是很难实现的。因为,要达到主动容灾,所有参与容灾的节点(计算机服务器或任何其它涉及到的服务器)必须达到所谓的合意性(Consensus)。合意性指的是所有节点对全域状态(系统整体状态)的判断一致。这不光是指数据的终结状态一致,而且到达这个状态的前缀序列状态也要一致。这个和数据一致性有区别。数据一致性要求每个节点对同一数据的拷贝应该是一样的。但到达这个一样的前续过程不一定要完全一样。
而要保持分布不同地方的节点的合意性是很难达到的。要明白这个道理,我们先讲一个在分布式系统里经常引用的故事。传说在拜占庭时代,有两支拜占庭军队将一支敌军部队围困在一个山凹里。拜占庭两支军队分占两个山头,分别由两个不同的指挥官指挥。两支拜占庭军队合起来比敌军强大,但分开来则不如敌军强大。如果这两个拜占庭军队的将军能够协同起来,同时对敌军发起攻击,则能取得完胜。如果单独一只拜占庭军队发起攻击,则该拜占庭军队将遭到毁灭性打击。现在的问题是,这两支拜占庭军队没有现代的电话、电报和无线电通讯手段,而因为相距遥远,也不能通过手语或其它肢体动作来协同。唯一的办法是通过信使来传递消息。一个将军如果决定了一个攻击时刻,则需要派信使到另一支拜占庭军队的营地通报这一决定。问题是,信使必须通过山下敌军的大营才能到达另一支军队的营地。而通过敌军营地是有危险的。信使可能被敌军俘获、杀掉。
问,在这种情况下,这两支拜占庭军队能够协同一个时间来攻击敌人吗?答案是不能。假定A将军决定在明天凌晨6点发起攻击,于是派一个信使带上此消息上路前往另一营地。现在问,到了明天6点,A将军是否真的敢发起攻击呢?他能确信另一个营地的B将军确实获得了他派人送去的信息吗?显然不能确定。事实上,无论信使往返多少回,都无法让A、B两支拜占庭军队有100%的把握取得一致。
现在我们已经知道,在通讯链路不可靠的情况下,通讯双方是不能达到合意性。推演到计算机世界,即是分布在不同地方由网络链接的计算机之间在网络不可靠的情况下,是不能达到合意性的。而我们正在讨论的主动容灾中需要达到的合意性就是在通过通讯线路连接的两个或多个容灾节点之间取得完全一致。而我们通过拜占庭军队的故事已经看到在不可靠通讯链接下是不能达到的。问题是,很多人会说我们现在的网络不是很可靠吗?TCP不就是一个可靠的传输协议吗?答案是,网络是不可靠的。也许现在的网络很可靠,但不是绝对可靠的,或者说不是100%可靠。因此,合意性是不能100%肯定的。
以上所述说明了主动容灾存在的困难。但我们能否将要求放低一些呢,即不要求时时刻刻都保持合意性呢?如果将要求降低,例如如果我们只要求合意性被保持在某个概率之上即可?这样的话,主动容灾就有可能实现。只不过这已经是打了折扣的主动容灾了。即使打了折扣,主动容灾还存在另一个困难,就是对硬件和通讯连接的要求非常高,由此而造成成本高昂。