分库分表篇-1 分库分表介绍

news2024/11/17 21:20:22

文章目录

  • 前言
  • 一、为什么要分库分表?
  • 二、分库分表的策略:
    • 2.1 垂直切分:
      • 2.2.1 垂直分库:
      • 2.2.2 垂直分表:
      • 2.2.3 垂直拆分的优缺点:
    • 2.2 水平切分:
      • 2.2.1 库内分表:
      • 2.2.2 分库分表:
      • 2.2.3 水平切分优缺点:
  • 三、分库分表的实现方案:
    • 3.1 数据库代理类中间件:
    • 3.2 数据源代理实现:
  • 四、数据迁移:
    • 4.1 停机迁移:
    • 4.1 不停机迁移:
  • 总结:
  • 参考:


前言

随着单库中业务数据的增加,数据库的查询QPS越来越高,相应的,对数据库的读写所需要的时间也越来越多,数据库的读写性能可能会成为业务发展的瓶颈。对应的,就需要做数据库性能方面的优化。如果单表数据量过大,当数据量超过一定量级后,常规的优化手段已经不起作用了,比如:SQL调优、添加索引、主从复制、读写分离,这是量变产生了质变,这时候就需要去换个思路来解决问题,既然单台数据库无法容纳如此多的数据,那么就把这些数据分而治之,分散到不同的表甚至不同的库中去,以此解决单台数据库的性能瓶颈问题。


一、为什么要分库分表?

关系型数据库以MySQL为例,单机的存储能力、连接数是有限的,它自身就很容易会成为系统的瓶颈。当单表数据量在百万以里时,我们还可以通过添加从库、优化索引提升性能。一旦数据量朝着千万以上趋势增长,再怎么优化数据库,很多操作性能仍下降严重。为了减少数据库的负担,提升数据库响应速度,缩短查询时间,这时候就需要进行分库分表。分库分表有一下几个方面的优势:

  • 扩展性:当应用的数据量增长到单个数据库无法处理的规模时,分库分表可以提供更大的扩展性。通过将数据分布在多个数据库和数据表中,可以增加存储容量和吞吐量,以满足大规模并发请求。

  • 性能:拆分数据到多个数据库和数据表中可以提高查询和写入操作的性能。每个数据库和数据表都处理部分数据,减轻了单个数据库的负载压力,允许更高效的查询和数据操作。

  • 可用性:通过分库分表,可以实现多个独立实例,提高整体系统的可用性。如果一个数据库或数据表发生故障,其他数据库和数据表仍然可用,保持部分功能仍能正常运行,提高了系统的容错能力。

  • 管理和维护:大规模单一数据库的管理和维护成本往往很高。通过分库分表,可以将数据划分为更为管理和维护的单元,更便于对每个单元进行备份、恢复、优化和维护操作。

  • 安全性:分库分表可以提供更好的数据安全性。敏感或机密的数据可以存储在单独的数据库中,并进行额外的安全措施和权限管理,减少数据泄露和风险。

需要注意的是,分库分表并非在所有情况下都是必要的。分库分表需要综合考虑应用需求、数据模型、查询模式、数据一致性和系统复杂性等因素来决定是否进行分库分表,以及如何进行拆分和管理。

二、分库分表的策略:

分库分表就是要将大量数据分散到多个数据库中,使每个数据库中数据量小响应速度快,以此来提升数据库整体性能。核心理念就是对数据进行切分(Sharding),以及切分后如何对数据的快速定位与整合。针对数据切分类型,大致可以分为:垂直(纵向)切分和水平(横向)切分两种。

2.1 垂直切分:

垂直切分又细分为垂直分库和垂直分表;

2.2.1 垂直分库:

垂直分库是基于业务分类的,和我们常听到的微服务治理观念很相似,每一个独立的服务都拥有自己的数据库,需要不同业务的数据需接口调用。而垂直分库也是按照业务分类进行划分,每个业务有独立数据库。
在这里插入图片描述

2.2.2 垂直分表:

垂直分表是基于数据表的列为依据切分的,改变表结构,增加表的数量,是一种大表拆小表的模式。
在这里插入图片描述
数据库是以行为单位将数据加载到内存中,这样拆分以后核心表大多是访问频率较高的字段,而且字段长度也都较短,可以加载更多数据到内存中,增加查询的命中率,减少磁盘IO,以此来提升数据库性能。

2.2.3 垂直拆分的优缺点:

