数据库性能优化入门:数据库分片初探

数据库分片是一种用于提升数据库性能的架构模式,选择正确的分片策略和实施方式对于提高数据库性能和应对大规模数据挑战至关重要。

本文介绍了数据库分片的定义、原理和实施方法。文章解释了数据库分片是如何通过将数据切分、分散存储在多个服务器上来提升性能,并对数据库分片与传统数据库的区别进行了详细对比,探讨了何时应该考虑进行数据库分片。文章介绍了几种常见的分片策略,包括基于键、基于范围、垂直和基于目录的分片,并分析了它们的优缺点。文章还讨论了数据库分片的实施步骤和长期解决方案,强调了 TiDB 作为支持自动分片的分布式 SQL 数据库的优势 。

数据库分片是一种提升数据库性能的策略,通过把数据切分成若干部分,然后将这些部分分散存储在多个数据库服务器上。 这些被切分的数据部分称为“分片”,每个分片都包含数据的一部分。 把所有分片合起来,就构成了完整的数据集,且每条数据仅存储在一个分片中。 由于涉及更多的机器参与处理,分片能让数据库处理更多事务,存储更多数据。 对于那些需要高可扩展性的大型分布式系统,数据库分片特别有效。

数据库分片是一种“无共享”架构的体现,即每个分片操作独立的数据库服务器,不与其他分片共享任何计算资源。比如,下方左图展示了存储在计算机上的一个原始表:

若原始表非常大,查询操作就会变得非常缓慢。采用分片架构可以提升查询性能,如右图所示,数据被分成两部分,一部分存储在数据库服务器 DB1 上,另一部分则存储在 DB2 上。通过这种方式,把数据分散存储在多个服务器上,就实现了分片。

在设置数据库分片时,分片策略的选择将直接影响数据库性能。我们将在文后详细探讨不同的分片方法。这篇文章旨在深入介绍数据库分片的原理,并揭示这一流行架构模式的所有细节。

传统数据库的局限性

传统数据库通常运行在单一服务器上,无论是实体服务器、虚拟机还是其他形式的节点。这些系统的一个共同点是它们的性能存在上限。这也意味着,为了满足快速增长的数据处理需求,你可能需要将数据库迁移到更强大但成本更高的硬件上。一旦数据库超出当前机器的处理能力,你就必须重复这一过程。

还有另一种既昂贵又复杂的解决方法,你可以在你的环境中添加新的数据库硬件。但这需要某种方式智能地将数据分布在多台机器上,通过在多个数据库服务器上增加一个软件层或将这个能力添加到你的应用程序中来实现。这种做法非常普遍,业界也形成了专门的术语–数据库分片。

数据库分片和分区的区别是什么?

