云原生是近几年互联网最热的词了,满嘴云原生,才显得有技术担当,格调高。那么什么是云原生,通俗理解,"生在云上,长在云上,也应用在云上",但是目前为止,没有一个标准的专业定义。综合各家的说法,和水,电做个类比。
1、基础设施云原生,机房,网络,物理机,存储设备等等,这些云计算服务商都是需要考虑的,作为使用方感知不到,也无需关心的,就好像我们使用水,电,从不需要考虑污水处理设备和发电机,这也是云计算基本概念。
2、服务能力的云原生,服务系统部署在云计算上,天生就具有云原生的特征。从用户的角度来看,就是"按需分配,即时即用,按量付费",没有时间,空间,以及资源的限制,需要多少用多少,什么时候想用就可以用,且只有用到的时候才付费,这也和水,电的服务一样。
要达成这个目标,那云原生需要具备以下能力:
围绕这些能力,这些年做了大量的革新,涌现了一批新技术和概念,如微服务,docker,k8s,serviceless,servicemesh等。数据库作为核心的中间件,在云原生时代,也必然有所创新。
我们来研究下近几年涌现的比较热门的云原生数据库,并了解下云原生数据库应具备哪些特点。
TiDB是PingCAP设计和研发的开源分布式云原生数据库,具有水平扩缩容,高可用,实时HTAP,兼容MySQL协议等特点。其整体架构如下:
从架构上看,可以分成如下几个模块:
PolarDB是阿里巴巴自研的新一代云原生数据库,在存储计算分离架构下,利用了软硬件结合的优势,为用户提供具备极致弹性、高性能、海量存储、安全可靠的数据库服务。
Snowflake是一家成立于2012年的创业型公司,2020年上市后市值达到700亿美金,其核心产品就是OLAP的数仓Snowflake,一开始就立志打造一款完全的云原生的Data Clound。
Aurora是Amazon 提供兼容Mysql和PostgreSQL 的关系型数据库,专为云而打造,既具有传统企业数据库的性能和可用性,又具有开源数据库的简单性和成本效益。Amazon在SIGMOD 2017发表了论文《Amazon Aurora: DesignConsiderations for High Throughput Cloud-Native Relational Databases》,其中对于Aurora的架构设计做了较为详细的阐述。Aurora是基于MySQL和InnoDB,并采用计算存储分离架构。
(1)存储层,充分利用AWZ的云的特点,每个段有6个副本,跨3个AZ(每个AZ两个副本),副本之间采用REDO log复制,解析之后生产页面数据,所有存储层保存的是logging日志以及data数据,相关数据保存到ssd盘,并备份到S3。多个副本之间通过Gossip协议可以保障数据的“自愈”能力。
(2)cache层,传统数据库的cache层,即能向上提供读的能力,提升读取速度,又能向下提供写入能力,将脏页刷到磁盘,减少随机IO操作,Amazon认为磁盘IO不是性能瓶颈(网络IO才是),所以消除了脏数据刷出的过程,数据缓冲区的作用只是加载数据供上层使用。
(3)计算节点,计算节点负责SQL解析,优化,以及事务处理等能力,采用一主多从架构,主节点负责数据写入,从节点只读,最多有15个。
我们来小结下云原生数据库的特点。
欲练此功,必先自宫,每家都不约而同采用了该架构,并认为这是云原生和单体架构的核心区别。分离架构的优势,不言而喻,比如避免了计算和存储一起扩缩容的成本代价,实现了真正意义上的弹性;资源调度更好的与云计算相关工具统一协同,实现计算容器化,存储云化。
但是劣势也是很明显,主要体现在实现技术难度上,分离情况下,磁盘I/O就转化成了网络I/O,如何保证低延迟;OLTP场景下,事务的ACID特性如何保证;故障场景下,如何快速恢复等等,都是必须要解决的问题。
大数据时代,分布式是其核心场景,那么有一统OLTP,OLAP强烈意愿的云原生数据库,分布式也是必然选择,同时这也是符合云计算的理念的。在多个节点的情况下,通过管理和调度,将流量和数据均摊到每个节点,减少由于业务不均衡带来的节点压力;同时,分布式架构也能更好的支持扩缩容。
(3)多副本
多副本确保了系统的高可用和数据的一致性,在故障的情况下,能快速恢复。在单体架构下,也存在从库和备库,但是这与云原生数据库的多副本有根本的区别。云原生数据库是在计算和存储分离的情况下,多副本依赖的底层存储层能力实现,包括数据的同步和一致性。
实际上,这几年MySQL在云原生时代并没有太多的动作,按部就班,貌似事不关己,高高挂起。我想MySQL并不是不想改变,而是有着难言之隐。主要有以下几点:
1、技术上还不成熟,当下云原生的基石是docker+k8s,一开始就是为无状态业务设计,并不擅长处理有状态业务。
2、云环境的多样性,云原生是要求生在云上,长在云上,与云环境的完美融合。目前的云提供商太多,仅头部的就有谷歌,亚马逊,微软,阿里,每家的技术实现差别很大,比如存储。MySQL要能兼容这些云环境,工作量和技术难度都很大。现在更多的是反向操作,每家云提供商积极推出云原生数据库产品,同时兼容MySQL协议。
3、历史包袱重,MySQL基本都用来存储核心数据,比如用户,订单,账单等,架构上,如果没有重大缺陷,一般不能轻易变动,而且也不见得有用户愿意为新架构买单,毕竟稳定压倒一切。
那是不是MySQL在云原生时代就没有任何作为了呢?那倒也不是,我觉得有两个发展途径:
1、大量云原生数据库的的技术反哺,大量云原生数据库涌现并如火如荼的发展,短期内会对MySQL造成了冲击。但是反过来思考,这些云原生数据库何尝不是在做技术探索呢,当技术积累到一定程度,而且用户习惯也养成后,采用拿来主义,一切都会水到渠成,毕竟目前这些云原生数据库都是宣称兼容MySQL协议。
2、基于K8S+Docker的生态尝试,不擅长不代表不可以,现在很多大厂就尝试了MySQL的容器化改造,也有很多较为成熟的方案,比如将存储分离,使用本地存储或者分布式块存储,而计算节点装载到pod,统一调度。但这些方案都有使用环境的限制,比如为了降低延迟,以及满足网络I/O要求,计算和存储节点必须在同一VPC内。
云原生时代,我们即要积极拥抱变化,关注技术的发展趋势,同时也要冷静思考,这些技术会不会对我们的业务有帮助,在当下现实环境下,技术从来都是为业务服务的,毕竟大多数企业要靠业务活着,而不是技术。
可喜的是,数据库技术作为软件行业三座大山之一(操作系统,数据库,编译器),这些年以PolarDB,TiDB等数据库为代表,国内的大厂在技术上实现了很多突破,Oracle已成为过去式。在云原生时代,我们能否实现数据库技术的弯道超车呢,非常值得期待。
云原生时代的MySQL何处何从,答案就留给未来。
附:
深入理解MySQL原理之一--如何提升查询SQL的性能
深入理解MySQL原理之二--如何建立高效索引
深入理解MySQL原理之三--如何实现事务与分库分表
深入理解MySQL原理之四--如何实现高可用
深入理解MySQL原理之五--如何高效利用InnoDB存储引擎
深入理解MySQL原理之六--核心算法有哪些
深入理解MySQL原理之七--云原生时代将何去何从