在开始讲述原理的情况下,我们先来做个知识汇总,
究竟什么是主从,为什么要搞主从,可以怎么实现主从,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. 使用Octotree插件在Edge上以树形结构浏览GitHub上的源码

    先预览效果左侧的目录通过点击,就可以到达对应的源码位置. 首先点击打开Edge中的浏览器扩展在右上角...=>点击扩展=>点击获取Microsoft Edge扩展按钮=>在左侧搜索所 ...

  2. WPF项目升级sqlite-net-pcl时遇到Library e_sqlite3 not found的问题解决办法记录

    项目中为了方便的存储本地数据,使用了SQLite数据库作为数据存储,再设计时DB.models引用了sqlite-net-pcl,那么项目再升级sqlite-net-pc 1.7.335l版本后后,遇 ...

  3. 【记录】如何造一个vite插件(1)

    在看文章前,先做个定位,这不是一篇纯粹的技术性文章,可以把它理解成一个叙述文章,记录我开发插件的过程. 开始前简单的吹个牛 vue2 也写了很多年了,多人合作始终避不开用到别人的组件.关键是有些组件没 ...

  4. Oracle执行计划总结

    一.ORACLE中常见执行计划 表访问的执行计划 1.table access full:全表扫描.它会访问表中的每一条记录. 2.table access by user rowid:输入源rowi ...

  5. 微信小程序云开发-添加数据

    一.数据的添加 使用add方法添加数据 添加完成后,在数据库中查询,可以看到数据库中添加了1条数据,此时添加的数据系统自动添加了_openid 将[添加]功能写到对应的方法中 wxml页面中,点击[添 ...

  6. 分享一个自己画div的技巧

    分享一个自己画div的技巧 笔者是小白,前端不是很懂.现在想总结下自己画div布局的小技巧和思路. 先对着设计图把div给好好框选出来 我个人觉得这一步是很重要的,要先分析大局,再细节处理.一定要先决 ...

  7. 简单快速安装Apache+PHP+MySql服务环境(三)—— 下载安装phpmyadmin

    为了方便在Linux上操作mysql数据库,打算安装一个phpmyadmin,不过在下载安装的过程中出现了一些坑,特此记录. 1. 在官网上下载phpmyadmin https://files.php ...

  8. 关于 .NET 与 JAVA 在 JIT 编译上的一些差异

    最近因为公司的一些原因,我也开始学习一些 JAVA 的知识.虽然我一直是以 .NET 语言为主的程序员,但是我并不排斥任何其它语言.在此并不讨论 JAVA .NET 的好坏,仅仅是对 .NET 跟 J ...

  9. Python自动化测试面试题-接口篇

    目录 Python自动化测试面试题-经验篇 Python自动化测试面试题-用例设计篇 Python自动化测试面试题-Linux篇 Python自动化测试面试题-MySQL篇 Python自动化测试面试 ...

  10. SickOs1.2靶机

    仅供个人娱乐 靶机信息 靶机下载地址:https://www.vulnhub.com/entry/sickos-12,144/一.主机发现  arp-scan -l 二.端口扫描 1. masscan ...