前言:中国人民大学常被誉为是“中国人文社会科学的高学府”,其实人民大学也是“中国数据库的发源地”。由中国人民大学教授萨师煊与王珊合作编写的《数据库系统概论》是国内部系统阐明数据库原理、技术和理论的教材,也被公认为是国内数据库领域的经典权威教材。
近期,蚂蚁金服研究员、OceanBase团队创始人阳振坤受邀在人民大学分享了分布式关系数据库OceanBase如何登顶国际TPC-C benchmark排行榜,并对这一突破背后的技术创新进行了深入的解析。
数据库:技术和市场的“死亡之谷”
数据库的概念早源自上个世纪60年代。到了70年代,关系模型已经诞生。80年代关系数据库逐渐成为整个社会的信息基础设施。2000年伊始,随着互联网的发展,业务系统对数据库的需求发生了很大的变化。在过去,传统的数据库并发访问量从几百到几千。进入互联网时代后,并发访问量骤增,达到百万至千万的级别。越来越多的公司发现根据现有的并发量和数据量,不仅他们买不起传统商业数据库,而且传统商业数据库也无法容纳和处理他们的数据量和访问量。
从2006年开始,大量新的非关系型数据库如雨后春笋般涌出,在整个数据库行业掀起了一场空前盛大的NoSQL革命。早在 2006年,Google Bigtable发表,随后HBase,HyperTable,MongoDB,Redis相继问世。火热发展的云计算带来了对更大规模数据库的需求。过去的业务大多类似商场开业,从选址、装修到IT设备的采购,至少需要一个季度甚至半年时间。如今业务部门从采购到上线,时间缩短至数小时,甚至很多业务要求像租用云计算服务一样,能够即拿即用。
云计算改变了已有模式,这时候传统关系数据库的缺点也进一步凸显:不能水平扩展、容量小、处理能力不够、成本又非常高。甚至很多人断言,关系数据库正在走向末路,然而时至今日,关系数据库依然是整个社会的信息基础设施,承载着整个社会重要程度高、访问量大的数据。
关系数据库从诞生起已经有几十年的时间了,但基本上它的市场格局没有太大的变化。早的几家霸主直至今天依然占据着统治地位。关系数据库虽然很重要,但是它在整个IT系统的成本里却并占据非常大的比例。关系数据库处在整个产品或者产业链底层的位置,替换风险很大,迁移的成本很高,因此非常难以被替换。这就导致了数据库变成了一个门槛极高、强者恒强的领域,后来者很难居上。
谈到关系数据库,准确地说用于在线交易处理的关系数据库,在我看来这是所有软件中难的。首先一个重要的难点在于它需要支持数据库事务即ACID,其次在于SQL优化器,这两点就占据了数据库中很大部分的工作量。同时,在线交易处理关系数据库的技术门槛也非常高,我们常说有三个“要”:1)既要:数据一条不能错;2)又要:服务片刻不能停;3)还要:交易处理高并发。基于如此高的技术门槛,这也意味着在线交易处理数据库注定是一个非常艰难的领域。
前有先行者挡道、后有NoSQL追赶,在大部分人看来,很多人都觉得这不是做自研关系数据库的好时机。但仔细分析后,会发现这是个千载难逢的好机会。
天时地利人和铸就OceanBase开创性的革新
2010年加入阿里巴巴后,当时很多人都看到单机数据库已经走到了尽头,我想如果能将分布式的核心理论揉到数据库里,解决单机数据库的水平扩展问题,对当时整个互联网的基础设施乃至整个社会的信息基础设施都会是一个非常好的机会。我当时找了几个同学想要一起做这件事,跟我一样,这几个同学都有分布式背景。尽管研制关系数据库充满了挑战,但我们得到了千载难逢的天时地利与人和的机遇。
“天时”是互联网的爆发式增长对数据库的高并发、大数据量提出了很高的需求,而传统关系数据库难以满足这个需求;“地利”是阿里巴巴内部从淘宝到支付宝拥有大量使用数据库的场景,OceanBase可以从不是特别关键的应用场景开始尝试,一步步地将数据库做到关键系统;“人和”是当时单机数据库已经走到了尽头,下一步一定是走向分布式,而当时团队成员大多是分布式技术背景,做的就是自己擅长的工作。
2010年6月25号OceanBase项目正式立项。项目创立之初,我们给自己定了两个小目标:是硬件性价比做到Oracle的十倍,第二是做到可水平扩展,因为这是OceanBase的根基。
传统数据库常常被人诟病,因为它有两个本质的缺陷:首先是传统的OLTP数据库不能水平扩展。由于不能水平扩展,机器只能越做越大,价格甚至几何级数的增长。
第二就是主库备库的数据不一致。主备镜像无法做到数据可用性跟一致性两全:主库备库的完全一致意味着每一笔事务都得从主库同步到备库,备库确认后才能应答。假如这中间网络出现问题,或者备库出现问题,所有的同步都会被堵塞,也就是所有的写操作都无法进行。因此主库一旦出问题,数据是有损的,所以企业只能买可靠的设备,从四个九到五个九,就是为了让这些机器不出一点问题,可想而知这样的设备肯定便宜不了。不论是软件还是硬件都便宜不了,服务自然也便宜不了,这就导致数据库成本非常高。
如果分布式数据库是一条康庄大道,这条路可能早就被无数人踏过。分布式OLTP数据库其实是一条非常难走的路,因为分布式数据库的一个核心问题就是单机故障会引起整库故障。随着机器规模的增大,机群故障率会指数级的提高。由于主备镜像无法做到数据可用性跟一致性两全,因此无法采用主备镜像或类似手段解决分布式数据库的节点故障的问题。 对于银行和企业的业务来说,可用性跟一致性是一个生死两难的问题,要保证同步,就面临着业务不可用的风险。所以银行往往会购买可靠性更高的存储和服务器等硬件。可靠性高的硬件自然价钱也非常高昂。因为分布式里每一个节点在任何时刻都可能会故障,不管这个节点本身的可靠性有多高,它都有故障的可能性。一直以来,我们工作的重点之一,就是围绕如何提升分布式整体的可用性。如果解决了这个问题,不再需要高可靠的硬件,也不用在意主备库是否一致和水平扩展的问题,很多问题都能引刃而解。
所以OceanBase采用了Paxos分布式一致性协议,它也是OceanBase整个分布式数据库里核心的基础之一。它本质上解决的一个问题就是用不可靠的成员来提供可靠的服务。也就是哪怕单个节点不可靠,只要大部分节点正常工作时这个系统就能正常工作。传统数据库中五个九的设备非常昂贵,OceanBase则基于普通的PC服务器,且不要求设备有很高的可靠性,只要两个九到三个九,整个系统就能够工作得很好,这一创新的技术突破大大提升了性价比。
那么,OceanBase是如何用Paxos协议来做成这件事?我们前面简单分析过,不可能既保证高可用,又保证主备库完全一致,因为这两个需求是矛盾的。然而Paxos协议却提供了一个迂回的解决方案,即多数派。举例说明,主库中的每一条日志会同步给两个备库,只要有一个备库收到,就能达成一个多数派协议。简而言之就是三者中有两个同意,少数服从多数,就认为这件事情成功了。那么这种情况下,任何一个节点坏掉,刚才的这笔事务也至少会在剩下两个节点中的其中一个节点有。所以哪怕是主库故障了,那么两个备库会互相握手,相互把缺失的数据快速补齐。恢复时间OceanBase通常不会超过30秒。