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

news2024/12/25 0:13:08

文章目录

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

简介

以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.coloradmin.cn/o/1327115.html

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

相关文章

C# 使用MSTest进行单元测试

目录 写在前面 代码实现 执行结果 写在前面 MSTest是微软官方提供的.NET平台下的单元测试框架;可使用DataRow属性来指定数据,驱动测试用例所用到的值,连续对每个数据化进行运行测试,也可以使用DynamicData 属性来指定数据&…

计算机网络(4):网络层

网络层提供的两种服务 虚电路服务(Virtual Circuit Service)和数据报服务(Datagram Service)是在网络层(第三层)提供的两种不同的通信服务。它们主要区别在于建立连接的方式和数据传输的方式。 虚电路服务…

[图像和LiDAR点云的可微分配准]

文章目录 概要主要贡献内容概述实验小结 概要 不同模态之间的配准,例如来自摄像机的2D图像和LiDAR的3D点云之间的配准,是计算机视觉和机器人领域中至关重要的任务。 以往的方法通常通过匹配神经网络学习到的点和像素模式来估计2D-3D对应关系&#xff0…

听GPT 讲Rust源代码--src/tools(15)

File: rust/src/tools/rust-analyzer/crates/mbe/src/token_map.rs 在Rust源代码中,rust/src/tools/rust-analyzer/crates/mbe/src/token_map.rs文件的作用是实现了一个能够将输入的文本映射为标记的结构。具体来说,它定义和实现了几个结构体&#xff08…

PolarDB-X、OceanBase、CockroachDB、TiDB二级索引写入性能测评

为什么要做这个测试 二级索引是关系型数据库相较于NoSQL数据库的一个关键差异。二级索引必须是强一致的,因此索引的写入需要与主键的写入放在一个事务当中,事务的性能是二级索引性能的基础。 目前市面上的分布式数据库中,从使用体验的角度看…

178. 第K短路(A*启发式算法)

178. 第K短路 - AcWing题库 给定一张 N 个点(编号 1,2…N),M 条边的有向图,求从起点 S 到终点 T 的第 K 短路的长度,路径允许重复经过点或边。 注意: 每条最短路中至少要包含一条边。 输入格式 第一行包…

Istio 社区周报(第一期):2023.12.11 - 12.17

欢迎来到 Istio 社区周报 Istio 社区朋友们,你们好! 我很高兴呈现第一期 Istio 社区周报。作为 Istio 社区的一员,每周我将为您带来 Istio 的最新发展、有见地的社区讨论、专业提示和重要安全新闻内容。 祝你阅读愉快,并在下一期中…

❀My虚拟机上的ftp服务器搭建(centos)❀

❀My虚拟机上的ftp服务器搭建(centos)❀ 在CentOS上搭建FTP服务器可以使用vsftpd软件,下面是详细的搭建教程: ①安装vsftpd软件 在终端中输入以下命令进行安装: sudo yum install vsftpd ②配置vsftpd 打开vsftpd的配置文件,…

Java_集合进阶Set集合

少年没有乌托邦,心向远方自明朗 集合进阶(Set、Map集合) 一、Set系列集合 1.1 认识Set集合的特点 Set集合是属于Collection体系下的另一个分支,它的特点如下图所示 下面我们用代码简单演示一下,每一种Set集合的特…

城市里的“蛋壳运动空间”

近年来,秉承"发展群众体育,服务健康中国”的理念,全国各地持续推进全民健身与全民健康的融合发展。越来越多的口袋公园、户外运动设施出现在城市各个角落,一定程度上提升了全民运动的便利性和幸福感。 但是,遇到…

数说故事荣登胡润“全球猎豹企业榜”,彰显大数据与AI融合的创新力

昨日,2023 胡润全球猎豹企业大会暨《2023 胡润全球猎豹企业榜》发布活动在广州市南沙区金茂万豪酒店圆满举办。胡润研究院与广州南沙联合发布《2023胡润全球猎豹企业榜》,这是胡润研究院首次发布“全球猎豹企业榜”。榜单列出了全球成立于2000年之后&…

固态硬盘的基本知识

1.硬盘分为SSD(solid state drive)和 H(hard desk drive) 2.SSD数倍于HDD机械硬盘的传输性能,让普通用户和发烧玩家的体验均成倍提升。 三.SSD主要从如下3个方面来介绍(3个方面匹配好才是速度的关键&…

C#线程的定义和使用方法

引言 在C#编程语言中,线程是一种并发执行的机制,允许程序同时执行多个任务。线程的使用使得我们能够利用计算机的多核处理器,实现程序的并行执行,提高系统的性能和响应能力。本文将详细介绍C#中线程的定义和使用方法,涵…

代码随想录27期|Python|Day21|二叉树| 530.二叉搜索树的最小绝对差| 501.二叉搜索树中的众数| 236. 二叉树的最近公共祖先

特别需要注意题目中给的隐藏信息(比如这里的BST) 530. 二叉搜索树的最小绝对差 前两个是BST的经典递归模版解法,后面一个迭代的解法可以当作BST的一般迭代规则。 转换成数组 根据一般的递归模版 def traversal(self, root):if not root:r…

用23种设计模式打造一个cocos creator的游戏框架----(二十三)中介者模式

1、模式标准 模式名称:中介者模式 模式分类:行为型 模式意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 结构图&#xff…

基于SSM框架的电脑测评系统论文

基于 SSM框架的电脑测评系统 摘要 随着信息技术在管理上越来越深入而广泛的应用,作为一个一般的用户都开始注重与自己的信息展示平台,实现基于SSM框架的电脑测评系统在技术上已成熟。本文介绍了基于SSM框架的电脑测评系统的开发全过程。通过分析用户对于…

【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建基本状态内部任务)、任务调度、系统函数

上一课: 【小黑嵌入式系统第十课】μC/OS-III概况——实时操作系统的特点、基本概念(内核&任务&中断)、与硬件的关系&实现 文章目录 一、任务设计1.1 任务概述1.2 任务的类型1.2.1 单次执行类任务(运行至完成型&#…

ai学习笔记-入门

目录 一、人工智能是什么?可以做什么? 人工智能(Artificial Intelligence): 人工智能的技术发展路线: 产业发展驱动因素:数据、算力、算法 二、人工智能这个工具的使用原理入门 神经网络⭕数学基础 1.神经网络的生物表示 …

成都爱尔蔡裕主任提醒眼前有条状黑影飘动,该治疗吗?

眼前有好多影子,有的看起来是黑色有的仿佛透明,呈现条状、点状,它们还跟随脑袋的移动而移动,仿佛在眼前打转,尤其在阳光明媚的时候或者注视白墙壁时尤为明显。 这是病吗?需要治疗吗? 飞蚊症 飞蚊症在医学上称为“玻璃…

JavaScript系列-循环语句

文章目录 1. JavaScript 函数常用的循环语句有以下1 打遍所有可循环对象的 for 循环2 for in :遍历对象3 for of :遍历有迭代器对象,如数组4 while 循环5 do while6 switch case 2.各循环方法的使用场景和方法for 循环第一种用法(…