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

一主多从的设置,用于读写分离,主库负责所有的写入和一部分读,其他读请求则由从库分担。

一主多从架构下,主库故障后的主备切换问题。相比于一主一备,多了从库指向新主库的过程。
在这里插入图片描述

基于位点的主备切换同步

把节点B设置为节点A‘的从库,执行change master命令:

CHANGE MASTER TO
MASTER_HOST = $host_name
MASTER_POST = $port
MASTER_USER = $user_name
MASTER_PASSWORD = $password
MASTER_LOG_FILE = $master_log_name
MASTER_LOG_POS = $master_log_pos
  • MASTER_HOST、MASTER_PORT、MASTER_USER和MASTER_PASSWORD四个参数,分别达标主库A’的IP、端口、用户名、密码

  • MASTER_LOG_FILE和MASTER_LOG_POS是主库对应的文件名和日志偏移量,就是同步位点

节点B要设置为A‘的从库,就必须要设置位点参数。

原本节点B是A的从库,本地记录的也是A的位点。 但是相同的日志,A的位点于A’的位点不同。所以在切换的时候需要先找同步位点。

(这个不一致造成的原因之一:备库启用了并行复制,例如使用了组提交并行(prepare和commit状态之间事务组可以并行执行),那么这时候在主库上先执行完成的事务在备库上就不一定先执行完成了,binlog因此就会有所差异。 )

找同步位点的方法:

1、等待新主库A‘把中转日志(relay log)全部同步完成

2、在A’上执行show master status命令,得到当前A’上最新的file和position

3、取原主库A故障时刻T

4、用mysqlbinlog工具解析A’的file,得到T时刻的位点123

不过这样并不精确:

假设在T时刻,主库A已经执行完成了一个insert语句插入一行数据R,并且已经将binlog传给A‘和B,然后在传完的瞬间主库A的主机就掉电了。

此时系统状态如下:

1、在从库B上,由于同步了binlog,R这一行已经存在

2、在新主库A’上,R这一行也已经存在,日志卸载123位置后

3、在从库B上执行change master命令,指向A’的file文件123位置,会把插入R这一行数据的binlog又同步到从库B执行,会发生主键冲突,然后停止同步

所以在切换主库的时候要主动跳过一些"重复操作"引起的错误,避免切换任务阻塞。

1、在从库上执行跳过事务命令:

set global sql_slave_skip_counter = 1;
start slave;

每次碰到错误就停下来,执行以此跳过命令,直到不再报错。

2、通过设置slave_skip_errors参数,直接设定跳过指定的错误

主备切换时,有两类错误经常遇到:

1062 插入数据时唯一键冲突
1032 删除数据时找不到行

可以把slave_skip_errors设置为"1032,1062",遇到这两个错误直接跳过。

注意,在主备切换过程中,跳过这两个错误是无损的。同步完成后,需要把整个参数设置为空,防止出现主从不一致时也跳过了。

基于GTID的主备切换同步

GTID全称Global Transaction Identifier ,也就是全局事务ID,是一个事务在提交的时候生成的,是这个事务的唯一标识。格式为:

GTID = server_uuid:gno
  • server_uuid是一个实例第一次启动时自动生成的,是一个全局唯一的值
  • gno是一个整数,初始值为1,每次提交事务的时候分配给这个事务,并+1

官方格式定义:

GTID = source_id:transaction_id

transaction_id指的是事务id,事务id实在事务执行的过程中分配的,如果这个事务回滚了,transaction_id也会增加,而gno实在事务提交的时候才会分分配,所以使用gno更好。

使用方法:在启动一个MySQL实例的时候,加上参数gtid_mode = onenforce_gtid_consistency = on

在GTID模式下,每个事务都会和一个GTID对应。

在GTID模式下,备库B要设置为新主库A’的从库:

CHANGE MASTER TO 
MASTER_HOST=$host_name 
MASTER_PORT=$port 
MASTER_USER=$user_name 
MASTER_PASSWORD=$password 
master_auto_position=1 

可以发现,现在不需要指定参数了。

实例A‘的GTID集合记为set_a,实例B的GTID集合记为set_b。

在实例B上执行start slave命令,取binlog:

1、实例B指定主库A’,基于主备协议建立连接

