《MySQL——主备一致性六问六答》

目录

    • 备库为什么要设置为只读模式?
    • 备库设置为只读,如何与主库保持同步更新?
    • A到B的内部流程如何?
    • binlog内容是什么?
    • `row`格式对于恢复数据有何好处
    • M-M结构的循环复制问题以及解决方案

备库为什么要设置为只读模式?

有这样几点考虑:

1、有时候一些运营类的查询语句会被放到备库上去查,设置为只读可以防止误操作

2、防止切换逻辑有bug,比如切换过程中出现双写( 同时写两个库(A、B )),造成主备不一致

3、可以用 readonly 状态,来判断节点的角色

备库设置为只读,如何与主库保持同步更新?

readonly的设置对于super权限用户是无效的。用于同步的线程,就拥有super权限。

A到B的内部流程如何?

主库接收到客户端的更新请求后,执行内部事务的更新逻辑,同时写binlog;

备库B与主库A之间维持一个长连接。主库内部有一个线程,专门用于服务备库B这个长连接。

一个事务日志同步的完整过程:

1、备库B通过change master命令,设置主库A的IP、端口、用户名、密码,以及请求binlog的起始位置(文件名+日志偏移量)

2、备库B执行start slave命令,备库启动两个线程io_threadsql_threadio_thread负责与主库建立连接

3、主库A校验完用户名、密码后,按照备库B传过来的起始位置,读取本地的binlog然后发给备库B

4、备库B拿到binlog后,写到本地文件,称为中转日志(relay log)

5、sql_thread读取中转日志relay log ,解析日志里的命令,并执行

binlog内容是什么?

在解释内容之前,需要知道binlog的格式。

binlog有三种格式:statementrowmixed

statement

binlog_format=statement 时,binlog 里面记录的就是 SQL 语句的原文

在这里插入图片描述

statement格式的binlog的缺陷有个缺陷:

主备使用的索引可能是不一致的,最终导致执行删除时删除的数据不一致。

**row **

row 格式的 binlog 里没有了 SQL 语句的原文,而是替换成了两个 event: Table_mapDelete_rows.
在这里插入图片描述

1、 Table_map , 用于说明操作的表是test库的表t

2、Delete_rows , 用于定义删除的行为

binlog_format = row,binlog里面记录了真实删除行的主键id,这样binlog传到备库去的时候,肯定不会出现主备删除不同行的问题

mixed

mixed格式用于哪些场景呢?

statement格式可能会导致主备不一致,所以要使用row格式

row格式比较占空间,同时也更要耗费IO资源,影响执行速度

所以采用这种方案,采用mixed格式,MySQL自己会判断这条SQL语句是否可能引起主备不一致,如果可能,使用row格式,否则使用statement格式。

row格式对于恢复数据有何好处

现在,越来越多场景要求使用row格式的binlog,可以从delete、insert、update三种sql语句角度看待这个问题。

使用delete语句,row格式会把被删除的行的整行信息保存。所以删错之后,只需要把binlog记录的delete语句转成insert就能恢复了。

使用insert语句,row格式会记录所有的字段信息。所以插入错误的时候,只需要把binlog记录的insert语句转成delete语句就能恢复了。

使用update语句,binlog会记录修改前整行的数据和修改后的整行数据。所以如果update误执行,只需要把event前后的两行信息对调,再去数据库执行,就能恢复数据了。

M-M结构的循环复制问题以及解决方案

M-S结构
M-M结构

图1是M-S结构,但是现在常用的是M-M结构,M-M结构区别在于:节点A与节点B总是互为主备关系,所以在切换的时候就不用修改主备关系了。

M-M存在循环复制问题:

在节点A更新一个语句,把生成的binlog发给节点B。

节点B执行完更新语句后也会生成binlog。

如果A同时为B的备库,A会把节点B新生成的binlog拿过去执行。节点A和B之间会不断循环执行这个更新语句。

解决方案:

已知MySQL在binlog中记录了命令第一次执行所在实例的server id。

1、规定两个库的server id 必须不同。若相同,则不能设定为主备关系

2、备库接到binlog,生成与原binlog的server id相同的新的binlog

3、每个库在收到从自己的主库发过来的日志后,先判断server id,如果和自己的相同,表示这个日志是自己生成的,丢弃这个日志。

所以使用M-M结构的日志执行流程如下:

1、从节点A更新的事务,binlog里记录的都是A的server id

2、传到节点B执行一次后,节点B生成的binlog的server id 也是A的server id

3、再传给节点A,A判断这个server id与自己的相同,不处理这个日志

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

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

相关文章

fyi 在邮件里是什么意思_FYI的完整形式是什么?

fyi 在邮件里是什么意思仅供参考:供您参考 (FYI: For Your Information) FYI is an acronym of "For Your Information". It is a widespread internet slang used these days in text messaging, instant messaging, and chatting on Facebook, WhatsApp…

Hyper-V 替换 vmwp

要激活 Hyper-V 下的虚机 最简单的方法是用带证书的vmwp替换掉原来的 带证书的vmwp参见:http://bbs.pcbeta.com/viewthread-1408240-1-1.html 下载后腰替换 先把 Hyper-V 的俩服务停止掉 然后找到 C:\Windows\System32\vmwp.exe 右键--安全 替换掉所有者 然后给自己…

ejb模式_EJB的完整形式是什么?