优点:

  • 数据隔离:垂直拆分可以将不同类型或功能的数据分离到不同的数据库中。这样可以避免不同数据之间的冲突、干扰和复杂性,提高数据的隔离性和独立性。

  • 性能提升:将热点数据与不常用的数据分离开来,可以对热点数据进行优化,提高查询和操作的性能。例如,将经常被查询的表放在高性能的服务器上,提供更快的响应时间。

  • 安全性提高:通过垂直拆分,可以将核心数据和敏感数据放置在独立的数据库中,并应用更严格的安全措施和权限控制。这样可以降低数据泄露和风险,提高数据的安全性。

  • 管理和维护的简化:垂直拆分将不同类型的数据分散到多个数据库中,简化了管理和维护的复杂性。可以更专注地管理每个数据库,并根据不同需求进行备份、优化和维护操作。

缺点:

  • 数据关联与一致性:垂直拆分容易导致数据之间的关联问题和一致性的挑战。如果需要跨数据库进行查询和操作,会增加开发和维护的复杂度,并可能引入数据不一致的风险。

  • 扩展性限制:垂直拆分可能对扩展性产生限制。如果一个特定表的数据量增长迅速,而其他表的数据却不增长或增长较慢,可能导致某些数据库的负载过重,需要重新调整拆分策略。

  • 跨库查询与事务:由于数据被拆分到不同的数据库中,跨库查询和事务的处理变得更加复杂和耗费资源。需要设计合适的机制来支持跨库操作和确保数据一致性。

总的来说,垂直拆分的优点包括数据隔离、性能提升、安全性增强和管理简化。但同时也带来了数据关联和一致性的挑战,以及对扩展性和跨库操作的限制。因此,在进行垂直拆分时需要仔细考虑业务需求和数据模型,确保拆分的合理性和可行性。

2.2 水平切分:

水平切分将一张大数据量的表,切分成多个表结构相同(表结构不变),而每个表只占原表一部分数据,然后按不同的条件分散到多个数据库中。水平切分又分有库内分表和分库分表。

2.2.1 库内分表:

库内分表虽然将表拆分,但子表都还是在同一个数据库实例中,只是解决了单一表数据量过大的问题,并没有将拆分后的表分布到不同机器的库上,还在竞争同一个物理机的CPU、内存、网络IO。

在这里插入图片描述

2.2.2 分库分表:

分库分表则是将切分出来的子表,分散到不同的数据库中,从而使得单个表的数据量变小,达到分布式的效果。

2.2.3 水平切分优缺点:

优点:

  • 扩展性:水平切分允许将数据行分布在多个数据库或数据表中,使得系统能够处理更大的数据量和更高的并发请求。通过横向扩展,可以提升系统的性能和容量。

  • 并发性能:由于数据行被分散处理,每个数据库或数据表只负责部分数据,可以并行处理并发请求,提高系统的响应速度和并发读写能力。

  • 高可用性:通过将数据行复制到不同的数据库或数据表中,水平切分提供了冗余备份机制,从而提高了系统的可用性。当某个节点或分片发生故障时,可以从其他节点获取数据,实现障转移与恢复。

  • 数据隔离:水平切分使得不同数据行分布在不同的数据库或数据表中,实现了数据的隔离和分离。这种隔离性可以提高系统的稳定性和可靠性,减少某个数据行的故障对其他数据行的影响。

缺点:

  • 数据一致性:水平切分可能导致数据的一致性问题。例如,跨多个数据库或数据表的查询可能需要额外的机制来保证数据一致性,如分布式事务处理或一致性哈希算法。

  • 查询复杂性:某些查询需要跨多个数据库或数据表获取数据,这会增加查询的复杂性和开销。需要特殊的查询机制来优化跨分片查询操作。

  • 分片管理:水平切分需要充分考虑数据行的划分和分片管理。均衡地划分分片,免部分分片负载过重,需要仔细的规划和管理。

  • 可操作性:水平切分后,数据库的操作和维护变得更加复杂。例如,备份和恢复需要分别处理每个分片,管理分布式系统的操作复杂度较高。

综上所述,水平切分能够实现扩展性、并发性能和高可用性的提升,同时也带来了数据一致性、查询复杂性、分片管理和操作复杂性的挑战。在进行水平切分时,需要仔细考虑业务需求、数据模型和系统架构,合理划分分片并设计相应的管理和查询机制。

三、分库分表的实现方案:

分库分表的实现可以通过 数据库代理或者数据源代理实现:
在这里插入图片描述

3.1 数据库代理类中间件:

这类分库分表中间件的核心原理是在应用和数据库的连接之间搭起一个代理层,应用连接这个代理层发送SQL请求,代理层再根据用户配置的分库分表等规则进行解析后,将SQL路由到真实的数据库,代表的产品是MyCAT。

