数据库-分库分表初探

news2024/9/24 23:21:53

文章目录

  • 分库策略
    • 垂直切分
      • 垂直分库(专库专用)
      • 垂直分表(拆表)
      • 优点
      • 缺点
    • 水平(Sharding)切分
      • 水平分表
      • 库内分表
      • 分库分表
      • 优点
      • 缺点
  • 分表策略
    • hash取模方案
    • range范围区间取值方案
    • 映射表方案
  • 分库分表问题
    • 事务一致性问题
    • 跨节点关联查询
    • 跨节点分页、排序函数
    • 主键避重
    • 公共表
  • 分库分表工具
  • 分库后的查询问题
  • 数据迁移
    • 停机迁移(一般都不允许)
    • 不停机迁移
  • 上线
  • TiDB分布式数据架构
  • 雪花算法(Snowflake)— 唯一ID的生成和管理
  • 美团实践

数据量在百万以里,可以通过Tina集从库、优化索引等提升性能
数据量超过千万,为了减少数据库的负担,提升数据库响应速度,缩短查询时间,需要进行分库分表

分库策略

推荐:采用垂直分库&水平分表
总结:分库要解决的是硬件资源的问题,不管是拆分字段,还是拆分数据,都是要拆到不同的数据库不同的服务器上,从硬件资源上解决性能瓶颈。而分表是解决单表数据量过大的问题,拆分完后还是放在同一数据库中不同表里面,只是减少了单表的读写锁资源消耗,如果性能瓶颈在硬件资源,只是简单的分表并不能从根本上解决问题,所有具体分库分表亦或者是结合使用都要结合具体的业务场景

垂直切分

垂直分库(专库专用)

每一个独立的服务(业务)都拥有自己的数据库,如订单、用户、商品

垂直分表(拆表)

基于数据表的列为依据切分,大表拆小表,拆的是表结构,如一个表内将常用和访问不频繁的字段分到不同表中存储,把text,blob等大字段拆分出来放在附表中

优点

  • 业务间解耦,不同业务的数据进行独立的维护、监控、扩展
  • 在高并发场景下,一定程度上缓解了数据库的压力

缺点

  • 提升了开发的复杂度,由于业务的隔离性,很多表无法直接访问,必须通过接口方式聚合数据,
  • 分布式事务管理难度增加
  • 数据库还是存在单表数据量过大的问题,并未根本上解决,需要配合水平切分

水平(Sharding)切分

水平分表

分的是数据,将一张大数据量的表,切分成多个表结构相同,而每个表只占原表一部分数据,然后按不同的条件分散到多个数据库中。

库内分表

表拆分了,但还在一个数据库内,还是存在竞争同一物理机的CPU、内存、网络IO

分库分表

将切分出来的子表,放到不同数据库

优点

  • 解决高并发时单库数据量过大的问题,提升系统稳定性和负载能力
  • 业务系统改造的工作量不是很大

缺点

  • 跨分片的事务一致性难以保证
  • 跨库的join关联查询性能较差
  • 扩容的难度和维护量较大,子表如果过多难以维护,增加系统复杂度

分表策略

hash取模方案

hash(key) % NUM_DB
id数据取模,按照不同的模值存放到不同表
优点:

  • 数据分片相对比较均匀,不易出现某个库并发访问的问题
  • 同维度的数据便于存到一个库内,便于查询定位,不用跨库查询
    缺点:
  • 当某一台机器宕机,本应该落在该数据库的请求就无法得到正确的处理,这时宕掉的实例会被踢出集群,此时算法变成hash(userId) mod N-1,用户信息可能就不再在同一个库中
  • 不便于分库,模值很难定义,后续数据量不断增多,如果再次分表比较麻烦,不利于水平扩展

range范围区间取值方案

可以是 ID 范围也可以是时间范围
按ID区间区分,0-10000,10000-20000
优点:

  • 单表数据量是可控的
  • 水平扩展简单只需增加节点即可,无需对其他分片的数据进行迁移
  • 可以分库存储,能快速定位要查询的数据在哪个库
    缺点:
  • 由于连续分片可能存在数据热点问题,如果按时间字段分片,有些分片存储最近时间段内的数据,可能会被频繁的读写,而有些分片存储的历史数据,则很少被查询

映射表方案

使用单独的一个数据库来存储映射关系

分库分表问题

事务一致性问题

由于分库分表把数据分布在不同库甚至不同服务器,不可避免会带来分布式事务问题。

跨节点关联查询

由于原来一张表的数据现在分布在不同数据库,不同表中,在涉及到多表关联,一定要设计好分片策略以及查询条件,否则很可能出现笛卡尔积现象,导致性能更低。

