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%可靠的么?会不会有例外情况?读者可思考一下,下期我们将继续进行介绍。
面对国内众多的云平台,个人和企业该如何选择呢?可以参考这篇文档:【云服务器推荐】2021年腾讯云、阿里云、华为云服务器价格和配置评测