在这里插入图片描述

优点:对于应用透明,应用可以像连接MySQL一样连接MyCAT,配置简单且无代码侵入
缺点:SQL需要进行额外的转发,且部署MyCAT增加组件运维成本,且对开发和运维人员要求较高

3.2 数据源代理实现:

代表框架为Sharding-JDBC:定位为轻量级Java框架,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

在这里插入图片描述
优点:性能高,无需额外部署和依赖
缺点:需要改动大量配置和SQL代码,且存在部分不兼容SQL的情况,代码侵入性高

四、数据迁移:

数据迁移 主要包括停机迁移和不停机迁移;

4.1 停机迁移:

停机迁移,将系统或服务停机,将数据从源环境迁移到目标环境,在此期间服务不可用,适用于短时间内可以完成数据迁移的场景;

4.1 不停机迁移:

不停机迁移是指在迁移过程中不中断系统或服务的运行,采用数据同步、分批迁移、双写模式或代理中间件等技术和方法来实现。在迁移过程中不中断系统或服务的运行,保持系统的可用性和连续性。
在这里插入图片描述
思想:

  • 对于历史的数据,截止一个时间点;
  • 对截止时间点的数据通过程序进行数据迁移;
  • 对于新产生的数据,通过cannal 将新产生的数据,同步到消息队列中;
  • 在历史数据迁移完成之后,通过程序,消费增量数据;
  • 增量数据消费完成之后,将新的数据库上线,旧的数据库下线;

总结:

随着业务数据量的增加,单库单表有明显的性能瓶颈,此时可以考虑对数据进行垂直或者水平的拆分,以达到多台db 数据库分担流量,提高数据库读写性能。

参考:

1 分库分表的实现;
2 分库分表策略;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

04-MySQL02

1、什么是索引下推? 索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。 需求: 查询users表中 "名字第一个字是张,年龄为10岁的所有记录"。 SELECT * FROM u…

无涯教程-JavaScript - FTEST函数

FTEST函数取代了Excel 2010中的F.TEST函数。 描述 该函数返回F检验的输出。 F检验返回两尾概率,即array1和array2的方差没有显着差异。使用此功能可以确定两个样本是否具有不同的方差。 语法 FTEST (array1, array2)争论 Argument描述Required/OptionalArray1The first ar…

【仿写spring之ioc篇】三、检查是否实现了Aware接口并且执行对应的方法

