分布式 SQL:数据库分片的替代方案——MariaDB Xpand
本文译自:Distributed SQL: An Alternative to Database Sharding
分布式 SQL 数据库是从头开始设计的,几乎可以线性扩展。在本文中,了解分布式 SQL 的基础知识以及如何入门。
数据库分片是将数据分成称为“碎片”的更小部分的过程。当需要扩展写入时,通常会引入分片。在一个成功的应用程序的生命周期中,数据库服务器将达到它可以在处理或容量级别执行的最大写入次数。将数据分成多个分片——每个分片都在自己的数据库服务器上——减少了每个节点的压力,有效地增加了整个数据库的写入容量。这就是数据库分片。
分布式 SQL是使用类似分片的策略扩展关系数据库的新方法,该策略对应用程序完全自动化且透明。分布式 SQL 数据库是从头开始设计的,几乎可以线性扩展。在本文中,您将了解分布式 SQL 的基础知识以及如何入门。
数据库分片的缺点
分片带来了许多挑战:
- **数据分区:**决定如何跨多个分片对数据进行分区可能是一个挑战,因为它需要在数据邻近性和数据均匀分布之间找到平衡以避免热点。
- **故障处理:**如果一个关键节点发生故障,没有足够的分片来承载负载,如何在不停机的情况下获取新节点上的数据?
- **查询复杂性:**应用程序代码与数据分片逻辑耦合,需要重新连接来自多个节点的数据的查询。
- **数据一致性:**确保跨多个分片的数据一致性可能是一个挑战,因为它需要协调跨分片的数据更新。当同时进行更新时,这可能特别困难,因为可能需要解决不同写入之间的冲突。
- **弹性可扩展性:**随着数据量或查询数量的增加,可能需要向数据库添加额外的分片。这可能是一个复杂的过程,停机时间不可避免,需要手动过程在所有分片之间均匀地重新定位数据。
通过采用多语言持久性(针对不同的工作负载使用不同的数据库)、具有本机分片功能的数据库存储引擎或数据库代理,可以减轻其中一些缺点。然而,在帮助解决数据库分片中的一些挑战的同时,这些工具也有局限性并引入了需要持续管理的复杂性。
什么是分布式 SQL?
分布式 SQL是指新一代的关系数据库。简单来说,分布式 SQL 数据库是一种具有透明分片的关系数据库,在应用程序看来就像一个单一的逻辑数据库。分布式 SQL 数据库实现为无共享架构和存储引擎,可扩展读写,同时保持真正的ACID合规性和高可用性。分布式 SQL 数据库具有NoSQL 数据库的可扩展性特性——NoSQL 数据库在 2000 年代流行起来——但不会牺牲一致性。它们保留了关系数据库的优势,并增加了具有多区域弹性的云兼容性。
一个不同但相关的术语是 NewSQL(由Matthew Aslett 在 2011 年创造)。该术语还描述了可伸缩和高性能的关系数据库。但是,NewSQL 数据库不一定包括水平可伸缩性。
分布式 SQL 是如何工作的?
要了解分布式 SQL 的工作原理,让我们以MariaDB Xpand 为例——一个与开源MariaDB数据库兼容的分布式 SQL数据库。Xpand 的工作原理是在节点之间对数据和索引进行切片,并自动执行数据重新平衡和分布式查询执行等任务。并行执行查询以最大程度地减少延迟。自动复制数据以确保没有单点故障。当一个节点出现故障时,Xpand 会在幸存的节点之间重新平衡数据。添加新节点时也会发生同样的情况。一个叫做rebalancer的组件确保没有热点——手动数据库分片的挑战——当一个节点与有时可能保持空闲的其他节点相比不得不不均匀地处理太多事务时,就会发生这种情况。
让我们研究一个例子。假设我们有一个some_table
包含许多行的数据库实例:
我们可以将数据分成三个块(分片):
然后将每个数据块移动到一个单独的数据库实例中:
这就是手动数据库共享的样子。分布式 SQL 会自动为您执行此操作。在 Xpand 的例子中,每个分片被称为一个slice。使用表列子集的散列对行进行切片。不仅数据被切片,而且索引也被切片并分布在节点(数据库实例)之间。此外,为了保持高可用性,切片在其他节点中进行复制(每个节点的副本数是可配置的)。这也会自动发生:
当一个新的节点加入集群或者一个节点出现故障时,Xpand 会自动重新平衡数据,无需人工干预。这是将节点添加到先前集群时发生的情况:
一些行被移动到新节点以增加整体系统容量。请记住,虽然图中未显示,但索引和副本也会相应地重新定位和更新。此图中显示了前一个集群的稍微更完整的视图(数据的重新定位略有不同):
这种架构允许近乎线性的可扩展性。无需在应用程序级别进行手动干预。对于应用程序,集群看起来像一个单一的逻辑数据库。该应用程序仅通过负载均衡器 ( MariaDB MaxScale )连接到数据库:
当应用程序发送写操作(例如,INSERT
或UPDATE
)时,将计算并发送哈希以更正切片。多个写入并行发送到多个节点。
何时不使用分布式 SQL
对数据库进行分片可以提高性能,但也会在节点之间的通信级别引入额外的开销。如果数据库配置不正确或查询路由器未优化,这可能会导致性能下降。对于每秒少于 10K 查询或每秒 5K 事务的应用程序,分布式 SQL 可能不是最佳选择。此外,如果您的数据库主要由许多小表组成,那么整体式数据库的性能可能会更好。
分布式 SQL 入门
由于分布式 SQL 数据库将应用程序视为一个逻辑数据库,因此入门非常简单。您只需要以下内容:
Docker使第二部分变得简单。例如,MariaDB 发布了mariadb/xpand-single
Docker 镜像,允许您启动单节点 Xpand 数据库以进行评估、测试和开发。
要启动 Xpand 容器,请运行以下命令:
docker run --name xpand \
-d \
-p 3306:3306 \
--ulimit memlock=-1 \
mariadb/xpand-single \
--user "user" \
--passwd "password"
有关详细信息,请参阅 Docker 映像文档。
**注意:**在撰写本文时,mariadb/xpand-single
Docker 映像在 ARM 架构上不可用。在这些架构(例如带有 M1 处理器的 Apple 机器)上,使用UTM创建虚拟机 (VM) 并安装,例如Debian。分配主机名并使用SSH连接到 VM 以安装 Docker 并创建 MariaDB Xpand 容器。
连接到数据库
连接到 Xpand 数据库与连接到 MariaDB社区或企业服务器相同。如果您安装了mariadb
CLI 工具,只需执行以下命令:
mariadb -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 脚本。如果您只是想尝试一些东西,Nation或Sakila是很好的示例数据库。
从 Java、JavaScript、Python 和 C++ 连接
要从应用程序连接到 Xpand,您可以使用MariaDB 连接器。有许多可能的编程语言和持久性框架组合。涵盖这一点超出了本文的范围,但如果您只是想开始并查看实际操作,请查看此快速入门页面,其中包含Java、JavaScript、Python和C++的代码示例。
分布式 SQL 的真正力量
在本文中,我们了解了如何启动单节点 Xpand 用于开发和测试目的,而不是用于生产工作负载。然而,分布式 SQL 数据库的真正强大之处在于它不仅可以扩展读取(就像在经典数据库分片中),还可以通过简单地添加更多节点并让重新平衡器以最佳方式重新定位数据来扩展写入。虽然可以在多节点拓扑中部署 Xpand,但在生产中使用它的最简单方法是通过SkySQL。
如果您想了解有关分布式 SQL 和 MariaDB Xpand 的更多信息,请参阅以下有用资源列表: