互联网三高-数据库高并发之分库分表

news2025/4/15 16:59:24

1 数据库概述

        1.1 数据库本身的瓶颈

                ① 连接数

                        MySQL默认最大连接数为100,允许的最大连接数为16384

                ② 单表海量数据查询性能

                        单表最好500w左右,最大警戒线800w

                ③ 单数据库并发压力问题

                        MySQL QPS:1500左右/秒

                ④ 系统磁盘IO、CPU瓶颈

        1.2 数据库架构演变升级

                (1)单机

                        请求量大查询就会变慢;单机不可用

                        

                (2)主从

                        主从同步,读写分离。从库可以水平扩展。满足更大读请求

                        但单服务器TPS、内存、IO等都有限

                   

                (3)双主(使用场景较少)

                        用户量上来了,写请求越来越多,一个master节点不能解决问题,添加多个主节点

                        多个主节点数据要保持一致性,写操作需要两个master之间同步,流程更加复杂              

                (4)分库分表

                        分库分表是通过‌垂直拆分‌或‌水平拆分‌对数据库进行物理或逻辑层面的分割,以解决单库单表的性能瓶颈(如连接数限制、数据量过大、硬件资源不足)和数据管理复杂度问题‌。                   

面试题:开发的项目业务增长,数据库优化思路

        思路:① 先问清楚业务增长量,平均大概增长多少

                   ② 千万不要一上来就说分库分表,要根据实际情况分析

        (1)数据库优化

                1)硬优化:如果资金充裕,可以先优化硬件条件

                        提升系统硬件,更快的IO,更多的内存,带宽、CPU、磁盘等

                2)软优化

                        ① 数据库参数优化

                        ② 分析慢查询SQL语句,分析执行计划,进行SQL改写或程序改下

                        ③ 优化索引结构

                        ④ 优化数据表结构

                        ⑤ 引入NoSQL和程序架构调整

        (2)分库分表(如果单表数据量超过1000w或者并发量特别大,还是建议分库分表)

                ① 根据业务情况而定,选择合适的分库分表策略

                ② 先看只分表是否满足需求和未来增长

                ③ 如果单分表不能满足需求,再分库分表一起

        总结:

                ① 在数据量和访问压力不是特别大的情况下,首先考虑数据库优化

                ② 如果数据量极大,且业务增长块,在考虑分库分表方案

2 分库分表的问题

        ① 跨节点数据库 join 关联查询

        ② 分库操作带来的分布式事务问题

        ③ 执行的SQL排序、翻页、函数计算问题

        ④ 数据库全局主键重复问题(以前使用的自增ID就会出现问题)

        ⑤ 容量规划,分库分表二次扩容问题

        ⑥ 分库分表技术选型问题

3 常见分库分表方案

项目、技术负责人需要有前瞻性思维

        ① 需要提前考虑1到2年的业务增长情况

        ② 对数据库服务器(QPS、连接数、容量等)做合理评估和规划

        3.1 垂直分表

                大表拆小表:基于列字段进行,分离热点字段和非热点字段,避免大字段IO

                ① 把不常用的字段放在一张表

                ② 把text、blob等大字段拆分出来一张表

                ③ 业务经常组合查询的列放在一张表中

        3.2 垂直分库

                微服务架构,就做了垂直分库,每个服务使用自己的库

        问题:垂直分库分表可以提高并发,但是依然没有解决单表数据量过大的问题。

        3.3 水平分表

                数据拆分:把一个大表分割成N个小表,表结构一样,数据不一样

                主要解决单表数据量过大的问题,减少锁表时间

        3.4 水平分库

                把同一个表数据按照一定规则分到不同的数据库中,数据库在不同的服务器上

                水平分库的粒度,比水平分表大

                多个数据库,降低系统的IO和CPU压力

        注意:水平分库分表,选择合适的分片键和分片策略,和业务场景相配合

4 分库分表常见策略

        4.1 range范围(更多适用于水平分表)

                (1)数字范围

                        自增ID,根据ID范围进行分表(左闭右开)

                        优点:ID自增长,可以无限;扩容不用迁移数据,容易理解和维护

                        缺点:数据倾斜严重,热点数据过于集中,部分节点有瓶颈,整体利用率低

                (2)时间范围

                        年、月、日范围

                        使用场景:流水数据、日志信息

                (3)空间范围

                        地理位置:省份、区域划分(华东、华中、华南...)

                        使用场景:外卖、物流等            

        4.2 Hash取模

                库ID = hashcode % 库数量

                表ID = hashcode / 库数量 % 表数量

                

                优点:保证数据较均匀的分散在不同的库、表中,可以有效的避免热点数据集中问题

                缺点:扩容不是很方便,需要数据迁移

