当前位置: 首页 > news >正文

一文详解什么是数据库分片

67950e6d8aac4cdf990c82219c80fdc9.jpg


 

概要

 

应用程序正在变得越来越好,它拥有更多的功能、更多的活跃用户,并且每天都会收集更多的数据。但数据库现在导致应用程序的其余部分变慢。数据库分片可能是问题的答案,但许多人不知道它是什么,最重要的是何时使用它。在本文中我们将讨论什么是数据库分片、它的工作原理以及使用它的最佳方法。

在我们讨论这个问题之前,有必要了解为什么我们对数据存储进行分片,以及在开始分片之前可以选择的各种选项。

b819189593a349599c73582d831be697.png

 当表达到特定大小时,人们通常会觉得分片是解决所有扩展问题的神奇解决方案。然而拥有包含数十亿行的表,并且没有看到令人信服的理由进行分片,因为使用模式非常适合单个表,并且没有看到任何强有力的理由(除了管理如此大的表之外)对表进行分片。

 

什么是数据库分片?

 

简单来说分片是一种跨多台机器分布数据的方法。当没有一台机器可以处理预期的工作负载时,分片变得特别方便。

分片是水平扩展的一个例子,而垂直扩展是一个越来越大的机器来支持新工作负载的例子。

e5a969417ad04c0b988c93d8e34b1eb2.png

 工程师经常会陷入以最复杂的方式做事的过程中,但是随着应用程序的发展变得更加容易,早期保持事情简单会使以后的事情变得具有挑战性。因此,如果问题通过获得具有更多资源的计算机而消失,这就是正确的答案。

现在我们已经讨论了潜在的服务器架构,让我们谈谈数据布局。

还可以通过多种方式对数据进行分区,并将特定表移动到其数据库,这与在微服务架构中看到的非常相似,其中应用程序的特定方面拥有其数据库服务器。应用程序知道在哪里寻找每个。或者可以跨多个数据库节点存储同一个表的行,这带来了诸如分片键之类的想法;稍后会详细介绍。

3b67b77c6d84415b9043623e34449ff1.png

 Cassandra 等更现代的数据库将其从应用程序逻辑中抽象出来,并在数据库级别进行维护。

 

分片之前有哪些选择?

 

与任何分布式架构一样,数据库分片也需要花钱。设置分片、保持每个分片上的数据最新以及确保请求发送到正确的分片既耗时又复杂。在开始分片之前可能想看看这些其他选项之一是否适合。

选项 1:什么也不做。

曾多次被问到在没有任何明显的瓶颈或限制因素(例如耗尽可以支持工作负载的硬件)的情况下,分片是否是一个好主意。如果没有损坏,就不要修理它。

选项 2:垂直缩放

之前我们已经回避了这一点,只是让机器拥有更多资源,添加额外的 RAM,为计算繁重的工作负载添加更多的 CPU 核心,并添加额外的存储。这些都是不需要重新设计应用程序和数据库架构的选项。其他最终限制,例如带宽(网络或系统内部),也可能迫使进行分片。

6ee88e31a2c9447797a4f919a6cbff0a.png

WAL WAL(预写日志)是磁盘上只能添加的额外结构。在将更改写入数据库之前,首先将它们写入日志,该日志必须位于持久存储上。它用于从崩溃和丢失的事务中恢复。此日志还用于支持某些数据库(例如 PostgreSQL 和 MySQL)中的复制。

选项 3:复制

如果对数据所做的大部分操作都是读取数据,那么复制可以提高数据的可用性并加快读取数据的速度。这可以避免数据库分片的一些复杂性。通过制作更多数据库副本可以提高读取性能。当然假设已经补充了缓存,这可以通过负载平衡或根据查询所在的位置路由查询来完成。但复制使得写入密集型工作负载更难处理,因为每次写入都必须复制到每个节点。这可能会根据数据存储而有所不同,其中一些数据存储是异步执行的,而其他数据存储可能会延迟初始写入以确保其被复制。

8caf5e33b502447c9a2e892b36a87b38.png

选项 4:专业数据库

