`
BradyZhu
  • 浏览: 261313 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MySQL 数据库主从复制架构

 
阅读更多

前文《MySQL 数据库事务与复制》分析了 MySQL 复制过程中如何保证 binlog 和事务数据之间的一致性,本文进一步分析引入从库后需要保证主从的数据一致性需要考虑哪些方面。

原生复制架构

MySQL 的原生复制架构原理如上图所示。从库的 I/O Thread 线程负责不断读取主库的 binlog 日志文件并写入本地的 Relay log 临时缓存。从库的 SQL Thread 线程则不断读取 Relay log 重放事件入库。整个过程看起来是比较简单清晰的,但其中有几个点对主从数据一致性有关键影响,我们下面逐一分析。

主从复制的场景下,产生数据不一致的现象有两种:

  1. 数据丢失
  2. 数据重复

从库的 I/O Thread 是通过网络读取主库的 binlog 的,若出现网络故障,有可能产生数据丢失。为避免网络故障导致的数据丢失,网络恢复后从库重新连接上来需要知道从主库 binlog 的哪个位置重新传输数据。从库需要记住中断发生时 binlog 的位置,并从该断点处重新读取,这个断点我们称为从库的重传检查点。一个可靠的重传检查点必须是在从库读到数据并写入到本地 Relay log 持久化之后才可建立,否则都有丢失数据的可能。

由于主从复制过程的分布式特征,需要保证复制过程的幂等性,也就是重复复制同一条数据最终不会产生重复的数据。防重策略是必须的,一般符合范式特征的数据库表设计通过主键来防重,而无主键表数据可以通过所有字段联合唯一索引来防重。有了防重策略就可以任意回溯复制过程,而不必考虑从库产生重复数据。

为了保证主从数据一致性,复制过程不仅要保证不丢失、不重复,还需要保证操作顺序一致。binlog 的事件日志反应了主库并发事务的操作序列,最终这种序列也要原样反应到从库上。所以原生复制架构为了做到这点,采用了单线程模型的串行化操作。这也是没办法的,因为在数据库层面是无法知道不同数据之间的因果和依赖关系,因此无法并行入库。

原生的复制架构做到了无丢失、无重复和顺序一致性,普通场景下基本可用,但也存在一些不足:

  • 可监控性、可管理性相对较弱。
  • 对于异构数据无能为力。
  • 通用的单线程模型可能成为性能瓶颈,导致复制延时过高。
  • 一对多场景下对主库形成过大复制压力,影响主库可用性。

一些特殊场景下的数据库复制分布,使用原生复制架构则不一定合适,可能的场景有:

  • 大型库,数据量大,写入量大,还需要跨地域、跨机房的复制,而且对复制延时长短比较敏感,比如大型电商的订单、交易类数据库。

所以我们才需要考虑针对特殊场景自定义复制架构,下面我们看一个自定义复制架构的概念原理图。

自定义复制架构

如上,自定义复制架构参考原生架构模拟成一个 MySQL 从库,它内部包括三个主要角色:

  1. Pull Worker,作用类似于原生的 I/O Thread。
  2. Buffer + Persistent Storage,作用类似于原生的 Relay log。
  3. Load Worker,作用类似于原生的 SQL Thread。

由于是自定义程序实现则可以在无改造 MySQL 的前提下提供额外的功能,相对应用和 MySQL 都可以做到透明。相对原生复制架构的不足,自定义复制架构可以提供更好的复制过程监控和管理能力,并支持异构数据转换等等。而对于需要跨地域、跨机房且延时敏感的大型库复制,则可以通过适当的策略来加速复制过程。

比如前面提到的大型电商的订单、交易类数据库,一般都是分库分表的。分库分表后,不同库表之间的数据其实在业务上是完全独立的,是可以支持并行写入的。所以我们看上图为什么画了两个 Load Worker,就是表达可以针对业务独立的表进行并行写入。一条数据的复制延时包括:

总时长 T = P + N + L; 其中 P 是 Pull Worker 处理时长,N 是网络传输时长, L 是 Load Worker 处理时长。

同一个库的 binlog 是顺序的不好并行拉取,传输过程的网络时长也是刚性的,唯一能加速的就是入库处理。按业务独立的不同表可以做到并行的多线程入库操作,以缩短 L 的整体时长,如下图所示。

总结

本文分析了 MySQL 基于 binlog 的主从复制原理,从数据一致性的角度考虑分布式网络环境下主从架构设计的关键要素。在分析了 MySQL 原生复制架构的基础上给出了一个灵活性和可控性更高的自定义复制架构的高层设计。理解了主从复制架构如何保证数据一致性后,我们后面才可进一步考虑在双写主库的场景如何做双向复制同步并保证双主库的数据最终一致性问题。这个系列下一篇文章会专门分析这个问题。

参考

[1] MySQL Internals Manual. Replication.
[2] MySQL Internals Manual. The Binary Log.
[3] in355hz. 数据库 ACID 的实现.
[4] jb51. MySQL 对 binlog 的处理说明.
[5] repls. 浅析 innodb_support_xa 与 innodb_flush_log_at_trx_commit.
[6] 68idc. MySQL 5.6 之 DBA 与开发者指南.
[7] csdn. 高性能 MySQL 主从架构的复制原理及配置详解


下面是我的微信公众号 「瞬息之间」,除了写技术的文章、还有产品、行业和人生的思考,希望能和更多走在这条路上同行者交流。

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    MYSQL数据库主从复制高可用技术改造环境部署方案

    ### MySQL数据库主从复制高可用技术改造环境部署方案 #### 安装部署DRBD DRBD(Distributed Replicated Block Device)是一种分布式复制块设备,主要用于实现数据在两台或多台服务器之间的实时同步,以此来构建高...

    MySQL数据库主从复制架构

     MySQL 的原生复制架构原理如上图所示。从库的 I/O Thread 线程负责不断读取主库的 binlog 日志文件并写入本地的 Relay log 临时缓存。从库的 SQL Thread 线程则不断读取 Relay log 重放事件入库。整个过程看起来...

    源码包编译高性能的MySQL主从复制架构

    MySQL主从复制架构是MySQL数据库中一种实现数据同步和备份的机制,它允许将数据从一个主数据库(Master)复制到一个或多个从数据库(Slave)中。在复制过程中,主服务器负责处理更新操作,如INSERT、UPDATE、DELETE...

    MySQL主从复制架构原理与配置实践

    ### MySQL主从复制架构原理与配置实践 #### 一、MySQL主从复制概述 MySQL主从复制是一种常用的技术手段,用于提高数据库系统的可用性、扩展性和数据安全性。它通过将一个MySQL实例(主服务器)的数据实时复制到一...

    mysql主从复制架构

    mysql数据库主从架构的简介、部署、使用场景和配置等详细介绍

    SpringBoot第 12 讲:SpringBoot+MySQL主从复制、读写分离

    主从复制是MySQL数据库的一种高可用性解决方案,其中一台服务器(主服务器)处理所有写操作,而其他服务器(从服务器)同步主服务器上的数据变化,从而形成一个读写分离的环境。这种设计模式有助于减轻主服务器的...

    MySQL数据库主从复制技术应用实战(阶段二)

    MySQL数据库主从复制技术是数据库高可用性和负载均衡的重要手段,尤其在大型互联网服务和企业信息系统中广泛应用。在“MySQL数据库主从复制技术应用实战(阶段二)”中,我们将深入探讨这一关键技术,以帮助学员全面...

    MySQL 主从复制模式全面实践

    MySQL主从复制模式是数据库领域内一种重要的数据同步机制,它能够让一台主数据库服务器(master)的数据实时复制到一个或多个从数据库服务器(slave)上。这种机制在数据库的高可用性、数据备份、读写分离以及负载...

    MySQL5.7主从复制(Win10)及mybatis相关配置

    MySQL5.7主从复制是数据库高可用性和数据冗余的一种常见实现方式,特别是在Windows操作系统环境下,这种配置有助于确保服务的连续性和数据的一致性。本文将深入探讨MySQL5.7在Windows 10上的主从复制配置以及与...

    MySQL主从复制数据同步详解及其架构与优化策略

    使用场景及目标:旨在帮助技术人员理解和实施高效的MySQL主从架构,确保数据库的高性能、可用性和稳定性。具体应用包括:①优化读写分离;②提升数据同步速度;③解决脑裂、数据不一致性等问题。 其他说明:通过案例...

    MySQL主从架构的复制模式.pdf

    主从复制对于MySQL数据库的高可用性、扩展性以及灾难恢复具有重要意义。通过合理配置和管理,可以构建稳定可靠的数据库环境。然而,需要注意的是,主从复制并不能解决所有的问题,比如单点故障(如果主库出现问题)...

    MySQL主从复制.docx

    MySQL 的主从复制是一种常见的数据库架构模式,它能够帮助实现数据的自动备份与读写分离,从而增强数据安全性并提高数据库性能。本文将详细介绍 MySQL 主从复制的基本概念、实现原理以及具体的配置步骤。 #### 二、...

    MySQL主从复制:构建高可用和高性能的数据架构

    在现代数据库架构中,MySQL主从复制是一种常用的技术,用于实现数据的高可用性、负载均衡和数据备份。本文将详细介绍MySQL主从复制的原理、配置步骤、不同复制模式以及在实际应用中的策略和优化。 MySQL主从复制是一...

    数据库领域 MySQL 主从复制的原理与配置详解

    具体目标是掌握MySQL主从复制的具体实施技术和最佳实践,以此增强数据库服务的鲁棒性和灵活性。 其他说明:本资料不仅提供了理论性的介绍,还包含了大量实用的操作指南,帮助读者更好地理解和运用MySQL主从复制技术...

    MySQL主从复制模式全面实践

    综上所述,MySQL主从复制是构建高可用数据库架构的关键技术之一。通过深入理解其工作原理和实践技巧,我们可以有效地利用这一机制提升系统的稳定性和扩展性。《MySQL主从复制模式全面实践》PDF文档将更详细地讲解...

    互联网技术下的数据库主从复制与读写分离优化方案

    内容概要:本文深入讨论了在高并发情况下,通过数据库主从复制与读写分离来提升系统整体性能和可靠性的方法。首先阐述了主从复制的概念,接着详细讲解了其实现步骤与优化策略,主要包括启用并配置二进制日志、正确...

    MySQL主从复制原理架构部署

    MySQL主从复制是一种数据备份的方式,它能够将一台MySQL数据库服务器(称为master)的数据变化实时复制到一台或多台MySQL服务器(称为slave)上。复制是一种异步的过程,即数据的变化不是实时同步的,但通常具有很高...

Global site tag (gtag.js) - Google Analytics