Native的分布式数据库架构与实践

W020170419607825911257

黄东旭:大家好,今天我的题目是Cloud-Native与分布式数据库的实践,我先简单的介绍一下自己,我是PingCAP的联合创始人和CTO,过去一直都是做基础软件领域的工程师,基本上做的所有的东西都是开源,其实在整个分享之前我想说一下为什么现在各行各业或者整个技术软件社区一直在重复的再造数据库或者现在数据库到底怎么了,为什么这么百花齐放?因为随着整个业务的多种多样还有不管是传统行业还是互联网行业,业务的迭代速度越来越互联网化,使得整个数据量其实是一直在往上走的,第二就是随着IOT的设备还有包括像手机、移动互联网蓬勃的发展,终端其实也不仅仅是传统的PC客户端的数据的接入,第三方面随着现在AI或者大数据分析一些模型或者理论上的突破,使得在大数据上进行计算的手段越来越多样,还有在物理上一些硬件的新的带有保护的内存,各种各样新的物理的设备包括我正在做的,越来越多的硬件或者物理上的存储成本持续的降低,使得我们的数据库需要要面对更多的挑战。关联数据库理论是上世纪七十年代做出来的东西,现在四十年过去不管是物理的环境还是计算模型都是完全不一样的阶段,还抱着过去这种观念可能并不是一个面向未来的设计,而且今天我的题目是Cloud-Native,有一个比较大胆的假设,大家在过去三十年的计算平台基本都是在一台PC或者一个服务器或者一个手机这样的独立的计算平台,但是未来我觉得一切的服务都应该是分布式的,因为我觉得摩尔定律已经失效了,所以未来的操作系统会是一个大规模分布式的操作系统,在上面跑的任何的进程任何的服务都应该是分布式的,在这个假设下怎么去做设计,云其实是这个假设最好的载体,怎么在这个假设上去设计面向云的技术软件,其实是最近我一直在思考的一个问题。其实在这个时代包括面向云的软件,对业务开发来说尽量还是不要太多的改变过去的开发习惯。你看最近大数据的发展趋势,从最传统的关系数据库到过去十年相比,整个改变了用户的编程模型,但是改变到底是好的还是不好的,我个人觉得其实并不是太好,最近这两年大家会看到整个学术圈各种各样的论文都在回归,包括DB新时代的软件都会把扩展性和分布式放在第一个要素。

大家可能听到主题会有点蒙,叫Cloud-Native,Cloud-Native是什么?其实很早的过去也不是没有人做过这种分布式系统的尝试,最早是IBM提出面向服务的软件架构设计,最近热门的SOA、Micro Service把自己的服务拆分成小的服务,到现在谷歌一直对外输出一个观点就是Cloud-Native,就是未来大家的业务看上去的分布式会变成一个更加透明的概念,就是你怎么让分布式的复杂性消失在云的基础设施后,这是Cloud-Native更加关心的事情。

W020170421728270990519

这个图是CNCF的一个基金会,也是谷歌支持的基金会上扒过来的图,这里面有一个简单的定义,就是SCALE作为一等公民,面向Cloud-Native的业务必须是弹性伸缩的,不仅能伸也得能缩,第二就是在对于这种Cloud-Native业务来说是面向Micro service友好,第三就是部署更加的去人工化,最近可能也看到很多各种各样容器化的方案,背后代表的意义是什么?就是整个运维和部署脱离人工,大家可以想象过去十几二十年来,一直以来运维的手段是什么样的,我找了一个运维,去买服务器,买服务器装系统,在上面部署业务,但是现在Cloud-Native出现变得非常的自动化,就相当于把人的功能变得更低,这是很有意义的,因为理想中的世界或者未来的世界应该怎么样,一个业务可能会有成百上千的物理节点,如果是人工的去做运维和部署是根本不可能做得到的,所以其实构建整个Cloud-Native的基础设施的两个条件,第一个就是存储本身的云化,第二就是运维要和部署的方式必须是云化的,我就从这两个点说一下我们 TiDB 在上面的一些工作和一些我的思考。

存储本身的云化有几个基本条件,大家过去认为是高可用,主要停留在双活,其实仔细去思考的话,主备的方案是很难保证数据在完全不需要人工的介入情况下数据的一致性可用性的,所以大家会发现最近这几年出来的分布式存储系统的可用性的协议跟复制协议基本都会用类似Raft/Paxos基于选取的一致性算法,不会像过去做这种老的复制的方案。第二就是整个分片的策略,作为分布式系统数据一定是会分片的,数据分片是来做分布式存储唯一的思路,自动分片一定会取代传统的人工分片来去支撑业务,比如传统分片,当你的数据量越来越大,你只能做分库分表或者用中间件,不管你分库分表还是中间件都必须制订自己人工的分辨规则,但是其实在一个真正面向Cloud的数据库设计里,任何一种人的介入的东西都是不对的。第三,接入层的去状态化,因为你需要面对Cloud-Native做设计,你的接入层就不能带有状态,你可以相当于是前端的接入层是一层无状态的或者连接到任何一个服务的接入的入口,对你来说应该都是一样的,就是说你不能整个系统因为一个关键组件的损坏或者说磁盘坏掉或者机器的宕机,整个系统就不能服务了,整个测试系统应该具有自我愈合和自我维护的能力。