ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

分布式SQL的基础知识与入门

2023-01-04 21:07:30  阅读:566  来源: 互联网

标签:sql icode9 基础知识 数据库 服务器 体系结构 MaxScale 客户端扩展


数据库分片是将数据分成称为“分片”的较小部分的过程。分片通常在需要扩展写入时引入。在成功的应用程序的生命周期内,数据库服务器将达到它在处理或容量级别可以执行的最大写入次数。将数据切成多个分片(每个分片位于自己的数据库服务器上)可减少每个节点的压力,从而有效地提高整个数据库的写入容量。这就是数据库分片。

分布式 SQL 是使用类似分片的策略扩展关系数据库的新方法,该策略完全自动化且对应用程序透明。分布式 SQL 数据库是从头开始设计的,几乎可以线性扩展。在本文中,你将了解分布式 SQL 的基础知识以及如何入门。

数据库分片的缺点

分片带来了许多挑战:

  • 数据分区:决定如何跨多个分片对数据进行分区可能是一个挑战,因为它需要在数据接近度和数据均匀分布之间找到平衡以避免热点。
  • 故障处理:如果关键节点发生故障并且没有足够的分片来承载负载,如何在不停机的情况下在新节点上获取数据?
  • 查询复杂性:应用程序代码与数据分片逻辑耦合,需要来自多个节点的数据的查询需要重新联接。
  • 数据一致性:确保跨多个分片的数据一致性可能是一个挑战,因为它需要协调跨分片的数据更新。当同时进行更新时,这可能特别困难,因为可能需要解决不同写入之间的冲突。
  • 弹性可扩展性:随着数据量或查询数量的增加,可能需要向数据库添加其他分片。这可能是一个复杂的过程,不可避免地会出现停机,需要手动过程在所有分片之间均匀地重新定位数据。

其中一些缺点可以通过采用多语言持久性(对不同的工作负载使用不同的数据库)、具有本机分片功能的数据库存储引擎或数据库代理来缓解。但是,虽然有助于解决数据库分片中的一些挑战,但这些工具具有局限性,并引入了需要持续管理的复杂性。

什么是分布式 SQL?

分布式SQL是指新一代的关系数据库。简单来说,分布式 SQL 数据库是具有透明分片的关系数据库,对于应用程序来说,它看起来像单个逻辑数据库。分布式 SQL 数据库作为无共享体系结构和存储引擎实现,可缩放读取和写入,同时保持真正的 ACID 合规性和高可用性。分布式 SQL 数据库具有 NoSQL 数据库的可伸缩性功能(在 2000 年代开始流行),但不会牺牲一致性。它们保留了关系数据库的优势,并通过多区域弹性增加了云兼容性。

一个不同但相关的术语是NewSQL(由Matthew Aslett在2011年创造)。该术语还描述了可扩展且高性能的关系数据库。但是,NewSQL 数据库不一定包括水平可伸缩性。

分布式 SQL 如何工作?

为了理解分布式SQL的工作原理,让我们以MariaDB Xpand为例,这是一个与开源MariaDB数据库兼容的分布式SQL数据库。Xpand 的工作原理是在节点之间切割数据和索引,并自动执行数据重新平衡和分布式查询执行等任务。查询并行执行以最大程度地减少延迟。数据会自动复制,以确保没有单点故障。当节点发生故障时,Xpand 会在幸存的节点之间重新平衡数据。添加新节点时也会发生同样的情况。称为 rebalancer 的组件可确保没有热点 - 这是手动数据库分片的挑战 - 当一个节点不均匀地必须处理太多事务时,与其他节点相比有时会保持空闲状态时,就会发生这种情况。

让我们研究一个例子。假设我们有一个数据库实例,其中包含许多行:some_table

具有some_table和行数的数据库实例

我们可以将数据分为三个块(分片):

将数据分为三个块(分片):

然后将每个数据块移动到单独的数据库实例中:

将每个数据块移动到单独的数据库实例中

这就是手动数据库共享的样子。分布式 SQL 会自动为您执行此操作。在Xpand的情况下,每个分片称为一个切片。使用表列子集的哈希对行进行切片。不仅数据被切片,索引也被切片并分布在节点(数据库实例)之间。此外,为了保持高可用性,切片在其他节点中复制(每个节点的副本数是可配置的)。这也会自动发生:

切片复制到其他节点

当将新节点添加到群集或一个节点发生故障时,Xpand 会自动重新平衡数据,而无需手动干预。以下是将节点添加到上一个群集时发生的情况:

