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

详解分库分表设计

详解分库分表设计

背景

​ 在传统的单机数据库架构中,所有数据都存储在同一个数据库中,随着业务规模的不断扩大,数据量和并发量也会越来越大,这会给数据库的性能和可用性带来挑战。此外,当单机数据库的容量达到瓶颈时,无法继续扩展,这也限制了应用程序的可扩展性。

​ 为了解决这些问题,分库分表技术应运而生。通过将数据分散存储在多个数据库或表中,可以减轻单一数据库的负载,提高系统的并发性能。此外,分库分表还可以支持水平扩展,使得系统能够随着业务的增长而不断扩展。

总之,分库分表是一种常用的数据库架构设计方案,可以解决数据库在数据量、并发性、可扩展性等方面面临的瓶颈问题,是大规模应用程序必不可少的技术之一。

为什么分库分表

  1. 数据量增大:当数据量逐渐增大时,单个数据库或表可能无法承载所有数据,导致性能下降,甚至崩溃

    分库分表可以将数据分散到多个数据库或表中,每个数据库或表都只负责一部分数据,从而提高系统的性能和可靠性。

  2. 提高并发能力:当多个用户同时访问同一个表时,容易造成数据库的性能瓶颈,导致响应变慢。

    分库分表可以将数据分散到多个数据库或表中,从而提高并发访问能力,减少系统的瓶颈。

  3. 数据隔离:在多租户场景下,不同的租户需要使用不同的数据库或表,以保证彼此的数据隔离。分库分表可以将不同租户的数据分散到不同的数据库或表中,从而保证数据的隔离性。

  4. 降低单节点的压力:当系统需要支持大量数据的读写操作时,单个数据库或表可能无法承载,此时可以将数据分散到多个数据库或表中,从而降低单个节点的压力。

什么是分库分表

  1. 分库:将一个数据库拆分为多个数据库

    1. 水平分库:指将一个大型数据库分成多个较小的、相似的数据库,每个数据库包含数据的不同部分

      例如:将用户数据根据其 ID 值的范围分配到用户库DB1、用户库DB2中。

      这种分片方式可以提高系统的扩展性和性能,因为可以将负载分散到多个数据库中

    在这里插入图片描述

    特点:

    1. 每个库的结构都一样,存储同一业务类型的数据

    2. 每个库的数据都不一样,没有交集

    3. 所有库的并集是全量数据

    4. 垂直分库:是指将一个大型数据库,根据业务关系分成多个较小的数据库。

      例如,将用户数据存储在用户库,订单数据存储在订单库中。

      这种分片方式可以提高系统的灵活性和可维护性,因为可以根据需要对不同的数据库进行单独的优化和维护

    在这里插入图片描述

    特点:

    1. 每个库的结构都不一样,存储不同业务类型的数据

    2. 每个库的数据都不一样,没有交集

    3. 所有库的并集是全量数据

    水平分库和垂直分库并不是互斥的概念,两者可以结合使用来实现更高效的数据库分片方案

  2. 分表:将一个数据表拆分为多个数据表

    1. 水平分表:是指将一个表中的数据按照某个规则分散到多个表中,这个规则通常是基于某个列的取值进行的

      例如,可以根据用户ID,通过范围、Hash、取余等规则将用户表分成多个子表,每个子表中存储特定范围内的用户数据

      水平分表可以提高数据查询效率,因为查询只需要在一个小的子表中执行,而不是在整个表中执行

在这里插入图片描述

  特点:1. 每个表的结构都一样,存储**同一实体、相同类型**的数据2. 每个表存的数据都不一样,没有交集3. 所有表的并集是全量数据
  1. 垂直分表:指将一个表按照列的方式进行分割,将一部分列存储到一个表中,另一部分列存储到另一个表中。这个分割通常是基于列的相关性进行的,典型的如主表和扩展表

    例如,可以将一个包含用户主要信息、用户辅助信息的表分成两个表,一个包含用户主要信息,另一个包含用户辅助信息。

    可以提高数据的存储效率,因为每个表只包含必要的列,而不是整个表的所有列。

在这里插入图片描述

  特点:1. 每个表的结构都不一样,存储**同一实体、不同类型**的数据2. 每个表存的数据都不一样,字段至少有一列交集,一般是主键,用于关联数据3. 所有表的并集是全量数据

