Mysql主从同步的实现原理
1、什么是mysql主从同步?
当master(主)库的数据发生变化的时候,变化会实时的同步到slave(从)库。
2、主从同步有什么好处?
- 水平扩展数据库的负载能力。
- 容错,高可用。Failover(失败切换)/High Availability
- 数据备份。
3、主从同步的原理是什么?
首先我们来了解master-slave的体系结构。
如下图:
不管是delete、update、insert,还是创建函数、存储过程,所有的操作都在master上。当master有操作的时候,slave会快速的接收到这些操作,从而做同步。
但是,这个机制是怎么实现的呢?
在master机器上,主从同步事件会被写到特殊的log文件中(binary-log);在slave机器上,slave读取主从同步事件,并根据读取的事件变化,在slave库上做相应的更改。
如此,就实现了主从同步了!
下面我们来详细的了解。
3.1主从同步事件有哪些
上面说到:
在master机器上,主从同步事件会被写到特殊的log文件中(binary-log);
主从同步事件有3种形式:statement、row、mixed。
- statement:会将对数据库操作的sql语句写入到binlog中。
- row:会将每一条数据的变化写入到binlog中。
- mixed:statement与row的混合。Mysql决定什么时候写statement格式的,什么时候写row格式的binlog。
3.2在master机器上的操作
当master上的数据发生改变的时候,该事件(insert、update、delete)变化会按照顺序写入到binlog中。
binlog dump线程
当slave连接到master的时候,master机器会为slave开启binlog dump线程。当master 的 binlog发生变化的时候,binlog dump线程会通知slave,并将相应的binlog内容发送给slave。
3.3在slave机器上的操作
当主从同步开启的时候,slave上会创建2个线程。
- I/O线程。该线程连接到master机器,master机器上的binlog dump线程会将binlog的内容发送给该I/O线程。该I/O线程接收到binlog内容后,再将内容写入到本地的relay log。
- SQL线程。该线程读取I/O线程写入的relay log。并且根据relay log的内容对slave数据库做相应的操作。
3.4如何在master、slave上查看上述的线程?
使用SHOW PROCESSLIST命令可以查看。
如图,在master机器上查看binlog dump线程。
如图,在slave机器上查看I/O、SQL线程。
4、讲了这么多,一图以蔽之
5、关于实战
关于实战,请参考我的另一篇文章:Mysql主从同步实战
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
相关推荐
-
Mysql主从同步备份策略分享
环境:主从服务器上的MySQL数据库版本同为5.1.34主机IP:192.168.0.1从机IP:192.168.0.2一. MySQL主服务器配置1.编辑配置文件/etc/my.cnf# 确保有如下行server-id = 1log-bin=mysql-binbinlog-do-db=mysql #需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可binlog-ignore-db=mysql #不需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可log-slave-up
-
mysql主从同步复制错误解决一例
蚊子今天下午搭了一主三从的mysql复制,结果所有服务器都配置好后,发现从上报如下的错误 复制代码 代码如下: Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-i
-
MySQL 5.5主从同步设置笔记分享
先修改Master(10.1.123.197)的 my.cnf 配置 在 [mysqld] 中新增以下内容: 复制代码 代码如下: log-bin=mysql-binlog-bin-index=mysql-bin.indexserver-id = 1sync_binlog=1binlog_format=mixed 然后指定要做同步的数据库,并忽略掉不需要做同步的数据库 复制代码 代码如下: binlog-do-db = testdbbinlog-ignore-db = mysqlbinlog-i
-
MySQL5.6 数据库主从同步安装与配置详解(Master/Slave)
MySQL5.6 数据库主从同步安装与配置详解(Master/Slave) 本篇文章主要介绍了MySQL5.6 数据库主从同步安装与配置详解,具有一定的参考价值,有兴趣的可以了解一下. 安装环境 操作系统 :CentOS 6.5 数据库版本:MySQL 5.6.27 主机A:192.168.1.1 (Master) 主机B:192.168.1.2 (Slave) 这里强调的数据库的版本,是因为MySQL在5.6之前和之后的安装方式是不一样的. 本人在进行配置的时候,也遇到了这个坑,这里提前说明,
-
MySQL主从同步、读写分离配置步骤
现在使用的两台服务器已经安装了MySQL,全是rpm包装的,能正常使用. 为了避免不必要的麻烦,主从服务器MySQL版本尽量保持一致; 环境:192.168.0.1 (Master) 192.168.0.2 (Slave) MySQL Version:Ver 14.14 Distrib 5.1.48, for pc-linux-gnu (i686) using readline 5.1 1.登录Master服务器,修改my.cnf,添加如下内容: server-id = 1 //数据库ID号,
-
详解MySQL数据库设置主从同步的方法
简介 MySQL主从同步是目前使用比较广泛的数据库架构,技术比较成熟,配置也不复杂,特别是对于负载比较大的网站,主从同步能够有效缓解数据库读写的压力. MySQL主从同步的机制: MySQL同步的流程大致如下: 1.主服务器(master)将变更事件(更新.删除.表结构改变等等)写入二进制日志(master log). 2.从服务器(slave)的IO线程从主服务器(binlog dump线程)获取二进制日志,并在本地保存一份自己的二进制日志(relay log) 3.从服务器的SQL线程读取本
-
详解Mysql主从同步配置实战
1.Introduction 之前写过一篇文章:Mysql主从同步的原理. 相信看过这篇文章的童鞋,都摩拳擦掌,跃跃一试了吧? 今天我们就来一次mysql主从同步实战! 2.环境说明 os:ubuntu16.04 mysql:5.7.17 下面的实战演练,都是基于上面的环境.当然,其他环境也大同小异. 3.进入实战 工具 2台机器: master IP:192.168.33.22 slave IP:192.168.33.33 master机器上的操作 1.更改配置文件 我们找到文件 /etc/
-
linux下指定mysql数据库服务器主从同步的配置实例
一. 概念: ① 数据库同步 (主从同步 --- 主数据库写的同时 往从服务器写数据)② 数据库同步 (主主同步 --- 两台数据库服务器互相写数据) 二. 举例数据库服务器(A) 主数据库 IP:192.168.1.134数据库服务器(B) 主数据库 IP:192.168.1.138两台服务器同步的用户名为: bravedu 密码: brave123 一.主数据库操作设置(A):① 创建同步用户名 允许连接的 用户IP地址 (非本机IP) 复制代码 代码如下: grant
-
mysql主从同步快速设置方法
安装环境 centos 5.4 mysql 5.1.xx 采用rpm直接安装 xtrabackup 1.2.22 采用rpm直接安装 复制代码 代码如下: [mysqld] server-id = 1 log-bin innodb_flush_log_at_trx_commit=1 sync_binlog=1 datadir=/var/lib/mysql character-set-server=utf8 init_connect='SET NAMES utf8' 设定了默认字符集为utf8,可
-
MySQL主从同步原理介绍
概述 Mysql的Replication(复制)是一个异步的复制过程,从一个 Mysql instance(我们称之为 Master)复制到另一个Mysql instance(我们称之 Slave).在 Master 与 Slave之间的实现整个复制过程主要由三个线程来完成,其中两个线程(Sql线程和IO线程)在 Slave 端,另外一个线程(IO线程)在Master端. 主从同步需求 要实现 MySQL 的 Replication ,首先必须打开 Master 端的BinaryLog(mysq
随机推荐
- Angular2使用jQuery的方法教程
- MySQL导出数据遇到secure-file-priv问题的解决方法
- uploader秒传图片到服务器完整代码
- js将json格式的对象拼接成复杂的url参数方法
- js location.replace与location.reload的区别
- nginx配置引发的403问题解决办法
- python实现堆栈与队列的方法
- PHP浮点数的一个常见问题
- PHP在线打包下载功能示例
- 基于Python3 逗号代码 和 字符图网格(详谈)
- Python实现多线程抓取妹子图
- AndroidUI组件SlidingTabLayout实现ViewPager页滑动效果
- Android仿微信底部实现Tab选项卡切换效果
- 数据库崩溃,利用备份和日志进行灾难恢复
- Android 自定义view模板并实现点击事件的回调
- VUE axios上传图片到七牛的实例代码
- MSSQL 监控数据/日志文件增长实现方法
- js html5 css俄罗斯方块游戏再现
- jquery1.5.1中根据元素ID获取元素对象的代码
- 使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
其他
- python鼠标键盘模拟输入
- flutter 滑动切换页面
- python实现共轭梯度法
- springboot 配置jvm
- java读取excel数字变成科学 4变成4.0
- pygame超时怎么设置
- layui表格多出内容隐藏
- python websocket 获取数据
- python读取CSV数据实现线性回归
- c#生成唯一订单号 知乎
- vue-cli3.0 构建vue的npm依赖包
- python如何将两个列表合并为二维数组、
- layui前端id显示为名称
- springboot hive mapper查询
- vue.js jspdf.js 预览pdf
- sql报错字段长度不够postgresql
- C语言 opencv
- vscode为什么引入文件全部都是重复的文件夹
- 级联选择器输入筛选 vue
- vue转盘抽奖布局实现