总结一下对关系型数据库变化粗浅的认识。
前言
第一次知道数据库,是在大学时的数据库课程,那个时候的数据库特指关系型数据库。到后面工作后,才知道除了MySQL
,Oralce
这类关系数据库之外,还有NoSQL。
印象中,当时NoSQL
由于优秀的性能和扩展性,发展迅速。但技术并非一成不变,二者可以相互借鉴。
待NoSQL
潮水褪去,NewSQL
出现,就像是是NoSQL
和SQL
在易用性和可扩展性上的平衡。
技术线
关系型数据库的特点
1.SQL
。
2. 事务,符合ACID
原则。
3. 结构化存储。
这些特点的关键,就是易用性。
比如世界上使用最多的数据库SQLite
,常用于手机App的本地存储。它就是一个lib
库,小巧而精悍。但也支持上述的特点。因此也是一款关系型数据库。
可用性需求
主备同步的优化
MySQL,PostgreSQL,都是流行的数据库之一,它们广泛用于在线交易,或近线计算中。它们都有主备同步的方案。
默认方案
比如MySQL基于Binlog同步数据,有异步同步和半同步,通常使用外部高可用组件来控制流量。 但由于binog并非强同步,所以主库彻底挂掉的情况下,会存在丢数据的风险。 PostgreSQL可以强同步,但同样存在问题,备库异常会影响主库可用性。
引入分布式共识
可用性和一致性无法两全其美,但可以尽可能的优化。比如使用3个节点,相比2节点强同步,能达到同等一致性,也有更好的可用性。
使用分布式共识算法来同步日志是目前的标准做法,类似Spanner
,TiDB
,OceanBase
等NewSQL
也都是基于分布式共识算法来保证数据的一致性。
使用Mulit-Paxos算法的产品
传统数据库: AliSQL X-Cluster,TDSQL,MySQL Group Replication NewSQL: Spanner,Oceanbase
使用Raft算法的数据库
Tidb,CockroachDB
两种算法各有千秋。
更大的吞吐能力
当单台服务器的资源不足以支撑数据库的需求时,我们需要进行扩容,提升资源。
1. ScaleUp
: 提升单机的性能,比如使用更好的CPU
,更大的内存,更大更快的SSD存储。
2. ScaleOut
: 使用更多的服务器。
硬件提升终归有限,所以ScaleOut
是最后的办法。目前,ScaleOut
有两种Shared-Nothing
,Shared-Disk
.
Shared-Disk
在这个方向,有一个优化思路是将本地存储使用分布式存储替换。 1. 适合容量非常大,但写较少的场景。 2. 完全兼容单机数据库。 2. 缺点则是只解决了存储瓶颈,并没有解决计算和内存的瓶颈。
使用这种方案最经典的产品是
1. Oracle RAC
,使用专用存储,应该是比较费钱。
2. Amazon Aurora
/PolarDB MySQL
,改造了Innodb
,使用分布式存储的方式存储文件。
3. OceanBase0.5
,最早的OceanBase
,ChunkServer
其实就是分布式存储,UpdateServer
则是单点的修改入口。因此当时的结构,更像是Shared-Disk
的设计。
4. 使用虚拟机运行数据库也是个不错的办法,因为云上的分布式存储本身就具备很高的可用性,比如直接将数据库跑在使用云盘的ECS上,也差不多可以达到这个效果。较好的云盘,可能也会使用RDMA
,NVME
等技术。搭车很不错。
Shared-Nothing
使用分布式集群的方式来提升系统容量。简单说,就是将请求分散到多台服务器上处理。
分布式中间件
分布式中间件是在NewSQL出现前,最常用的解决办法。
关键功能
- 分库分表访问
- 全局Sequence,全局递增但不一定连续。
- 小表广播
- 全局索引
几个分布式中间件
Taobao Distributed Data Layer
,淘宝分布式中间件,外号头都大了。是基于客户端实现的中间件,没有Proxy,承担淘宝很多核心的数据库访问。MariaDB MaxScale
/Spider
,开源的Proxy式中间件,基于MySQL内核实现。
分布式中间件具备了一定分布式的能力,但依然有很多限制,但已经非常接近NewSQL了。 有的NewSQL产品就是分布式中间件的实现。
分布式事务的需求
在解决了上面的各种问题之后,NewSQL还要解决的问题就是分布式事务。
比如常见的交易系统实现,我们可以使用中间件来做分库分表,达到很快的订单创建。订单创建同时,我们需要扣减库存,需要扣款。这些动作分布式中间件不能支持事务,通常需要另一个中间件来实现分布式事务。
因为事务的实现并不能简单的在中间件层面完成,也涉及存储。分布式事务需要全局时钟
,2PC
和MVCC
配合实现。
NewSQL
NewSQL
是上述特点的集大成者。
1. 原始数据库的特性。
2. 基于分布式共识的多副本同步。
3. 分库分表技术。
4. 分布式事务。
在NewSQL的实现中,有部分基于现有的数据库和中间件。有部分借鉴Spanner
,使用KV
存储上增加SQL解析层。但也是大同小异。
几款NewSQL
Spanner/F1
,基于truetime
的数据库。也只有这样,才能实现全球化部署。其它基于中央授时,或逻辑时钟的关系型数据库,都无法做到全球化部署生产。TiDB/TiKV
,Spanner/F1
,的乞丐版实现,由于使用了TSO
所以集群通常不会跨城市。此外,事务的实现是在TiDB
上,和Spanner
略有不同。但事务隔离性强于Spanner
,可能是因为不用考虑truetime
的延时.Ocaenbase
,蚂蚁金服的分布式数据库,于TiDB/TiKV
不同,KV
层和SQL
层不做分离。
总结
技术的发展总归不是一蹴而就,而是一步步变化的,是易用性和业务需求的相互作用。
1. 最早的关系型数据库,是易用性占主导地位。
2. NoSQL崛起,则是更高性能的业务需求占主导地位。
3. 随着硬件提升和技术发展,重新回归SQL
的NewSQL
,则是易用性重新占据主导地位。