拆分策略

  1. 范围切分:按照数据的某个范围将表拆分成多个子表。例如,可以按照时间范围将订单表拆分成每个月的子表。

    优点:

    水平扩展:按照范围进行分库分表可以实现水平扩展,当数据量增加时,可以方便地增加更多的数据库或表;比如以2000万标准拆分,超过2000万的转移到新表,而之前2000万内的记录就无需再做迁移了

    缺点:

    热点问题:如果某些数据访问频率很高,但是按范围切分后,又被分在同一个区段,这样大量请求会集中在这一区段,没有很好的负载均衡效果

  2. 按照哈希值切分:按照数据的哈希值将表拆分成多个子表。例如,可以使用用户ID的哈希值将用户表拆分成多个子表。

    HASH取模策略:指定的路由key(一般是主键ID)对分表总数进行取模,把数据分散到各个表中

    优点:

    ​ 负载均衡,没有明显的热点倾斜问题

    缺点:

    扩展不灵活,如果一开始按照HASH取模分成4个表了,未来某个时候,表数据量又到瓶颈了,需要扩容至,这就比较棘手了,需要重新进行数据迁移

  3. 按照地理位置切分:如果数据与地理位置相关,则可以按照地理位置将表拆分成多个子表。例如,可以按照城市将商家表拆分成多个子表。

  4. 按照业务类型切分:如果数据有不同的业务类型,则可以按照业务类型将表拆分成多个子表。例如,可以按照产品类型将商品表拆分成多个子表。

  5. 按照访问频率切分:如果某些数据被频繁访问,则可以将其放入单独的表中,以便更快地访问。例如,可以将最近一年的订单数据放入单独的表中,以便更快地查询最近的订单。

分库分表工具

  1. ShardingSphere:ShardingSphere是一套开源的分布式数据库中间件解决方案,支持分库分表、读写分离、数据加密等功能。

    官网:https://shardingsphere.apache.org/index_zh.html

  2. Mycat:Mycat是一款基于MySQL协议的开源分布式数据库中间件,支持分库分表、读写分离、数据分片等功能。

    官网:http://www.mycat.org.cn/

  3. TDDL:TDDL是阿里巴巴开源的一款分布式数据库中间件,支持MySQL、Oracle等数据库,提供了分库分表、读写分离、数据分片等功能。

  4. Cobar:Cobar是阿里巴巴开源的一款分布式数据库中间件,支持MySQL、PostgreSQL等数据库,提供了分库分表、读写分离、数据分片等功能。

分库分表问题

  1. 主键(自增 ID)唯一性问题:在表设计时,经常会使用自增 ID 作为主键,这就导致后续在迁库迁表、或者分库分表操作时,会因为主键的变化或者主键不唯一产生问题,解决方案主要有

    1. 采用分布式全局统一 ID 生成机制:如 UUID、雪花算法、数据库号段等方式
  2. 分布式事务:由于数据被分散在多个数据库或表中,事务的处理会变得更加复杂。例如,如果一个事务涉及多个数据库或表,那么如何保证这些操作的原子性就需要更加细致的设计。

  3. Join/分页查询:在分库分表的情况下,查询跨越多个数据库或表就变得更加复杂。例如,如果需要对一组数据进行全文搜索,那么就需要在多个数据库或表中执行查询,这可能会影响查询性能。

    1. 分开查询,再组装数据

    2. 冗余字段:如果每次join操作只是为了获取少量的字段,那么可以考虑直接将这些字段冗余到表上

    3. 数据同步:

      ​ 将数据源之间的数据同步到一个单独的数据仓库中,然后在这个数据仓库中进行join操作。这种方法可以解决跨库跨表的join问题,但是需要额外的存储和同步成本,并且可能存在数据同步延迟和一致性问题

  4. 数据迁移:在分库分表的情况下,如果需要将数据迁移到新的数据库或表中,就需要考虑如何迁移数据,并且在迁移的过程中如何保证数据的一致性。

  5. 系统复杂度:由于分库分表需要管理多个数据库或表,系统的复杂度也会随之增加。例如,需要考虑如何监控每个数据库或表的状态,如何处理数据库或表的故障等等问题。

  6. 数据迁移:在分库分表的情况下,如果需要将数据迁移到新的数据库或表中,就需要考虑如何迁移数据,并且在迁移的过程中如何保证数据的一致性。

  7. 系统复杂度:由于分库分表需要管理多个数据库或表,系统的复杂度也会随之增加。例如,需要考虑如何监控每个数据库或表的状态,如何处理数据库或表的故障等等问题。

相关文章:

详解分库分表设计

详解分库分表设计 背景 ​ 在传统的单机数据库架构中,所有数据都存储在同一个数据库中,随着业务规模的不断扩大,数据量和并发量也会越来越大,这会给数据库的性能和可用性带来挑战。此外,当单机数据库的容量达到瓶颈时…...

动态规划-基础(斐波那契数、爬楼梯、使用最小花费爬楼梯、不同路径、不同路径II、整数拆分、不同的二叉搜索树)

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的。动态规划问题,五步走:状态定义&am…...