2、实例B把set_b发给主库A‘

3、实例A’算出set_a与set_b的差集,也就是所有存在于set_a但是不存在于set_b的GTID集合。

判断A‘本地是否包含了这个差集需要的binlog事务。

如果不包含,表示A’已经把实例B需要的binlog删除了,直接返回错误

如果确认全部包含,A‘从自己的binlog文件里面,找出第一个不在set_b的事务,发给B

4、从这个事务开始,往后读文件,按顺序取binlog发给B去执行

也就是说,基于GTID的主备关系里,系统认为只要建立主备关系,就必须保证主库发给备库的日志是完整的。如果备库要求的日志不存在,主库就拒绝把日志发给备库。

基于位点的主备协议,是由备库决定的,备库指定位点,主库顺着位点取log,不做日志完整性判断。

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

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

相关文章

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

数据科学和统计学统计 (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 是一个网页链接检查…

c语言语言教程0基础_C语言基础

c语言语言教程0基础Hey, Folks here I am back with my second article on C language. Hope you are through with my previous article C language - History, Popularity reasons, Characteristics, Basic structure etc. In this one, I will cover some fundamental conce…

《MySQL——临时表》

内存表与临时表区别 临时表&#xff0c;一般是人手动创建。 内存表&#xff0c;是mysql自动创建和销毁的。 内存表&#xff0c;指的是使用Memory引擎的表&#xff0c;建表语法&#xff1a;create table ... engine memeory 表的数据存在内存里&#xff0c;系统重启后会被清…

drei

模拟9 T3 &#xff08;COGS上也有&#xff0c;链接http://218.28.19.228/cogs/problem/problem.php?pid1428&#xff09; 题目描述 输入a&#xff0c;p&#xff0c;求最小正整数x&#xff0c;使得a^x mod p 1。 分析 神奇的欧拉定理&#xff08;对于gcd&#xff08;a&#xf…

css中变量_CSS中的变量

css中变量CSS | 变数 (CSS | Variables) CSS variables allow you to create reusable values that can be used throughout a CSS document. CSS变量允许您创建可在CSS文档中使用的可重用值。 In CSS variable, function var() allows CSS variables to be accessed. 在CSS变…

SuperSpider——打造功能强大的爬虫利器

SuperSpider——打造功能强大的爬虫利器 博文作者&#xff1a;加菲 发布日期&#xff1a;2013-12-11 阅读次数&#xff1a;4506 博文内容&#xff1a; 1.爬虫的介绍 图1-1 爬虫&#xff08;spider) 网络爬虫(web spider)是一个自动的通过网络抓取互联网上的网页的程序&#xf…

《MySQL——关于grant赋权以及flush privileges》

先上总结图&#xff1a; 对于赋予权限或者收回权限还是创建用户&#xff0c;都会涉及两个操作&#xff1a; 1、磁盘&#xff0c;mysql.user表&#xff0c;用户行所有表示权限的字段的值的修改 2、内存&#xff0c;acl_users找到用户对应的对象&#xff0c;将access值修改 g…

《MySQL 8.0.22执行器源码分析(1)——execute iterator一些记录》

目录一条语句的函数调用栈顺序8.0使用迭代器模式改进executorint *handler*::ha_rnd_next(*uchar* **buf*)int *TableScanIterator*::Read()int FilterIterator :: Read&#xff08;&#xff09;int HashJoinIterator::Read()int NestedLoopIterator :: Read&#xff08;&#…

strcspn函数

函数原型&#xff1a;extern int strcspn(char *str1,char *str2) 参数说明&#xff1a;str1为参照字符串&#xff0c;即str2中每个字符分别与str1中的每个字符比较。 所在库名&#xff1a;#include <string.h> 函数功能&#xff1a;以str1为参照&#xff0c…

MongoDB源码概述——内存管理和存储引擎

数据存储&#xff1a; 之前在介绍Journal的时候有说到为什么MongoDB会先把数据放入内存&#xff0c;而不是直接持久化到数据库存储文件&#xff0c;这与MongoDB对数据库记录文件的存储管理操作有关。MongoDB采用操作系统底层提供的内存文件映射&#xff08;MMap&#xff09;的方…