mysql主从同步工作原理(MySQL是如何实现主备同步)
mysql主从同步工作原理
MySQL是如何实现主备同步主备同步,也叫主从复制,是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后,发现是自己的,就丢掉。死循环就在这里断掉了。
以上就是MySQL是如何实现主备同步的详细内容,更多关于MySQL 主备同步的资料请关注开心学习网其它相关文章!
原文链接:https://www.cnblogs.com/liang24/p/14149412.html
- mysqlshell日常运维脚本(监控MySQL主从状态的shell脚本)
- docker创建mysql环境(docker上部署MySQL的示例)
- mysql数据库如何删除重复记录(mysql数据库删除重复数据只保留一条方法实例)
- mysql函数编写(MySQL中sum函数使用的实例教程)
- mysql添加注释视图(mysql创建表添加字段注释的实现方法)
- mysql设置updatetime自动更新(mysql 实现添加时间自动添加更新时间自动更新操作)
- visual studio怎么连接数据库(使用Visual Studio Code连接MySql数据库并进行查询)
- 用mysql语句写python学生管理系统(Python基于mysql实现学生管理系统)
- mysql对大表千万级如何优化(MySQL 大表的count优化实现)
- Mysql官方性能测试工具mysqlslap的使用简介(Mysql官方性能测试工具mysqlslap的使用简介)
- mysql高级概念(MySQL 自定义变量的概念及特点)
- navicat for mysql连接测试失败(Navicat连接虚拟机mysql常见错误问题及解决方法)
- mysql数据库怎么换行(MySQL数据中很多换行符和回车符的解决方法)
- mysql如何修改列的默认值(mysql查询的时候给字段赋默认值操作)
- navicat连接报错10038(解决Navicat for Mysql连接报错1251的问题连接失败)
- mysql并发查询优化(详解MySQL 联合查询优化机制)
- Top 3 JSHS《运动与健康科学 英文 》跻身SCI体育学期刊世界前三(Top3JSHS运动与健康科学)
- 体坛传媒LOGO全新升级,多元发展迈出坚实步伐(体坛传媒LOGO全新升级)
- 超撩人治愈的绝美水彩,原来出自她之手 一笔一画令无数人沉醉(超撩人治愈的绝美水彩)
- 新手的勾线(新手的勾线)
- ()
- 书法欣赏 宋.志南诗《绝句》(宋.志南诗绝句)
热门推荐
- 用docker搭建在线开发平台(docker部署蜗牛影院系统详细流程分析)
- nginx做转发配置weight啥意思(Nginx中break与last的区别详析)
- wds怎么设置32位(wdcp /dev/vda1 磁盘占满使用100%解决办法)
- linux下date用法(Linux date命令的使用)
- dedecms使用方法(Dedecms织梦CMS搜索页面调用全站最新文章的方法)
- python自动解密(python实现移位加密和解密)
- sqlserver数据回退(SQLServer数据库处于恢复挂起状态的解决办法)
- python核心编程内容(顶级大神Linux,Python,Go,PHP之父谁是夜猫子?用Python揭秘!)
- mysql 索引表空间(MySQL如何构建数据表索引)
- dedecms标签怎么用(dedecms列表页上一页下一页翻页单独调用的方法)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9