深入理解WebSocket协议

“ 一直以来对WebSocket仅停留在使用阶段,也没有深入理解其背后的原理。当看到 x x x was not upgraded to websocket,我是彻底蒙了,等我镇定下来,打开百度输入这行报错信息,随即看到的就是大家说的跨域,或…...

Vector的扩容机制

到需要扩容的时候,Vector会根据需要的大小,创建一个新数组,然后把旧数组的元素复制进新数组。 我们可以看到,扩容后,其实是一个新数组,内部元素的地址已经改变了。所以扩容之后,原先的迭代器会…...

22讲MySQL有哪些“饮鸩止渴”提高性能的方法

短连接风暴 是指数据库有很多链接之后只执行了几个语句就断开的客户端,然后我们知道数据库客户端和数据库每次连接不仅需要tcp的三次握手,而且还有mysql的鉴权操作都要占用很多服务器的资源。话虽如此但是如果连接的不多的话其实这点资源无所谓的。 但是…...

10.0自定义SystemUI下拉状态栏和通知栏视图(六)之监听系统通知

1.前言 在进行rom产品定制化开发中,在10.0中针对systemui下拉状态栏和通知栏的定制UI的工作开发中,原生系统的下拉状态栏和通知栏的视图UI在产品开发中会不太满足功能, 所以根据产品需要来自定义SystemUI的下拉状态栏和通知栏功能,首选实现的就是下拉通知栏左滑删除通知的部…...

怎样在外网登录访问CRM管理系统?

一、什么是CRM管理系统? Customer Relationship Management,简称CRM,指客户关系管理,是企业利用信息互联网技术,协调企业、顾客和服务上的交互,提升管理服务。为了企业信息安全以及使用方便,企…...

Activity工作流(三):Service服务

3. Service服务 所有的Service都通过流程引擎获得。 3.1 RepositoryService 仓库服务是存储相关的服务,一般用来部署流程文件,获取流程文件(bpmn和图片),查询流程定义信息等操作,是引擎中的一个重要的服务。…...

算法--最长回文子串--java--python

这个算法题里面总是有 暴力解法 把所有字串都拿出来判断一下 这里有小小的优化: 就是当判断的字串小于等于我们自己求得的最长回文子串的长度,那么我们就不需要在进行对这个的判断这里的begin,还可以用来取得最小回文子串是什么 java // 暴…...

ElasticSearch-第二天

目录 文档批量操作 批量获取文档数据 批量操作文档数据 DSL语言高级查询 DSL概述 无查询条件 叶子条件查询 模糊匹配 match的复杂用法 精确匹配 组合条件查询(多条件查询) 连接查询(多文档合并查询) 查询DSL和过滤DSL 区别 query DSL filter DSL Query方式查…...

【AI大比拼】文心一言 VS ChatGPT-4

摘要:本文将对比分析两款知名的 AI 对话引擎:文心一言和 OpenAI 的 ChatGPT,通过实际案例让大家对这两款对话引擎有更深入的了解,以便大家选择合适的 AI 对话引擎。 亲爱的 CSDN 朋友们,大家好!近年来&…...

美团笔试-3.18

1、捕获敌人 小美在玩一项游戏。该游戏的目标是尽可能抓获敌人。 敌人的位置将被一个二维坐标 (x, y) 所描述。 小美有一个全屏技能,该技能能一次性将若干敌人一次性捕获。 捕获的敌人之间的横坐标的最大差值不能大于A,纵坐标的最大差值不能大于B。 现在…...

