博客
关于我
MySQL主从篇:死磕主从复制中数据同步原理与优化
阅读量:789 次
发布时间:2023-02-11

本文共 1516 字,大约阅读时间需要 5 分钟。

一、主从复制架构概述

主从复制架构是分布式系统中常用的高可用性和数据一致性的解决方案。无论采用何种技术栈,高性能、高可用性和高稳定性都会引入集群或主从架构的概念。MySQL数据库也不例外,其官方支持通过配置多个MySQL节点实现数据同步。这种方式的特点是所有数据都复制到目标节点,但这种方法会同步所有数据。

有人可能会疑惑:为什么要同步所有数据呢?难道不能对数据进行分片,让不同的节点同步不同的数据吗?这是一个历史遗留问题。早期,由于分布式技术尚未成熟,大多数技术栈在设计高可用方案时,普遍选择主从架构,使得各节点之间同步所有数据,以确保系统的高可用性。

主从架构必须有一个主节点和一个或多个从节点。所有数据先写入主节点,然后从节点复制主节点上的增量数据,从而保证数据的一致性。主从复制架构带来了多个优势:

  • 主节点故障恢复:当主节点出现故障或失效时,从节点能够自动切换为主节点的角色,继续提供服务。
  • 数据备份:主节点数据损坏时,从节点仍然保留完整数据,确保数据安全。
  • 读写分离:主节点负责处理写请求,从节点处理读请求,提升系统性能。
  • 尽管主从架构有诸多优势,但也存在一些潜在问题:

  • 木桶效应:主从集群的性能受限于存储容量最低的节点。
  • 数据延迟:由于数据通过网络传输,存在存储延迟。
  • 脑裂问题:从节点通过心跳机制检测主节点存活状态,网络故障可能导致出现多主。
  • 第一个问题只能通过增加服务器硬件配置来解决。第二个问题已经有不错的解决方案。第三个问题取决于部署方式,部署在同一网络段的节点通常不会出现脑裂问题。

    二、MySQL中的主从复制技术

    MySQL本身提供了主从复制功能,无需依赖第三方技术。MySQL的数据复制基于Bin-log日志,记录所有对数据库产生变更的语句,包括DML和DDL操作。主从复制采用异步复制方式,流程如下:

  • 主节点接收客户端写入请求后,先写入自身数据。
  • 主节点立即记录Bin-log日志。
  • 主节点启动一个专门监听Bin-log日志的log dump线程。
  • 当log dump线程检测到日志变更时,通知从节点拉取数据。
  • 从节点有专门的I/O线程处理主节点通知,请求特定数据范围。
  • 从节点将获取到的数据写入relay-log中继日志。
  • 从节点启动SQL线程监听relay-log变更,解析日志并写入自身存储。
  • 这种设计优化了传统的从节点无限轮询方式,引入了惰性思想,只有在主节点数据变更时才通知从节点拉取数据。

    2.1、MySQL数据同步的原理

    MySQL通过Bin-log日志实现异步复制。Bin-log记录了所有数据库变更操作,包括DML和DDL。主从复制采用“从拉”方式,但优化了传统从节点长连接的方式。具体流程如下:

  • 客户端向主节点提交写入请求。
  • 主节点先写入自身数据。
  • 主节点记录Bin-log日志。
  • 主节点启动log dump线程监听Bin-log变更。
  • 日志变更触发时,log dump线程通知从节点。
  • 从节点I/O线程接收通知,开始请求特定数据范围。
  • 从节点将获取到的数据写入relay-log中继日志。
  • 从节点启动SQL线程解析relay-log,写入自身存储。
  • 这种方式避免了从节点无限轮询,提高了效率,接近MySQL单机写入性能。

    2.2、从节点拉取的数据格式

    从节点复制的数据基于Bin-log日志格式有三种模式:

  • Statement模式:记录每条会影响数据库的SQL语句,默认格式。
  • Row模式:记录具体变更的数据,包括数据所在分区和数据页。
  • Mixed模式:结合Statement和Row模式,SQL语句可复制,具体数据不可复制。
  • 在搭建主从架构时,建议根据具体需求选择合适的日志格式。

    转载地址:http://wxbfk.baihongyu.com/

    你可能感兴趣的文章
    mysqlreport分析工具详解
    查看>>
    MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
    查看>>
    Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
    查看>>
    mysql_real_connect 参数注意
    查看>>
    mysql_secure_installation初始化数据库报Access denied
    查看>>
    MySQL_西安11月销售昨日未上架的产品_20161212
    查看>>
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>
    MySQL、HBase 和 Elasticsearch:特点与区别详解
    查看>>
    MySQL、Redis高频面试题汇总
    查看>>
    MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
    查看>>
    mysql一个字段为空时使用另一个字段排序
    查看>>
    MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
    查看>>
    MYSQL一直显示正在启动
    查看>>
    MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
    查看>>
    MySQL万字总结!超详细!
    查看>>
    Mysql下载以及安装(新手入门,超详细)
    查看>>
    MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
    查看>>
    MySQL不同字符集及排序规则详解:业务场景下的最佳选
    查看>>
    Mysql不同官方版本对比
    查看>>