本文始发于:云栖社区
时间:2020-06-01
原文链接:
https://yq.aliyun.com/articles/763185
1 引言
高可用是系统架构设计中必须考虑的因素之一,主要目标是消除基础架构中的单点故障,通常表示为一个百分比,表示在给定时间段内特定系统或组件的正常运行时间,其中100%表示系统永不失效。而任何的单机系统因受限于软硬件的限制,如硬件损坏、操作系统崩溃、软件BUG、业务压力过大等原因,都不可能保证系统100%可用。一旦出现此类问题,如何能快速恢复用户业务,将影响程度减至最低,降低故障RTO(Recovery Time Objective,恢复时间目标)成为我们所要考虑的问题。
对于数据库系统来说,比较通用的解决方案是将单机程序部署在多台主机上,组成一个集群共同对外提供服务。在MySQL中,最常见的一种部署方式为主从复制,这种部署方式一方面满足了故障恢复的场景,又能够在一定程序上分担主库的压力,做到了业务的读写分离。相较于Oracle的RAC(real application clusters,实时应用集群)来讲,一不需要共享存储,二不需要内存同步,也无需VIP(Virtual IP Address,虚拟IP地址)。因此MySQL的主从部署更为便捷,实现原理也简单。本文将对MySQL主从复制的实现原理进行介绍。
2 一主一从复制实现原理
在数据库实现技术中,最基本的、必须要满足的一个特性便是ACID,即事务的原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。为了实现ACID,MySQL引入了Binlog(二进制日志),数据库中所有的DML、DDL语句都将记录在Binlog当中。如用户在主库上执行了一条update语句,那么在Binlog中便会记录这条update语句,这样就可以使用Binlog来进行实例间的数据同步,Binlog也成为MySQL主从复制的实现基础,能够达到增量数据同步的目的,具体实现原理如下图所示。

图1:MySQL一主一从复制实现原理图
- 主库所有的DML、DDL操作语句记录到Binlog日志中。
- 从库中的IO线程会实时捕获主库中Binlog的变化内容,并写到从库的中继日志Relay log里。Relay log会持久化到本地文件中。
- 从库中的SQL线程负责从Relay log日志里取出Binlog内容,并把所有的语句按先后顺序在从库中执行一遍,这样就实现了主从间数据的一致性。
以上便是MySQL主从库实现增量数据同步的步骤和原理。
3 一主一从部署
在实际部署过程中,需要先做全量数据的同步,保证从库中存在与主库相同的基础数据,然后再进行增量同步。一般使用数据库全库的备份恢复来做主从间的全量同步,即先在主库上做一次全量备份,然后把备份传到从库中进行全量恢复。这里会有一个问题,主库不会一直是静止状态,数据备份和恢复需要一定的时间,这个时间长短完全取决于数据量的大小以及主从间的传输带宽,从库执行完全量恢复后可能已经落后主库一段时间,这段时间的增量数据就需要Binlog来追。所以在从库上需要执行一个change master的命令来告诉从库需要从哪个位置来同步主库的Binlog日志,同时从库上会启动IO线程和SQL线程,IO线程从指定位置开始读取Binlog,SQL线程用来回放日志。当从库追平主库时,便完成了主从部署和搭建。
以上便是MySQL基于Binlog进行主从复制的相关内容,不过这种机制是100%可靠的么?会不会有例外情况?读者可思考一下,
下期我们将继续进行介绍。
后续内容
云数据库高可用——Series2:MySQL如何保证主从一致作者:张西来
阿里云智能GTS-SRE团队技术服务经理
曾就职于某国产数据库厂商,有10多年数据库技术支持工作经验,精通多款数据库产品,为国内多个大中银行核心数据库提供技术支持。目前就职于阿里云智能GTS-SRE团队,负责云数据库的高效运维和管理工作。
我们是阿里云智能全球技术服务-SRE团队,我们致力成为一个以技术为基础、面向服务、保障业务系统高可用的工程师团队;提供专业、体系化的SRE服务,帮助广大客户更好地使用云、基于云构建更加稳定可靠的业务系统,提升业务稳定性。我们期望能够分享更多帮助企业客户上云、用好云,让客户云上业务运行更加稳定可靠的技术,您可用钉钉扫描下方二维码,加入阿里云SRE技术学院钉钉圈子,和更多云上人交流关于云平台的那些事。