上一篇介绍了binlog的基本内容,在主备关系中,是每个备库接收主库的binlog并执行。

正常情况下,只要主库执行更新生成的所有的binlog,都可以传到备库并被正确执行,备库就能跟主库一致的状态,之就是最终一致性,但是,mysql要提供高可用能力,只有最终一致性是不够的

主备延时

主备切换可能是一个主动运维动作,比如软件升级,主库所在机器按计划下线,也可能是被动操作,比如主库所在机器掉电。

在主从切换之前,先了解一下同步延时

1 主库A执行完成一个事务,写入binlog,这个时刻记T1

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

3 备库B执行完成这个事务,这个时刻记T3

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

可以在slave上执行show slave status查看,Seconds_Behind_Master 这个参数,用于表示当前备库延时了多少秒

Seconds_Behind_Master的计算方法

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

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

可以看到,这个Seconds_Behind_Master参数计算的就是T3-T1,这个参数可以用来作为主备的延时,单位是秒

如果主备机器的系统时间设置不一致,会不会导致主备延时的值不准

其实不会,在备库接收到主库的时候,会通过执行select UNIX_TIMESTAMP() 来活动当前主库的系统时间,如果发现主库的系统时间与自己不一致,备库计算Seconds_Behind_Master的时候会自动扣掉这个差值

在网络正常的时候,日志从主库传给备库是需要很短时间的,及T2-T1需要很短的时间,也就是说网络正常的情况下,主备延时的主要来源是备库接收完binlog和执行任务之间的时间差。

主备延时的来源

首先,有些部署环境下,备库所在机器的性能要比主库所在的机器性能要差。

一般情况下,有的备库的请求要少很多,所以,这种情况是存在的,备库的机器的性能要差一些,更新请求对iops的压力,在主库和备库上是没有差别的,所以这种部署时,一般都会将备库设置为”非双1”模式。

但实际上,更新过程中也会触发大量的读操作,所以,当备库机器上的多个备库都在争抢资源是,可能会导致主备延时。

在对称部署时,主备的机器都相同规格,在备库上运行一些报表之类的运营业务,也可能出现主备延时的情况

遇到这种情况

1 一主多从,除了备库,可以多接几个从库,来分担读的压力

2 通过binlog输出到外部系统,比如hadoop,让外部系统提供查询的能力

大事务,影响主备延时,因为主库上必须等待执行完成了,才能将binlog发送到备库,然后备库在执行相同的时间,可能更久

避免在线上系统一次性的删除大量的数据,避免在业务高峰期执行这些比较大的事务和ddl操作等。

造成主备延时的还有一个原因,就是备库的并行能力,mysql5.6提供了并行复制,slave_parallel_workers,在5.7以上,有更好的并行复制。

可靠性优先策略

在主从环境下,主库A,假如这个时候备库B上存在延时Seconds_Behind_Master,落后主库5秒,这个时候需要主从切换,(设置为read_only=on),需要等待B库上的延时为0,等待备库完全追赶了主库的日志,在做切换,这时候叫可靠性优先切换。当然在等待的这段时间内,应用是有一定的影响的。

可用性优先策略

就是强行在B库上进行更新操作,没有等待B库上完全同步和应用了日志就把改变了ip的指向,这个时候发生切换,可能会导致数据的不一致。

小结

由于主备延时的存在,切换策略就有不同的选择,在可靠性和可用性优先的策略之间,进行选择,根据不同的业务需要进行不同的选择。

在实际应用中, 更建议使用可靠性优先的策略,毕竟保证数据的准确,应该是数据库服务的底线。在这个基础上,通过减少主备的延时,提升系统的可用性。