性能不佳是由于数据库需要针对其所服务的工作负载进行更好的设计而导致的。例如将搜索数据存储在关系数据存储中可能没有什么意义。将类似的东西转移到 Elasticsearch 会更有效。将 blob 移动到像 S3 这样的对象存储比将它们存储在关系存储中可能是一个巨大的胜利。外包此功能可能比尝试对整个数据库进行分片更有意义。

如果应用程序数据库管理大量数据、需要大量读取和写入和/或需要始终可用,则分片数据库可能是最佳选择。让我们看一下分片的优点和缺点。

 

如果必须的话进行分片

 

分片可以在提高系统吞吐量、存储容量和可用性方面提供几乎无限的可扩展性。有许多更小、更容易控制的系统,每个系统都可以通过各自的副本自行扩展和缩小。

所有这些优点都是以操作复杂性、应用程序开销和支持这种新设计的基础设施成本为代价的。

它是如何工作的?

在对数据库进行分片之前,我们需要回答一些重要的问题。计划将取决于如何回答这些问题。

  • • 我们如何跨分片分布数据?如果数据分布不均匀,是否存在潜在的热点?

  • • 我们运行哪些查询以及表如何交互?

  • • 数据将如何增长?以后需要如何重新分配?

在我们进入下一步之前,了解以下术语很重要。

分片键是主键的一部分,它告诉数据应该如何分布。使用分片键可以通过将操作路由到正确的数据库来快速查找和更改数据。

同一节点包含具有相同分片键的条目。共享相同分片键的一组数据称为逻辑分片。一个数据库节点中包含多个逻辑分片,也称为物理分片。

54b764078caf425ab8706865e58f66c2.png

 最关键的假设,也是未来最难改变的假设。逻辑分片只能跨越一个节点,因为它是存储的原子单元。在分片对于单个节点来说太大的情况下,数据库集群实际上会出现空间不足的情况。

 

基于键的分片

 

算法分片数据库使用哈希函数来定位数据。这允许我们给定一个特定的分片键来找到正确的物理分片来请求数据。

数据仅通过哈希函数进行分发。它不考虑有效负载的大小或空间使用情况。散列的好处是当没有合适的分区键可用时,可以实现更均匀的分布,并且如果有正确的分区键,则可以动态计算位置。

82e38ab5e3e84d78ba4da21552e19582.png

 这种分片策略的缺点是,重新分片数据可能很困难,并且在可用的情况下保持一致性更加困难。

 

基于范围的分片

 

基于范围的分片,根据某个值的范围将数据分为块。

e1456979aad343f0aca598a2a8a109ab.png

 这需要一个查找表来查看数据应存储在哪里。保持这样一个表格的一致性并显然在这里选择范围是至关重要的。

为这种分片类型选择分片键时,必须选择基数高的分片键,因此该键的可能值有很多。例如,可能值为 North、South、East 和 West 的键的基数较低,因为只有 4 个。

c768d60e0c354feeba14066c0c6b1637.png

 如果一切都落在可能值的 50% 内,某些分片将开始出现热点。使用准确的数据运行此实验很容易,只需几行代码即可完成。首先选择一个键和范围并检查潜在的分布。

 

基于关系的分片

 

这种共享机制将相关数据保存在单个物理分片上。例如,相关数据通常分布在关系数据库中的多个表中。

例如对于像 Instagram 这样的应用程序,用户和所有相关数据将被分片到同一个物理节点,其中分别包含帖子和评论。通过将相关实体放在同一分区中,可以从单个分区中获得更多信息。因此在整个物理分片中保持了更强的一致性,并减少了跨物理分片的查询。

跨分片事务

最后介绍一些有关复杂性的细节,当需要执行跨多个分片的事务时,可能会引入这些复杂性。无论计划多少,寿命足够长的服务或应用程序最终都会遇到一些跨分片事务。

这本质上意味着需要由符合 ACID 的数据库提供的事务保证,但在数据库无法确保这种合规性的分片中,因为操作的数据超出了启动它的事务的范围。

这通常称为全局事务,其中多个子事务需要协调并成功。一般来说,事务打开的时间越长,可能发生的争用和潜在的失败就越多。

两阶段提交

