分布式数据库技术具体难在哪里呢?简单说,要想账头一分钱都不错,数据库要支持事务,事务拥有ACID原则,这四个字母分别代表:A原子性、C一致性、I隔离性、D持久性。
原子性:表示事务中的多个操作要么全部完成,要么全部失败,不会出现中间状态,例如A转给B100块钱,A账户扣除100块的同时,B账户必须增加100块钱。这两件事必须像一个原子一样紧紧抱在一起,决不允许“A已经扣钱,B还没加钱”的事情发生。
一致性:A转给B100块钱,转账完成的一瞬间,A瞬间再查询自己的最新余额,必须显示已经扣除100之后的金额,B必须瞬间查到已经加上100块之后的余额。所有的账目在任何一个时间切面必须完完全全对得上。
隔离性:表示多个并发事务之间不互相影响,A转给B100块钱,不能对C有任何影响。
持久性:表示事务一旦成功就不会丢失,A转给B100块钱,这笔转账一旦完成,就永远生效。
其中一致性是目的,原子性隔离性和持久化是手段,只要做好ACID中的AID,C自然就能满足。
由于数据散落在多台数据库服务器上,库作了拆分。分布式写最大的难度其实就在于保证ACID中的那个A——原子性。
为了保证以上这两种尴尬的局面不发生,OceanBase 1.0采用了整整一组技术,但最主要的是两个。
投票机制
数据库采用“三副本”,也就是任何一个账户,都有一个主咖两个备胎共三份相同的数据。
举例来说:账户A的数据一定同时存在三台机器上。转账时,至少两台机器执行完毕才算转账完成,这意味着,三台机器里有一台坏掉,并不影响转账的执行。同时,三台机器之间相互实时发送“心跳信号”,如果有一台机器挂了,其他两台马上就能感觉到,处理完手头这个交易后,马上向系统发送警报,系统自动为他俩匹配一个新搭档,三台机器继续工作。而换下来那个坏机器,交给技术人员维修,修好后重新上架成为备用机器,等待进入战斗序列。
也就是说,除非两台机器在同年同月同日同分同秒同毫秒坏掉,否则数据库的工作不受影响。

经典集中式数据库往往采用主备同步方案,有两种同步模式:第一种是强同步,每个事务操作都需要强同步到备机才可以应答用户,这种方式能够做到服务器故障不丢数据,但必须停服务,无法保证可用性;另外一种是异步,每个事务操作只需要在主机成功就可以应答用户,这种方式能够做到高可用,但主库和备库之间数据不一致,备库切换为主库之后会丢数据。

强一致和高可用作为数据库最重要的两个特性,在主备同步模式下,鱼和熊掌不可兼得。Paxos是一种基于多数派的分布式投票协议,每个事务需要成功写入超过一半服务器才可以应答用户。俗话说得好,“三个臭皮匠顶过一个诸葛亮”,假设总共有3台服务器,每个事务操作要求至少在2台服务器上成功,无论任何一台服务器发生故障,系统中还有1台包含了全部数据的服务器能够正常工作,从而做到完全不丢数据,并在30秒之内选出新的主库恢复服务,RPO等于0,RTO小于 30秒。所有保证RPO=0的协议都是Paxos协议或者Paxos协议的变种,Raft协议就是其中之一。




