分库分表方案

文章目录

    • 分库分表设计思路
    • hash取模和范围方案
    • 最终方案采用hash取模和rang范围两者相结合

分库分表设计思路

首先分库分表有两种方式,一种是垂直拆分,一种是水平拆分。
垂直拆分
垂直拆分比较简单,也就是本来一个数据库,数据量大之后,从业务角度进行拆分多个库,就是一微服务下边一个库
水平拆分
当然如果用到了水平拆分前提一定是做了垂直拆分,然后如果某个业务表比如说订单表4000W数据了,那就把这订单表4000W数据拆分成四张表或者更多表,比如说1000W数据就拆分为一张表,这就是水平拆分。
分库分表所带来的问题
传统的分库分表方案,假设现在已经是把订单表拆分成4张表了,接下来新的数据假设是id为2W的时候落入哪一张表?超过4千万要做数据扩容了,扩容的方案是什么?怎么知道要分四张表?
业内两种解决方案

hash取模和范围方案

1、hash取模
在这里插入图片描述

hash的方案就是对指定的路由key(如:id)对分表总数进行取模。
在上图中,id=12的订单,对4进行取模,也就是会得到0,那此订单会放到0表中;
id=13的订单,取模得到为1,就会放到1表中。
为什么对4取模,是因为分表总数是4。
优点:
没有热点,订单的数据可以均匀的放入到4张表当中,均衡不会有热点问题
缺点:
难扩容难迁移,订单量很大超出了4000万的量,那就需要增加分表数,取模基数就会被改变,然后以前存的数据有可能因为取模基数变化而查询不到了,然后把之前的4000万数据,重新做一个hash方案,放到新的规划分表中。也就是要做数据迁移。这个是一件很痛苦的事情。
2、范围查找
在这里插入图片描述

意思就是把一定范围内的订单,存放到一个表中;
比如说0到1千万的数据放到0号表,1千万到2千万放到1号表。设计这个方案时就是前期把表的范围设计好。
通过id进行路由存放。
优点:
容易扩容,未来不需要做什么数据迁移
缺点:
就是很可能有热点,因为id的值会一直递增变大,那这段时间的订单是不是会一直在某一张表中,
如id=2000万 ~ id=3000万之间,这段时间产生的订单是不是都会集中到此张表中,这个就导致某表过热,压力过大,而其他的表没有什么压力,空闲着。。。

最终方案采用hash取模和rang范围两者相结合

0、思路
考虑一下数据的扩容代表着路由key(如id)的值变大了,这个是一定的,那我们先保证数据变大的时候,首先用range方案让数据落地到一个范围里面。这样以后id再变大,那以前的数据是不需要迁移的。
但又要考虑到数据均匀,那是不是可以在一定的范围内数据均匀的呢?
因为我们每次的扩容肯定会事先设计好这次扩容的范围大小,会做好约定,我们只要保证这次的范围内的数据均匀是不是就ok?
1、设计+方案
在这里插入图片描述
在这里插入图片描述

根据上两图id=15000在【0,1000万】范围内的,根据上面的流程设计,1000万以内的id都均匀的分配到DB_0,DB_1,DB_2三个数据库中的Table_0表中。
也就是组库表,意思就是先分组,再分库,再分表,比如说1到4000W都在分组1里边存着,分组1里边可以分为多个库,而每个库,比如说第一个库的表1就是1到1000w,第二个表就是1000W到2000W,第三个表存的是2000w到3000w,第四个表存是3000w到4000W,因为有可能库1的服务器配置性能配置比较好,所以可以这么存,而库2和其他几个库都可能服务器性能配置不太高,所以库2的表1就可以是存0到1000w,表2存1000w到2500w,表3存2500w到4000w这种,性能好的服务器配置就可以设计多一张表来存,这样大范围的定下来,然后在组库表里边进行取模定位数据。
2、定位数据如何进行定位?
定位查询id为15000的数据,首先根据范围定位是哪个分组,比如查询id为15000的数据是在分组1里边的,然后利用hash取模取表数最终结果来定位到哪个库,假设结果是到0号库,然后再根据0号库的范围来定位是最终的表。
3、为什么要根据hash取模取表数来定位哪个库呢?
因为要兼顾服务器的性能高低不同,安排服务器时,有些公司有些服务器的性能高,存储高,就可以安排多存放些数据,多劳多得;有些服务器的性能低,就少放点数据。
这样就解决了热点问题以及可以按照服务器指标,设计数据量的分配
因为如果利用取模是按照DB总数3,进行取模,那就代表着【0,4000万】的数据是平均分配到3个DB中的,那就不能够实现按照服务器能力适当分配了。
4、扩容方案:
在这里插入图片描述

