《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…

java随机数生成(固定位数)

随机生成 a 到 b (不包含b)的整数:(int)(Math.random()*(b-a))a; 随机生成 a 到 b (包含b)的整数:(int)(Math.random()*(b-a1))a;转载于:https://www.cnblogs.com/zhwl/p/3624726.html

POJ 3670 Eating Together

POJ_3670 由于递增和递减是类似的,下面不妨只讨论变成递增序列的情况。 由于Di只有三个数,所以可以考虑将序列分割成三部分,第一部分全部变成1,第二部分全部变成2,第三部分全部变成3。然后我们枚举3开始的位置&#xf…

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

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

json/ 发送形式_24/7的完整形式是什么?

json/ 发送形式24/7:二十四 (24/7: Twenty-Four Seven) 24/7 or 24-7 service, which generally marked "twenty-four seven" is service that is existing at any time and typically, every day in trade business and industry. Substitute orthograph…

《MySQL tips:并发查询与并发连接区别》

并发连接与并发查询,并不是一个概念。 在执行show processlist的结果里,看到了几千个连接,指的是并发连接。 而"当前正在执行"的语句,才是并发查询。 并发连接数多影响的是内存。 并发查询太高对CPU不利。一个机器的…

对上拉下拉电阻的作用作个总结(想了解的过来看看)(转载)

转自:http://www.amobbs.com/thread-5475279-1-3.html 一、定义:上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!下拉同理!上拉是对器件注入电流,下拉是输出电流;弱强只是…

给用户传入的变量进行转义操作

先看代码实现: /* 对用户传入的变量进行转义操作。*/ if (!get_magic_quotes_gpc()) {if (!empty($_GET)){$_GET addslashes_deep($_GET);}if (!empty($_POST)){$_POST addslashes_deep($_POST);}$_COOKIE addslashes_deep($_COOKIE);$_REQUEST addslashes_…

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

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

NIM的完整形式是什么?

NIM:无内部消息 (NIM: No Internal Message) NIM is an abbreviation of "No Internal Message". NIM是“无内部消息”的缩写。 It is an expression, which is commonly used in the Gmail platform. It is written in the subject of the mail, if the…

[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 …

let 只能在严格模式下吗_LET的完整形式是什么?

let 只能在严格模式下吗LET&#xff1a;今天早早离开 (LET: Leaving Early Today) LET is an abbreviation of "Leaving Early Today". LET是“ Leaveing Today Today”的缩写 。 It is an expression, which is commonly used in the Gmail platform. It is writt…

js 遮罩层 loading 效果

//调用方法 //关闭事件<button οnclickLayerHide()>关闭</button>&#xff0c;在loadDiv(text)中&#xff0c;剔除出来 //调用LayerShow(text)&#xff0c;text为参数&#xff0c;可以写入想要写入的提示语 //本方法在调用时会自动生成一个添加到body的div&#x…

centos6.5安装配置LDAP服务[转]

centos6.5安装配置LDAP服务[转] 安装之前查一下 1find / -name openldap*centos6.4默认安装了LDAP&#xff0c;但没有装ldap-server和ldap-client 于是yum安装 1su root2yum install -y openldap openldap-servers openldap-clients不建议编译源码包&#xff0c;有依赖比较麻烦…

《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…

Freemarker中遍历List实例

Freemarker中如何遍历List摘要&#xff1a;在Freemarker应用中经常会遍历List获取需要的数据&#xff0c;并对需要的数据进行排序加工后呈现给用户。那么在Freemarker中如何遍历List&#xff0c;并对List中数据进行适当的排序呢&#xff1f;通过下文的介绍&#xff0c;相信您一…

工作总结:文件对话框的分类(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;这样做的…

nfc/nfc模式_NFC的完整形式是什么?

nfc/nfc模式NFC&#xff1a;没有进一步评论 (NFC: No Further Comment) NFC is an abbreviation of "No Further Comment". NFC是“没有进一步评论”的缩写 。 It is an expression, which is commonly used in messaging or chatting on social media networking s…