暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
MySQL主从切换主库出问题了,从库如何处理?
1112
3页
5次
2020-06-18
5墨值下载
目前 MySQL 主从还是主流架构,当主库出问题了,从库应该怎么办?
一、MySQL 主从原理
A B
1.在备库 B 上通过 change master 命令,设置主库 A IP、端口、用户名、密码,以及要从
哪个位置开始请求 binlog,这个位置包含文件名和日志偏移量。
2.在备库 B 上执行 start slave 命令,这时候备库会启动两个线程,就是图中的 io_thread
sql_thread。其中 io_thread 负责与主库建立连接。
3.主库 A 校验完用户名、密码后,开始按照备库 B 传过来的位置,从本地读取 binlog,发给
B
备库 B 拿到 binlog 后,写到本地文件,称为中转日志(relay log)。
4.sql_thread 读取中转日志,解析出日志里的命令,并执行。(5.6 版本之后引入多线程方
案)
二、主库出问题了,从库怎么办?
主从切换?
图中 A A互为主备,BCD 分别为 A 的备库,当主库 A 故障时,A将变为主库,BCD
也分别切换指向 A
三、主从切换方式
1.基于主库位点切换(异步复制)
如果把 B 设置为 A 的主库,相应需要设置如下:6 个参数
CHANGE MASTER TO
MASTER_HOST=$host_name
MASTER_PORT=$port
MASTER_USER=$user_name
MASTER_PASSWORD=$password
MASTER_LOG_FILE=$master_log_name
MASTER_LOG_POS=$master_log_pos
最后两个参数 MASTER_LOG_FILE MASTER_LOG_POS 表示,要从主库的
master_log_name 文件的 master_log_pos 这个位置的日志继续同步。而这个位置就是我们
所说的同步位点,也就是主库对应的文件名和日志偏移量。异步复制基本无法精确的找到位置,
只能取大概的位置。
常见的取位点做法:
等待新主库 A把中转日志(relay log)全部同步完成;在 A上执行 show master status 命令,
得到当前 A上最新的 File Position;取原主库 A 故障的时刻 T;用 mysqlbinlog 工具解
AFile,得到 T 时刻的位点。
然而异步复制主从切换,取到的位点经常有问题,常见的切换后的错误:主键冲突(取的位点
靠前)
Duplicate entry ‘id_of_R’ for key ‘PRIMARY’,同步停止。这时候怎么办呢。
悲观的解决:跳过错误
set global sql_slave_skip_counter=1;
start slave;
另一种更暴力:通过设置 slave_skip_errors 参数,直接设置跳过指定的错误。在执行主备切
换时,有这么两类错误,是经常会遇到的:
1062 错误是插入数据时唯一键冲突;
1032 错误是删除数据时找不到行。
因此,我们可以把 slave_skip_errors 设置为 “1032,1062”这样中间碰到这两个错误时就直
接跳过。
这种方式是不是太粗糙了。
2.GTID 模式
上面的找位点的坑怎么办?
MySQL 5.6 版本引入了 GTID,彻底解决了异步复制找位点的难题。
启用 GTID:加入两个参数
gtid_mode=on
enforce_gtid_consistency=on
基于 GTID 切换(GTID 内容后续在深入说明)
GTID 模式下,备库 B 要设置为新主库 A的从库的语法如下:
CHANGE MASTER TO
of 3
5墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