如上图所示新增的一个group02组,完全是新增的group组,谈不上什么数据迁移,
而且这个group组照样就防止了热点,也就是【4000万,5500万】的数据,都均匀分配到三个DB的table_0表中,
【5500万~7000万】数据均匀分配到table_1表中。
设计新的分组,然后也是根据服务器性能配置,如果是配置一样,就分表均匀一些,如果配置不一样,就让服务器性能高的承担更多一些
5、如果定位不是以id进行,比如 where条件并不是id,而是其他字段,这个怎么定位呢?
分库分表如果不按id查询的话,以上设定的方案都是根据id来查询的,当然这个业务可能不一样,总的一套系统肯定要按照id查询,先确定哪一张表,那么那一张表是做一个映射的,尤其是做分布式的,那么id是最准确的,如果你确定要查询其他字段,那么就要做一些kv映射,只能是这样。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小红书前端2轮面试期望22K,全程问低代码设计

一面(通过) 1、好,那我们开始把,先简单介绍一下自己的一个经历,以及自己有亮点的项目?balabala 2、你可以这样介绍:在这里边主要负责哪几个项目,哪些项目是比较有亮点的&#xff0…

超市管理系统设计1——基本功能设计

超市管理系统基础功能类设计 1. 概述 本设计文稿提供一个基础的超市管理系统,包含基本的功能设计。该系统将管理商品、顾客、员工和交易记录,不需要接入数据库,通过文件存储数据,并满足面向对象编程的基本要求(继承、…

LabVIEW开发EOL功能测试系统

LabVIEW开发EOL功能测试系统 介绍了一种基于LabVIEW开发的EOL功能测试系统方案,涵盖软件架构、工作流程、模块化设计、低耦合性、易于修改与维护、稳定性及硬件选型。系统通过高效的CAN通信实现对电机控制器的全面测试,确保运行可靠并支持未来的升级需求…

媒体有入口,发稿有入口 是什么意思?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体有入口,发稿有入口是指在新闻媒体发稿时,稿件可以通过一定的路径被访问和浏览。具体来说,有入口的新闻稿件可以通过点击链接,逐步深入…

PyTorch深度学习实战(44)——基于 DETR 实现目标检测

PyTorch深度学习实战(44)——基于 DETR 实现目标检测 0. 前言1. Transformer1.1 Transformer 基础1.2 Transformer 架构 2. DETR2.1 DETR 架构2.2 实现 DETR 模型 3. 基于 DETR 实现目标检测3.1 数据加载与模型构建3.2 模型训练与测试 小结系列链接 0. 前…

第 10 章 动态参数(自学二刷笔记)

重要参考: 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 10.2动态参数 参数服务器的数据被修改时,如果节点不重新访问,那么就不能获取修改后的…

MySQL的组成与三种log

MySQL由几块组成 连接器分析器优化器执行器 MySQL的三大log blog 作用&#xff1a; 用于主从同步与数据恢复 记录内容&#xff1a; 已经完成的 DML(数据操作语句)&#xff0c;主要是用于数据备份 redolog<重试日志> 作用&#xff1a; 崩溃恢复&#xff0c;用于事…

Linux - 高级IO

目录 理解五种IO模型非阻塞IO的设置多路转接之select 实现一个简易的select服务器select服务器的优缺点 多路转接之poll 实现一个简易的poll服务器poll服务器的优缺点 多路转接之epoll epoll原理epoll的优势用epoll实现一个简易的echo服务器 epoll的LT和ET工作模式 什么是LT和…

【mysql】数据报错: incorrect datetime value ‘0000-00-00 00:00:00‘ for column

一、问题原因 时间字段在导入值0000-00-00 00:00:00或者添加 NOT NULL的时间字段时&#xff0c;会往mysql添加0值&#xff0c;此时可能出现此报错。 这是因为当前的MySQL不支持datetime为0&#xff0c;在MySQL5.7版本以上&#xff0c;默认设置sql_mode模式包含NO_ZERO_DATE, N…

实验名称:组合数据类型

大家好&#xff01;欢迎收听你的月亮我的心&#xff01;我是肖老师&#xff01;好久不见&#xff01; 目录 一、实验目的&#xff1a; 二、实验环境&#xff1a; 三、实验步骤&#xff1a; 四、实验结果&#xff1a; 1.已知列表li_one[1,2,1,2,3,5,4,3,5,7,4,7,8],删除列…

解决使用Python检查本地网络中运行的Web服务器的问题

如果我们要检查本地网络中运行的 Web 服务器&#xff0c;可以使用 Python 的 socket 模块来进行网络连接测试。以下是一个简单的示例代码&#xff0c;演示如何检查本地网络中运行的 Web 服务器&#xff1a; 1、问题背景 在学习如何使用 Python 时&#xff0c;一位用户希望编写…

C#的web项目ASP.NET

添加实体类和控制器类 using System; using System.Collections.Generic; using System.Linq; using System.Web;namespace WebApplication1.Models {public class Company{public string companyCode { get; set; }public string companyName { get; set; }public string com…

开始报名!龙蜥社区系统安全 Meetup 硬核议程发布

在数字化时代&#xff0c;随着云计算、大数据和人工智能等技术的广泛应用&#xff0c;操作系统扮演着关键的角色&#xff0c;成为支撑关键业务和数据的核心基础设施。在这一背景下&#xff0c;操作系统的安全性显得尤为重要&#xff0c;它直接影响着信息系统的稳定运行和持续发…

RocketMQ---Day1

RocketMQ---Day1 1.认识MQ 火车案例&#xff1a; 人就相当于消息 进站口将消息分发给不同的候车厅&#xff08;主题&#xff09; 火车将不同候车厅的人拉走&#xff08;消费不同主题里面的数据&#xff09; MQ是一种消息中间件。 2.微服务的远程调用 1.同步调用 RPC&am…

(Arkts界面示例)ets pages Demo

Index.ets 文件 import router from ohos.routerEntry//表示该自定义组件为入口组件 Component //表示自定义组件 struct Index {//表示组件中的状态变量&#xff0c;状态变量变化会触发UI刷新State changeValue: string State submitValue: string controller: SearchContr…

04.docker的主要组成部分

docker体验 docker是传统的CS架构分为docker client和docker server,跟mysql一样 查看版本命令&#xff1a;docker version 查看docker下载的是社区版,ce代表社区 rpm -qa |grep docker 查看docker系统命令 docker system docker info&#xff08;如果要做监控&#xff…

机器视觉开启航空安全新篇章:飞机复合材料检测研究进展,军工材料、智能装备和通信技术全产业链博览会

"精准把控行业标准&#xff1a;机器视觉在飞机垂尾复合材料检测中的应用" 随着航空航天技术的快速发展&#xff0c;飞机制造的质量控制要求越来越高&#xff0c;尤其是对于关键部件如垂尾复合材料零件的缺陷检测。基于机器视觉的检测技术因其非接触、高效率和高精度…

使用 Django Channels 构建实时聊天应用(包含用户认证和消息持久化)

文章目录 准备工作创建 Django 项目创建应用程序配置项目编写 Consumer编写路由创建 URL 路由运行应用用户认证消息持久化显示历史消息结论 Django Channels 是 Django 的一个扩展&#xff0c;允许在 Web 应用中添加实时功能&#xff0c;例如 Websockets、HTTP2 和其他协议。本…

虚拟机安装 RockyLinux为例

目录 一、VMWare、Xshell、Xftp、LinuxISO资料下载 二、VMWare安装 三、创建虚拟机 四、虚拟机安装过程的问题 一、VMWare、Xshell、Xftp、LinuxISO资料下载 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;6666 二、VMWare安装 三、创建虚拟机 四、虚拟机安装…

企业如何利用智能防止截屏保护商业机密

在数字化时代&#xff0c;企业商业机密的保护变得尤为重要。智能防止截屏技术作为一种先进的数据安全手段&#xff0c;能够帮助企业有效防止商业机密的泄露。本文将探讨企业如何利用这一技术保护其宝贵的商业信息。 一、商业机密面临的威胁 商业机密包括但不限于产品设计方案…