MySQL是如何实现主备同步
作者:大杂草 发布时间:2024-01-19 06:53:16
主备同步,也叫主从复制,是MySQL提供的一种高可用的解决方案,保证主备数据一致性的解决方案。
在生产环境中,会有很多不可控因素,例如数据库服务挂了。为了保证应用的高可用,数据库也必须要是高可用的。
因此在生产环境中,都会采用主备同步。在应用的规模不大的情况下,一般会采用一主一备。
除了上面提到的数据库服务挂了,能够快速切换到备库,避免应用的不可用外,采用主备同步还有以下好处:
提升数据库的读并发性,大多数应用都是读比写要多,采用主备同步方案,当使用规模越来越大的时候,可以扩展备库来提升读能力。
备份,主备同步可以得到一份实时的完整的备份数据库。
快速恢复,当主库出错了(比如误删表),通过备库来快速恢复数据。对于规模很大的应用,对于数据恢复速度的容忍性很低的情况,通过配置一台与主库的数据快照相隔半小时的备库,当主库误删表,就可以通过备库和binlog来快速恢复,最多等待半小时。
说了主备同步是什么和好处,下面让我们来了解一下主备同步是怎么实现的。
主备同步的实现原理
我们先来了解一下主备同步的原理,下面以一个update语句来介绍主库与备库间是如何进行同步的。
上图是一个update语句在节点A执行,然后同步到节点B的完整流程图,具体步骤有:
主库接受到客户端发送的一条update语句,执行内部事务逻辑,同时写binlog。
备库通过 change master 命令,设置主库的IP、端口、用户名和密码,以及要从哪个位置开始请求 binlog。这个位置包含文件名和偏移量。
在备库上执行start slave命令,启动两个线程 io_thread 和 sql_thread,其中 io_thread 负责与主机进行连接。
主库校验完用户名和密码,按照接收到的位置去读取binlog,发给备库。
备库接收到binlog后,写到本地文件(relay log,中转文件)。
备库读取中转文件,解析出命令,然后执行。
主备同步的工作原理其实就是一个完全备份加上二进制日志备份的还原。不同的是这个二进制日志的还原操作基本上是实时的。
备库通过两个线程来实现同步:
一个是 I/O 线程,负责读取主库的二进制日志,并将其保存为中继日志。
一个是 SQL 线程,负责执行中继日志。
从上面的流程可以看出,主备同步的关键是binlog
常见的两种主备切换流程
M-S结构
M-S结构,两个节点,一个当主库、一个当备库,不允许两个节点互换角色。
在状态1中,客户端的读写都直接访问节点A,而节点B是A的备库,只是将A的更新都同步过来,到本地执行。这样可以保持节点B和A的数据是相同的。
当需要切换的时候,就切成状态2。这时候客户端读写访问的都是节点B,而节点A是B的备库。
双M结构
双M结构,两个节点,一个当主库,一个当备库,允许两个节点互换角色。
对比前面的M-S结构图,可以发现,双M结构和M-S结构,其实区别只是多了一条线,即节点A和B之间总是互为主备关系。这样在切换的时候就不用再修改主备关系。
双M结构的循环复制问题
在实际生产使用中,多数情况是使用双M结构的。但是,双M结构还有一个问题需要解决。
业务逻辑在节点A执行更新,会生成binlog并同步到节点B。节点B同步完成后,也会生成binlog。(log_slave_updates设置为on,表示备库也会生成binlog)。
当节点A同时也是节点B的备库时,节点B的binlog也会发送给节点A,造成循环复制。
解决办法:
设置节点的server-id,必须不同,不然不允许设置为主备结构
备库在接到binlog后重放时,会记录原记录相同的server-id,即谁产生即为谁的。
每个节点在接受binlog时,会判断server-id,如果是自己的就丢掉。
解决后的流程:
业务逻辑在节点A执行更新,会生成带有节点A的server-id的binlog。
节点B接受到节点A发过来的binlog,并执行完成后,会生成带有节点A的server-id的binlog。
节点A接受到binlog后,发现是自己的,就丢掉。死循环就在这里断掉了。
来源:https://www.cnblogs.com/liang24/p/14149412.html
猜你喜欢
- 上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围。一旦进入或者离开该使用范围
- 一、了解字符编码的知识储备1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了
- 一般安装完Python后,我会先装一些常用的Package。做个笔记,记录下来,以备查询:Web FrameWorksTornado,访问:
- JavaScript 中的并没有提供像 VBScript 里的 DateAdd 方法用于日
- 正在编写的程序用的很多Windows下的操作,查了很多资料。看到剪切板的操作时,想起以前想要做的一个小程序,当时也没做,现在正好顺手写完。功
- Function content_Code(Str) dim ary_String,i,n,n_pos&nbs
- datetime 和 smalldatetime 代表日期和一天内的时间的日期和时间数据类型。 Microsoft SQL Server 用
- 前序1、蓝图在一个Flask 应用项目中,如果业务视图过多,可否将以某种方式划分出的业务单元单独维护,将每个单元用到的视图、静态文件、模板文
- 由于现在在公司负责制作标准的静态页面,为了增强客户体验,所以经常要做些AJAX效果,也学你也和我一样在,学习AJAX。而设计AJAX时使用的
- 前言聚合函数用来对表中的数据进行统计和计算。users表结构如下:什么是聚合函数聚合函数是用来做简单的数据统计的,比如说统计一下 &
- 问题作为一个负责几个服务器的数据库管理员,我接到许多电话是关于磁盘空间的。我所做的第一件事是找到可以缩小的数据文件来释放一些磁盘上的空间。我
- 本文实例讲述了Python自动连接ssh的方法。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/python#-*- codi
- 我们在使用ASP 内置的ADO组件进行数据库编程时,通常是在脚本的开头打开一个连接,并在脚本的最后关闭它,但是就较大脚本而言,在多数情况下连
- 1. 解决思路首先要获得这张验证码的图片,但是该图片一般都是用的js写的,不能够通过url进行下载。解决方案:截图然后根据该图片的定位和长高
- 今天因为程序里面要把写入数据库的html源代码以html源编码的形式显示在页面里面,而不要被浏览器解释成。。找了N久都不知道怎么做后来看了一
- 用ASP.NET与SQL SERVER可是缘份最好了,稍大的程序一般第一先考虑的是SQL SERVER,只是一些很考虑经济的才使用ACCES
- 日志级别CRITICAL 50ERROR 40WARNING 30INFO 20DEBUG 10logging.basicConfig()函
- select * from table limit m,n其中m是指记录开始的index,从0开始,n是指从第m条开始,取n条。mysql(
- 本文主要给大家介绍了关于CentOS 6.5 安装Python 3.5.2并与Python2并存的相关内容,分享出来供大家参考学习,下面来看
- 今天在调试项目的时候出现下面的错误信息:SoapFaultlooks like we got no XML document (D:\php