25 mysql怎么保证高可用的更多相关文章

  1. 25 | MySQL是怎么保证高可用的?

    在上一篇文章中,我和你介绍了binlog的基本内容,在一个主备关系中,每个备库接收主库的binlog并执行. 正常情况下,只要主库执行更新生成的所有binlog,都可以传到备库并被正确地执行,备库就能 ...

  2. MySQL数据库的优化(下)MySQL数据库的高可用架构方案

    MySQL数据库的优化(下)MySQL数据库的高可用架构方案 2011-03-09 08:53 抚琴煮酒 51CTO 字号:T | T 在上一篇MySQL数据库的优化中,我们跟随笔者学习了单机MySQ ...

  3. mysql数据库的高可用方法总结

    高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.虽然互联网服务号称7*24小时不间断服务,但多多少少有一 些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无 ...

  4. 浅谈mysql主从复制的高可用解决方案

    1.熟悉几个组件(部分摘自网络)1.1.drbd     —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...

  5. MySQL集群(四)之keepalived实现mysql双主高可用

    前面大家介绍了主从.主主复制以及他们的中间件mysql-proxy的使用,这一篇给大家介绍的是keepalived的搭建与使用! 一.keepalived简介 1.1.keepalived介绍 Kee ...

  6. MySQL系列:高可用架构之MHA

    前言 从11年毕业到现在,工作也好些年头,入坑mysql也有近四年的时间,也捣鼓过像mongodb.redis.cassandra.neo4j等Nosql数据库.其实一直想写博客分享下工作上的零零碎碎 ...

  7. MySQL数据库的高可用方案总结

    高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.虽然互联网服务号称7*24小时不间断服务,但多多少少有一些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无法 ...

  8. MySQL的keepalived高可用监控脚本

    MySQL的keepalived高可用监控脚本 MySQL(或者其它服务)的keepalived高可用监控脚本 开发脚本需求 :我们知道,keepalive是基于虚拟ip的存活来判断是否抢占maste ...

  9. mysql-master-ha 实现mysql master的高可用。

    常用的mysql 高可用有下面几种方案: 名称 原理 特点 mysqlmha Perl脚本对mysql master做心跳,master down了以后,选举new master   ,是要改代理层的 ...

随机推荐

  1. Oracle操作ORA-02289: 序列不存在

    解决方案:实现创建序列,创建语句如下所示: create sequence employees_seq minvalue maxvalue start increment cache ; 这时候再执行 ...

  2. Python — List、Set、Tuple、Dictionary之间的区别、参数传递

    1.list 列表 有序集合,随时增删.包含的数据类型可以不同:整数.浮点数.字符串.list.tuple.dict.set.bool.空值.常量. list = [12, 'Yummy', 19.2 ...

  3. Ubuntu 下 安装 网易云音乐

    先去网易云音乐官网下载Linux下版本的包. 默认下载到  “下载”   路径下 cd 到下载的包目录 通过使用   sudo dpkg -i netease-cloud-music_1.1.0_am ...

  4. 【河南第十届省赛-B】情报传递

    题目描述 抗日战争时期,在国共合作的大背景下,中共不断发展壮大,其情报工作也开始由获取警报性.保卫性信息,向获取军政战略性情报转变.各系统情报组织遵循"荫蔽精干,长期埋伏,积蓄力量,以待时机 ...

  5. S3C2440启动方式

    不管S3C2440的启动设备是什么,它都是从0x0000 0000地址开始执行程序的,所不同的是地址的映射不一样.基于S3C2440的嵌入式系统上电之后,需要首选选择启动设备,2440的启动方式选择是 ...

  6. Render QGraphicsItem on QPixmap: aggregate 'QWidget w' has incomplete type and cannot be defined

    Render QGraphicsItem on QPixmap: aggregate 'QWidget w' has incomplete type and cannot be defined #in ...

  7. C/C++ 安全编码 —— 指针与内存

    1. 仿踩内存 if (buf[len - 1] != 0x5A) { return; }

  8. 安装使用lynis扫描Linux的安全漏洞

    Lynis是Linux平台上的一款安全漏洞扫描工具.它可以扫描系统的安全漏洞.收集系统信息.安装的软件信息.配置问题.没有设置密码的用户和防火墙等等. Lynis是流行可靠的安全扫描工具. 前不久,L ...

  9. 修改CentOS7网卡名称为传统名称eth0格式

    1.调整网卡名称 进入网卡目录```[root@tools]# cd/etc/sysconfig/network-scripts/``` 修改名称```[root@network-scripts]# ...

  10. 【剑指offer】数组中的逆序对,C++实现

    原创博文,转载请注明出处!本题牛客网地址 博客文章索引地址 博客文章中代码的github地址 1.题目 2.思路 3.代码 class Solution { public: int InversePa ...