热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MySQL45讲之备库并行复制策略

MySQL45讲之备库并行复制策略-前言本文主要介绍MySQL备库的并行复制策略。为什么备库需要并行复制如果主库有大量更新操作,因为主库可以并发写入,而备库只能单线程执行的

前言

本文主要介绍 MySQL 备库的并行复制策略。

为什么备库需要并行复制

如果主库有大量更新操作,因为主库可以并发写入,而备库只能单线程执行的话,那么备库的同步延迟会不断累加,即备库越来越追不上主库。所以,后面有了备库的并行复制。

备库的并行复制模型:

coordinator 职责是分发 binlog 给工作线程,真正执行同步的是 worker。

按表分发策略

每个 worker 工作线程都对应一个表,coordinator 根据 binlog 内容将事务分发到不冲突的 worker 中并行执行,如果发生冲突,则等到不冲突的情况再分发到 worker 中执行。

以“数据库名 + 表名”为键,判断是否冲突:

  1. 如果待分发事务的键和 worker 存在键冲突数等于0,则选择空闲的 worker 执行;

  2. 如果待分发事务的键和 worker 存在键冲突数等于1,则选择冲突的 worker 执行;

  3. 如果待分发事务的键和 worker 存在键冲突数大于1,则等待直到前两个条件符合;

按行分发策略

和按表分发策略同理,不过是以“数据库名 + 表名 + 主键名 + 主键值”或者“数据库名 + 表名 + 唯一键名 + 唯一键值”为键来判断冲突,需要计算更多的键。

为什么还需要判断唯一键是否冲突?
因为并发执行时,执行时序不与原先相同,原先后执行的事务可能现在先执行,有可能会导致不符合唯一性约束,造成数据不一致。

组提交并行策略

MariaDB 提出的并行复制策略

MySQL 组提交的前提是组里面的事务是不冲突的,或者说并行执行不影响数据一致性的。组提交时,在 binlog 中记录 commit_id,那么在备库分发时,将同一个 commit_id 的事务分到不同的 worker 并行执行。

不过,这个方法存在一个缺陷。备库每次执行分发同一个 commit_id 下的事务到 worker 中执行,等都执行完之后,才可以分发下一个 commit_id 对应的事务。这样的话,备库并不是真正地在并行复制,并且,如果一个 commit_id 下的某个事务是大事务,那么将导致下一组执行的时间延后,即存在“短板效应”。

组提交优化策略

MySQL5.7 提出的并行复制策略,在 MariaDB 并行复制策略上进行了优化。

根据 MySQL 两阶段提交,只要处于 prepare 阶段的事务就可以并行执行。所以,下面情况下的事务都可以并行执行:

  1. 同时处于 prepare 的事务

  2. 处于 prepare 和 commit 之间的事务

write_set策略

在主库写入 binlog 之前,计算事务涉及的每一行的 hash 值,写入 binlog,这样在备库分发的时候就不需要解析 binlog 来判断,只需要判断两个事务是否有交集来判断是否可以并行,提交运行效率。

因为不需要解析 binlog 来获取信息,所以该方法下, binlog 采用 statement 和 row 格式都可以。

此外,还有 write_set_session 策略,它在 write_set 策略上加了一个约束,同一个线程先后执行的两个事务,在备库复制时不能并行。

参考

  • [1] 备库为什么会延迟好几个小时

推荐阅读
  • 优化Flask应用的并发处理:解决Mysql连接过多问题
    本文探讨了在Flask应用中通过优化后端架构来应对高并发请求,特别是针对Mysql 'too many connections' 错误的解决方案。我们将介绍如何利用Redis缓存、Gunicorn多进程和Celery异步任务队列来提升系统的性能和稳定性。 ... [详细]
  • 本文深入探讨了MySQL中常见的面试问题,包括事务隔离级别、存储引擎选择、索引结构及优化等关键知识点。通过详细解析,帮助读者在面对BAT等大厂面试时更加从容。 ... [详细]
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • MySQL锁机制详解
    本文深入探讨了MySQL中的锁机制,包括表级锁、行级锁以及元数据锁,通过实例详细解释了各种锁的工作原理及其应用场景。同时,文章还介绍了如何通过锁来优化数据库性能,避免常见的并发问题。 ... [详细]
  • 华为云openEuler环境下的Web应用部署实践
    本文详细记录了在华为云openEuler系统上进行Web应用部署的具体步骤,包括配置yum源、安装Apache、MariaDB、PHP及其相关组件,并完成WordPress的安装与配置过程。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • 字节跳动夏季招聘面试经验分享
    本文详细记录了字节跳动夏季招聘的面试经历,涵盖了一、二、三轮面试的技术问题及项目讨论,旨在为准备类似面试的求职者提供参考。 ... [详细]
  • 本文详细介绍了如何解决在使用本地SQlyog客户端尝试连接阿里云上的MariaDB数据库时遇到的2003错误,即无法连接到MySQL服务器的问题。 ... [详细]
  • 在 Ubuntu 22.04 LTS 上部署 Jira 敏捷项目管理工具
    Jira 敏捷项目管理工具专为软件开发团队设计,旨在以高效、有序的方式管理项目、问题和任务。该工具提供了灵活且可定制的工作流程,能够根据项目需求进行调整。本文将详细介绍如何在 Ubuntu 22.04 LTS 上安装和配置 Jira。 ... [详细]
  • 在关系型数据库中,数据约束是指在向数据表中插入数据时必须遵循的限制条件。在MySQL和MariaDB中,常见的数据约束包括主键约束、唯一键约束、外键约束以及非空约束等。这些约束确保了数据的完整性和一致性,是数据库管理中的重要组成部分。通过合理设置和使用这些约束,可以有效防止数据冗余和错误,提升数据库的可靠性和性能。 ... [详细]
  • 在2015年1月的MySQL内核报告中,我们详细探讨了性能优化和Group Commit机制的改进。尽管网上已有大量关于Group Commit的资料,本文将简要回顾其发展,并重点分析MySQL 5.6及之前版本中引入的二进制日志(Binlog)对性能的影响。此外,我们还将深入讨论最新的优化措施,如何通过改进Group Commit机制显著提升系统的整体性能和稳定性。 ... [详细]
  • 在重新安装Ubuntu并配置Django和PyCharm后,忘记测试MySQL连接,导致在后续配置过程中遇到错误:ERROR 2003 (HY000) - 无法连接到本地服务器 ‘127.0.0.1’ (111)。本文将详细介绍该错误的原因及解决步骤,帮助用户快速恢复MySQL服务的正常运行。我们将从检查网络配置、验证MySQL服务状态、配置防火墙规则等方面入手,提供全面的故障排除指南。 ... [详细]
  • MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案
    MySQL 8.0 MGR 自动化部署与配置:DBA 和开源工具的高效解决方案 ... [详细]
  • 如何利用Apache与Nginx高效实现动静态内容分离
    如何利用Apache与Nginx高效实现动静态内容分离 ... [详细]
author-avatar
百变精灵1980
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有