02.25 Day 35 - 可靠性优先与可用性优先策略

大家好,我是 Snow Hide,作为《MySQL 实战》这个专栏的学员之一,这是我打卡的第 35 天,也是我第 100 次进行这种操作。

今天我温习了该专栏里一篇叫《MySQL 是怎么保证高可用的?》的文章。

关键词总结:主备延迟(同步有关的时间点、seconds_behind_master 计算方法、主备延迟最直接的表现)、主备延迟的来源(备库机器性能比主库机器差、备库压力大、大事物、导致主备延迟的另一个原因)、可靠性优先策略(双主结构下,主备切换过程)、可用性优先策略(当 binlog_format 为 mixed 时的切换流程、当 binlog_format 为 row 时的切换流程、适用场景、异常切换效果)。

所学总结:

主备延迟

同步有关的时间点

  1. 主库执行完成一个事务,写入 binlog,该时刻记为 T1;
  2. 传给备库,备库接收完 binlog 的时刻记为 T2;
  3. 备库执行完该事物,该时刻记为 T3。

执行 show slave status 命令以显示 seconds_behind_master 的值,该值表示备库延迟了多少秒。

seconds_behind_master 计算方法

  1. 每个事务的 binlog 里都有一个时间字段,以记录主库上的写入时间;
  2. 备库取正在执行的事务的时间字段的值,计算它与系统时间的差值,得到 seconds_behind_master

seconds_behind_master 参数计算的就是 T3-T1,其可以被用来做主备延迟的值,精确度为秒。

主备延迟最直接的表现

备库消费中转日志(relay log)的速度,比主库生产 binlog 的速度慢。
 

主备延迟的来源

备库机器性能比主库机器差

  • 问题:早期的主库硬件资源富足,而备库的硬件资源比较拮据;
  • 方案:主备选用相同规格的机器,并做对称部署。

备库压力大

  • 问题:备库查询耗费大量 CPU 资源,影响同步速度;
  • 方案:一主多从。除备库外,多接几个从库,让从库分担读压力。通过 binlog 输出到外部系统,如 Hadoop 这类系统,让外部系统提供统计类查询能力。

大事务

  • 问题:一次性太多 delete 语句、大表 DDL;
  • 方案:控制每个事务删除的数据量、计划内的 DDL 尽量使用 gh-ost 方案。

导致主备延迟的另一个原因

  • 问题:备库并行复制能力。
     

可靠性优先策略

双主结构下,主备切换过程

  1. 判断备库的 seconds_behind_master,小于某值则继续下一步,否则继续重试;
  2. 主库切换成只读,即 readonly 设置为 true
  3. 判断备库的 seconds_behind_master,直到其变成 0 为止;
  4. 备库切换成读写,即 readonly 设置为 false
  5. 业务请求切至备库。
     

可用性优先策略

切换流程

假设主备延迟达到 5 秒时,在插入一条语句后发起了主备切换:

insert into t(c) values(4);
insert into t(c) values(5);

当 binlog_format 为 mixed 时的切换流程

  1. 主库执行完 insert 语句,插入 (4,4),并开始进行主备切换;
  2. 主备之间延迟 5 秒,所以备库没来得及应用 “插入 c=4” 中转日志,就开始接收客户端 “插入 c=5” 的命令;
  3. 备库插入一行数据 (4,5),并将 binlog 发给主库;
  4. 备库执行 “插入 c=4” 中转日志,插入数据 (5,4)。直接在备库执行的 “插入 c=5” 语句,被传至主库,插入了新数据 (5,5)。

当 binlog_format 为 row 时的切换流程

  1. 使用 row 格式的 binlog 时,数据不一致的问题更容易被发现。而使用 mixed 或 statement 格式的 binlog 时,数据很可能悄悄地就不一致了。如果过了很久才发现数据不一致的问题,很可能这时的数据不一致已经不可查,或连带造成了更多的数据逻辑不一致;
  2. 主备切换的可用性优先策略会导致数据不一致。因此,大多数情况下,都尽量使用可靠性优先策略。对数据服务来说,数据的可靠性优于可用性。

适用场景

  • 当有一个库的作用为记录操作日志时,如果数据不一致则可以通过 binlog 来修补,而该短暂不一致也不会引发业务问题;
  • 同时,业务系统依赖该日志写入逻辑,如果该库不可写,会导致线上业务操作无法执行。

异常切换效果

在满足数据可靠性的前提下,MySQL 高可用系统的可用性,是依赖于主备延迟的。延迟的时间越小,在主库故障时,服务恢复所需时间就越短,可用性就越高。

末了

重新总结了一下文中提到的内容:MySQL 高可用系统基础、导致主备延迟的情况、切换策略的不同选择、可靠性优先和可用性优先策略、建议使用可靠性优先策略、减少主备延迟以提升系统可用性。

发布了182 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/stevenchen1989/article/details/104489272