【12】SCI易中期刊推荐——计算机信息系统(中科院4区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…...

好不容易约来了一位程序员来面试,结果人家不做笔试题

感觉以后还是不要出面试题这环节好了。好不容易约来了一位程序员来面试。刚递给他一份笔试题,他一看到要做笔试题,说不做笔试题,有问题面谈就好了,搞得我有点尴尬,这位应聘者有3年多工作经验。关于程序员岗位&#xff…...

这几个过时Java技术不要再学了

Java 已经发展了近20年,极其丰富的周边框架打造了一个繁荣稳固的生态圈。 Java现在不仅仅是一门语言,而且还是一整个生态体系,实在是太庞大了,从诞生到现在,有无数的技术在不断的推出,也有很多技术在不断的…...

EEPROM芯片(24c02)使用详解(I2C通信时序分析、操作源码分析、原理图分析)

1、前言 (1)本文主要是通过24c02芯片来讲解I2C接口的EEPROM操作方法,包含底层时序和读写的代码; (2)大部分代码是EEPROM芯片通用的,但是其中关于某些时间的要求,是和具体芯片相关的,和主控芯片和外设芯片都有关系&…...

Django4.0新特性-主要变化

Django 4.0于2021年12月正式发布,标志着Django 4.X时代的来临。参考Django 4.0 release notes | Django documentation | Django Python 兼容性 Django 4.0 将支持 Python 3.8、3.9 与 3.10。强烈推荐并且仅官方支持每个系列的最新版本。 Django 3.2.x 系列是最后…...

MySQL高级面试题整理

1. 执行流程 mysql客户端先与服务器建立连接Sql语句通过解析器形成解析树再通过预处理器形成新解析树,检查解析树是否合法通过查询优化器将其转换成执行计划,优化器找到最适合的执行计划执行器执行sql 2. MYISAM和InNoDB的区别 MYISAM:不支…...

【Java】面向对象三大基本特征

【Java】面向对象三大基本特征 1.封装 On Java 8:研发程序员开发一个工具类,该工具类仅向应用程序员公开必要的内容,并隐藏内部实现的细节。这样可以有效地避免该工具类被错误的使用和更改,从而减少程序出错的可能。彼此职责划分清晰&#x…...

蓝桥杯C++组怒刷50道真题(填空题)

🌼深夜伤感网抑云 - 南辰Music/御小兮 - 单曲 - 网易云音乐 🌼多年后再见你 - 乔洋/周林枫 - 单曲 - 网易云音乐 18~22年真题,50题才停更,课业繁忙,有空就更,2023/3/18/23:01写下 目录 👊填…...

Shell自动化管理 for ORACLE DBA

1.自动收集每天早上9点到晚上8点之间的AWR报告。 auto_awr.sh #!/bin/bash# Set variables ORACLE_HOME/u01/app/oracle/product/12.1.0/dbhome_1 ORACLE_SIDorcl AWR_DIR/home/oracle/AWR# Set date format for file naming DATE$(date %Y%m%d%H%M%S)# Check current time - …...

Unity学习日记13(画布相关)

目录 创建画布 对画布的目标图片进行射线检测 拉锚点 UI文本框使用 按钮 按钮导航 按钮触发事件 输入框 实现单选框 下拉菜单 多选框选项加图片 创建画布 渲染模式 第一个,保持画布在最前方,画布内的内容显示优先级最高。 第二个,…...

初阶C语言:冒泡排序

冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。1.冒泡排序关于冒泡排序我们在讲…...

带头双向循环链表

在前面我们学习了单链表,发现单链表还是有一些不够方便,比如我们要尾插,需要遍历一遍然后找到它的尾,这样时间复炸度就为O(N),现在我们引入双向带头链表就很方便了,我们先看看它的结构。通过观察,我们发现一…...

C#中的DataGridView中添加按钮并操作数据

背景:最近在项目中有需求需要在DataGridView中添加“删除”、“修改”按钮,用来对数据的操作以及显示。 在DataGridView中显示需要的按钮 首先在DataGridView中添加需要的列,此列是用来存放按钮的。 然后在代码中“画”按钮。 if (e.Column…...

WEB安全 PHP基础

WEB安全 PHP基础 PHP简述 PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。 在一个php文件中可以包括以下内容:  PHP 文件可包含文本、HTML、…...

基础篇:07-Nacos注册中心

1.Nacos安装部署 1.1 下载安装 nacos官网提供了安装部署教程,其下载链接指向github官网,选择合适版本即可。如访问受阻可直接使用以下最新稳定版压缩包:📎nacos-server-2.1.0.zip,后续我们也可能会更改为其他版本做更…...

端口镜像讲解

目录 端口类型 镜像方向 观察端口位置 端口镜像实现方式 流镜像 Vlan镜像 MAC镜像 配置端口镜像 配置本地观察端口 配置远程流镜像(基于流镜像) 端口镜像是指将经过指定端口的报文复制一份到另一个指定端口,便于业务监控和故障定位…...

图形视图框架QGraphicsScene(场景,概念)

QGraphicsScene 该类充当 QGraphicsItems 的容器。它与 QGraphicsView 一起使用,用于在 2D 表面上可视化图形项目,例如线条、矩形、文本甚至自定义项目。 QGraphicsScene具有的功能: 提供用管理大量数据项的高速接口传播事件到每一个图形项…...

ChatGPT 拓展资料: 强化学习-SARSA算法

强化学习是一种机器学习技术,它关注的是在特定环境中,如何最大化一个智能体(agent)的累积奖励(reward)。强化学习算法会根据当前状态和环境的反馈来选择下一个动作,不断地进行试错,从而优化智能体的行为。 SARSA是一种基于强化学习的算法,它可以用于解决马尔可夫决策…...