服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - 一文带你了解Mysql主从同步原理

一文带你了解Mysql主从同步原理

2021-09-24 17:06王若伊_恩赐解脱 Mysql

本文主要讲解了Mysql主从同步原理,主从同步可以扩展数据库的负载能力、容错还可以数据备份等。想要了解相关内容的朋友可以阅读这篇文章

mysql 主从同步原理简析

在开始讲述原理的情况下,我们先来做个知识汇总,
究竟什么是主从,为什么要搞主从,可以怎么实现主从,mysql主从同步的原理

1、什么是主从

其实主从这个概念非常简单
主机就是我们平常主要用来读写的服务,我们称之为master(主人、主宰)
从机就是主机进行的一个扩展,他一般不会主动用来读写,我们称之为slave( [sleɪv] 奴隶)
从机上的数据是从主机通过某种形式获取到而写入从机的,理论上从机并不能直接获取到来自外界的数据。

2、为什么要搞主从呢?

最早搞主从是为了主备,也就是master是主机,salve是备机。因为早期软件的数据量与并发性并不高。主机完全支撑得住日常的使用。
所以通过主备的形式,保证db高可用,当检测到主db挂掉的时候,自动将服务的数据源切换到备db。
随着业务的发展,大家发现单master往往很难支撑的住业务的需要,因此对传统的主从开始进行了扩展。

一文带你了解Mysql主从同步原理

(1)一主一从
从机不仅仅作为备机,而且还作为读数据源的db,业务服务写数据时,写到主机,读数据时,从从机上读。从而降低主机的压力
(2)一主多从
主写从读之后,我们发现单一的从节点在支撑业务查询数据时,还是存在性能瓶颈,因此将从机进行水平扩展,实现多从。
(3)双m
从机的身份提升为主机,两个主机互为对方的从机,共同分担读写压力
(4)联级复制
联级复制和一主多从比较相像,区别是次级别的从机的数据来源是来自于从机而不再是主机。这样主要是考虑到从机变多后,同步数据对主机性能的影响
(5)多主一从
多主应用在写多读少的场景,通过多主降低主机的压力,同时通过1个从机,来完成读操作和数据备份的能力。

3、如何实现主从同步呢?

大家不要把主从同步想的太难以理解,其实非常简单,对于一个软件工程师来说,你只要会写代码,能从主库中查出数据,然后连接到备库里,将数据写进去,就可以了。这就是最易于理解的主从同步。
但是这种太粗糙了,性能也不好,所以mysql自身就已经提供了一套完整的主从同步机制,保证数据可以高效的从主机到从机的同步过去。
除去mysql 自身的主从同步,业界还有一些通过组件来支持的,比如阿里的canal,这个主要是为了更灵活的进行数据同步,比如对同步数据进行解析,同步的从机可以不再使用mysql,而是其他存储服务等。(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )

4、mysql 主从同步的原理

