什么是分布式SQL?看完你就懂了

420 阅读6分钟

通过优锐课核心java学习笔记中,我们可以看到在本文中,找出什么是分布式SQL,并查看数据库体系结构,业务收益等。码了很多专业的相关知识, 分享给大家参考学习。

什么是分布式SQL?

SQL已经成为关系数据库(又名RDBMS)的事实语言近40年了。 因此,关系数据库也称为SQL数据库。但是,从体系结构的角度来看,原始的SQL数据库(如Oracle,PostgreSQL和MySQL)是整体的。 他们无法自动在多个实例之间分配数据和查询。 NewSQL数据库的出现使SQL具有可伸缩性。但是,他们也提出了自己的痛苦妥协。

自2015年开始引入Docker容器和Kubernetes编排以创建灵活的,可组合的基础架构之后,基于微服务的应用程序不断增加。内置缩放,弹性和地理分布的云原生原则是此架构转变的核心。引入称为“分布式SQL”的新型数据库的时机已经成熟。分布式SQL数据库的定义特征是整个数据库集群(无论其中的节点数如何)对于应用程序都将其视为单个逻辑SQL数据库。

数据库架构

分布式SQL数据库具有三层体系结构。



1. SQL API

顾名思义,分布式SQL数据库必须具有SQL API,以便应用程序可以对关系数据进行建模并执行涉及这些关系的查询。SQL数据库特有的典型数据建模结构是索引,外键约束,JOIN查询和多行ACID事务。

2.分布式查询执行

查询应自动分布在群集的多个节点上,这样就不会有单个节点成为查询处理的瓶颈。群集中的任何节点都应接受传入的查询,然后该节点应请求其他节点以使其处理等待时间最小化的方式处理其查询的一部分,其中包括网络上各节点之间传输的数据量。然后,接受请求的原始节点应将汇总结果发送回客户端应用程序。

3.分布式数据存储

包含索引的数据应在群集的多个节点之间自动分布(也称为分片),这样就不会有单个节点成为确保高性能和高可用性的瓶颈。此外,数据库集群应支持高度一致的复制和多行(也称为分布式)ACID事务,以确保单个逻辑数据库概念。

高度一致的复制

支持强大的SQL API层本质上要求底层存储层建立在跨数据库群集节点的强一致性复制之上。这意味着对数据库的写入将在多个节点上同步提交,以保证故障期间的可用性。读取应服务于最后提交的写入或错误。此属性通常称为可线性化。根据著名的CAP定理,分布式SQL数据库被分类为一致性和分区容忍(CP)。

分布式ACID交易

数据库存储层还应支持分布式ACID事务,其中需要跨多个节点上的多行进行事务协调。通常,这需要使用两阶段提交(2PC)协议。隔离级别代表ACID中的I,它表示数据库对并发数据访问的严格程度。 分布式SQL数据库有望作为最严格的隔离级别以及其他较弱的隔离级别(如Snapshot)支持可序列化性。

商业利益

以上架构带来了四个关键优势。


1.使用SQL和事务的开发人员敏捷性

即使诸如Amazon DynamoDB,MongoDB和FaunaDB之类的NoSQL数据库开始使某些操作具有事务性,应用程序开发人员仍继续使SQL数据库贴心。

这种亲和力的原因之一是SQL固有的强大功能,它是一种轻松建模关系和多行操作的数据建模语言。例如,SQL通过显式(使用BEGIN和END TRANSACTION语法)和隐式(使用二级索引,外键和JOIN查询)允许多行事务,从而超越了传统的键值NoSQL。

此外,开发人员喜欢轻松地利用SQL仅对数据建模(和存储)一次,然后在业务需求变化时只需更改JOIN即可更改查询。

2.具有本地故障转移/修复的超弹性

在分布式SQL数据库中使用每个分片的分布式共识复制等技术可确保每个分片(而不是每个实例)在出现故障时仍保持高可用性。

基础架构故障始终仅影响数据的一个子集(仅影响其领导者被分割开的那些碎片),而不影响整个集群。并且,鉴于剩余的分片副本能够在几秒钟内自动选出新的领导者,集群会自行修复,从而在出现故障时表现出自我修复的特性。该应用程序对这些群集配置更改保持透明,并且可以继续正常运行,而不会发生中断或速度下降。

3.具有水平写入可扩展性的按需缩放


如何在分布式SQL数据库中进行数据分片''展示了通常如何在分布式SQL数据库中实现自动数据分片。随着添加新节点或删除现有节点,分片将在所有可用节点之间保持自动平衡。

现在,需要事务处理应用程序具有写可伸缩性的微服务可以直接依赖数据库,而不必添加新的基础架构,例如内存中的缓存(从数据库中卸载读取请求,以便可以保留以处理写入请求)或

NoSQL数据库。 (可扩展写入但放弃ACID保证)。

4. 具有地理数据分布的低用户延迟

正如“ 9种构建具有低延迟的云原生,地理分布式SQL应用程序的技术”中所强调的那样,分布式SQL数据库可以提供广泛的技术来构建地理分布式应用程序,这些技术不仅有助于自动容忍区域故障,而且还可以降低容错能力。通过使数据更接近其本地区域来为最终用户带来延迟。