登录
首页 >  数据库 >  MySQL

【MySQL—高可用】复制

来源:SegmentFault

时间:2023-01-17 16:35:02 347浏览 收藏

对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《【MySQL—高可用】复制》,主要介绍了MySQL,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

MySQL内建的复制功能是构建基于MySQL的大规模、高性能应用的基础,这类应用使用所谓的“水平扩展”的架构。我们可以通过为服务器配置一个或多个备库的方式来进行数据同步。复制功能不仅有利于构建高性能的应用,同时也是高可用性、可扩展性、灾难恢复、备份以及数据仓库等工作的基础。

概述

复制解决的基本问题是让一台服务器的数据与其他服务器保持同步。一台主库的数据可以同步到多台备库上,备库本身也可以被配置成另外一台服务器的主库。主库和备库之间可以有多种不同的组合方式。

适用场景

横向扩展

横向扩展是指在多个从库之间进行读负载均衡,以提高读性能。在此扩展方案中,所有数据变更在主库上执行,读负载可以分摊到一个或者多个从库上。

数据安全

数据安全性在很大程度上需要靠数据副本来保证。在这里,副本可以理解为我们通常所说的备份。

数据分析

在主库上运行OLTP(联机事务处理)应用,而OLAP(联机分析处理)应用可以在从库上运行,避免在主库上运行OLAP应用对主库性能造成影响。

远程数据分发

可以使用复制特性为远程站点创建数据的本地副本,那些对数据实时性没有要求的应用可以访问本地副本,剩下的一小部分对实时性有要求的应用访问主库。远程站点既可以作为灾备中心,也可以用于实现跨地域访问以分摊负载,以及实现就近访问,加快访问速度。

滚动升级

使用一个更高版本的MySQL作为备库,保证在升级全部实例前,查询能够在备库按照预期执行。

高可用性和故障切换

复制能够帮助应用程序避免MySQL单点失败,一个包含复制的设计良好的故障切换系统能够显著地缩短宕机时间。

复制方式

MySQL支持以下两种数据同步方法:

  • 传统复制:也可以称为基于二进制日志文件和位置的复制,在从库中配置复制时,要求指定从主库中获取的二进制日志文件(binlog file)和位置(binlog position),以便从库中的复制线程启动时,能够以指定的二进制日志文件和位置为起点,持续读取主库中的二进制日志,并在从库中应用,从而达到数据同步的目的。
  • 基于GTID的复制:GTID(全局事务标识符)是新的事务性复制方法,利用GTID可以自动在主库中寻找需要复制的二进制日志记录,因此不需要关心日志文件或位置,极大地简化了许多常见的复制任务。使用GTID复制可确保主库和从库之间的一致性。。

同步类型

MySQL支持如下4种不同类型的数据同步:

  • 异步复制:最早出现的复制技术,MySQL内置支持,不需要额外安装插件。其中,一个实例充当主库,一个或多个其他实例充当从库,与同步复制形成对比。
  • 半同步复制:从MySQL 5.5开始支持半同步复制。使用半同步复制时,主库的会话在提交事务之前,会等待至少一个从库返回收到二进制日志的ACK消息(确认接收,并将事务的事件记录到从库的中继日志中)。
  • 延迟复制:从MySQL 5.6开始支持,使得从库可以故意滞后于主库至少一段指定的时间,以便在出现误操作时,有时间对误操作的数据进行补救。
  • 同步复制:指的是需要保证写操作完全同步到其他数据节点,而不仅仅是二进制日志被其他节点接收。对于需要同步复制的场景,可以使用NDB Cluster,或者其他类似的开源解决方案(虚拟同步,非完全同步),例如Percona XtraDB Cluster(PXC)、MariaDB GaleraCluster(MGC)、MySQL Group Replication(MGR)。

复制格式

MySQL的复制格式(二进制日志格式)可以分为三种,由系统变量binlog_format进行设置:

  • 基于statement的复制(Statement Based Replication,SBR):SBR复制的是整个SQL语句的原始文本,日志量较小,但容易出现主从库数据不一致。对于SBR,当执行的某个语句被判定为不安全时,是否允许其执行还取决于事务的隔离级别。
  • 基于row的复制(Row Based Replication,RBR):RBR复制的是发生更改的数据行的实际记录(原始语句会被转换为发生变更的行数据记录),日志量较大,但可以保证主从库数据的一致性。
  • 混合复制(Mixed Based Replication,MBR):MBR实际上是由MySQL自行判断的,即在不影响数据一致性的情况下,使用SBR;如果可能影响数据一致性,则自动转换为RBR。

复制的基本原理

复制是基于主库(master)二进制日志中写入的关于该数据库的所有更改(更新、删除等)的日志记录来实现的。从库(slave)利用这些二进制日志中的事件记录进行回放来同步数据。

对于复制线程在主从之间新建立连接或重新建立连接的情况,从库会主动向主库请求所需的二进制日志(从库向主库注册连接时,携带了从库自身所需二进制日志的位置信息)。如果复制线程已经在主从之间建立连接,而且从库已经完全接收建立连接时请求的二进制日志内容,后续的增量二进制日志是由主库主动推送给从库的。

MySQL的复制功能用三个线程来实现:一个线程在主库上(Binlog Dump线程),两个线程在从库上(I/O线程和SQL线程)。如图所示:

image.png

复制的大致步骤如下:

  1. 用户提交对数据的修改,然后主库把所有数据库变更写进二进制日志。
  2. 从库会启动一个工作线程,称为I/O线程。然后在主库上启动一个特殊的Binlog Dump线程,这个线程会读取主库上二进制日志中的事件,它不会对事件进行轮询,如果该线程追赶上了主库,它将进入睡眠状态,直到主库发送信号量通知其有新的事件产生时才会被唤醒。从库的I/O线程跟主库的Binlog Dump线程建立一个普通的客户端连接,备库I/O线程将接收到的事件记录到中继日志中。
  3. 从库SQL线程读取并解析中继日志中的内容,按照读取的顺序进行回放。

好了,本文到此结束,带大家了解了《【MySQL—高可用】复制》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多数据库知识!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>