mysql自身实现主从同步,主要是利用到binlog 日志。
由于不是本文的重点,这里简单说下binlog日志:
它是mysql用来记录db改变的日志,
比如某条数据的值从0改为1 (dml语句)
比如某张表被删除了 (ddl语句)
binlog 有三种形式:(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
(1)statement:记录具体引起改动的操作语句,比如insert xxxxx....
(2)row:基于数据行的,原来数据行是xx值改为了yy 值,这种一般占用空间比较大
(3)mixed:混合模式,由服务自己来决定此次变更采用哪种形式。
当sql操作写入binlog,就已经算作sql执行成功了,而不是写入到对应磁盘中(刷盘)。所以binlog中对应的值,我们可以理解为就是mysql的一个映射,同步mysql数据不同捞磁盘中的数据进行同步,而只需要同步binlog日志就行。
具体的同步原理如下:
(1)主从同步设置好之后(进行相关的诸如ip,端口,服务id,等操作设置后)
(2)相关变动会写入到binlog中
(3)maser会启动一个线程:binlog dumplog 线程,这个线程会通知从机,当前存在sql变更,并将binlog的变动发送到从机上
(4)从机收到请求后,会启动线程:i/o线程 ,该线程会将收到的binlog日志加载到中继日志delay log中
(5)从机中的另外一个线程:sql 线程会读取relay日志中的信息,刷新到从机中
具体可见下图

一文带你了解Mysql主从同步原理

根据cap理论(不清楚这点这里),这套架构很明显无法保证实时的数据一致性,如:
1、写入主机后,主机立刻挂掉,进行主备倒换,此时可能会丢失数据,
2、当主机发生写操作,因为同步数据到从机的binlog中会存在延迟,所以立刻查询从机时,可能会无法查询到数据,针对这种情况
解决办法:
1、启用半同步复制,之前主从同步信息是异步同步,不影响主库的逻辑,半同步复制则是主机等待binlog写入到(至少一个)从机的中继日志中,主机才确定返回给客户端。
2、强制敏感数据调用主机,但是这样使读写分离的概念模糊化,不是很推荐
3、使用中间件(canal),大致原理是当写请求发生时,记录到cache中,并预估好同步到从机的时间。
此时写入主库数据,查询从库时,会根据写入到cache的预估时间判定此时从机上的时间,判定是等待从库,还是直接查询从库

到此这篇关于一文带你了解mysql主从同步原理的文章就介绍到这了,更多相关mysql主从同步原理内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://www.cnblogs.com/jilodream/p/15187614.html

延伸 · 阅读

精彩推荐
  • MysqlMySQL优化中B树索引知识点总结

    MySQL优化中B树索引知识点总结

    在本文里我们给大家整理了关于MySQL优化中B树索引的相关知识点内容,需要的朋友们可以学习下。 ...

    laozhang4942020-09-12
  • Mysqlmysql5.7.18解压版启动mysql服务

    mysql5.7.18解压版启动mysql服务

    这篇文章主要为大家详细介绍了mysql5.7.18解压版启动mysql服务的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    水之原4822020-07-27
  • MysqlMySQL 5.7临时表空间如何玩才能不掉坑里详解

    MySQL 5.7临时表空间如何玩才能不掉坑里详解

    这篇文章主要给大家介绍了关于MySQL 5.7临时表空间如何玩才能不掉坑里的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定...

    叶师傅不会咏春拳5862019-06-26
  • MysqlMySQL中的乐观锁,悲观锁和MVCC全面解析

    MySQL中的乐观锁,悲观锁和MVCC全面解析

    这篇文章主要介绍了MySQL中的乐观锁和悲观锁和MVCC全面解析的相关资料,帮助大家更好的理解和学习MySQL数据库,感兴趣的朋友可以了解下...

    X先生5072021-04-06
  • MysqlMySQL中union和join语句使用区别的辨析教程

    MySQL中union和join语句使用区别的辨析教程

    这篇文章主要介绍了MySQL中union和join语句的用法区别,举例说明了union和join在连接操作上的不同作用,需要的朋友可以参考下 ...

    古腾龙5892020-05-27
  • MysqlMysql启动报ERROR:2002的分析与解决

    Mysql启动报ERROR:2002的分析与解决

    这篇文章主要给大家介绍了关于Mysql启动时报ERROR:2002问题的分析与解决方法,文中通过示例代码介绍将该问题分析的非常详细,对同样遇到这个问题的朋...

    N27_Danry2122020-08-13
  • MysqlLinux下mysql 8.0安装教程

    Linux下mysql 8.0安装教程

    这篇文章主要为大家详细介绍了Linux下mysql 8.0安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    AH_HH1992020-09-04
  • MysqlMysql闪退问题图文解决办法

    Mysql闪退问题图文解决办法

    之前在使用MySQL 5.5 Command Line Client时,无论输入什么密码,都出现闪退的情况,纠结了半天才找到原因,下面小编给大家分享我的解决方法,感兴趣的朋友...

    sinat_281580554632020-07-01