当前位置:网站首页>MySQL主备切换
MySQL主备切换
2022-07-29 22:47:00 【苦 糖 果】
一主多从
主备切换
一个切换系统完成一主多从的主备切换过程
GTID的全称是Global Transaction Identifier,也就是全局事务ID,是一个事务在提交的时候生成的,是这个事务的唯一标识。它由两部分组成,格式是:
GTID=server_uuid:gno
其中:
server_uuid是一个实例第一次启动时自动生成的,是一个全局唯一的值;
gno是一个整数,初始值是1,每次提交事务的时候分配给这个事务,并加1。
在MySQL的官方文档里,GTID格式是这么定义的:GTID=source_id:transaction_id
在MySQL里面我们说transaction_id就是指事务id,事务id是在事务执行过程中分配的,如果这个事务回滚了,事务id也会递增,而gno是在事务提交的时候才会分配。
基于GTID的主备切换
现在,我们已经理解GTID的概念,再一起来看看基于GTID的主备复制的用法。
在GTID模式下,备库B要设置为新主库A’的从库的语法如下:
CHANGE MASTER TO
MASTER_HOST= h o s t n a m e M A S T E R P O R T = host_name MASTER_PORT= hostnameMASTERPORT=port
MASTER_USER= u s e r n a m e M A S T E R P A S S W O R D = user_name MASTER_PASSWORD= usernameMASTERPASSWORD=password
master_auto_position=1
其中,master_auto_position=1就表示这个主备关系使用的是GTID协议。可以看到,前面让我们头疼不已的MASTER_LOG_FILE和MASTER_LOG_POS参数,已经不需要指定了。
我们把现在这个时刻,实例A’的GTID集合记为set_a,实例B的GTID集合记为set_b。接下来,我们就看看现在的主备切换逻辑。
我们在实例B上执行start slave命令,取binlog的逻辑是这样的:
实例B指定主库A’,基于主备协议建立连接。
实例B把set_b发给主库A’。
实例A’算出set_a与set_b的差集,也就是所有存在于set_a,但是不存在于set_b的GITD的集合,判断A’本地是否包含了这个差集需要的所有binlog事务。
a. 如果不包含,表示A’已经把实例B需要的binlog给删掉了,直接返回错误;
b. 如果确认全部包含,A’从自己的binlog文件里面,找出第一个不在set_b的事务,发给B;
之后就从这个事务开始,往后读文件,按顺序取binlog发给B去执行。
其实,这个逻辑里面包含了一个设计思想:在基于GTID的主备关系里,系统认为只要建立主备关系,就必须保证主库发给备库的日志是完整的。因此,如果实例B需要的日志已经不存在,A’就拒绝把日志发给B。
这跟基于位点的主备协议不同。基于位点的协议,是由备库决定的,备库指定哪个位点,主库就发哪个位点,不做日志的完整性判断。
基于上面的介绍,我们再来看看引入GTID后,一主多从的切换场景下,主备切换是如何实现的。
由于不需要找位点了,所以从库B、C、D只需要分别执行change master命令指向实例A’即可。
其实,严谨地说,主备切换不是不需要找位点了,而是找位点这个工作,在实例A’内部就已经自动完成了。但由于这个工作是自动的,所以对HA系统的开发人员来说,非常友好。
边栏推荐
- 五、HikariCP源码分析之初始化分析二
- 分支语句那些事儿(上)~~~~看完少走两月弯路!!
- ah?Now the primary test recruitment requirements will be automated?
- 真offer收割机 第二弹~大厂如何考察候选人?(附答案详解)
- Implementation and implementation of Any to Any real-time voice change丨RTC Dev Meetup
- 【板栗糖GIS】arcmap—如何在表格空值处进行批量求和
- Redis和MySQL如何保持数据一致性
- rtsp-simple-server + srs搭建流媒体服务器
- 专利说明书怎么写?
- ict的终极模式 是软件研发
猜你喜欢

JetsonNano学习(五)JetsonNano 安装 PyTorch 及 Torchvision

一文读懂Elephant Swap,为何为ePLATO带来如此高的溢价?

Three chess (written in C language)

MySQL数据库进阶篇

Any to Any 实时变声的实现与落地丨RTC Dev Meetup
一、HikariCP源码分析之获取连接流程一

【面试:并发篇34:Unsafe】

bgp基础配置和宣告

Implementation and implementation of Any to Any real-time voice change丨RTC Dev Meetup

【微信小程序】一文解忧,事件绑定
随机推荐
将文件流转成file文件后使用luckysheet回显数据
JZ18 删除链表的节点
cmd md命令
JZ24 反转链表
【企业架构】企业架构框架的新资源出现
我想申请专利,却没有经验,如何学会写专利申请文件?
【技术规划】描绘未来第 4 部分:技术路线图
八、HikariCP源码分析之ConcurrentBag一
JZ23 链表中环的入口结点
一、HikariCP源码分析之获取连接流程一
JVM 上数据处理语言的竞争:Kotlin, Scala 和 SPL
CNCF Keith Chan:分布式云时代,云原生社区的发展与趋势
【LeetCode】36、有效的数独
WSDM‘22推荐系统论文梳理
推荐 7 个学习 Web3 的开源资源
六、HikariConfig配置解析
go语言中的goroutine(协程)
【企业架构】描绘未来第 3 部分:产品路线图
WY16 不要二
leetcode 890. Find and Replace Pattern(查找和替换pattern)