将节点添加到上一个群集

某些行将移动到新节点以增加整体系统容量。请记住,尽管图中未显示,但索引和副本也会相应地重新定位和更新。下图显示了上一个集群的稍微完整的视图(数据的重新定位略有不同):

前一个集群的稍微完整的视图(数据的重新定位略有不同)

此体系结构允许近乎线性的可伸缩性。无需在应用程序级别进行手动干预。对于应用程序,群集看起来像单个逻辑数据库。应用程序只需通过负载均衡器(MariaDB MaxScale)连接到数据库:

应用程序只需通过负载平衡器(MariaDB MaxScale)连接到数据库

当应用程序发送写入操作(例如,或)时,将计算并发送哈希以更正切片。多个写入将并行发送到多个节点。INSERTUPDATE

何时不使用分布式 SQL

对数据库进行分片可以提高性能,但也会在节点之间的通信级别引入额外的开销。如果未正确配置数据库或查询路由器未优化,这可能会导致性能降低。分布式 SQL 可能不是每秒查询数低于 10K 或每秒事务数低于 5K 的应用程序中的最佳选择。此外,如果数据库主要由许多小表组成,则整体式数据库的性能可能会更好。

分布式 SQL 入门

由于分布式 SQL 数据库在应用程序看来就像一个逻辑数据库一样,因此入门非常简单。您所需要的只是以下内容:

  • 一个SQL客户端,如DBeaver,DbGate,DataGrip或IDE的任何SQL客户端扩展
  • 一个 SQL 数据库

Docker使第二部分变得简单。例如,MariaDB 发布 Docker 映像,允许您启动单节点 Xpand 数据库进行评估、测试和开发。mariadb/xpand-single

若要启动 Xpand 容器,请运行以下命令:


docker run --name xpand \

-d \

-p 3306:3306 \

--ulimit memlock=-1 \

mariadb/xpand-single \

--user "user" \

--passwd "password"

 

有关详细信息,请参阅 Docker 映像文档。

注意:在撰写本文时,Docker 映像在 ARM 体系结构上不可用。在这些架构上(例如带有 M1 处理器的 Apple 机器),使用 UTM 创建虚拟机 (VM) 并安装 Debian。分配主机名并使用 SSH 连接到 VM 以安装 Docker 并创建 MariaDB Xpand 容器。mariadb/xpand-single

连接到数据库

连接到 Xpand 数据库与连接到 MariaDB 社区或企业服务器相同。如果您安装了 CLI 工具,只需执行以下操作:mariadb

1mariadb -h 127.0.0.1 -u user -p

您可以使用 SQL 数据库的 GUI(如 DBeaver、DataGrip)或 IDE 的 SQL 扩展(如 VS Code 的扩展)连接到数据库。我们将使用一个名为DbGate的免费开源SQL客户端。您可以下载 DbGate 并将其作为桌面应用程序运行,或者由于您使用的是 Docker,因此您可以将其部署为 Web 应用程序,您可以通过 Web 浏览器从任何地方访问该应用程序(类似于流行的 phpMyAdmin)。只需运行以下命令:

docker run -d --name dbgate -p 3000:3000 dbgate/dbgate

容器启动后,将浏览器指向 http://localhost:3000/。填写连接详细信息:

填写连接详细信息

单击“测试”并确认连接成功:

单击测试并确认连接成功

单击“保存”,然后通过右键单击左侧面板中的连接并选择“创建数据库”来创建新数据库。尝试创建表或导入 SQL 脚本。如果你只是想尝试一些东西,国家或Sakila是一个很好的例子数据库。

从 Java、JavaScript、Python 和 C++ 进行连接

要从应用程序连接到Xpand,您可以使用MariaDB连接器。有许多编程语言和持久性框架组合是可能的。本文的范围不在本文的讨论范围之内,但如果您只是想开始并查看实际操作,请查看此快速入门页面,其中包含 Java、JavaScript、Python 和 C++ 的代码示例。

分布式 SQL 的真正力量

在本文中,我们学习了如何启动单节点 Xpand 以进行开发和测试,而不是生产工作负载。但是,分布式 SQL 数据库的真正功能在于它不仅能够扩展读取(如经典数据库分片),而且还能够通过简单地添加更多节点并让重新平衡器以最佳方式重新定位数据来进行写入。尽管可以在多节点拓扑中部署Xpand,但在生产中使用它的最简单方法是通过SkySQL。

标签:sql,icode9,基础知识,数据库,服务器,体系结构,MaxScale,客户端扩展
来源:

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有