两阶段提交理论上很简单,但在实践中很难执行。

  • • Leader 写入一条持久的交易记录,指示跨分片事务。

  • • 参与者将他们的承诺意愿永久记录下来并通知领导者。

  • • 领导者在收到所有响应后通过更新持久事务记录来提交事务。(如果没有人响应,它可以中止事务。)

  • • 在领导者宣布提交决定后,参与者可以显示新的状态。(如果领导者中止事务,他们会删除暂存状态。)

协议路径中的读写放大是一个主要问题。发生写入放大是因为您必须写入事务记录并持久地暂存提交,这需要每个参与者至少进行一次写入。过多的写入可能会导致锁争用和应用程序不稳定。数据库必须另外过滤每个读取,以确保它不会看到任何依赖于待处理的跨分片事务的状态,这会影响系统中的所有读取,甚至是非事务性读取。

 

结论

 

我们讨论了分片、何时使用它以及如何设置它。对于需要管理大量数据并使其易于进行大量读写的应用程序来说,分片是一个出色的解决方案。尽管如此这仍然使操作变得更加复杂。在开始实施之前应该考虑收益是否值得付出的成本,或者是否有更直接的解决方案。

 

 

欢迎点赞收藏转发,感谢🙏

 

相关文章:

一文详解什么是数据库分片

概要 应用程序正在变得越来越好,它拥有更多的功能、更多的活跃用户,并且每天都会收集更多的数据。但数据库现在导致应用程序的其余部分变慢。数据库分片可能是问题的答案,但许多人不知道它是什么,最重要的是何时使用它。在本文中我…...

百度留痕是什么方法排名的

百度留痕是什么方法排名的,黑帽seo教学:谷歌外推搜索留痕关键词秒收录排名软件技术培训 #外推留痕 #黑帽seo #黑帽seo培训 今天给大家看一个百度留痕的一个链接,东西也很简单,其实就是前面的一个地址加后面的一个你的联系方式,你…...

基于时域特征和频域特征组合的敏感特征集,再利用CNN进行轴承故障诊断(python编程)

1.文件夹介绍(使用的是CWRU数据集) 0HP-3HP四个文件夹装载不同工况下的内圈故障、外圈故障、滚动体故障和正常轴承数据。 2.模型 按照1024的长度分割样本,构建内圈故障、外圈故障、滚动体故障和正常轴承样本集 2.1.计算11种时域特征值 # 计…...

CAD2021安装教程适合新手小白【附安装包和手册】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、下载文件二、使用步骤1.安装软件前,断开电脑网络(拔掉网线、关闭WIFI)2、鼠标右击【AutoCAD2021(64bit)】压缩包选择【解…...

AcWing 107. 超快速排序—逆序对

问题链接: AcWing 107. 超快速排序 问题描述 分析 这道题考查的算法不难,就只是利用归并排序来求逆序对的数量,但是主要是如何分析问题,如何能从问题中看出来和逆序对数量有关,现在的题目基本上很少是那种模板算法题了&#xff…...

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(三)

系列文章目录 个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页 Python面试专栏:《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读,一起进步!🌟🌟🌟 …...

详解在Linux中修改Tomcat使用的jdk版本

问题分析 由于部署个人项目使用了openjdk11,但是我之前安装的是jdk1.8,jdk版本升级的后果就是,tomcat运行的时候报一点小bug(因为之前安装tomcat默认使用了系统的jdk版本)所以就想着把tomcat使用的jdk版本调回原来的&…...

高级 Matplotlib:3D 图形和交互性

Matplotlib 是 Python 中最重要的数据可视化库之一。在之前的文章中,我们讨论了如何使用基础和中级功能来创建各种图形。在本文中,我们将深入研究 Matplotlib 的高级特性,特别是如何创建 3D 图形和交互式图形。 一、创建 3D 图形 Matplotli…...

cloud Alibab+nacos+gateway集成swaggerui,统一文档管理(注意点)

首先说明&#xff1a;本文只说整合注意点 效果图和功能参考链接 1.使用gateway访问nacos服务&#xff0c;503 在网关服务添加依赖即可解决 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign&…...

使用 YOLOv8 进行传输线故障检测-附源码

