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

这篇具有很好参考价值的文章主要介绍了一文详解什么是数据库分片。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


 文章来源地址https://www.toymoban.com/news/detail-564263.html

概要

 

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

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

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

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

 

什么是数据库分片?

 

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

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

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

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

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

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

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

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

 

分片之前有哪些选择?

 

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

选项 1:什么也不做。

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

选项 2:垂直缩放

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

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

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

选项 3:复制

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

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

选项 4:专业数据库

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

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

 

如果必须的话进行分片

 

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

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

它是如何工作的?

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

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

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

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

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

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

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

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

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

 

基于键的分片

 

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

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

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

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

 

基于范围的分片

 

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

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

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

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

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

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

 

基于关系的分片

 

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

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

跨分片事务

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

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

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

两阶段提交

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

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

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

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

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

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

 

结论

 

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

 

 

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

 

到了这里,关于一文详解什么是数据库分片的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库问题记录(粗略版)oracle、mysql等主流数据库通用

    1. ORA-00918:未明确定义列 该问题情况大致为:select 所取列名错误、重复等问题。 2. “select * from temp where 1=0; ”的含义 布尔值为FALSE,只返回表结构,不返回数据。 举一反三: select * from temp where 10 , 布尔值为TRUE,返回所有数据记录; select * from temp where 1=0, 暂不清楚是何

    2024年02月07日
    浏览(48)
  • DBeaver连接mysql、oracle数据库

    1) 下载DBeaver https://dbeaver.io/download/,并安装 2) 新建数据库连接    3)选择mysql驱动程序  4)填写连接设置内容 5)点击 “编辑驱动设置”,并填写相关信息  6)选择本地自己下载的驱动库jar包 (也可以点击下载驱动)  7)完成后,点击测试连接,可以查看是否连接成功

    2024年02月05日
    浏览(64)
  • 查询数据库空间(mysql和oracle)

    1.查看数据库表空间文件: 2.查看所有表空间的总容量: 3.查看数据库表空间使用率 4.1.查看表空间总大小、使用率、剩余空间 4.2.查看表空间使用率(包含temp临时表空间) 5.查看具体表的占用空间大小 1.更改表空间的dbf数据文件分配空间大小 2. 为表空间新增一个数据文件(表空间

    2024年02月05日
    浏览(45)
  • 数据库去重(MYSQL和ORACLE)

    一、数据库中的去重操作(删除数据库中重复记录的SQL语句)主要有三种方法 (1)、rowid方法 (2)、group by 方法 (3)、distinct方法 1、用rowid方法 根据Oracle带的rowid属性,可以进行判断是否存在重复语句; (1)、查出表1和表2中name相同的数据 Select * from table1 a Where rowid !=

    2024年02月09日
    浏览(45)
  • PLSQL连接Oracle 数据库配置详解

    1. 下载instantclient-basic-win32-11.2.0.1.0 Oracle Instant Client - Free tools and libraries for connecting to Oracle Database (oracle官网下载地址:http://www.oracle.com/technetwork/topics/winsoft-085727.html , 下载地址2:http://download.csdn.net/detail/czw2010/5732241)    2. 解压instantclient-basic-win32-11.2.0.1.0并放置在oracle安

    2024年02月07日
    浏览(55)
  • Oracle数据库中的table@xyz是什么意思?

    是DBlink访问外部表的语法。xyz是其他Oracle数据库在你所登录的用户下建立的Dblink名。通过这种方式访问其他数据库中的表。 在Oracle数据库中,表名后跟着@符号和一个连接字符串(xyz)是一种用法,它用于指定要访问的远程数据库。 当在一个Oracle数据库中访问另一个Oracle数据

    2024年02月05日
    浏览(61)
  • 从 Oracle 到 MySQL 数据库的迁移之旅

    目录 引言 一、前期准备工作 1.搭建新的MySQL数据库 2 .建立相应的数据表 2.1 数据库兼容性分析 2.1.1 字段类型兼容性分析 2.1.2 函数兼容性分析 2.1.3 是否使用存储过程?存储过程的个数?复杂度? 2.1.4 是否使用触发器?个数?使用的场景? 2.2 建表过程中其他需要注意的事项

    2024年04月11日
    浏览(49)
  • Mysql和Oracle数据库死锁查看以及解决

    一、Mysql数据库死锁排查 SQL : SQL: SQL: 示例: 备注:通过查看事务的trx_started(开始时间)来判断该事务的阻塞时间。 SQL  : 备注:线程ID指的是 1.1.3步骤中查询出来的 trx_mysql_thread_id。 SQL : 示例 : 字段解析 : SQL : 示例: SQL : 备注:多个session用逗号隔开。 View Code   造

    2024年01月20日
    浏览(44)
  • 【MySQL】一文带你了解数据库约束

    作用: 数据库约束是用于限制数据输入或数据更新的规则。数据库约束确保在表中只能插入符合规则的数据,以确保数据的完整性和一致性。 常见的数据库约束包括: 主键约束:用于唯一标识表中的每一行数据,确保数据唯一性和完整性。 外键约束:用于确保表之间数据的

    2024年02月08日
    浏览(70)
  • 一文详解python中的数据库操作

    最近做毕设,需要添加个数据库,记录一下。 重点介绍数据库API接口中的连接对象和游标对象 1. 连接对象 数据库连接对象主要提供获取数据库游标对象和提交/回滚事务的方法,以及关闭数据库连接。 使用connect函数获取对象,该函数有多个参数: host 主机名 database/db 数据库

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包