一:为什么要进行主备切换?

  - 比如软件升级、主库所在机器按计划下线等。主动运维。

  - 比如主库所在机器掉电,为了保证服务的正常运行,而进行切换。可能是被动操作。

  - 流程图

  -  

二:什么是同步延迟?

  - 在介绍主动切换流程的详细步骤之前,先跟你说明一个概念,既“同步延迟”

  - 与数据同步有关的时间点主要包括以下三个:

    - 主库 A 执行完成一个事务,写入 binlog,我们把这个时刻记为 T1;

    - 之后传给备库 B,我们把备库 B 接收完这个 binlog 的时刻记为 T2;

    - 备库 B 执行完成这个事务,我们把这个时刻记为 T3。

二:什么是主备延迟?

  - 所谓主备延迟,就是在备库执行完成的时间和主库执行完成的时间之间的差值,也就是 T3-T1

  - 可以在备库上执行 show slave status 命令,它的返回结果里面会显示 seconds_behind_master,用于表示当前备库延迟了多少秒。

  - seconds_behind_master 计算规则

    - 每个事务的 binlog 里面都有一个时间字段,用于记录主库上写入的时间。

    - 备库取出当前正在执行的事务的时间字段的值,计算它与当前系统时间的差值,得到 seconds_behind_master。

  - 需要说明的是,在网络正常的时候,日志从主库传给备库所需的时间是很短的,即 T2-T1 的值是非常小的。

  - 所以说,主备延迟最直接的表现是,备库消费中转日志(relay log)的速度(T2-T3 之间) ,比主库生产 binlog 的速度要慢。

三:什么情况会导致主备延迟?

  - (主 / 从) (机器不同 / 配置不同)(不常见) 

    - 当备库所在机器性能较差/Mysql配置不同,备库争抢资源/配置问题,就可能会导致主备延迟了。

  - 备库压力过大

    - 备库上的查询耗费了大量的 CPU 资源,影响了同步速度,造成主备延迟。

    - 解决

      -  一主多从。除了备库外,可以多接几个从库,让这些从库来分担读的压力。

      -  通过 binlog 输出到外部系统,比如 Hadoop 这类系统,让外部系统提供统计类查询的能力。

  - 大事务 / 大表 DDL 

    - 因为主库上必须等事务执行完成才会写入 binlog,再传给备库。所以当有大事务的进行,会导致延迟。

    - 例如: 不要一次性地用 delete 语句删除太多数据。其实,这就是一个典型的大事务场景。

  - 其他

    - 主库 DML 并发大,从库 QPS 高。

    - 从库备份。

四:如何主备切换?

  - 由于主备延迟的存在,所以在主备切换的时候,就相应的有不同的策略。

  

  - 可靠性优先策略

    - 流程(在图 1 的双 M 结构下)( 一般是由专门的 HA(双机集群系统) 来完成)

      - 判断备库 B 现在的 seconds_behind_master,如果小于某个值(比如 5 秒)继续下一步,否则持续重试这一步;

      - 把主库 A 改成只读状态,即把 readonly 设置为 true;

      - 判断备库 B 的 seconds_behind_master 的值,直到这个值变成 0 为止;

      - 把备库 B 改成可读写状态,也就是把 readonly 设置为 false;

      - 把业务请求切到备库 B。

    - 问题

      - 可以看到,这个切换流程中是有不可用时间的。

      - 因为在步骤 2 之后,主库 A 和备库 B 都处于 readonly 状态,也就是说这时系统处于不可写状态,直到步骤 5 完成后才能恢复。

    - 总结

      - 在确定使用可用性优先策略时候,先做判断,确保 seconds_behind_master 的值足够小。这样可以保证切换够快。

      - 试想如果一开始主备延迟就长达 30 分钟,而不先做判断直接切换的话,系统的不可用时间就会长达 30 分钟,这种情况一般业务都是不可接受的。

    - 优点

      - 数据可靠。无需修复数据。

    

  - 可用性优先策略

    - 流程(在图 1 的双 M 结构下)

      - 不检查 seconds_behind_master,直接进行上面 4,5 步的主从切换。

    - 问题

      - 这个切换流程的代价,就是可能出现数据不一致的情况。(binglog 推荐使用 row 模式,使得不一致错误更容易发现 )

    - 优点

      - 无不可用时间。

  - 策略选择?

    - 更多的从业务上去考虑。

    - 如过这个业务已经是不可用的状态,那么也只能选择可用优先。

    - 如果这个业务是正常的切换,那么就应该选择可靠优先策略。

  

《Mysql - Mysql 是如何保证高可用的?》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. Ubuntu 18.04.1 安装mysql 5.7.27

    sudo apt-get update sudo apt-get install mysql-server 配置 sudo mysql_secure_installation 参考文档 Ubuntu1 ...

  2. python 椭球面

    作者:chaowei wu链接:https://www.zhihu.com/question/266366089/answer/307037017来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...

  3. 自定义Hooks函数获取窗口大小(十一)

    其实自定义Hooks函数和用Hooks创建组件很相似,跟我们平时用JavaScript写函数几乎一模一样,可能就是多了些React Hooks的特性,自定义Hooks函数偏向于功能,而组件偏向于界面和 ...

  4. package.json 字段说明

    以vue的package.json为例: { // 名称 "name": "vue", // 版本 "version": "2.6 ...

  5. 分库分表 or NewSQL数据库?终于看懂应该怎么选!【转】

    最近与同行科技交流,经常被问到分库分表与分布式数据库如何选择,网上也有很多关于中间件+传统关系数据库(分库分表)与NewSQL分布式数据库的文章,但有些观点与判断是我觉得是偏激的,脱离环境去评价方案好 ...

  6. TreeFrog Framework : High-speed C++ MVC Framework for Web Application http://www.treefrogframework.org

    TreeFrog Framework : High-speed C++ MVC Framework for Web Application http://www.treefrogframework.o ...

  7. 027 H5常用标签

    只记录一下比较有趣的知识点. 一:新标签 1.选项列表datalist <!DOCTYPE html> <html lang="en"> <head& ...

  8. Nginx 配置操作注意事项

    Nginx reload 会中断现有连接吗? - 知乎https://www.zhihu.com/question/57096250 在NGINX上配置HTTPS---血的教训--要重启NGINX - ...

  9. Spring-AOP @AspectJ切点函数之@annotation()

    @annotation()概述@annotation表示标注了某个注解的所有方法. 下面通过一个实例说明@annotation()的用法. AnnotationTestAspect定义了一个后置切面增 ...

  10. 无法调用到appcode下的类

    解决方法: 右键 appp_code下的类, 点击 “属性”, 里面 [生成操作] 一项 由内容 改为 编译 即可