Mysql系列-Binlog主从同步

原文链接:https://zhuanlan.zhihu.com/p/669450627

一、主从同步概述

mysql主从同步,即MySQL Replication,可以实现将数据从一台数据库服务器同步到多台数据库服务器。MySQL数据库自带主
从同步功能,经过配置,可以实现基于库、表结构的多种方案的主从同步。可以对MySQL做主从架构并且进行读写分离,让主服务器(Master)处理写请求,从服务器(Slave)处理读请求,这样可以
进一步提升数据库的并发处理能力,如下图所示:

二、主从同步作用

一般来说,优先考虑优化sql及索引等,充分发挥数据库的最大性能;其次是采用缓存的策略,比如使用redis、magodb
等缓存工具,通过其高性能的优势把数据保存在内存数据库中,提升读取的效率,最后才是采取数据库主从架构,进行读写分
离(因为成本高)。

2.1 读写分离

通过主从复制的方式来同步数据,之后通过读写分离的方法提升数据库并发处理能力。简单来说就是数据放在多个数据库中,其中一
个是Master主库,其余的是Slave从库。当主数据库数据发生变化时,会自动将数据同步到从数据库中,程序可以设置去从库
读取数据,从而实现读写分离

2.2 数据备份

主从同步属于数据热备份机制,在主库正常运行下备份,不影响提供查询服务。

2.3 高可用性

数据备份其实是冗余的机制,通过冗余的方式可以换取数据库的高可用性,当服务器出现故障、宕机等无可用的情况下,可
以迅速进行故障切换,让从库当主库,保证服务正常运行。

三、主从同步原理

3.1 主从同步流程图

3.2 主从同步执行流程

1、从库不断试探主库的二进制日志文件(binlog),如果这个文件有更新则发送请求从主库获取新的内容;
2、用户向主库中写数据:包括添加、删除、修改、建库建表等操作;
3、主库将写的命令记录到二进制文件并更新二进制文件的偏移量;
4、从库试探主库二进制文件发现偏移量与从库中记录的偏移量值不一样时表示主库有更新,那么启动IO线程向主库请求从某个偏移量开始到二进制日志文件结束位置之间所有的数据;
5、主库根据从库请求,通过binlog dump线程将新偏移量推送到从库中;
6、从库获取主库的数据后,会将这些命令数据写入中继日志文件(relaylog)中,然后唤醒SQL线程同时让当前的IO线程挂起(休眠等待);
7、SQL线程根据记录的中继日志文件的偏移量读取中继日志文件中的命令;
8、SQL线程获取到命令后在本地数据库进行回放(就是从库中执行主库的SQL语句),回放完成当前SQL线程挂机(休眠等待)。

3.3 主从同步线程

msyql 的主从同步通过3个线程完成,其中1个线程在主库,2个线程在从库上。

如果一个主库连接多个从库,那么主库将会给每个处于连接状态的从库创建一个Binary log dump线程,每个从库也有自己的同步I/O以及SQL线程。

3.3.1 Binary log dump 线程

当从库连上主库时,主库会创建一个线程来发送 binlog 的内容给从库。

在数据库终端执行sql: SHOW PROCESSLIST , 可以看到 Binlog Dump 线程。

binlog dump 线程在binlog中读取要发送给从库的数据时,会对binlog加锁。一旦数据读取完成,线程将释放锁,即使数据还未发送到从库。

3.3.2 IO 线程

当在从库上执行sql: START SLAVE ,从库将创建一个I/O线程。该线程将连接主库,并请求主库发送binlog中更新的记录给从库。

主库的Binlog Dump线程,将更新的binlog发送到从库,从库的 I/O线程将这些更新入从库的relay log。

在从库中执行sql: SHOW SLAVE STATUS, 能够看到 Slave_IO_running 的状态。

3.3.3 IO 线程

从库创建同步SQL线程来读取 relay log,并执行其中的事务。