ejb模式EJB:企业Java Bean (EJB: Enterprise Java Bean) EJB is an abbreviation of Enterprise Java Bean. EJB is one of many Java application programming interfaces (API) for flexible and manageable structuring of Java Platform, Enterprise Edition (J…

Android之PreferenceActivity

http://www.cnblogs.com/wservices/archive/2010/07/08/1773449.html 看到很多书中都没有对PreferenceActivity做介绍,而我正好又在项目中用到,所以就把自己的使用的在这总结一下,也方便日后查找。 PerferenceActivity是什么,看下…

浅谈算法和数据结构: 七 二叉查找树

前文介绍了符号表的两种实现,无序链表和有序数组,无序链表在插入的时候具有较高的灵活性,而有序数组在查找时具有较高的效率,本文介绍的二叉查找树(Binary Search Tree,BST)这一数据结构综合了以上两种数据结构的优点。…

《MySQL——备库多线程复制策略。》

目录备库并行复制能力MySQL5.6版本 并行复制策略MariaDB 并行复制策略MySQL5.7版本 并行复制策略MySQL5.7.22版本 并行复制策略总结备库并行复制能力 主要涉及两个方面的并行度: 1、客户端写入主库的能力 2、备库上sql_thread执行中转日志relay log 1的并行能力…

为移动端网页构造快速响应按钮

背景 在谷歌,我们不断地推测手机网页应用的可能性。像HTML5这样的技术使我们网页版的应用以及运行在手机设备上的原生应用。而这些技术的成就之一就是我们开发了一种新的创建按钮的方法,使按钮的响应时间远远快于一般的HTML按钮。在此之前的按钮或者其他…

Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解+使用教程

Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解使用教程 Red Gate系列文章: Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解使用教程 Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制…

《MySQL——基于位点orGTID的主备切换协议》

一主多从的设置,用于读写分离,主库负责所有的写入和一部分读,其他读请求则由从库分担。 一主多从架构下,主库故障后的主备切换问题。相比于一主一备,多了从库指向新主库的过程。 基于位点的主备切换同步 把节点B设…

数据科学和统计学_数据科学中的统计

数据科学和统计学统计 (Statistics) Statistics are utilized to process complex issues in reality with the goal that Data Scientists and Analysts can search for important patterns and changes in Data. In straightforward words, Statistics can be utilized to ge…

《MySQL——如何解决一主多从的读写分离的过期读问题》

目录两种架构两种架构特点强制走主库方案Sleep方案判断主备无延迟方案配合semi-sync等主库位点方案GTID方案两种架构 基于一主多从的读写分离,如何处理主备延迟导致的读写分离问题。 读写分离的主要目标:分摊主库压力。 有两种架构: 1、客…

《MySQL——外部检测与内部统计 判断 主库是否出现问题》

目录select1判断查表判断更新判断外部检测弊端内部统计一主一备的双M架构里,主备切换只需要把客户端流量切换到备库。 在一主多从的架构里,主备切换要把客户端流量切换到备库,也需要把从库接到新主库上。 切换有两种场景:1、主动…

[Json] C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json (转载)...

点击下载 ConvertJson.rar 本类实现了 C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json|等功能大家先预览一下 请看代码 /// <summary> /// 类说明&#xff1a;Assistant /// 编 码 人&#xff1a;苏飞 /// 联系方式&#xff1a;361983679 …

《MySQL——恢复数据-误删行、表、库》

目录误删行事前预防误删行数据方法误删表/库延迟复制备库事前预防误删库/表方法传统的架构不能预防误删数据&#xff0c;因为主库的一个drop table命令&#xff0c;会通过binlog传给所有从库和级联从库&#xff0c;进而导致整个集群的实例都会执行这个命令。 MySQL相关的误删除…

python图例位置_Python | 图例位置

python图例位置Legends are one of the key components of data visualization and plotting. Matplotlib can automatically define a position for a legend in addition to this, it allows us to locate it in our required positions. Following is the list of locations…

工作总结:文件对话框的分类(C++)

原文地址&#xff1a;http://www.jizhuomi.com/software/173.html 文件对话框分为打开文件对话框和保存文件对话框&#xff0c;相信大家在Windows系统中经常见到这两种文件对话框。例如&#xff0c;很多编辑软件像记事本等都有“打开”选项&#xff0c;选择“打开”后会弹出一个…

《MySQL——Innodb改进LRU算法》

Innodb改进LRU.算法&#xff0c;实质上将内存链表分成两段。 靠近头部的young和靠近末尾的old&#xff0c;取5/12段为分界。 新数据在一定时间内只能在old段的头部&#xff0c;当在old段保持了一定的时间后被再次访问才能升级到young。 实质上是分了两段lru&#xff0c;这样做的…

jQuery: 整理4---创建元素和添加元素

1.创建元素&#xff1a;$("内容") const p "<p>这是一个p标签</p>" console.log(p)console.log($(p)) 2. 添加元素 2.1 前追加子元素 1. 指定元素.prepend(内容) -> 在指定元素的内部的最前面追加内容&#xff0c;内容可以是字符串、…

Design a high performance cache for multi-threaded environment

如何设计一个支持高并发的高性能缓存库 不 考虑并发情况下的缓存的设计大家应该都比较清楚&#xff0c;基本上就是用map/hashmap存储键值&#xff0c;然后用双向链表记录一个LRU来用于缓存的清理。这篇文章 应该是讲得很清楚http://timday.bitbucket.org/lru.html。但是考虑到高…

LinkChecker 8.1 发布,网页链接检查

LinkChecker 8.1 可对检查时间和最大的 URL 数量进行配置&#xff1b;当使用 HTTP 请求时发送 do-not-track 头&#xff1b;生成 XML 的 sitemap 用于搜索引擎优化&#xff1b;检测 URL 长度和重复的页面内容&#xff1b;修复了很多检查的 bug。 LinkChecker 是一个网页链接检查…