用于传输线故障检测的 YOLO 我将模型缩小到YOLO 或 Faster R-CNN。但YOLO 作为单次目标检测模型在速度和计算效率方面获得了许多好处。由于基于无人机的实时故障检测是最佳选择,我选择使用 YOLO。YOLO 代表“You Only Look Once”,暗示您只需要通过一个神经网络即可对检测到…...

安装RabbitMQ 详细步骤

我这里是在Linux系统里面安装的按照步骤即可 1. 安装Socat&#x1f349; 在线安装依赖环境&#xff1a; yum install gcc yum install socat yum install openssl yum install openssl-devel2. 安装Erlang&#x1f349; 去官网下载一下安装包&#xff0c;将安装包拉到Linux系…...

SAP CAP篇十:理解Fiori UI的Annoation定义

本文目录 本系列此前的文章官方文档和基础概念SAP CAP对Fiori UI的支持package.json的新增内容Annotation定义List Page 生成的Edmx文件 对应代码及branch 本系列此前的文章 SAP CAP篇一: 快速创建一个Service&#xff0c;基于Java的实现 SAP CAP篇二&#xff1a;为Service加上…...

不允许你不知道的 MySQL 优化实战(二)

文章目录 11、使用联合索引时&#xff0c;注意索引列的顺序&#xff0c;一般遵循最左匹配原则。12、对查询进行优化&#xff0c;应考虑在where及order by涉及的列上建立索引&#xff0c;尽量避免全表扫描。13、如果插入数据过多&#xff0c;考虑批量插入。14、在适当的时候&…...

JVM_00000

JVM 所谓虚拟机&#xff08;Virtual Machine&#xff09;就是一台虚拟的计算机。它是一款软件&#xff0c;用来执行一系列虚拟计算机指令。大体上&#xff0c;虚拟机可以分为系统虚拟机和程序虚拟机。 Visual Box&#xff0c;VMware就属于系统虚拟机&#xff0c;它们完全是对物…...

MCU嵌入式开发-硬件和开发语言选择

引入 RTOS的考虑因素 主要考虑以下方面来决定是否需要RTOS支持: 需要实现高响应时的多任务处理能力需要实现实时性能要求高的任务需要完成多个复杂的并发任务 NanoFramework 具备满足工控系统实时性要求的各项功能特性。通过它提供的硬件库、线程支持、中断支持等,可以完全控制…...

SVR算法简介及与其它回归算法的关系

目录 参考链接 有人可以帮助我理解支持向量回归技术和其他简单回归模型之间的主要区别是什么 支持向量回归找到一个线性函数&#xff0c;表示误差范围 (epsilon) 内的数据。也就是说&#xff0c;大多数点都可以在该边距内找到&#xff0c;如下图所示 这意味着 SVR 比大多数其…...

Rust系列(二) 内存管理

上一篇&#xff1a;Rust系列(一) 所有权和生命周期 通过前面的文章&#xff0c;目前我已经了解到了单一所有权、Move语义、Copy语义、可变和不可变借用以及引用计数。突然回首可以发现&#xff0c;Move 语义和 Copy 语义保证了值的单一所有权&#xff1b;而可变和不可变借用又可…...

VYaml | 超快速低内存占用yaml库

一、介绍 官方github仓库 YAML&#xff1a;YAML Ain’t Markup Language&#xff08;YAML 不是标记语言&#xff09;。 使用Unity2021.3 or later。 通过Unity Package Manager安装&#xff1a; https://github.com/hadashiA/VYaml.git?pathVYaml.Unity/Assets/VYaml#0.13.1 …...

动态规划01背包之1049 最后一块石头的重量 II(第9道)

题目&#xff1a; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 。那么粉碎的可能结果如下&#xff1a; …...

运输层(TCP运输协议相关)

运输层 1. 运输层概述2. 端口号3. 运输层复用和分用4. 应用层常见协议使用的运输层熟知端口号5. TCP协议对比UDP协议6. TCP的流量控制7. TCP的拥塞控制7.1 慢开始算法、拥塞避免算法7.2 快重传算法7.3 快恢复算法 8. TCP超时重传时间的选择8.1 超时重传时间计算 9. TCP可靠传输…...

本地部署drawDB结合内网穿透技术实现数据库远程管控方案