一个从库使用2个线程将从主库读取更新以及在从库执行数据更新分成独立的任务。因此,从主库读取更新的任务不会减慢,即使从库执行数据更新任务很慢。例如,如果从库停止运行一段时间后再启动从库,从库的 I/O线程能够快速获从主库取到所有的binlog,即使 SQL 线程滞后。如果从库在 SQL线程执行所有更新前停止运行, I/O 线程至少获取到了一份安全的更新binlog并保存到从库的relay log, 当下次启动从库后就可能执行数据更新。

在从库上通过设置系统变量 slave_parallel_workers 的值大于0(默认值),可以开启并行处理任务。当该变量设置了,从库设置创建设置的数量的worker 线程,以及一个协调线程来管理worker 线程。如果你在使用多从库通道,每个通道都将有这么多线程。slave_parallel_workers大于0从库一般被称为多线程从库(副本)。一旦这么设置,失败的事务将会被重试。

3.4 Relay log与从库元数据存储

从库(副本)也会记录从库(源库)的binlog的当前位置以及从库的relay log。

在同步过程中,一个从库创建多个信息库。

3.4.1 relay log

该log有 I/O线程写入,log中的事务来自主库的binlog,并且将被 SQL线程执行更新到从库。

3.4.2 从库连接元数据存储

包含了从库I/O线程连接主库需要的信息,以及从主库binlog中检索事务需要的信息。连接元数据存储被写进表mysql.slave_master_info或者一个文件中。

3.4.3 从库的应用程序元数据存储

包含了从库SQL线程从relay log读取事务以及将事务更新到从库的信息。从库的应用程序元数据存储被写进表mysql.slave_relay_log_info 或者 一个文件中。

从库连接元数据存储与从库的应用程序元数据存储被统称为从库元数据存储,可以参考更多相关说明

使从库能够灵活应对宕机: 事务性存储引擎InnoDB创建表mysql.slave_master_info 与 表mysql.slave_relay_log_info。从库的应用程序元数据存储表更新将与事务一起提交, 也就是记录在元数据存储中的从库进度信息一直与从库的更新保持一致,即使从库宕机。

四、解决主从数据一致性

4.1 全同步复制

全同步复制,就是当主库执行完一个事务之后,要求所有的从库也都执行完该事物,才可以返回处理结果给客户端;因此,虽然
全同步复制数据一致性得到保证了,但是主库完成一个事务需要等待所有从库完成,性能难免会降低。

4.2 异步复制

异步复制,就是当主库提交事物后,会通知binlog dump线程发送binlog 日志给从库,一旦binlog dump线程将binlog 日志
发送给从库之后,不需要等到从库也同步完成事物,主库就会将处理结果返回给客户端。
主库只管自己完成事物,就将处理结果返回给客户端(此时从库不一定完成同步事物),可能导致主从数据不一致问题,比如刚在
主库新增的数据,马上去从库查询就可能查询不到。而且当主库提交完事物后,如果宕机了,可能会导致binlog 日志未同步给从库,
同时为了回复故障切换主从节点的话,就会出现数据丢失问题。因此,虽然异步复制性能高,但是数据一致性是最弱的。
mysql主从复制,默认采用的就是异步复制这种复制策略。

4.3 半同步复制

mysql5.5 版本后开始支持半同步复制方式。原理就是在客户端提交commit之后不直接将结果返回客户端,而是至少等待至少有一个从
库收到binlog ,并且写到中继日志之后再返回给客户端。优点:提高数据一致性。缺点:降低主库写的效率。
mysql5.7 版本中增加了一个rpl_semi_sync_master_wait_for_slave_count参数,可以根据需要响应的从库数据库数量
设置,默认为1,也就是一个从库有了响应,就返回给客户端。如果这个参数调大,就可以提高数据一致性。

4.4 增强半同步复制

增强半同步复制,是mysql 5.7.2后的版本对半同步复制做的一个改进,原理上几乎是一样的,主要是解决幻读的问题。
主库配置了参数 rpl_semi_sync_master_wait_point = AFTER_SYNC 后,主库在存储引擎提交事务前,必须先收到从库数据
同步完成的确认信息后,才能提交事务,以此来解决幻读问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

