SQL进阶理论篇(十七):数据库主从同步的原理

文章目录

  • 简介
  • 为什么需要主从同步
  • 主从同步的原理
  • 总结
  • 参考文献

简介

以MySQL数据库为例,在实际生产中,我们会如何对MySQL数据库进行性能优化呢?

比如说配合上Redis做缓存。Redis是一种高性能的内存数据库,而MySQL是一种基于磁盘文件的关系型数据库。Redis胜在读取速度极快,而MySQL虽然读取慢,但是可以持久化。因此实际工作中,我们经常将Redis作为缓存与MySQL配合使用。

当有数据请求进来时,会先从Redis里进行缓存查找,如果存在就直接取出,这样就不用再访问数据表,从而提升了读取的效率,也减少了后端数据库的访问压力。

基于Redis的这种缓存架构,是高并发架构中常用的一环。

在这里插入图片描述

除此之外,我们也可以对MySQL做主从架构进行读写分离,让主服务器(Master)处理写请求,从服务器(Slave)处理读请求,以此提升数据库的并发处理能力。

本节将会从以下几个方面来了解主从同步:

  • 主从同步的作用
  • 主从同步的原理和常见的问题

为什么需要主从同步

首先我们需要知道,并不是所有的应用都适合对数据库进行主从架构的设置,毕竟架构本身是有成本的。

如果你的目的是提升数据库并发访问的效率,那么首先应该做的是优化你的查询SQL和索引,这种方式简单且非常高效。其次才是采用缓存的策略,如引进Redis,利用Redis的高性能查询优势,将热数据保存在内存中,提升读取的效率。最后才是对数据库进行主从架构,进行读写分离。

上面三种方案,使用和维护的成本是由低到高的。

主从同步的设计在提高数据库吞吐量的同时,还有以下3个方面的作用。

  • 读写分离

通过主从复制的方式来同步数据,通过读写分离来提高数据库的并发处理能力。

简单的说,就是一份数据被放在了多个数据库里,其中一个数据库是主库Master,负责所有写操作,其他的数据库是从库Slave,负责所有读操作。

当主库的数据被更新后,会自动的将数据同步到所有的从库。而我们通过客户端提交的数据读取申请,都会由从库来处理。这就是读写分离。

读写分离在互联网领域的作用很明显。因为互联网的应用大多是"读多写少",所以采用读写分离的方式,可以实现更高的并发访问。

原先所有的读写压力都是由一台服务器来承担,现在加入了多个兄弟来帮助它处理读请求,大大降低了主服务器的负担。同时提高了写和读流程的性能。

另外,我们还可以对从库做负载均衡,按策略将不同的读请求均匀的分配给不同的从库,进一步提升了读流程的性能。

而且,读写分离的架构下,也减少了锁表的影响,主库的写锁肯定是影响不到从库的读的。

  • 数据备份

基于主从复制,将主库的数据复制到从库,相当于是一种热备份机制,即在不影响主库运行的情况下做的备份。更加保障安全。

  • 高可用性

当主服务器出现故障或者宕机的情况下,可以迅速将一个从服务器切换成主服务器来履行职能,从而保障服务的正常运行,大大提高了容灾性。

关于高可用性的程度,确实是有一个指标可以来度量:正常可用时间/全年时间

比如要达到全年99.999% 的时间都可用,就意味着系统在一年中的不可用时间不得超过 5.256 分钟。而且这5分钟里还包含了日常维护时的停机时间、系统崩溃时间等。

所以,更高的可用性,意味着更高的成本代价。日常生产中应该酌情选择。

主从同步的原理

首先我们需要了解数据库中的一个极其重要的日志文件,即binlog二进制日志,它记录了数据库所有更新的事件,

主从同步,就是基于binlog进行同步。在主从复制的过程中,存在3个线程,一个是主库线程,另外两个是从库线程。

二进制日志转储线程(binlog dump thread),是一个主库线程。当从库线程连接的时候,主库会将二进制日志发送给从库。而主库在读取更新事件时,则会将binlog上锁,待更新事件完成后,再将锁打开(考虑到数据一致性)。

从库IO线程用于连接主库,向主库发送更新binlog的请求。之后从库IO线程就可以读取到主库二进制日志转储线程发送过来的binlog,并拷贝到本地形成中继日志(Relay log)。

接着就是最后一个线程,从库SQL线程登场。它会读取从库保存下来的中继日志,并且执行日志中的更新事件,即将主库的更新事件在从库上再来一遍,从而使得从库的数据跟主库保持一致。

在这里插入图片描述

