MySQL优化--主从同步,分库分表

news2024/11/24 15:23:49

目录

MySQL主从同步原理

 MySQL主从复制的核心就是二进制日志

面试回答

分库分表

分库分表的时机

分库分表的策略

垂直分库

垂直分表

水平分库

水平分表

分库分表的策略

分库之后的问题

面试回答


MySQL主从同步原理

如果项目上线了,通常情况下,会去搭建主从的架构,一个JAVA应用,首先要去廉价而数据库的中间件,中间件其中至少连接了两个库。当主库写数据的时候,就要把数据同步到从库,那是如何进行同步的呢?原理又是什么呢?

 MySQL主从复制的核心就是二进制日志

        二进制日志(BINLOG)记录了所有的 DDL(数据定义语言CREATE,DROP,OUT)语句和 DML(数据操纵语言INSERT,UPDATE,DELETE)语句,但不包括数据查询(SELECT、SHOW)语句。

        同步流程是这样的,当主库数据发生了变化,比如是一个写操作,也可以是DDL或者是DML,会把这些数据写到一个blog日志文件中,这时候,从库有一个IOthread线程,专门从主库的blog日志文件中读取数据,读取完成后,就会写入到从库的中继日志中,叫做Relay log。

        再由从库的SQLthread线程来读取中继日志的文件,把里面的命令在重新执行一次,执行完之后,主库和从库不就保持同步了吗

        复制主要分成三步:

Master 主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。

从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log

slave重做中继日志中的事件,将改变反映它自己的数据。

面试回答

面试官:MySQL主从同步原理

候选人:MySQL主从复制的核心就是二进制日志(DDL(数据定义语言)语句 和 DML(数据操纵语言)语句),它的步骤是这样的:

第一:主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。

第二:从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log 。

第三:从库重做中继日志中的事件,将改变反映它自己的数据

分库分表

在主从同步阶段,主库和从库的数据是一样的,主要解决的是访问的压力,让读写分开进行,它是解决不理海量数据存储的问题的,这个时候,就需要分库分表

当然分库分表也不是一开始就需要的,而是有前提的

分库分表的时机

1前提,项目业务数据逐渐增多,或业务发展比较迅速(单表的数据量达1000W20G以后 )