5 分库分表技术选型

        ① TDDL(Taobao Distributed Data Layer)

                淘宝根据自己业务特点开发的

                基于JDBC规范,没有server,以client-jar形式存在,引入项目即可使用

                开源功能比较少,阿里内部使用为主

        ② Mycat

                网址:| MYCAT官方网站—中国开源分布式数据库中间件

                遵守MySQL原生协议,跨语言、跨平台、跨数据库的通用中间件代理

                基于proxy,复写了MySQL协议,将Mycat server伪装成一个MySQL数据库       

        ③ ShardingJDBC

                网址:Apache ShardingSphere

                Apache ShardingSphere 是一款分布式的数据库生态系统,包括Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar

                基于JDBC驱动,不用额外proxy,支持任意实现JDBC规范的数据库

                以jar包形式提供服务,无需额外部署和依赖

   

面试题:Mycat 和 ShardingJDBC 的区别

两者设计理念相同,主流程都是 SQL解析 -> SQL路由 -> SQL改写 -> 结果归并
        ShardingJDBC

                ① 基于JDBC驱动,不用额外proxy,在本地应用重写JDBC原生的方法,实现数据库分片形式

                ② 是基于JDBC接口的扩展,是以jar包的形式提供轻量级服务,性能高

                ③ 代码有侵入性

        Mycat

                ① 是基于proxy,复写了MySQL协议,将Mycat server 伪装成一个MySQL数据库

                ② 客户端所有的JDBC请求都必须要先交给Mycat,再由Mycat转发到具体的真实服务器
                ③ 缺点是效率偏低,中间包装了一层

                ④ 代码无侵入性

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

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

相关文章

UE5 在UE中创建骨骼动画

文章目录 创建动画的三种方式修改骨骼动画 创建动画的三种方式 方法一 打开一个已有的动画,左上角“创建资产/创建动画/参考姿势” 这将创建一个默认的A字形的骨骼,不建议这么做 方法二 打开一个已有的动画,左上角“创建资产/创建动画/当前…

[ctfshow web入门] web38

信息收集 过滤多了php和file if(isset($_GET[c])){$c $_GET[c];if(!preg_match("/flag|php|file/i", $c)){include($c);echo $flag;}}else{highlight_file(__FILE__); }解题 更多解法参考 [ctfshow web入门] web37 我们选个最简单的。但是因为php被过滤了我们改用…

汽车CAN总线采样点和采样率详解

写在前面 本篇文章主要讲解在汽车电子中CAN总线采样率的相关知识点,内容涉及CAN波特率、采样点、时间份额、同步跳转宽度以及采样率的计算。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 1、CAN波特率 CAN波特率常规分为250kbps和500kbps,本文章主要以这两个波特率为…

Maven error:Could not transfer artifact