因此,主从同步的内容,实际上就是二进制日志(binlog)

虽然叫做二进制日志,但它内部存储的是一个一个事件(Event),这些事件分别对应着数据库的更新操作,如insert、update和delete等。

另外,有的版本的MySQL默认是关闭二进制日志的,因此在进行主从同步的架构时,需要先检查服务器是否已经开启了二进制日志

接着我们考虑一个问题,既然主从同步传输的是一个文件,那么进行传输的过程中必定是有网络延迟的,那么这个时间里,用户读取的从库数据就不是最新数据了,跟主库数据不一致,这种情况下该怎么办呢?
下一节会简单介绍一下这个问题。

总结

在配置主从架构的时候,如果想要采取读取分离的策略,可以选择自己编写程序,也可以通过第三方的中间件来实现。

自己编写程序还是有好处的,比如说我们可以自行判断什么样的查询可以在主库上,什么样的查询可以在什么样的从库上等。

中间件的话,胜在全面稳定,且使用简单,当然,在客户端和数据库之间添加一层中间件势必会带来一些性能的损耗,而且好用的商业中间件也是有成本的。开源的中间件的话,可以看看MaxScale,是MariaDB开发的MySQL数据中间件。如下图,使用MaxScale作为数据库的代理,通过路由转发来完成读写分离。同时配合上MHA工具来作为主从切换的工具(保障容灾),从而完成MySQL的高可用架构。

参考文献

  1. 35丨数据库主从同步的作用是什么,如何解决数据不一致问题?

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

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

相关文章

docker-compose安装Rocketmq总结,以及如何更换mq端口

默认你已经装好了docker哈 安装docker-compose sudo curl -L https://github.com/docker/compose/releases/download/1.25.1-rc1/docker-compose-uname -s-uname -m -o /usr/local/bin/docker-composechmod x /usr/local/bin/docker-composedocker-compose --version成功打印…

截断霍夫曼编码

截断霍夫曼编码是一种数据压缩技术,它基于霍夫曼编码的原理,通过截断霍夫曼树,减少编码中的冗余信息,实现更高效的数据压缩。在本文中,我们将详细探讨截断霍夫曼编码的原理、应用及其优势。 一、霍夫曼编码简介 霍夫曼…

12.21 汇编点亮STM32MP157小灯

.text .global _start _start: 时钟使能pb6 pf6 pe9LDR r0,0x50000A28LDR r1,[r0]ORR r1,r1,#(0x1<<4)ORR r1,r1,#(0x1<<5)ORR r1,r1,#(0x1<<1)STR r1,[r0]配置GPIO模式LDR r0,0x50006000LDR r1,[r0]BIC r1,r1,#(0x2<<20)ORR r1,r1,#(0x1<<20)B…

kubernetes集群应用 service进阶

kubernetes集群应用 Service进阶 一、场景 使用kubernetes集群运行工作负载时&#xff0c;由于Pod经常处于用后即焚状态&#xff0c;Pod对应的IP地址也会经常变化&#xff0c;因此我们不能直接访问Pod&#xff0c;可以通过Service对应的端点列表&#xff08;Endpoints&#x…

PaddleOCR Docker 容器快捷调用,快捷调用OCR API

文章目录 搞环境命令行测试Python调用测试转fastapi服务打包成镜像服务PaddleOCR 服务端模型总结&#xff0c;直接启动OCR服务 paddleOCR迎来大更新&#xff0c;搞一把新的api接口&#xff0c;直接用起来。 搞环境 搞容器&#xff1a; FROM nvidia/cuda:11.8.0-cudnn8-devel…

Python importlib模块详细教程

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com importlib模块是Python标准库中用于动态导入模块的工具。它提供了一系列函数&#xff0c;允许以编程方式加载、检查和操作模块。本文将深入探讨importlib的各种用法&#xff0c;并通过丰富的示例代码帮助你更好地…

华清作业day46

.text .global _start _start: led1 设置时钟使能 ldr r0,0x50000A28 ldr r1,[r0] orr r1,r1,#(0x1<<4) str r1,[r0]设置输出模式 ldr r0,0x50006000 ldr r1,[r0] bic r1,r1,#(0x3<<20) orr r1,r1,#(0x01<<20) str r1,[r0]设置推挽输出 ldr r0,0x5000600…

在QT Creator下用CMake编译GEOS库

最近&#xff0c;想要在C下编一个可用GDAL模块的地图管理系统&#xff0c;找来找去&#xff0c;找到了GEOS。GEOS&#xff08;Geometry Engine-Open Source&#xff09;开源几何引擎 是一个用于计算几何的JTS库的 C/C实现&#xff0c;专注于地理信息系统 &#xff08;GIS&#…

