与搞不清核污染水排放的问题类似,在数据安全领域有些时候也是很难搞清楚的。因为绝对的可用性是不存在的,现实世界中的数据库安全是投资与可用性之间的游戏。单一数据库存在单点故障,那么主备机同时故障的可能性就不存在了吗?当然存在,只是概率低了一点而已。我在十多年前就遇到过客户主数据库、ADG备库、磁带备份三大保障措施同时失效的悲剧,这种低概率事件落到你头上就是100%。二十多年前我和一个银行的主管交流数据库可用性的时候,他说他们为了确保可用性,主备机不能使用同一批次的小型机,同一个磁盘组里的磁盘不能使用同一批次生产的磁盘。我问他为什么,他说他们曾经出过一次故障,是因为一个批次购买的几台小型机中同时有3台在同一天里出现了内存故障,不幸的是,其中两台是核心数据库服务器,当时使用HACMP高可用切换,切换时HANG死了,核心交易停了几个小时,事后就有了这个规定。
分布式数据库自身具有高可用机制,比如Oceanbase在一些金融行业应用时是采用5副本机制的,一种典型的配置是2副本在主机房,2副本在备机房,第五副本在第三机房。这样的配置,在绝大多数情况下出现故障,都可以快速的通过切换来保证业务系统的正常运行。不过有没有可能存在2个机房同时故障甚至三个机房同时故障的可能性呢?虽然这种可能性存在,但是几率很小。那么基于这个原则,使用分布式数据库之后就不需要备机了吗?好像也没有那么简单,按照金融机构的安全要求,两地三中心、主备机高可用切换,这是监管要求。虽然这个监管要求出台是在集中式数据库大行其道的时候颁布的,但是只要一天不修改条款,金融机构就必须严格的遵守。双倍的可靠性更加安全也是十分肯定的,因此只要手头的银子够,给分布式数据库搞个备机也不是不可能的。
还有一个需要考虑的因素是,分布式数据库本身会不会出问题。相信分布式数据库的高可用还要看数据库本身有没有问题。就像以前我们通过extended RAC来做同城双活一样,这套双机房四节点部署的extended RAC系统,哪怕增加了第三机房的第五块投票盘,也不能确保任何时候都不出问题,一旦整个集群出问题了,那么数据库就挂了。因此能做得起extended RAC的用户我们都会让用户再上一个ADG,一旦整个RAC出问题了,ADG还可以接管大部分核心业务。实际上分布式数据库的可靠性也不会比Oracle RAC高多少,也会出现整个数据库出问题的可能性。因此哪怕监管没有需求,对于银行账务这样的核心系统,做个备机也是十分必要的,金融账务安全,哪怕再小心都还是值得的。
对于绝大多数用户来说,给RAC,分布式数据库做一个备机,能用上的概率都是极小的,我参与过的一些基于extended RAC的双活项目,从来没有发生过主数据库故障必须切换到ADG的情况。不过extended RAC故障,没有备机,导致业务中断的案例还是听说过几次的。要不要建备机与风险和投入的比例关系有关,这是一个政治问题,不是技术问题。从技术底线上说,备机肯定更安全,不过也更花钱。谁要是和我说分布式数据库不需要备机,那我也只能说你自己觉得就行,天底下没有三十年不漏的砖瓦房,数据库也是人一行行代码写出来的,哪怕是有了备机,也无法保证100%不出问题,只要是出了问题你能扛得住就行。