MySQL主从同步原理及应用
作者:Java烘焙师 发布时间:2024-01-18 07:42:24
1、主从同步原理
主从同步架构图(异步同步)
这是最常见的主从同步架构
主从同步流程(异步同步)
主库把数据变更写入
binlog
文件从库I/O线程发起
dump
请求主库I/O线程推送
binlog
至从库从库I/O线程写入本地的
relay log
文件(与binlog
格式一样)从库SQL线程读取
relay log
并重新串行执行一遍,得到与主库相同的数据
什么是binlog?
主库每提交一次事务,都会把数据变更,记录到一个二进制文件中,这个二进制文件就叫binlog
。需注意:只有写操作才会记录至binlog
,只读操作是不会的(如select
、show
语句)。
binlog的3种格式
statement格式:binlog
记录的是实际执行的sql语句
row格式:binlog
记录的是变化前后的数据(涉及所有列),形如update table_a set col1=value1
, col2=value2 ... where col1=condition1 and col2=condition2 ...
mixed格式:默认选择statement
格式,只在需要时改用row
格式
binlog格式对比
statement级别:优点是
binlog
文件小,缺点是主库的慢sql也会在从库上再出现一次,一些依赖环境或上下文的函数可能会产生不一致的数据row级别:缺点是文件大(一条语句如果涉及多行,会放大n倍),优点是无上述慢sql问题,不依赖环境或上下文
为了获取前后变化数据,
canal
建议使用row
级别
主从同步的2种方式
异步同步:默认方式,可能会导致主从切换时数据丢失。因为主库是否
commit
与主从同步流程无关,也不感知。半同步:高可用方案,较新
mysql
版本支持,需要至少1个从库(默认1,具体数量可指定)对写入relay log
进行ack,主库才会commit
并把结果返回client
。
主从同步流程(半同步)
从库在连接主库时,表明自己支持半同步复制
主库也需支持半同步复制,主库
commit
事务前会阻塞等待至少一个从库写入relay log
的ack
,直至超时如果阻塞等待超时,则主库临时切换回异步同步模式,当至少一个从库的半同步追上进度时,主库再切换至半同步模式
半同步适用场景
高可用备份:半同步复制,可确保从库与主库的一致性,当主库发生故障时,切换到从库不会丢失数据。为了保证稳定性(不因半同步慢而拖累主库),一般不承担业务流量、尽可能快地ack
,只用于同步备份。
2、主从同步应用场景
普通场景:线上从库异步同步,高可用备份半同步
对一致性要求较高的大数据取数需求
大数据取数可能导致从库cpu使用率飙升、ack变慢,可设置半同步所需ack数量为1,正常情况下高可用备份能很快ack
,于是主库会commit
并返回,而大数据取数复制慢一些也无所谓。这样就不会因为大数据取数ack
慢而影响主库和业务了。
来源:https://news.51cto.com/art/202110/684936.htm


猜你喜欢
- 一、为什么要配置文件1、容易编辑,配置比较集中,方便修改,在大业务量的系统里面,通过配置会方便后人理解整个系统的架构2、做到业务代码和环境解
- 一、pytest.ini说明pytest.ini是pytest的全局配置文件,一般放在项目的根目录下固定的配置文件(pytest.ini),
- 先看一下最简单的例子,在test中,添加一个字段,字段名为birth,类型为date类型。mysql> alter table tes
- 数组的组合主要有:1.水平组合:np.hstack(arr1,arr2) 或 concatenate(arr1,arr2,axis=1)2.
- 本文实例讲述了php隐藏IP地址后两位显示为星号的方法。分享给大家供大家参考。具体实现方法如下:我们在很多的公共网站中都会有碰到显示用户的I
- 用途:图形化界面操作:通过设计一个图形化的界面,用户可以通过按钮或其他操作方式调用后台的Python程序进行数据处理、图像处理等功能。自动化
- SQL Server 平台修改自增列值由于之前处理过sql server数据库的迁移工作,尝试过其自增列值的变更,但是通过SQL 语句修改自
- 命令行进入python打开cmd——>直接输入python即可,如下退出python方法一:先按Ctrl+z,再按Enter(回车键)
- tensorflow下设置使用某一块GPU(从0开始编号):import osos.environ["CUDA_DEVICE_OR
- MySQL、SQL Server和mSQL都是绝佳的SQL工具,可惜,在ASP的环境下你却用不着它们来创建实用的SQL语句。不过,你可以利用
- MySQL如何查看元数据锁阻塞在哪里操作步骤:1、session 1 执行: start transaction;  
- 1.1.propety动态属性在面向对象编程中,我们一般把名词性的东西映射成属性,动词性的东西映射成方法。在python中他们对应的分别是属
- 我们知道可以将一个海量记录的 MySQL 大表根据主键、时间字段,条件字段等分成若干个表甚至保存在若干服务器中。 唯一的问题就是跨服务器批量
- 译注:这是一篇在Stack overflow上很热的帖子。提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(me
- 本文实例讲述了flask框架实现连接sqlite3数据库的方法。分享给大家供大家参考,具体如下:1. 在flask文件夹中新建一个model
- python字符串-删除末位字符(rstrip)rstrip函数用于删除字符串末位指定字符,默认为空白符。语法str.rstrip([cha
- 这段时间看了关于在SQL server 中通过日志和时间点来恢复数据。也看了一些网上的例子,看如何通过日志来恢复数据。 前提条件:数据库的故
- 那天突然的一个灵感,是针对防盗链的。正常上传的文件,若被人盗链则增加了自己服务器的负担,上次164.cc就因此被挂。然后想想对策,目前各类防
- 随着对称密码的发展,DES数据加密标准算法由于密钥长度较小(56位),已经不适应当今分布式开放网络对数据加密安全性的要求,因此1997年NI
- 之前使用beego的http库的时候,有的情况需要下载文件。beego是能实现,但就是有点问题:不支持回调,没法显示下载速度,这在日常开发中