速通Python基础语法--语句篇

缩进和代码块 一 条件语句if/elif if的基本语法 示例 条件语句嵌套 练习1 练习2 二 空语句 三 while循环 示例 打印1-10 求1-100的和 求5! 求1-5的阶乘之和 四 for循环 for的基本语法 1~range[ ,) 五 continue/break continue:结束当前循环,继续下一次循环 break:结束整个循…

《每天一分钟学习C语言·四》文本读写操作及二进制读写

fopen(参数1,参数2)&#xff0c;第一个参数是要打开的文件名&#xff0c;文件名字符串&#xff0c;第二个参数用于制定文件打开模式的一个字符串。 注&#xff1a;如果要打开某个盘的文本如F盘test文件夹下的test.txt文本&#xff0c;则fopen(“F:\test\test.txt”,”r”); 程序…

AcWing算法进阶课-1.1.2Dinic/ISAP求最大流

算法进阶课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 题目描述 给定一个包含 n n n 个点 m m m 条边的有向图&#xff0c;并给定每条边的容量&#xff0c;边的容量非负。 图中可能存在重边和自环。求从点 S S S 到点 T T T 的最大流。 输入格式 第一行包…

本地websocket服务端结合cpolar内网穿透实现公网访问

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…

黑马头条--day07--app文章搜索

目录 一.安装elasticsearch 1.拉取镜像 2.创建存放数据及配置文件的文件夹&#xff0c;启动时挂载。 4.修改文件夹权限 5.启动容器 5.1参数解释 6.安装ik分词器 6.2测试一下Ik分词器 二.添加文章索引库 1查询所有的文章信息&#xff0c;批量导入到es索引库中 2)测试 …

深度盘点:除了BRC20外 这些公链潜力铭文也值得关注

近日的铭文市场风起云涌&#xff0c;除BRC20占据着市场70%以上的份额外&#xff0c;其他公链的铭文也在快速发展

Spring Boot + EasyUI 全屏布局(二)

一、创建一个Spring Boot EasyUI项目 Spring Boot EasyUI 创建第一个项目&#xff08;一&#xff09;_springboot整合easyui-CSDN博客 二、相关知识点总结 布局&#xff08;layout&#xff09;是有五个区域&#xff08;北区 north、南区 south、东区 east、西区 west 和中区…

Spring Boot学习随笔- 拦截器实现和配置(HandlerInterceptor、addInterceptors)、jar包部署和war包部署

学习视频&#xff1a;【编程不良人】2021年SpringBoot最新最全教程 第十三章、拦截器 拦截器 &#xff1a;Interceptor 拦截 中断 类似于javaweb中的Filter&#xff0c;不过没有Filter那么强大 作用 Spring MVC的拦截器是一种用于在请求处理过程中进行预处理和后处理的机制。拦…

typeScript安装及TypeScript tsc 不是内部或外部命令,也不是可运行的程序或批处理文件解决办法

一、typeScript安装&#xff1a; # 全局安装 TypeScript npm i -g typescript 二、检查是否安装成功ts&#xff1a; #检查ts的版本号 确定是否安装成功 tsc -v出现报错&#xff1a;‘tsc’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 解决&#xff1…

fastGitHub工具推荐(如果打不开github或者使用很慢可以使用该工具)

目录 一&#xff0c;针对问题二&#xff0c;下载1&#xff0c;github里面下载FastGitHub2&#xff0c;博客上传了下载资源 三&#xff0c;安装使用点击执行文件即可 一&#xff0c;针对问题 当使用github很慢&#xff0c;或者根本打不开的时候&#xff0c;就可以使用该工具 …

Java基础知识复习

目录 一、Java语言基础知识&#xff0c;包括面向对象编程、语法特性等 0、什么是面向对象编程&#xff1f; 1、基本语法&#xff1a; 2、变量和数据类型&#xff1a; 3、运算符和表达式&#xff1a; 4、控制结构&#xff1a; 5、函数和方法&#xff1a; 6、类和对象&#xff1a…

电商数仓项目----笔记五(数仓架构和建模)

ODS&#xff1a;数据源 DWD&#xff1a;加工数据 DWS&#xff1a;统计数据 ADS&#xff1a;分析数据 DIM&#xff1a; 维度层&#xff08;大家都有可能用得上的部分&#xff09; ER模型 数据仓库之父Bill Inmon提出的建模方法是从全企业的…