文章目录 前言1. Windows本地部署DrawDB2. 安装Cpolar内网穿透3. 实现公网访问DrawDB4. 固定DrawDB公网地址 前言 在数字化浪潮席卷全球的背景下&#xff0c;数据治理能力正日益成为构建现代企业核心竞争力的关键因素。无论是全球500强企业的数据中枢系统&#xff0c;还是初创…...

Spring Boot 中实现 HTTPS 加密通信及常见问题排查指南

Spring Boot 中实现 HTTPS 加密通信及常见问题排查指南 在金融行业安全审计中&#xff0c;未启用HTTPS的Web应用被列为高危漏洞。通过正确配置HTTPS&#xff0c;可将中间人攻击风险降低98%——本文将全面解析Spring Boot中HTTPS的实现方案与实战避坑指南。 一、HTTPS 核心原理与…...

【NLP】 38. Agent

什么是 Agent&#xff1f; 一个 Agent 就是能够 理解、思考&#xff0c;并且进行世界交互 的模型系统&#xff0c;并不是纯粹的 prompt 返回器。 它可以&#xff1a; 读取外部数据&#xff08;文件/API&#xff09;使用记忆进行上下文维持用类Chain-of-Thought (CoT)方式进行…...

LSTM-XGBoost多变量时序预测(Matlab完整源码和数据)

LSTM-XGBoost多变量时序预测&#xff08;Matlab完整源码和数据&#xff09; 目录 LSTM-XGBoost多变量时序预测&#xff08;Matlab完整源码和数据&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 普通的多变量时序已经用腻了&#xff0c;审稿人也看烦了&#…...

< 自用文 OS有关 新的JD云主机> 国内 京东云主机 2C4G 60G 5Mb 498/36月 Ubuntu22

攒了这么久&#xff0c;废话一些&#xff1a; 前几周很多事儿&#xff0c;打算回北京&#xff0c;开个清真的德克萨斯烤肉店&#xff0c;写了一篇 &#xff1a; &#xff1c; 自用文 Texas style Smoker &#xff1e; 美式德克萨斯烟熏炉 从设计到实现 &#xff08;第一部分&…...

奈飞工厂官网,国内Netflix影视在线看|中文网页电脑版入口

奈飞工厂是一个专注于提供免费Netflix影视资源的在线播放平台&#xff0c;致力于为国内用户提供的Netflix热门影视内容。该平台的资源与Netflix官网基本同步&#xff0c;涵盖电影、电视剧、动漫和综艺等多个领域。奈飞工厂的界面简洁流畅&#xff0c;资源分类清晰&#xff0c;方…...

【从零学习JVM|第二篇】字节码文件

前言&#xff1a; 通过了解字节码文件可以帮助我们更容易的理解JVM的工作原理&#xff0c;所以接下来&#xff0c;我们来介绍一下字节码文件。 目录 前言&#xff1a; 正确的打开字节码文件 字节码文件组成 1. 魔数&#xff08;Magic Number&#xff09; 2. 版本号&…...

JS 事件流机制详解:冒泡、捕获与完整事件流

JS 事件流机制详解&#xff1a;冒泡、捕获与完整事件流 文章目录 JS 事件流机制详解&#xff1a;冒泡、捕获与完整事件流一、DOM 事件流基本概念二、事件捕获 (Event Capturing)特点代码示例 三、事件冒泡 (Event Bubbling)特点代码示例 四、完整事件流示例HTML 结构JavaScript…...

GitOps 核心思想 - 当 Git 成为唯一信源

GitOps 核心思想 - 当 Git 成为唯一信源 在我们之前的 CI/CD 系列中,我们构建了一条流水线:GitHub Actions 在代码测试和构建通过后,执行 kubectl apply 命令将变更推送 (Push) 到 Kubernetes 集群。这种模式非常普遍且有效,但当系统规模和团队复杂度增加时,它可能会遇到一…...

webpack其余配置

webpack搭建本地服务器 首先是要安装一个webpack-dev-server npm install webpack-dev-server -D 安装后在package.json中添加&#xff1a; {"name": "babel_core_demo","version": "1.0.0","main": "index.js"…...