MySQL主备延迟、可用与可靠
author:陈镇坤27
创建时间:2021年11月29日18:52:36
编辑时间:2021年11月30日09:21:22、2021年11月30日23:01:35
转载请注明出处
文章目录
————————————————————————————————
问:什么是cap?
答:百科词条:分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。
主备延迟
问:简单介绍下主备切换?
答:答:一般主库负责处理客户端的写请求,备库负责与主库同步数据,不参与与客户端的交互。
主备切换分主动运维操作和被动操作。
主动运维操作是软件升级,主库所在机器计划下线等。
被动操作是主库所在机器掉电。
问:什么是主备延迟?
答:假定主库事务提交时,将事务写入binlog 的时刻为T1,备库同步接收主库的binlog,将接收完的时刻记为T2,备库消费完该事务的时刻记为T3,则主备延迟为主库和备库之间同步数据的时间耗费,计算公式:(T3 - T1),其中,对主备延迟影响最大的是T2~T1的时间段,即备库消费完该事务的时间。一旦主备延迟过高,即备库消费中转日志(见第24篇)的速度越慢。
一般地,查询主备延迟,是查询当前备库正消费的主库事务写入时间与当前时间的差值,称为seconds_behind_master。
-- 查看主备延迟
show slave status
问:主备机器系统时间不一致,是否会导致主备延迟时间错误?
答:不会,备库与主库连接过程中,会获取主库系统时间,在计算主备延迟时,将该系统时间的差异考虑进去。
问:什么原因可能导致的MySQL的主备延迟?
答:
1)备库机器性能差;
2)备库CPU开销骤升(例如高频查询)——解决思路:一主多从;
3)大事务(一条语句delete太多数据);
4)大表DDL——解决思路:gh-ost方案(不了解);
5)备库的并行复制能力(例如:5.5之前sql_thread单线程);
主备同步策略
问:MySQL有哪几种主备同步策略,介绍下内容和各自的优缺点;
答:分
可靠性优先策略和可用性有限策略
一般采用可靠性优先策略。
——————————
主要操作流程如下:
可靠性优先策略:
判断备库的seconds_behind_master是否大于5s,小于则执行下一步,否则重试;
将主库改为只读;
判断备库的seconds_behind_master是否为0,是则执行下一步,否则重试;
将备库的只读取消;
将业务请求切换到备库。
可用性优先策略:
则是先取消备库的只读状态,进行业务请求的主备切换。
——————————
优缺点:
可靠性优先策略保证主备一致和数据不丢失,但存在不可用时间。
可用性优先策略几乎无不可用时间,但可能出现数据不一致情况。
问:可用性优先策略怎么会产生数据不一致情况?
答:假设binlog设置的是statement格式,则binlog之间同步的日志记录的是sql语句本身。
若DML时,设置主键自增,插入数据时只对非主键字段自定义值,插入主库时,最新数据主键为5(此时备库最新数据主键也是为5),此时新数据为(5,x),日志内容为insert (x)同步到备库前,备库已经插入了新的数据,则同步后的记录将是(6或更大,x)
假设binlog设置的是row格式,则在上面的场景中,(5,x)同步到旧备库时,会报错,旧备库新的记录(5,y)同步给旧主库时,也会报错。这两条数据在对方库中就丢失了。
问:可用和可靠,这两种策略在主备数据同步时,怎么选择?
答:一般选择可靠性优先策略,除非短暂的业务不一致不会引发业务问题,能通过后期binlog来恢复,且短暂的不可用会影响业务功能,则需要选择可用优先策略。但更应该处理的方式是避免这种问题的产生。
问:主备同步时,可靠性优先策略可能存在什么极端情况?
答:如果主库掉电,此时备库不可连接,则主备延迟无法降为0,则系统将一直不可用。
实战题
问:假如备库延迟的监控预警提示,备库的延迟时间正保持一个45°斜向上的发展趋势,可能是什么原因导致的?
答:1、备库单线程复制能力更不上;2、有大事务被同步到备库执行;3、有一个长事务阻塞(例如:长事务获得MDL读锁,同步的MDL写锁等待)