在开始讲述原理的情况下,我们先来做个知识汇总,
究竟什么是主从,为什么要搞主从,可以怎么实现主从,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 主从同步原理简析的更多相关文章

  1. MySQL主从同步原理 部署【转】

    一.主从的作用:1.可以当做一种备份方式2.用来实现读写分离,缓解一个数据库的压力二.MySQL主从备份原理master 上提供binlog ,slave 通过 I/O线程从 master拿取 bin ...

  2. mysql 主从 同步原理及配置

    一.在mssql 里头实现同步镜像,只能主库用而镜像库不能同时用,而mysql 主从同步可以实现 数据库的读写分离,主库负责 update insert delete ,从库负责select 这样一来 ...

  3. mysql主从同步原理及错误解决

    mysql主从同步的原理: 1.在master上开启bin-log日志功能,记录更新.插入.删除的语句. 2.必须开启三个线程,主上开启io线程,从上开启io线程和sql线程. 3.从上io线程去连接 ...

  4. 架构师必备:MySQL主从同步原理和应用

    日常工作中,MySQL数据库是必不可少的存储,其中读写分离基本是标配,而这背后需要MySQL开启主从同步,形成一主一从.或一主多从的架构,掌握主从同步的原理和知道如何实际应用,是一个架构师的必备技能. ...

  5. 高级程序员必知必会,一文详解MySQL主从同步原理,推荐收藏

    1. MySQL主从同步实现方式 MySQL主从同步是基于Bin Log实现的,而Bin Log记录的是原始SQL语句. Bin Log共有三种日志格式,可以binlog_format配置参数指定. ...

  6. MySQL主从同步-原理&实践篇

    来源:Onegoleya 简栈文化 什么是mysql的主从复制? MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点 ...

  7. MySQL主从同步原理

    mysql主从复制用途 实时灾备,用于故障切换 读写分离,提供查询服务 备份,避免影响业务 主从部署必要条件 主库开启binlo日志(设置log-bin参数) 主从server-id不同 从库可以连同 ...

  8. Mysql主从同步原理简介

    1.定义:当master(主)库的数据发生变化的时候,变化会实时的同步到slave(从)库. 2.好处: 1)水平扩展数据库的负载能力. 2)容错,高可用.Failover(失败切换)/High Av ...

  9. mysql 主从同步原理

    Replication 线程 Mysql的 Replication 是一个异步的复制过程,从一个 Mysql instace(我们称之为 Master)复制到另一个 Mysql instance(我们 ...

随机推荐

  1. Java | this的本质 和 static的本质

    this 在说this之前先说一下,对象创建的过程: 1.分配对象空间,并将对象成员变量初始化. 2.执行属性值的显式初始化. 3.执行构造方法. 4.返回相关的地址给相关的对象.   this的本质 ...

  2. ELK多索引配置(filebeat)

     nginx日志收集: ​ ​ #-------------------------输入 filebeat.inputs: ​ #----------json日志---------- ​ - type ...

  3. 家庭账本开发day02

    今日完成 今天主要进行了前台界面的构架,利用layUI已有的模板编写新增账单界面 然后进行了后端的Bean和Servlet的初步编写,实现数据库的构建. 遇到问题 获取前端传输数据,并添加数据到数据库 ...

  4. 高校表白App-团队冲刺第二天

    今天要做什么 今天要把昨天的activity进行完善,并且加上计时跳转的功能,将其设置为主页面,设置两种跳转功能. 遇到的问题 今天没遇到什么大的问题,只是在进行编写的时候,又出现了R文件无法找到的情 ...

  5. 常用js代码积累

    1,js判断进入可视区,参考(亲测不行):https://www.cnblogs.com/Marydon20170307/p/8830069.html 重点学习的话,可参考: js计算元素距离顶部的高 ...

  6. gnome环境设置

    1.gnome的环境安装sudo apt-get install gnome2.选择gdm3 开机显示不正常:could not apply the stored configuration for ...

  7. centos7下安装、配置Nginx、设置Nginx开机自启动

    测试环境: [root@centos-linux ~]# cat /etc/redhat-releaseCentOS Linux release 7.6.1810 (Core) [root@cento ...

  8. SpringCloud学习之【Eureka实现服务注册与发现】

    这段时间开始整理之前的SpringCloud实践笔记,这里感谢翟永超大佬的文章SpringCloud从入门到精通的指导. 项目结构 服务注册中心 注意: 1.SpringCloud与SpringBoo ...

  9. Linux文件浏览(less、more、head、tail)以及vim编辑器命令总结

    结合小编学习实践,整理了Linux下查看内容(less.more.head.tail)和编辑内容(vim)的部分基础命令解析: 1.less命令 分页浏览内容,如果在shell命令行下按回车键,则一点 ...

  10. Python -- 长字符串

    如果需要写一个非常非常长的字符串,它需要跨多行,那么,可以使用三个引号代替普通引号. print '''This is a very long string. It continues here. A ...