一文带你了解Mysql主从同步原理
目录
- Mysql 主从同步原理简析
- 1、什么是主从
- 2、为什么要搞主从呢?
- 3、如何实现主从同步呢?
- 4、mysql 主从同步的原理
Mysql 主从同步原理简析
在开始讲述原理的情况下,我们先来做个知识汇总,
究竟什么是主从,为什么要搞主从,可以怎么实现主从,mysql主从同步的原理
1、什么是主从
其实主从这个概念非常简单
主机就是我们平常主要用来读写的服务,我们称之为master(主人、主宰)
从机就是主机进行的一个扩展,他一般不会主动用来读写,我们称之为slave( [sleɪv] 奴隶)
从机上的数据是从主机通过某种形式获取到而写入从机的,理论上从机并不能直接获取到来自外界的数据。
2、为什么要搞主从呢?
最早搞主从是为了主备,也就是master是主机,salve是备机。因为早期软件的数据量与并发性并不高。主机完全支撑得住日常的使用。
所以通过主备的形式,保证db高可用,当检测到主db挂掉的时候,自动将服务的数据源切换到备db。
随着业务的发展,大家发现单master往往很难支撑的住业务的需要,因此对传统的主从开始进行了扩展。
(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日志中的信息,刷新到从机中
具体可见下图
根据CAP理论(不清楚这点这里),这套架构很明显无法保证实时的数据一致性,如:
1、写入主机后,主机立刻挂掉,进行主备倒换,此时可能会丢失数据,
2、当主机发生写操作,因为同步数据到从机的binlog中会存在延迟,所以立刻查询从机时,可能会无法查询到数据,针对这种情况
解决办法:
1、启用半同步复制,之前主从同步信息是异步同步,不影响主库的逻辑,半同步复制则是主机等待binlog写入到(至少一个)从机的中继日志中,主机才确定返回给客户端。
2、强制敏感数据调用主机,但是这样使读写分离的概念模糊化,不是很推荐
3、使用中间件(canal),大致原理是当写请求发生时,记录到cache中,并预估好同步到从机的时间。
此时写入主库数据,查询从库时,会根据写入到cache的预估时间判定此时从机上的时间,判定是等待从库,还是直接查询从库
到此这篇关于一文带你了解Mysql主从同步原理的文章就介绍到这了,更多相关Mysql主从同步原理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!