Aware接口 Aware接口中只是设置了对应的set方法,目前只定义了三个Aware 以BeanNameAware为例 package com.ez4sterben.spring.ioc.factory.aware;/*** bean名字清楚** author ez4sterben* date 2023/08/31*/ public interface BeanNameAware {/*** 设置beanName* …

老胡的周刊(第106期)

老胡的信息周刊[1],记录这周我看到的有价值的信息,主要针对计算机领域,内容主题极大程度被我个人喜好主导。这个项目核心目的在于记录让自己有印象的信息做一个留存以及共享。 🎯 项目 quivr[2] Quivr 是您在云中的第二个大脑&…

Mysql数据库事务隔离级别造成死锁

场景:如下代码,获取数据库连接,删除权限的时候,会造成数据库死锁. 代码 日志: 数据库: SHOW OPEN TABLES where In_use > 0; 问题分析:测试环境Centos7操作系统,Mysql5.7.40版本程序运行正常,开发环境Windows操…

设计模式行为型-模板模式

文章目录 一:模板方法设计模式概述1.1 简介1.2 定义和目的1.3 关键特点1.4 适用场景 二:模板方法设计模式基本原理2.1 抽象类2.1.1 定义和作用2.1.2 模板方法2.1.3 具体方法 2.2 具体类2.2.1 定义和作用2.2.2 实现抽象类中的抽象方法2.2.3 覆盖钩子方法 …

学生信息管理系统MIS(前端)

改造HTML文件 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>学生信息管理系统MIS</title><!-- link在HTML文件中,引入外部的css文件 rel的值是固定写法,stylesheet样式表href用来指定样式表的位置--><lin…

CleanMyMac X2024软件最新版本更新下载

CleanMyMac X是一款颇受欢迎的专业清理软件&#xff0c;拥有十多项强大的功能&#xff0c;可以进行系统清理、清空废纸篓、清除大旧型文件、程序卸载、除恶意软件、系统维护等等&#xff0c;并且这款清理软件操作简易&#xff0c;非常好上手&#xff0c;特别适用于那些刚入手苹…

企业架构LNMP学习笔记5

Nginx&#xff1a; 常见用法&#xff1a; 1&#xff09;web服务器软件 httpd http协议 同类的web服务器软件&#xff1a;apache Nginx&#xff08;俄罗斯&#xff09;IIS&#xff08;微软&#xff09;lighttpd&#xff08;德国&#xff09; 2&#xff09;代理服务器 反向代…

springboot:时间格式化的5种方法(解决后端传给前端的时间格式转换问题)推荐使用第4和第5种!

本文转载自&#xff1a;springboot&#xff1a;时间格式化的5种方法&#xff08;解决后端传给前端的时间显示不一致&#xff09;_为什么前端格式化日期了后端还要格式化_洛泞的博客-CSDN博客 时间问题演示 为了方便演示&#xff0c;我写了一个简单 Spring Boot 项目&#xff…

设计模式-工厂模式Factory

工厂模式 b.工厂方法模式 (Factory Method) (重点)1) 简单工厂 Simple Factory1.a) 简单工厂的好处 2) 工厂方法 Factory Method2.a) 对工厂进行抽象化 (版本一)2.b) 对工厂进行缓存 (版本二)2.c) 加载配置文件到缓存中 (版本三)c.1) 产品线 c.抽象工厂模式 (Abstract Factory)…

五子棋游戏禁手算法的改进

五子棋游戏禁手算法的改进 五子棋最新的禁手规则&#xff1a; 1&#xff0e;黑棋禁手判负、白棋无禁手。黑棋禁手有“三三”&#xff08;包括“四三三”&#xff09;、“四四”&#xff08;包括“四四三”&#xff09;和“长连”。黑棋只能以“四三”取胜。 2&#xff0e;黑方…

B端系统设计之【权限】详解

衡量B端产品系统好坏的一个重要标准就是它的权限是否细致&#xff0c;拓展性是否强。 权限管理是B端产品系统的基础&#xff0c;好的权限管理系统延展性较强&#xff0c;即使业务发生变化也能避免大改和推倒重建。 权限分类 1、功能权限 功能权限是指用户登录系统之后&#xff…

前端面试中Vue的有经典面试题三

11. 网页从输入网址到渲染完成经历了哪些过程&#xff1f; 大致可以分为如下7步&#xff1a; 输入网址&#xff1b; 发送到DNS服务器&#xff0c;并获取域名对应的web服务器对应的ip地址&#xff1b; 与web服务器建立TCP连接&#xff1b; 浏览器向web服务器发送http请求&a…

【自用】西门子s7-200连接显示屏和物联网盒子完整配置过程

总览 1.PLC配置 2.显示屏配置 3.物联网盒子配置 一、PLC配置 1.连接PLC软件 STEP-7MicroWIN V4.0 SP9完整版 链接&#xff1a;https://pan.baidu.com/s/17LMEXnbkQZMPI8Bte24Eug?pwdjsi3 提取码&#xff1a;jsi3 2.PLC配置 打开 PLC 上面的小盖子&#xff0c;把红色按钮…

【代码随想录day23】不同路径 II

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到…

3.1.6 练习 基于GPA排名计算本专业保研名单

C自学精简教程 目录(必读) GPA概念回顾 平均学分绩点GPA(Grade Point Average)是对一个学生大学学习成绩的综合的衡量指标。 在前面的文章 本科生学分绩点GPA计算 中&#xff0c;我们知道了什么是平均学分绩点GPA&#xff0c;以及如何计算它。 基于GPA给学生排名 现在我们…

介绍几种使用工具

FileWatch&#xff0c;观测文件变化&#xff0c;源码地址&#xff1a;https://github.com/ThomasMonkman/filewatch nlohmann::json&#xff0c;json封装解析&#xff0c;源码地址&#xff1a;https://github.com/nlohmann/json optionparser&#xff0c;解析选项&#xff0c;源…

4.(Python数模)0-1规划

Python解决0-1规划问题 参考下面文章 源代码 import pulp # 导入 pulp 库# 主程序 def main():# 投资决策问题&#xff1a;# 公司现有 5个拟投资项目&#xff0c;根据投资额、投资收益和限制条件&#xff0c;问如何决策使收益最大。"""问题建模&#x…

9. 微积分 - 导数

文章目录 导数求导实例代码演示:迭代法求解二次函数最小值阶Hi, 大家好。我是茶桁。 我们终于结束了极限和连续的折磨,开启了新的篇章。 不过不要以为我们后面的就会很容易,只是相对来说, 没有那么绕而已。 那么,我们今天开始学习「导数」。 导数 在之前的导论,也就是…