B端设计:任何不顾及用户体验的设计,都是在装样子,花架子

B端设计是指面向企业客户的设计,通常涉及产品、服务或系统的界面和功能设计。与C端设计不同,B端设计更注重实用性和专业性,因为它直接影响企业的效率和利益。 在B端设计中,用户体验同样至关重要。不顾及用户体验的设计只是空洞的表…

数据库之索引(二)

目录 一、如何判断数据库的索引是否生效 二、如何评估索引创建的是否合理 三、索引是否越多越好 四、如何处理数据库索引失效 五、是否所有的字段都适合创建索引 一、如何判断数据库的索引是否生效 可以使用EXPLAIN语句查看索引是否正在使用。 例如,假设已经创…

70.Bug:使用list.sort(Comparator.Comping(User::getCreateTime).reverse())空指针异常

1.出错原因&#xff1a;在xml中没有做字段映射 报错语句复现&#xff1a; List<User> listnew ArrayList<>()&#xff1b; xml中进行查询数据&#xff0c;数据存放在list中........... //排序 list.sort(Comparator.Comping(User::getCreateTime).reverse())&…

经典的layui框架,还有人用吗?令人惋惜。

自从layui官网宣布关闭之后&#xff0c;layui框架的用户飞速下滑&#xff0c;以至于到现在贝格前端工场承接的项目中&#xff0c;鲜有要求使用layui框架的&#xff0c;那么个框架还有人用吗&#xff1f; 一、layui没落是不是jquery惹的祸 layui的没落与jQuery无关。layui框架…

Hi3861 OpenHarmony嵌入式应用入门--UDP Server

本篇使用的是lwip编写udp服务端。需要提前准备好一个PARAM_HOTSPOT_SSID宏定义的热点&#xff0c;并且密码为PARAM_HOTSPOT_PSK。 修改网络参数 在Hi3861开发板上运行上述四个测试程序之前&#xff0c;需要根据你的无线路由、Linux系统IP修改 net_params.h文件的相关代码&…

深入理解 Docker 容器技术

一、引言 在当今的云计算和软件开发领域&#xff0c;Docker 容器技术已经成为了一项不可或缺的工具。它极大地改变了应用程序的部署和运行方式&#xff0c;为开发者和运维人员带来了诸多便利。 二、Docker 容器是什么&#xff1f; Docker 容器是一种轻量级、可移植、自包含的…

起底:Three.js和Cesium.js,二者异同点,好比全科和专科.

Three.js和Cesium.js是两个常用的webGL引擎&#xff0c;很多小伙伴容易把它们搞混淆了&#xff0c;今天威斯数据来详细介绍一下&#xff0c;他们的起源、不同点和共同点&#xff0c;阅读后你就发现二者就像全科医院和专科医院的关系&#xff0c;很好识别。 一、二者的起源 Th…

性能测试相关理解---性能测试流程(二)

六、性能测试流程&#xff08;如何做性能测试&#xff1f;) 根据学习全栈测试博主的课程做的笔记 1、前期准备– 项目初期就开始&#xff0c;业务需求评审时尽量参与,对业务更深刻的认识&#xff08;确定哪些是核心业务、哪些可能存在并发请求、确定什么地方会出现瓶颈,方便后…

WebOffice在线编微软Offfice,并以二进制流的形式打开Word文档

在日常办公场景中&#xff0c;我们经常会遇到这种场景&#xff1a;我们的合同管理系统的各种Word,excel,ppt数据都是以二进制数组的形式存储在数据库中&#xff0c;如何从数据库中读取二进制数据&#xff0c;以二进制数据作为参数&#xff0c;然后加载到浏览器的Office窗口&…

【无标题】地平线2西之绝境/Horizon Forbidden West™ Complete Edition(更新:V1.3.57)

游戏介绍 与埃洛伊同行&#xff0c;在危险壮美的边疆之地揭开种种未知的神秘威胁。此完整版可完整享受广受好评的《地平线 西之绝境™》内容和额外内容&#xff0c;包括在主线游戏后展开的后续故事“炙炎海岸”。 重返《地平线》中遥远未来的后末日世界&#xff0c;探索远方的土…