笛卡尔积现象:当进⾏多张表联合查询的时候,在没有任何条件进⾏限制情况下,最终查询结果条数是多张表记录条数的乘积!

跨节点分页、排序函数

跨节点多库进行查询时,limit分页、order by排序等问题,就变得比较复杂了。需要先在不同的分片节点中将数据进行排序并返回,然后将不同分片返回的结果集进行汇总和再次排序。

主键避重

不能在采用数据库自增主键,应采用分布式id,保证全局唯一。

公共表

实际的应用场景中,参数表、数据字典表等都是数据量较小,变动少,而且属于高频联合查询的依赖表。例如地理区域表也属于此类型。可以将这类表在每个数据库都保存一份,所有对公共表的更新操作都同时发送到所有分库执行。

分库分表工具

  • sharding-jdbc(当当)
  • TSharding(蘑菇街)
  • Atlas(奇虎360)
  • Cobar(阿里巴巴)
  • MyCAT(基于Cobar)
  • Oceanus(58同城)
  • Vitess(谷歌)
  • ShardingSphere(京东)

sharding-jdbc官网

分库后的查询问题

用户端:按照用户id,订单id(内部含userid后四位)
商家端:商家id,mq备份一下订单数据
运营管理端:查全量,非实时(数据仓库),实时(elasticsearch)

数据迁移

停机迁移(一般都不允许)

在这里插入图片描述

不停机迁移

有不断的增删改查
同步:
binlog日志、canal(阿里开源),同步两个表
增量同步的话可能会组件/数据冲突,update和delete会有问题,数据混乱
rocketmg延迟再传递一遍
运行一段时间,抽检,总数的比对等进行校验
在这里插入图片描述

上线

不会全量把老系统下掉
有损发布:
做一个灰度发布(用一部分流量打到新的系统),观察一段时间
少数情况下,数据到了新系统,旧系统没有,会有一部分数据问题
无损发布:
短暂灰度之后,全流量切

TiDB分布式数据架构

雪花算法(Snowflake)— 唯一ID的生成和管理

一种全局ID生成算法,其核心思想是将64位的long型ID分为四个部分,分别为:时间戳、工作机器ID、数据中心ID和序列号。通过将数据映射到具有特定结构的分布式系统中,实现数据的存储和查询。该算法由一系列节点组成,每个节点负责存储数据的一部分。这些节点通过哈希函数将数据映射到特定的位置,形成类似于雪花结构的分布式系统。通过这种方式,雪花算法能够在分布式系统中保证ID的唯一性和有序性。
在这里插入图片描述

美团实践

大众点评订单系统分库分表实践

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

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

相关文章

React16源码: React中的completeUnitOfWork的源码实现

completeUnitOfWork 1 )概述 各种不同类型组件的一个更新过程对应的是在执行 performUnitOfWork 里面的 beginWork 阶段它是去向下遍历一棵 fiber 树的一侧的子节点,然后遍历到叶子节点为止,以及 return 自己 child 的这种方式在 performUni…

php no input file specified

一、修改 .user.ini 文件 内容 open_basedir/wab/led-sht.com/:/tmp/ led-sportslight.com是项目根目录位置 改好后保存并清空缓存硬刷新网站就行了 二、mkdir(): Permission denied /core/library/think/cache/driver/File.php 第 84 行左右 mkdir(): Permission denied 这个…

如何用 500 行 SQL 实现 GPT2学习

目录 理论背景实现过程GenerationTokenizerEmbeddingsAttention为什么我们需要有因果掩码?为什么矩阵是 Q,K 和 V? BlocksTokens为什么要使用 softmax 转换概率?Inference 俄罗斯有个大佬每年都会用 SQL 来实现一个挑战庆祝新年&a…

JOSEF约瑟 JGL-15静态带时限过流继电器 柜内安装,板前接线

系列型号 JGL-11反时限过流继电器;JGL-12反时限过流继电器; JGL-13反时限过流继电器;JGL-14反时限过流继电器; JGL-15反时限过流继电器;JGL-16反时限过流继电器; 用途: JGL-15 反时限过流继电器…

(十)Head first design patterns组合模式(c++)

组合模式 组合模式在参考链接中已经讲得很好了,这里只简单讲讲就好。 组合模式的意图是表达部分-整体层次结构。 当你需要管理一个组合对象,又要管理这个组合对象的单个对象。这个时候就可以让这个组合对象和单个对象继承同一个基类,以便用…

Android14实战:调整A2DP音量曲线(五十三)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

【YOLO系列】 YOLOv4之SAT自对抗训练

一、简介 自对抗训练(Self-Adversarial Training,简称SAT)是一种新型的数据增强技术,旨在通过神经网络自身进行的对抗式攻击来提高模型的鲁棒性和泛化能力。其主要分为两个阶段: 第一阶段,神经网络会对其原…

