MySQL 基础技术(四)—— MySQL 如何保证高可用?

之前,有一年多的工作客户端领域的工作经验。
后来,也在字节做了一年多的后端业务。
现在希望做一些 MySQL 总结,丰富一下自己在后端领域的积累。
目录如下:
MySQL 基础技术(一) —— MySQL 是如何查询的?
MySQL 基础技术(二) —— MySQL 是如何更新的?
MySQL 基础技术(三)—— MySQL 如何保证数据不丢失?
MySQL 基础技术(四)—— MySQL 如何保证高可用?


一、引子

上一篇文章,我们讲述了:《MySQL 如何保证数据不丢失?》,介绍了 binlogredo log 的工作流程。
那么,MySQL 怎么保证高可用呢?
为了提高 MySQL 的读写性能,我们往往采用 MySQL 一主多从的方案。
即一个主库(主要负责写),多个从库(只负责读)。
因为单实例有性能瓶颈,多从库能优先解决 MySQL 的读负载压力。

二、主从同步

主从同步(简化)

原理:

MySQL 设计成一主多从模式。

简单来说,主要分为三步:

  • 第一步:所有增删改的 DML 语句都在 master 节点的示例上完成。
  • 第二步:将处理完成的 binlog 日志传输到各个 slave 节点。
  • 第三步:多个 slave 节点处理 binlog,从而保持主从一致。

详细来说,

主从同步(详细)

MasterSlave 之间会维护一个长连接,专门用来同步binlog

创建从库的过程:

  1. Slave 机器上,通过 change master 命令,设置主库的 IP、端口号、用户名、密码,以及binlog 从哪里开始获取等信息(具体binlog文件名 + 文件偏移量)。
  2. Slave 机器上,执行start slave命令,启动 io_threadsql_thread 线程。
    其中 io_thread 用于接收主库的 binlogsql_thread 用于处理主库的 binlog
  3. Slave 开始尝试连接 MasterMaster 校验完用户名密码后,dump_thread 根据 Slave 设置的 binlog 文件和偏移量,开始读取 binlog 发送给 Slave
  4. Slaveio_thread 将接收到的 binlog 写到 relay log (中转日志)。
  5. sql_thread 读取中转日志,执行对应SQL,同步完成。

问题:

1. 主从延迟

即“同步延迟”。
表示同一个事务下,主库执行完成到备库执行完成的时间差值。

主从延迟时间

时间线:

  1. Master 执行一个事务,成功写入binlog —— 这个时刻,我们记为 T1
  2. Slaveio_thread 接收到binlog —— 这个时刻,我们记为 T2
  3. Slave执行完这个事务。—— 这个时刻,我们记为 T3

所谓主从延迟,就是 T3-T1 的时间。

如果在这段时间里,在从库上查询主库刚插入/修改的数据,会出现主从不一致的现象。
这时,一些对可靠性要求比较高的业务场景里,就会出现错误。
我们可以在从库上执行:

show slave status;

其中,seconds_behind_master 就是从库延迟的时间(T3-T1

主从延迟的根本原因是:从库消费中转日志(relay log)的速度比主库生产 binlog 的速度慢。

2. 主从切换

在实际场景下,可能会遇到主库所在机器异常、掉电、或者机房升级等等。
这就会涉及到“主库”与“从库”之间的切换问题。
由于主从延迟的存在,在主从切换的时候,就会有不同的策略。

主从切换

可靠性优先策略(推荐):

  1. 查询 slaveseconds_behind_master,如果小于预定的某个值(比如3秒),就下一步。
    否则就一直轮训,直到出现满足条件的Slave。(选未来主库)
  2. masterreadonly = true,降为从库。
  3. 查询该 slave(未来主库) 的 seconds_behind_master 值变成 0。(即无主从延迟)
  4. 将该 slave (未来主库)的状态变成读写。readonly = false,升成主库。
  5. 将请求流量切到新主库。
  • 优点:可靠性高,数据可靠。
  • 缺点:会有一小段不可用的时间。

因此,得选择 seconds_behond_master 比较短的 slavemaster

可用性优先策略:

  1. 直接将 slave (未来主库)的状态变成读写。readonly = false,升成主库。
  2. 将请求流量切到新主库。
  3. 将老主库的 readonly = true,降为从库。
  • 优点:可用性高,没有真空期。
  • 缺点:可能会出现数据不一致的情况。

三、如何保证高可用

MySQL 如果要保证高可用,就要满足三个条件。

  1. 数据不丢失。(双1策略)
  2. 主从最终一致性。(主库所有binlog,备库都执行了)
  3. 无主从延迟。

主从延迟的来源:

1. Slave 所在机器性能问题。(部署在同一机器上)

我就遇到过这种 case:
我们的数据库和飞书的数据库部署在同一个机器上,
他们在大量的做一些DML操作,删除/归档很多老数据。
导致于我们的Slave资源被一直抢占,进而出现主从延迟。

解决思路:

  1. 如果成本允许,按服务,分开独立部署。

2. Slave 压力大,查询耗费了大量CPU资源,影响了同步速度。

这种也比较常见,表/索引设计不合理、或者有临时任务在拖库,导致慢慢查询,耗费了大量CPU资源。导致 io_threadsql_thread 抢占不到资源进而同步缓慢。

解决思路:
1.优化表设计、索引设计。解决慢 SQL 问题。
2.增加从库,分担现有从库的压力。
3.对于一些临时/定时任务:可用 Binlog -> Hadoop。转移让另外一个系统来提供查询能力。

3. 大事务

这种也比较好理解,主库上执行一个大事务花了n分钟,那么大概率就会导致从库延迟n分钟。
比如,磁盘空间快满了,需要归档一些历史数据,需要一次性删除大量历史数据。这时候和就会出现主从延迟。

解决思路:
1.业务允许的话,控制每个事务的数据量,分成多次操作。

参考与致谢:
1.《MySQL实战45讲》(林晓斌老师)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335