Twitter群发消息API接口的功能?如何配置?

Twitter群发消息API接口怎么申请&#xff1f;如何使用API接口&#xff1f; 为了方便企业和开发者有效地与用户互动&#xff0c;Twitter提供了各种API接口&#xff0c;其中Twitter群发消息API接口尤为重要。AokSend将详细介绍Twitter群发消息API接口的功能及其应用场景。 Twit…

html+css+js贪吃蛇游戏

贪吃蛇游戏&#x1f579;四个按钮控制方向&#x1f3ae; 源代码在图片后面 点赞❤️关注&#x1f64f;收藏⭐️ 互粉必回&#x1f64f;&#x1f64f;&#x1f60d;&#x1f60d;&#x1f60d; 源代码&#x1f4df; <!DOCTYPE html> <html lang"en"&…

15jQuery引入

【一】什么是jQuery jQuery是一个轻量级的、兼容多浏览器的JavaScript库。jQuery内部封装了原生的js代码&#xff0c;提高编写效率 【二】jQuery引入配置 1.● 代码复制下来放到自己建的txt中&#xff0c;然后把他移入pycharm项目中重构成js文件(注意&#xff1a;只能在当前…

win10使用小技巧三

1. 添加照片查看器支持 目的&#xff1a;为Windows 10添加对特定图片格式&#xff08;如JPG&#xff09;的支持&#xff0c;使用Windows照片查看器。步骤&#xff1a; 使用WinR打开运行窗口。输入regedit&#xff0c;点击确定进入注册表编辑器。导航至HKEY_CURRENT_MACHINE\SO…

tomcat原理、结构、设计模式

1 what 一种web服务器&#xff0c;运行java servlet、jsp技术&#xff0c;能为java web提供运行环境并通过http协议处理客户端请求。即tomcat http服务器 servlet容器。同类产品有jetty Web应用&#xff1a;Web应用是指通过Web浏览器访问的应用程序&#xff0c;它使用Web技术…

平台稳定性里程碑 | Android 15 Beta 3 已发布

作者 / 产品管理副总裁、Android 开发者 Matthew McCullough 从近期发布的 Beta 3 开始&#xff0c;Android 15 达成了平台稳定性里程碑版本&#xff0c;这意味着开发者 API 和所有面向应用的行为都已是最终版本&#xff0c;您可以查阅它们并将其集成到您的应用中&#xff0c;并…

HTML 标签列表(功能排序)

HTML 标签列表(功能排序) HTML(超文本标记语言)是构建网页的标准语言,它定义了网页的结构和内容。HTML包含众多标签,每个标签都有其特定的功能和用途。本文将按照功能对HTML标签进行分类和排序,以帮助您更好地理解和使用这些标签。 基础结构标签 <!DOCTYPE html>…

使用Node.js 框架( Express.js)来创建一个简单的 API 端点

文章目录 使用Node.js 框架&#xff08; Express.js&#xff09;来创建一个简单的 API 端点什么是express安装修改代码 express 自动刷新 使用Node.js 框架&#xff08; Express.js&#xff09;来创建一个简单的 API 端点 什么是express Express 是一个保持最小规模的灵活的 …

系统架构设计师——计算机体系结构

分值占比3-4分 计算机硬件组成 计算机硬件组成主要包括主机、存储器和输入/输出设备。 主机&#xff1a;主机是计算机的核心部分&#xff0c;包括运算器、控制器、主存等组件。运算器负责执行算术和逻辑运算&#xff1b;控制器负责协调和控制计算机的各个部件&#xff1b;主存…

如何看自己电脑的ip地址?这些方法教你搞定

在数字化时代&#xff0c;网络已经成为我们生活中不可或缺的一部分。对于每一个接入网络的设备来说&#xff0c;IP地址就像是一个独特的身份证&#xff0c;它标识着设备在网络中的位置。对于电脑用户而言&#xff0c;了解如何查看自己电脑的IP地址&#xff0c;不仅有助于我们更…