数据库分片与分区(partitioning https://docs.pingcap.com/zh/tidb/stable/partitioned-table ) 的主要区别在于其作用范围和数据分割的方式。分区发生在单个数据库服务器内部,将数据切分为多个段,即分区,但这些分区依然处于同一数据库系统内。这类似于在一个大仓库内划分不同的区域,而分片则相当于将货物分布到多个仓库中。每个分区,就像分片一样,包含数据集的一个子集,但所有分区都位于同一数据库服务器内。这种方式有助于管理大型数据表,并在不分散负载到多个服务器的情况下提升查询效率。

下图与前面的图相似。主要区别在于,原始表被分割成块,这些块位于单个数据库服务器上。分片的数据位于多个数据库服务器上。

虽然数据库分片通过将数据分割并分布到不同的数据库中以实现可扩展性,分区则在单个数据库内组织数据以实现高效管理和访问。两者都旨在提高数据库性能,只是实现方式不同。

分区和分片不是非此即彼的事情,数据库架构中二者结合的做法也是非常普遍的,在此我们不做赘述。

我何时考虑进行数据库分片?

决定何时以及是否对数据库进行分片,就像挑选扩展业务的恰当时机一样——时机与必要性并重。数据库分片并非万能钥匙,会引入一定的复杂性。

1 何时分片

  • 面对高流量与大数据量 :当数据库承受数百万用户或 TB 级别数据的压力开始挣扎时,分片便显得尤为必要。
  • 扩展性需求迫在眉睫 :业务快速成长,持续的数据与用户增长成为了新常态。
  • 性能遇到瓶颈 :查询反应迟缓,数据层面的瓶颈开始显现。

2 何时避免分片

  • 数据库规模尚小 :未触及存储或处理能力的上限。
  • 简单的工作量 :数据库未面临复杂查询或高交易量的挑战。
  • 技术资源受限 :分片需要专业的知识进行实施与管理,若团队尚未准备好迎接这种复杂性,最好暂缓行动。

记住, 数据库分片不是银弹,考虑周全后再决策是否适合你的数据库需求 。

分片架构的选择

分片策略的关键在于通过使用分片键,将数据高效分布至不同的分片中。不同的策略各有优缺点,选择应基于数据库的具体需求和特性。

1 基于键的数据库分片

基于键的分片利用特定值,如用户 ID 或时间戳,作为分片键。

如下图所示,我们选择了列 1 作为分片键。然后,我们对数据项应用哈希函数。哈希键决定了我们的数据将去往哪个分片。

基于键的分片有利于实现均匀分布数据。可随着数据增长,需要重新整理已有数据,维护成本较高。

2 基于范围的数据库分片(水平分片)

使用基于范围的分片方式会根据一系列值(如日期或地理位置)的范围进行数据分片划分。

在下图中,我们选择了基于 Paint Color 列进行分片, Paint Color 是一个数值。数据库将采用此数值以及分片范围来确定数据应该放置的位置。

这种方法根据范围(如字母顺序或日期范围)来实现数据分片,简单明了,非常适合时序数据这样具有清晰、均匀划分的数据类型。但如果某些范围比其他范围拥有更多数据(即热点),则可能导致数据分布不均。

3 垂直数据库分片

垂直分片根据表列分割数据,并将列分布在不同的分片中。这种模式用于将宽表分割成多个表,其中一个表比另一个表更窄,而这个更窄的表将包含最常查询的数据。如果需要查询第二个表数据的时候,你可以将第二个表与第一个表连接。

垂直分片适用于包含大量未使用列的表,通过隔离频繁访问的数据来提高性能。

4 基于目录的数据库分片

基于目录的分片策略根据表列分割数据,并将列分布在不同的分片中。

在下图中,我们再回到之前使用的 Paint Color 列。在这个例子中,我们使用字典(也称为查找表)将数据放置在特定的分片中。

此种分片策略适用于包含大量未使用列的表数据库,通过隔离频繁访问的数据来提高性能。

这种分片方法涉及使用查找目录来跟踪哪些数据在哪个分片上。虽然它提供了很大的灵活性并且可以很好地处理数据不均匀分布的问题,但引入的查找目录也带来了单点故障的风险。同时,维护和保持目录的一致性也是重要的考虑因素。

手动分片还是自动分片?

我们已经讨论了分片策略,但还有更关键细节:由谁来实施分片?换句话说,你可以手动分片你的数据库,或者你可以使用中间件层或可以有效自动分片数据的数据库。

让我们来看看我们可以使用哪些具体方法来实现手动分片或自动分片数据库:

1 自动分片:使用分布式 SQL 数据库

分布式 SQL 数据库本身就支持自动分片,大大简化了数据库的扩展和维护。

  • 优点:内置自动分片机制、具备可扩展性和高可用性,同时减少了维护工作量。
  • 缺点:可能需要从现有系统迁移和新的操作专业知识。其实所有分片方案都会涉及环境变化和新技能的学习。使用支持自动分片的分布式数据库提供了可靠的长期解决方案。

2 自动分片:中间件解决方案

中间件解决方案是指使用像 ProxySQL 或 Vitess 这样的为 MySQL 设计的分片中间件。这些工具部署在你的应用程序和数据库之间,透明处理分片逻辑。

  • 优点:简化了分片过程并对应用程序透明。
  • 缺点:增加了另一个需要管理的架构层级,并增加了学习曲线,这也意味着更高的软件、硬件和管理成本。

3 手动或自动分片:使用内置分片能力的数据库

如 MySQL Cluster 或 MariaDB 等数据库都包含内置分片功能,可以提供更 MySQL 原生的分片解决方案:

  • 优点:与 MySQL 生态系统的原生集成。
  • 缺点:可能比其他分布式 SQL 数据库的灵活性差,因为分片能力是后来加入的。相比起来,分布式 SQL 数据库则是从一开始就支持自动分片。

4 手动分片:应用层分片

应用层分片策略通过修改你的应用程序逻辑,以在多个数据库实例间分配数据。该策略让你有更多控制权,但需要大量的开发工作。

  • 优点:对分片逻辑有高度控制。
  • 缺点:需要大量的开发和维护工作。扩展数据库需要大量的规划,执行通常需要停机时间。实施这种策略往往会带来可能会在应用程序生命周期中不断重复的数据库咨询项目。

数据库分片项目步骤

数据库分片是一项复杂的工程,往往包含以下实施步骤:

  1. 确定分片需求:评估你的数据库以了解分片的需求。考虑因素如数据量、事务率和性能问题。
  2. 确定计算和存储需求:这是此过程中最重要的步骤之一。如果你正在对一个本地数据库进行分片,你可能需要购买硬件。如果你在云环境中运行,你需要估计所需虚拟机和存储的成本。当然,也别忘了软件。你可能需要额外的许可证或产品。如果你选择使用开源软件(非常推荐),你可能需要增加你的支持协议。
  3. 创建测试环境:测试环境在许多情况下简化了过程。尽管测试过程比较痛苦,但搞砸测试环境总比破坏生产系统要好。别忘了在你的规模文档中添加测试环境。
  4. 获取计算和存储资源:别忘了订购必要的软件和硬件。
  5. 选择分片策略:结合你的数据结构和使用模式,在前文中所介绍的分片策略中做出选择适合你的。
  6. 选择分片键:选择合适的分片键键以确保平衡的数据分布并最小化复杂的跨分片查询。
  7. 实施分片逻辑:这一步可在应用层完成。在数据库服务器之上增加一个分片层或使用支持自动分片的数据库管理系统。
  8. 测试:在上线前彻底测试分片数据库以确保数据完整性和性能。
  9. 监控和调整:实施分片后,持续监控分片数据库的性能,并在必要时重新平衡分片。

对于数据库分片的最佳长期解决方案

选择正确的数据库分片策略对于组织的成长至关重要。TiDB,由 PingCAP 开发的开源分布式 SQL 数据库,内置自动分片功能。它能为现代应用提供弹性扩展、实时分析和持续数据访问。使用 TiDB 进行 RDBMS 扩展以及互联网规模 OLTP 工作负载处理的公司可从以下方面获益:

  1. 与 MySQL 兼容 ( https://docs.pingcap.com/zh/tidb/stable/mysql-compatibility ):兼容 MySQL 8.0,使开发者可以利用 MySQL 生态系统中的丰富工具和框架。
  2. 水平可扩展 ( https://docs.pingcap.com/zh/tidb/stable/scale-tidb-using-tiup ):完全透明地处理数据工作负载,能根据需要即时扩展或缩减,无需手动分片。
  3. 高可用性 ( https://docs.pingcap.com/zh/tidb/dev/high-availability-faq ):在系统故障或网络问题时自动故障转移和自我修复,确保数据持续可访问。
  4. 强一致性:保持 ACID 事务的强一致性,即使是在全球分布数据时也能做到。
  5. 混合工作负载能力 ( https://docs.pingcap.com/zh/tidb/stable/quick-start-with-htap ):简化技术栈,使实时分析更加便捷,通过智能查询优化器选取最高效的查询执行计划。
  6. 混合云和多云支持 ( https://docs.pingcap.com/tidbcloud/tidb-cloud-intro ):支持在全球任意地点的公有云、私有云和混合云环境中部署数据库集群,兼容 VMs、容器或裸机部署。
  7. 开源:100%开源,遵循 Apache 2.0 许可,为业务创新开辟道路。
  8. 安全 ( https://cn.pingcap.com/law/ ):提供企业级数据加密,无论数据在传输中还是静态状态下均受保护。

结论

在我们探讨了数据库分片的复杂性和策略后,明显的结论是,尽管分片提供了一种强大的方法来处理大规模数据和高事务量,但它并不是一劳永逸的解决方案。特别是当考虑实施手动分片时,这一点尤为重要。因此,在决定分片之前,仔细评估数据库的规模、预期增长和可用的技术资源是非常必要的。

最终目标,无论是选择分片还是采取其他策略,都是确保数据库的可扩展性、高效性、易于维护性,并且能够满足应用程序当前和未来的需求。

在这方面,采用如 TiDB 这样支持自动分片的分布式 SQL 数据库,提供了一个理想的解决方案。它不仅能够应对规模的缩放挑战,还能够处理分片带来的复杂性,同时在处理大量数据时保持卓越的性能。这样的系统允许开发者专注于业务逻辑的实现,而不必过分担忧底层数据存储的细节,实现了技术架构的高效和灵活性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/298466.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux-程序地址空间

目录 1. 程序地址空间分布 2. 两个问题 3. 虚拟地址和物理地址 4. 页表 5. 解决问题 6. 为什么要有地址空间 1. 程序地址空间分布 测试一下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h>int ga…

计算机服务器中了halo勒索病毒怎么办,halo勒索病毒解密流程步骤

随着网络技术的不断应用&#xff0c;企业的生产运营得到了快速发展&#xff0c;越来越多的企业开始利用服务器数据库存储企业的重要信息文件&#xff0c;数据库为企业的生产运营提供了极大便利&#xff0c;但网络技术的不断发展也为企业的数据安全带来严重威胁。近日&#xff0…

全栈的自我修养 ———— react中router入门+路由懒加载

router 下载router配置view创建目录配置index.js 下载router npm install react-router-dom配置view 如下将组件倒出 const Login () > {return <div>这是登陆</div> } export default Login创建目录 配置index.js React.lazy有路由懒加载的功能&#xff0…

redis进阶入门配置与持久化

一、Redis.conf详解 容量单位 1、配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit,不区分大小写&#xff0c;G和GB有区别 2、对 大小写 不敏感 可以使用 include 组合多个配置问题 网络配置 bind 127.0.0.1 # 绑定的i…

递归算法讲解2

前情提要 上一篇递归算法讲解在这里 递归算法讲解&#xff08;结合内存图&#xff09; 没看过的小伙伴可以进去瞅一眼&#xff0c;谢谢&#xff01; 递归算法的重要性 递归算法是非常重要的&#xff0c;如果想要进大厂&#xff0c;以递归算法为基础的动态规划是必考的&…

【React】基于JS 3D引擎库实现关系图(图graph)

主角&#xff1a;3D Force-Directed Graph 简介&#xff1a;一个使用ThreeJS/WebGL进行3D渲染的Graph图库 GitHub: https://github.com/vasturiano/3d-force-graph Ps: 较为复杂或节点巨大时&#xff0c;对GPU>CPU消耗较大&#xff0c;同量级节点对比下优于AntV G6和Echarts…

RDD算子(四)、血缘关系、持久化

1. foreach 分布式遍历每一个元素&#xff0c;调用指定函数 val rdd sc.makeRDD(List(1, 2, 3, 4)) rdd.foreach(println) 结果是随机的&#xff0c;因为foreach是在每一个Executor端并发执行&#xff0c;所以顺序是不确定的。如果采集collect之后再调用foreach打印&#xf…

51之定时器与中断系统

目录 1.定时器与中断系统简介 1.1中断系统 1.2定时器 1.2.1定时器简介 1.2.2定时器大致原理及其配置 1.2.3定时器所需的所有配置总介 2.定时器0实现LED闪烁 3.使用软件生成定时器初始化程序 1.定时器与中断系统简介 1.1中断系统 首先&#xff0c;我们需要来了解一下什么…

Vue项目中引入html页面(vue.js中引入echarts数据大屏html [静态非数据传递!] )

在项目原有vue&#xff08;例如首页&#xff09;基础上引入html页面 1、存放位置 vue3原有public文件夹下 我这边是新建一个static文件夹 专门存放要用到的html文件 复制拖拽过来 index为html的首页 2、更改路径引入到vue中 这里用到的是 iframe 方法 不同于vue的 component…

python爬虫获取豆瓣前top250的标题(简单)

今天是简略的一篇&#xff0c;简单小实验 import requests from bs4 import BeautifulSoup# 模拟浏览器的构成&#xff08;请求头&#xff09; headers {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Ch…

从零开始搭建后端信息管理系统(新手小白比如)

如果你是新手小白&#xff0c;首先我们要进行一些准备工作&#xff0c;安装一些基础软件&#xff0c; 备注一下&#xff1a;这里安装的vue环境的后台管理系统&#xff0c;不同的后台管理系统&#xff0c;需要安装不同的插件 准备工作&#xff1a; 安装 Visual Studio Code …

如何使用 Midjourney?2024年最新更新

一&#xff1a;基础篇 1&#xff1a;注册 首先&#xff0c;你需要注册一个 Discord 账号&#xff0c;然后加入 Midjourney 的 Discord 服务器。或者去 Midjourney 的官网点击右下角的 Join the Beta&#xff1a; ​ 2&#xff1a;在 Discord 公共服务器里使用 注册并进入到…

Unix 网络编程, Socket 以及bind(), listen(), accept(), connect(), read()write()五大函数简介

Unix网络编程是针对类Unix操作系统&#xff08;包括Linux、BSD以及其他遵循POSIX标准的操作系统&#xff09;进行网络通信开发的技术领域。网络编程涉及创建和管理网络连接、交换数据以及处理不同层次网络协议栈上的各种网络事件。在Unix环境中&#xff0c;网络编程通常涉及到以…

kubectl explain资源文档命令

学习并使用了一段时间的kubernetes&#xff0c;发现对k8s还是了解甚少&#xff0c;于是利用上下班通勤的时间又去B站看一些大佬的视频&#xff0c;又来重学巩固一遍知识&#xff0c;并做些记录。 之前在学习使用过程中未成了解过explain这个命令&#xff0c;因为自己部署的版本…

【开发、测试】接口规范与测试

接口测试基础 url 是互联网标准资源地址&#xff0c;称为统一资源定位符 组成&#xff1a;协议&#xff0c;服务器地址&#xff0c;端口号 HTTP协议 HTTP&#xff1a;超文本传输协议&#xff0c;基于请求与响应的应用层协议 作用&#xff1a;规定了客户端和服务器之间的信…

NoSQL之Redis配置

文章目录 NoSQL之Redis配置一、关系数据库和非关系数据库1、关系型数据库2、非关系型数据库3、非关系型数据库产生背景4、关系型数据库和非关系型数据库的区别4.1 数据存储方式不同4.2 扩展方式不同4.3 对事务性的支持不同 5、总结5.1 关系型数据库5.2 非关系型数据库 二、Redi…

Anaconda/Python快速安装jieba 【win/mac】

一、直接上命令 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jieba 我是在PyCharm里面的终端输进去。 之后就很快速的看到成功的下图。 二、官网 官网下载的速度太慢了——这是官网地址https://pypi.org/project/jieba/#files 点进去之后点击下载&#xff0c…

Star GAN论文解析

论文地址&#xff1a;https://arxiv.org/pdf/1912.01865v1.pdf https://openaccess.thecvf.com/content_cvpr_2018/papers/Choi_StarGAN_Unified_Generative_CVPR_2018_paper.pdf 源码&#xff1a;stargan项目实战及源码解读-CSDN博客 1. 概述 在传统方法中&#x…

练习14 Web [极客大挑战 2019]Upload

phtml格式绕过&#xff0c;burp修改content-type绕过&#xff0c;常见的文件上传存放目录名 题目就叫upload&#xff0c;打开靶机 直接上传一个图片格式的一句话木马&#xff0c;返回如下&#xff1a; 提交练习5和9中的两种可以执行图片格式php代码的文件&#xff0c;修改con…

全面解析找不到msvcr110.dll,无法继续执行代码的解决方法

MSVCR110.dll的丢失可能导致某些应用程序无法启动。当用户试图打开依赖于该特定版本DLL文件的软件时&#xff0c;可能会遭遇“找不到指定模块”的错误提示&#xff0c;使得程序启动进程戛然而止。这种突如其来的故障不仅打断了用户的正常工作流程&#xff0c;也可能导致重要数据…