C# wpf利用Clip属性实现截屏框

wpf截屏系列 第一章 使用GDI实现截屏 第二章 制作截屏框(本章) ______第一节 使用DockPanel制作截屏框 ______第二节 利用Clip属性实现截屏框(本节) 第三章 实现截屏框热键截屏 第四章 实现截屏框实时截屏 第五章 使用ffmpeg命令行实现录屏 文章目录 wp…

JVM系列-1.初识JVM

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理🔥如果感觉博主的文…

Netty篇章(1)—— 核心原理介绍

终于进入到Netty框架的环节了,前面介绍了大量的Java-NIO的内容,核心的内容Selector、Channel、Buffer、Reactor掌握了,那么学起来Netty也是水到渠成的事情。如果没有掌握前面的内容那么学Netty会非常吃力,下面讲解Netty核心原理与…

界面控件DevExpress ASP.NET Data Grid组件 - 可快速处理各类型数据!(一)

由DevExpress开发的快速且功能完整的ASP.NET Web Forms的Data Grid组件,从全面的数据塑造和数据过滤选项到十多个集成数据编辑器,该套件提供了帮助用户构建极佳数据所需的一些,没有限制! P.S:DevExpress ASP.NET Web …

探索设计模式的魅力:一次设计,多次利用,深入理解原型模式的设计艺术

原型模式是一种设计模式,属于创建型模式的一种,它用于创建重复的对象,同时又能保持性能。在原型模式中,通过复制现有对象的原型来创建新对象,而不是通过实例化类来创建对象。这样做可以避免耗费过多的资源开销&#xf…

关于缓存 db redis local 取舍之道

文章目录 前言一、影响因素二、db or redis or local1.db2.redis3. local 三、redisson 和 CaffeineCache 封装3.1 redisson3.1.1 maven3.1.2 封装3.1.3 使用 3.2 CaffeineCache3.1.1 maven3.1.2 封装3.1.3 使用 总结 前言 让我们来聊一下数据缓存,它是如何为我们带…

01 Redis的特性

1.1 NoSQL NoSQL(“non-relational”, “Not Only SQL”),泛指非关系型的数据库。 键值存储数据库 : 就像 Map 一样的 key-value 对。如Redis文档数据库 : NoSQL 与关系型数据的结合,最像关系…

Linux的一些快捷键(hot keyboard)

Ctrl Alt t:打开bash(就是命令框窗口) Ctrl Alt F3~F6:打开tty终端(纯命令行终端,每个Linux发行版不相同,我的是Ubuntu20版) Alt F4:关闭当前窗口(Windo…

扫地机器人(二分算法+贪心算法)

1. if(robot[i]-len<sweep)这个代码的意思是——如果机器人向左移动len个长度后&#xff0c;比现在sweep的位置&#xff08;现在已经覆盖的范围&#xff09;还要靠左&#xff0c;就是覆盖连续不起来&#xff0c;呢么这个len就是有问题的&#xff0c;退出函数&#xff0c;再…

HTTP 基本概念

1. HTTP &#xff08;Hypertext Transfer Protocol&#xff09;超文本传输协议&#xff0c;是互联网上应用最为广泛的协议之一。 小林coding的解析特别通俗易懂 https://xiaolincoding.com/network/2_http/http_interview.html#http-%E6%98%AF%E4%BB%80%E4%B9%88 协议&#…

elementPlust 的el-select在提示框关闭时自动弹出

问题&#xff1a; 当el-select添加filterable属性时&#xff0c;弹提示窗时&#xff0c;点击确定后&#xff0c;下拉框会自动弹出 分析&#xff1a; 主要问题就是因为filterable属性&#xff0c;根本解决方案是选中的时候让他失去焦点 el-select有一个visible-change事件&…

本地生活服务平台加盟,成功路上的注意事项

近年来&#xff0c;随着短视频的快速发展&#xff0c;本地生活服务成为了一个蓬勃发展的行业。作为创业者&#xff0c;加盟本地生活服务平台是一个有潜力的商机。然而&#xff0c;在决定加入并投资之前&#xff0c;有一些关键的注意事项需要考虑。 选择一个信誉良好、口碑较好的…

【PWN · 格式化字符串|劫持fini_array|劫持got表】[CISCN 2019西南]PWN1

格式化字符串的经典利用&#xff1a;劫持got表。但是遇到漏洞点只能执行一次的情况&#xff0c;该怎么办&#xff1f; 前言 如果存在格式化字符串&#xff0c;保护机制开的不健全&#xff0c;通常可以劫持got表&#xff0c;构造后门函数。然而&#xff0c;如果不存在循环、栈溢…