2,优化已解决不了性能问题(主从读写分离、查询索引

3IO瓶颈(磁盘IO、网络IO)、CPU瓶颈(聚合查询、连接数太多)

分库分表主要解决的是存储的压力,本来只有一个库,现在分了多个库进行存储,是不是就可以存储更多的数据,同时因为我有多个库,那我每一个节点是不是都可以处理用户的请求呢,是不是就可以增加用户的连接数

分库分表的策略

垂直分库

以表为依据,根据业务将不同表拆分到不同库中。

 

如图,这是一张电商的数据库,前面两张都是和用户有关系,中间两张都是和订单有关系,后面两张是和商品有关系

所以现在我们可以根据不同的业务将不同的表存储到数据库中,这就是典型的垂直分库。而微服务不就是不同的服务对应不同的数据库,如图,不同的服务与不同的数据库相对应

特点:

1按业务对数据分级管理、维护、监控、扩展

2在高并发下,提高磁盘IO和数据量连接数

垂直分表

以字段为依据,根据字段属性将不同字段拆分到不同表中。

拆分规则:

1,把不常用的字段单独放在一张表

2,把textblob等大字段拆分出来放在附表中

 

如图,前面的字段都是对于商品的基本描述,而最后的description描述则是大文本内容,所以我们将表拆为基本信息和详细信息,这两个表分别存储不同的数据,其中两张表之间是1对1的关系

特点:

1,冷热数据分离

2,减少IO过渡争抢,两表互不影响

水平分库

将一个库的数据拆分到多个库中。

当数据量越来越大,如果还放在一起可能会影响性能,这个时候我们就需要把他拆到各个库中进行存储。

 

如图,每个库中存储的数据是不一样的,所有的库加起来,才是这个订单业务的所有的数据,但是此时出现了一个问题,现在有三个库,那我们应该如何找到数据并且进行查询呢?

在我们查询的时候,其实是有一些路由的规则

1,根据id节点取模

2,按id也就是范围路由,节点1(1-100),节点2(100-200)

特点:

1,解决了单库大数量,高并发的性能瓶颈问题

2,提高了系统的稳定性和可用性

 

水平分表

将一个表的数据拆分到多个表中(可以在同一个库内)

特点:

优化单一表数据量过大而产生的性能问题;

避免IO争抢并减少锁表的几率;

分库分表的策略

在一开始的时候,我们的应用程序只是连接了其中的一个库,

现在我们一个应用程序连接了三个库,还要按照取模的方式去找到各个数据库,假如后面因为业务要求,又做了集群,实现起来就会越来越复杂,就会产生一系列的问题

分库之后的问题

1分布式事务一致性问题

        现在有多个库,多个表,现在要同时操作在不同数据库中的不同的表,每一个库都会管理自己的事务,假如有一个库它的提交失败了,这个时候是不是就会产生事务不一致的问题

2,跨节点关联查询

        假如做了分库分表,现在你的a库和b库分别存储的是不同的表,两张表还要进行关联,这个又怎么做呢

3,跨节点分页、排序函数

        和2一样,这种排序,分页又要怎么做呢,即使说是取模,那有应该怎么去分页查询这些数据呢

4,主键避重

        假如现在做了水平分库,每个库中存储的都是相同的表,每个表中的id可能都是自增的,会不会出现id重复的情况呢

为了避免上述问题的产生,一般在项目中使用分库分表的话,都会去增加一个中间件,进行关联,并且可以帮助我们降低开发的难度,并且可以帮助我们解决上述的问题

分库分表中间件。比如:

sharding-sphere

mycat

面试回答

面试官:你们项目用过MySQL的分库分表吗?

候选人: 嗯,因为我们都是微服务开发,每个微服务对应了一个数据库,是根据业务 进行拆分的,这个其实就是垂直拆分。

面试官:那你之前使用过水平分库吗?

候选人: 嗯,这个是使用过的,我们当时的业务是(xxx),一开始,我们也是单库,后 来这个业务逐渐发展,业务量上来的很迅速,其中(xx)表已经存放了超过 1000万的数据,我们做了很多优化也不好使,性能依然很慢,所以当时就使 用了水平分库。

我们一开始先做了3台服务器对应了3个数据库,由于库多了,需要分片,我 们当时采用的mycat来作为数据库的中间件。数据都是按照id(自增)取模 的方式来存取的。

当然一开始的时候,那些旧数据,我们做了一些清洗的工作,我们也是按照 id取模规则分别存储到了各个数据库中,好处就是可以让各个数据库分摊存 储和读取的压力,解决了我们当时性能的问题

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

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

相关文章

【Python开发】FastAPI 11:构建多文件应用

以往的文件都是将对外接口写在一个文件里边,而作为应用来说,接口是不可避免分散到多个文件中的,比如某文件负责注册登录模块,某文件负责内管模块,某文件负责业务模块等。FastAPI 也提供了APIRouter 这一工具来进行灵活…

kafka消息队列的初步探索

消息队列的作用就是提高运行速度,防止线程堵塞。 kafka的作用 异步 通过在消息队列发送消息的方式,将对应的业务作为监听者,此时我们只需要考虑发送消息的时间即可,大大提高了运行的速度。 解耦 如果使用原来的直接调用对应业务的…

【libdatachannel】pycharm运行streamer的信令服务及streamer与js客户端联调

启动py服务器 ssl必须额外指定 # Usage: ./server.py [[host:]port] [SSL certificate file]文档给出了服务的启动命令: python3 -m http.server --bind 127.0.0.1 8080 直接运行: python的信令服务 #!/usr/bin/env python # # Python signaling server…

需求分析引言:架构漫谈(二)非功能性需求

上一篇文章,简要介绍了架构的概念和架构设计流程,并简单介绍了需求分析的内容, 并在最后指出:需求分析的产出物,要包括非功能性需求,常见的非功能性需求如下: 完成任务的速度结果的精度操作的安…

MySQL实战解析底层---为什么表数据删掉一半,表文件大小不变

目录 前言 参数innodb_file_per_table 数据删除流程 重建表 Online 和 inplace 前言 数据库占用空间太大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变?这与数据库表的空间回收有关这里还是针对MySQL中应用最广泛的InnoD…

结构型设计模式07-享元模式

🧑‍💻作者:猫十二懿 ❤️‍🔥账号:CSDN 、掘金 、个人博客 、Github 🎉公众号:猫十二懿 享元模式 1、享元模式介绍 享元模式是一种结构型设计模式,旨在**通过共享对象来减少内存使…

CSS弹性布局常用设置

目录 一、单位元素 二、弹性容器 三、常用属性 三、项目实战效果 一、单位元素 vm 1vm 为视口的1% vh 视口高的1% vmin 参照长边 vmax 参照长边 rem 等比缩放 需要设置最外层盒子html设置vw 根字号html的--- font-- 1vm 去适配 初始化 //初始化*{padding: 0;margin: 0}//…

机器学习笔记 - 通过一个例子来快速理解自注意力机制/缩放点积注意力机制

一、一个简单的示例 请看下面的例句:A dog ate the food because it was hungry(一只狗吃了食物,因为它很饿) 例句中的代词it(它)可以指代dog(狗)或者food(食物)。当读这段文字的时候,我们自然而然地认为it指代的是dog,而不是food。但是当计算机模型在面对这两种选…

CVPR首个大模型研讨会顺利召开,吸引超1000支队伍参与文心大模型国际比赛

CVPR 作为计算机视觉和模式识别领域的世界级学术顶会,不仅是学者们展示前沿科技成果的学术会议,也是企业界探索前沿应用的一大平台。近年来,随着大模型技术的爆发式发展,基于大模型技术的创新应用正逐步在产业界释放出巨大价值空间…

网易云信陈丽:做泛娱乐出海新浪潮中的坚实助力者

6 月 16 日下午,在 PAGC 2023 泛娱乐出海论坛上,网易智企副总经理、网易云信总经理陈丽分享了对全球化出海的趋势洞察和未来展望,并介绍了网易云信在帮助泛娱乐出海业务增长方面的探索和实践。 陈丽表示,网易云信志在成为中国开发…

STM32开发——非标协议(DH11+LCD1602)

1.STM32分文件实现代码 编译的总文件夹dh11andlcd,C文件不能跨文件夹查找,新增的分文件,需要都放调用的文件夹下 C文件和H文件理解:H文件是门脸,放在前面给别人的,别人一看就知道有什么东西。C是给内部人用…

记录--新的HTML标签 :search

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本文介绍了一种新的HTML元素搜索方法,并提供了一个实用的工具来帮助开发者快速找到所需的元素。这对于那些需要处理大量HTML元素的开发者来说是非常有用的。文章还通过提供一些常见元素的用…

AutoSAR系列讲解(入门篇)1.1-AutoSAR的发展史

一、AutoSAR成员 大体可以分为核心成员、高级成员和发展成员,可以打开AutoSAR官网的成员的介绍界面 所以有兴趣的小伙伴可以稍微了解一下,仅作了解就行,不是什么重要的知识 还有一张大家经常能看见的成员图,如下 二、AutoSAR历史…

国潮之美丨土家族西兰姑娘续写千年非遗传奇

光脚丫,童年时期的行为艺术 还记得儿时的夏夜,姥爷总说:“娃儿呀,光着脚在地上跑,接地气些”。那时只觉得脱掉鞋袜顿时轻松自在,从坡上冲到坡下,几个伙伴乐此不疲。后来长大了,穿着…

盘点一个Python网络爬虫过验证码的问题(方法一)

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 低眉信手续续弹,说尽心中无限事。 大家好,我是皮皮。 一、前言 前几天在Python最强王者群【鶏啊鶏。】问了一个Python网络爬虫的…

SSH连接异常:从迷茫到石破天惊的解决之道

文章目录 零:前言一:SSH1.1 SSH的连接类型、方式和端口1.2 常见端口及其类型 二:解决SSH连接异常第一步:欣赏报错,顺藤摸瓜第二步:异常窥探,摸石过河第三步:问题确定,斩首…

测试技术体系

目录: 软件测试分类分层测试体系 1.软件测试分类 软件测试的分类_安全性测试属于功能测试吗_阿瞒有我良计15的博客-CSDN博客 1.单元测试(Unit Testing):单元测试是指对软件的最小可测试单元进行测试,例如一个函数、一…

Cell — 新“出芽”方法为疫苗开发带来优势

在疫苗学中,基于mRNA向体内递送抗原编码基因同基于纳米颗粒向体内递送抗原在应对具有挑战性的病原体方面都显示出巨大的前景。本期的《Cell》中,Hoffmann等人将两种方法相结合,通过调节被许多病毒劫持的相同细胞代谢通路来增强SARS-CoV-2疫苗…

【UCOS-III】自我学习笔记→第27讲→优先级翻转

文章目录 前言实验步骤1.复制二值信号量工程,添加task2和task3,修改任务服务函数名称2.修改开始任务,任务1以及任务2、3的内容3.查看串口现象![在这里插入图片描述](https://img-blog.csdnimg.cn/efa5ee2d92b54fe8be5a419adcf92ead.png) 测试…

STM32速成笔记—DMA

文章目录 一、什么是DMA二、DMA有什么作用三、STM32的DMA3.1 DMA请求3.2 DMA通道3.3 仲裁器 四、DMA配置4.1 DMA配置步骤4.2 DMA结构体成员 五、DMA配置程序5.1 ADC1初始化程序5.2 DMA初始化程序 一、什么是DMA DMA全程Direct Memory Access,即直接存储器访问。简单…