问题描述 当项目从私有仓库下载依赖时,Maven 报错,无法从远程仓库下载指定的依赖包,错误信息如下: Could not transfer artifact com.ding.abcd:zabk-java:pom from/to releases (http://192.1122.101/repory/mavenleases/): 此…

pytorch 反向传播

文章目录 概念计算图自动求导的两种模式 自动求导-代码标量的反向传播非标量变量的反向传播将某些计算移动到计算图之外 概念 核心:链式法则 深度学习框架通过自动计算导数(自动微分)来加快求导。 实践中,根据涉及号的模型,系统会构建一个计…

WindowsPE文件格式入门06.手写最小PE

https://bpsend.net/thread-346-1-1.html 实现目标 实现目标:手写实现不大于 200 Byte大小的PE文件(又名:畸形PE/变形PE),要求MessageBox弹框显示一个字符串。实现要点:充分利用空间,在保证遵…

并发编程--互斥锁与读写锁

并发编程–互斥锁与读写锁 文章目录 并发编程--互斥锁与读写锁1. 基本概念2. 互斥锁2.1 基本逻辑2.2 函数接口2.3示例代码12.4示例代码2 3. 读写锁3.1 基本逻辑3.2示例代码 1. 基本概念 互斥与同步是最基本的逻辑概念: 互斥指的是控制两个进度使之互相排斥&#x…

记录第一次使用H5的WebBluetooth完成蓝牙标签打印机的(踩坑)过程

第1步 首先第一步,调试环境必须是https的,由于浏览器的强制安全策略,本地可以采用localhost 第2步 然后,如果打印需要服务UUID(Service UUID) 和 特征UUID(Characteristic UUID)&…

【WRF理论第十七期】单向/双向嵌套机制(含namelist.input详细介绍)

WRF运行的单向/双向嵌套机制 准备工作:WRF运行的基本流程namelist.input的详细设置&time_control 设置&domain 嵌套结构&bdy_control 配置部分 namelist 其他注意事项Registry.EM 运行 ARW 嵌套双向嵌套(two-way nesting)Moving …

React 学习 JSX

APP根组件被index.js渲染到public下的index.html下 JS中写 HTML 代码 渲染列表 条件渲染 复杂条件渲染 事件绑定 传递自定义参数 button标签中写箭头函数引用的格式 自定义参数和事件本身对象都想要的情况

大模型论文:Language Models are Few-Shot Learners(GPT3)

大模型论文:Language Models are Few-Shot Learners(GPT3) 文章地址:https://proceedings.neurips.cc/paper_files/paper/2020/file/1457c0d6bfcb4967418bfb8ac142f64a-Paper.pdf 一、摘要 我们证明了,扩大语言模型的规模在任务无关的 few…

一周学会Pandas2 Python数据处理与分析-Pandas2数据导出

锋哥原创的Pandas2 Python数据处理与分析 视频教程: 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 任何原始格式的数据载入DataFrame后,都可以使用类似 DataFrame.to_csv()的方法输出到相应格式的文件或者…

深入解析栈式虚拟机与反向波兰表示法

1.1 什么是虚拟机? 虚拟机(Virtual Machine, VM)是一种软件实现的计算机系统,提供与物理计算机相类似的环境,但在软件层面运行。虚拟机的存在简化了跨平台兼容性、资源管理以及安全隔离等问题。 1.2 栈式虚拟机的架构…

学习MySQL的第八天

海到无边天作岸 山登绝顶我为峰 一、数据库的创建、修改与删除 1.1 引言 在经过前面七天对于MySQL基本知识的学习之后,现在我们从基本的语句命令开始进入综合性的语句的编写来实现特定的需求,从这里开始需要我们有一个宏观的思想&…

AI识别与雾炮联动:工地尘雾治理新途径

利用视觉分析的AI识别用于设备联动雾炮方案 背景 在建筑工地场景中,人工操作、机械作业以及环境因素常常导致局部出现大量尘雾。传统监管方式存在诸多弊端,如效率低、资源分散、监控功能单一、人力效率低等,难以完美适配现代工程需求。例如…

GD32F303-IAP的过程和实验

使用的芯片为GD32F303VC 什么是IAP呢?有个博主写的很清楚;就是远程升级; 【单片机开发】单片机的烧录方式详解(ICP、IAP、ISP)_isp烧录-CSDN博客 我们需要写一个boot 和APP 通过 boot对APP的程序进行更新&#xf…

众趣科技助力商家“以真示人”,让消费场景更真实透明

在当今的消费环境中,消费者权益保护问题日益凸显。无论是网购商品与实物不符、预定酒店民宿与图文描述差异大,还是游览景区遭遇“照骗”,这些问题不仅让消费者在消费和决策过程中倍感困扰,也让商家面临信任危机。 消费者在享受便…

spark core编程之行动算子、累加器、广播变量

一、RDD 行动算子 reduce:聚集 RDD 所有元素,先聚合分区内数据,再聚合分区间数据。 collect:在驱动程序中以数组形式返回数据集所有元素。 foreach:分布式遍历 RDD 元素并调用指定函数。 count:返回 RDD…

提高课:数据结构之树状数组

1&#xff0c;楼兰图腾 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm>using namespace std;typedef long long LL;const int N 200010;int n; int a[N]; int tr[N]; int Greater[N], lower[N];int lowbit(int x) {ret…

基于javaweb的SpringBoot新闻视频发布推荐评论系统(源码+部署文档)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…