数据分片在分布式 SQL 数据库中的工作原理

各种规模的企业都在拥抱面向用户的应用程序的快速现代化,作为其更广泛的数字化转型战略的一部分。此类应用程序所依赖的关系数据库 (RDBMS) 基础设施突然需要支持更大的数据量和事务量。然而,在这种情况下,单体 RDBMS 往往很快就会过载。在 RDBMS 中获得更高性能和可扩展性的最常见架构之一是"分片"数据。在本博客中,我们将了解什么是分片以及如何使用它来扩展数据库。我们还将回顾常见分片架构的优缺点,并探讨如何在YugaByte DB 等基于 SQL 的分布式 RDBMS 中实现分片。

什么是数据分片?

分片是将大表分解成更小的块(称为分片)的过程,这些块分布在多个服务器上。分片本质上是一个水平数据分区,包含总数据集的子集,因此负责服务整体工作负载的一部分。这个想法是将无法容纳在单个节点上的数据分布到数据库节点集群上。分片也称为水平分区。水平和垂直之间的区别来自于数据库的传统表格视图。数据库可以垂直拆分(将不同的表列存储在单独的数据库中),也可以水平拆分(将同一表的行存储在多个数据库节点中)。

图 1:垂直和水平数据分区(来源:Medium)

为什么要对数据库进行分片?

依赖整体 RDBMS 的业务应用程序随着增长而遇到瓶颈。由于CPU、存储容量和内存有限,数据库性能必然受到影响。未分片数据库的查询性能和日常维护变得极其缓慢。当涉及到添加资源来支持数据库操作时,垂直扩展(也称为向上扩展)有其自身的限制,并最终达到收益递减的点。

另一方面,水平分区表意味着有更多的计算能力来服务传入的查询,因此您最终可以获得更快的查询响应时间和索引构建。通过不断平衡额外节点上的负载和数据集,分片还可以轻松扩展以容纳更多容量。此外,从长远来看,由更小、更便宜的服务器组成的网络可能比维护一台大型服务器更具成本效益。

除了解决扩展挑战之外,分片还可以减轻意外中断的影响。在停机期间,未分片数据库中的所有数据都无法访问,这可能会造成破坏或彻底灾难性的。如果做得正确,分片可以提供高可用性:即使托管几个分片的一两个节点出现故障,只要其他节点(托管剩余分片)运行,数据库的其余部分仍然可用于读/写操作。不同的故障域。总体而言,分片可以增加集群总存储容量,加快处理速度,并以比垂直扩展更低的成本提供更高的可用性。

手动分片的危险

分片,包括第一天的创建和第二天的重新平衡,如果完全自动化,可以为大容量数据应用程序带来福音。不幸的是,Oracle、PostgreSQL、MySQL 等单体数据库,甚至 Amazon Aurora 等较新的分布式 SQL 数据库都不支持自动分片。这意味着如果您想继续使用这些数据库,则需要在应用程序层进行手动分片。最终结果是开发复杂性大幅增加。您的应用程序必须具有额外的分片逻辑才能准确了解数据的分布方式以及如何获取数据。您还必须决定采用哪种分片方法、创建多少分片以及使用多少节点。如果您的业务需求发生变化,还要考虑分片键甚至分片方法的变化。

手动分片最重大的挑战之一是分片分配不均匀。数据不成比例的分布可能会导致分片变得不平衡,一些分片过载,而另一些则相对空。最好避免在分片上积累过多数据,因为热点可能会导致速度减慢和服务器崩溃。这个问题也可能是由小分片集引起的,这迫使数据分布在太少的分片上。这在开发和测试环境中是可以接受的,但在生产中则不行。数据分布不均匀、热点以及在太少的分片上存储数据都会导致分片和服务器资源耗尽。

最后,手动分片会使操作流程变得复杂。现在必须对多台服务器执行备份。数据迁移和架构更改必须仔细协调,以确保所有分片具有相同的架构副本。如果没有充分的优化,跨多个服务器的数据库连接可能效率极低且难以执行。

常见的自动分片架构

分片已经存在很长时间了,多年来,不同的分片架构和实现已被用于构建大规模系统。在本节中,我们将讨论三个最常见的问题。

基于哈希的分片

基于哈希的分片采用分片键的值并从中生成哈希值。然后使用哈希值来确定数据应驻留在哪个分片中。借助ketama等统一哈希算法,哈希函数可以将数据均匀分布在服务器之间,降低热点风险。通过这种方法,具有接近分片键的数据不太可能被放置在同一个分片上。因此,这种架构非常适合有针对性的数据操作。

图 2:基于哈希的分片(来源:MongoDB 文档)

基于范围的分片

基于范围的分片根据数据值的范围(也称为键空间)来划分数据。具有附近值的分片键更有可能落入相同的范围并进入相同的分片。每个分片本质上都保留了原始数据库中相同的模式。分片变得就像识别数据的适当范围并将其放置在相应的分片上一样简单。

图 3:基于范围的分片示例

基于范围的分片允许高效查询,读取连续范围内的目标数据或范围查询。然而,基于范围的分片需要用户先验选择分片键,而选择不当的分片键可能会导致数据库热点。

一个好的经验法则是选择基数大、重复频率低且不会单调增加或减少的片键。如果没有正确的分片键选择,数据可能会在分片之间分布不均匀,并且与其他数据相比,特定数据可能会被更多地查询,从而在分片中产生潜在的系统瓶颈,从而导致工作负载较重。

解决分片大小不均匀的理想解决方案是执行自动分片拆分和合并。如果分片变得太大或托管频繁访问的行,则将分片分成多个分片,然后在所有可用节点上重新平衡它们,从而获得更好的性能。同样,当小分片过多时,可以进行相反的过程。

基于地理的分片

在基于地理(也称为位置感知)的分片中,数据根据用户指定的列进行分区,该列将范围分片映射到特定区域以及这些区域中的节点。例如,跨美国、英国和欧盟 3 个区域运行的集群可以依赖 User 表的 Country_Code 列将用户的行映射到最近的符合 GDPR 规则的区域。

相关推荐
倔强的石头_5 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou641 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤2 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
初次攀爬者3 天前
ZooKeeper 实现分布式锁的两种方式
分布式·后端·zookeeper
爱可生开源社区3 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1773 天前
《从零搭建NestJS项目》
数据库·typescript
加号34 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏4 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐4 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再4 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip