首页 > 数据库 >什么是 MySQL 的主从同步机制?它是如何实现的?

什么是 MySQL 的主从同步机制?它是如何实现的?

时间:2024-12-15 14:53:57浏览次数:9  
标签:主库 binlog 同步 MySQL 日志 从库 主从

什么是 MySQL 的主从同步机制?它是如何实现的?

MySQL 的主从同步机制是一种将主数据库(Master)上的数据实时或接近实时地同步到从数据库(Slave)的机制。通过这种机制,从数据库可以获取到主数据库的数据更新并进行复制,从而实现数据的冗余备份、负载均衡和高可用性。

主从同步机制的工作原理

主从同步的核心思想是,所有对主数据库的写操作都会记录到二进制日志(binlog)中,然后由从数据库通过读取这些日志来进行数据同步。主要涉及以下几个组件:

  1. 主库(Master):处理所有的写操作,并将这些操作记录到二进制日志(binlog)中。
  2. 从库(Slave):定期从主库获取二进制日志,应用日志中的更改,使其数据与主库保持一致。

主从同步的实现过程

  1. 配置主库(Master)

    • 开启二进制日志:主库需要启用二进制日志(binlog),以便记录所有对数据库的写操作。
    • 配置唯一的服务器 ID:每个 MySQL 服务器需要有一个唯一的 ID,以便识别。
  2. 配置从库(Slave)

    • 设置从库连接到主库:在从库中配置主库的地址、端口和登录凭据,允许从库连接到主库。
    • 启动复制线程:从库启动 I/O 线程,读取主库的二进制日志并将其存储到中继日志(relay log)中。
  3. 同步过程

    • 主库的二进制日志(binlog):当主库执行任何写操作(INSERT、UPDATE、DELETE)时,都会将这些操作记录到 binlog 中。
    • 从库的 I/O 线程:从库的 I/O 线程不断从主库读取 binlog,并将其写入到从库的中继日志(relay log)中。
    • 从库的 SQL 线程:从库的 SQL 线程读取中继日志,并执行其中的 SQL 语句,以将主库的数据更新应用到从库中。
  4. 同步的延迟:由于从库是异步读取主库的 binlog 并执行 SQL,因此在大多数情况下,从库的数据会略微滞后于主库,这种延迟被称为“复制延迟”。

主从同步的工作流程

  1. 主库写操作

    • 主库执行写操作时,首先将操作记录到 binlog。
    • binlog 会被按顺序写入到二进制日志文件中,供从库读取。
  2. 从库获取 binlog

    • 从库的 I/O 线程连接到主库,从主库读取二进制日志,并将日志存储到中继日志(relay log)中。
  3. 从库应用日志

    • 从库的 SQL 线程从中继日志中读取 SQL 语句并执行它们,从而将主库的更改应用到从库。
  4. 主库与从库同步

    • 主库的 binlog 中的每个事务都会被从库的 I/O 线程读取并处理,确保数据同步。

同步模式

  1. 异步复制(Asynchronous Replication)

    • 在最常见的 MySQL 主从同步模式下,主库将数据写入 binlog 后,立即返回给客户端,不会等待从库确认。这个过程是异步的。
    • 优点:主库和从库之间的同步延迟较低,性能较高。
    • 缺点:主库发生故障时,从库的数据可能会丢失,导致数据不一致。
  2. 半同步复制(Semi-Synchronous Replication)

    • 主库在写入 binlog 后,会等待至少一个从库确认接收到日志,才能返回客户端。
    • 优点:相比异步复制,能减少数据丢失的风险。
    • 缺点:会增加写操作的延迟。
  3. 同步复制(Synchronous Replication)

    • 所有的主从服务器都必须同步提交事务,主库和所有从库都成功接收到日志并确认之后,才会向客户端返回操作结果。MySQL 从 5.7 版本开始支持同步复制。
    • 优点:可以确保所有数据库节点的严格一致性。
    • 缺点:性能较低,主库和从库之间的延迟会增加。

主从同步的优缺点

  • 优点

    • 数据冗余:从库可作为主库的备份,保证数据安全。
    • 读写分离:通过主从同步,读请求可以分发到从库上,减轻主库的负担,提高查询性能。
    • 高可用性:如果主库发生故障,可以手动或自动将从库提升为主库,保证系统的可用性。
  • 缺点

    • 延迟:主库和从库之间存在一定的延迟,可能导致从库的数据与主库不一致。
    • 写操作压力:如果写操作集中在主库,可能会导致性能瓶颈。

总结

MySQL 的主从同步机制通过主库记录写操作到 binlog,并通过从库的 I/O 线程和 SQL 线程将数据同步到从库,实现数据的冗余备份和负载均衡。通过异步、半同步或同步复制等不同的同步模式,用户可以根据实际需求在性能和数据一致性之间进行权衡。

标签:主库,binlog,同步,MySQL,日志,从库,主从
From: https://www.cnblogs.com/eiffelzero/p/18607988

相关文章

  • MySQL 中有哪些锁类型?
    MySQL中有哪些锁类型?在MySQL中,锁是用于管理并发访问的机制,以保证数据一致性和完整性。MySQL支持多种类型的锁,按照其粒度和用途可以分为以下几类。1.按粒度分类表锁(TableLock)定义:表锁是一种锁住整个表的机制,锁定后其他事务无法对该表进行任何操作,直到锁释放为止。特性......
  • MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
    MySQL中count(*)、count(1)和count(字段名)的区别在MySQL中,COUNT()函数用于统计记录数。虽然COUNT(*)、COUNT(1)和COUNT(字段名)的功能类似,但它们在执行逻辑和结果上有所不同。1.count(*)特点统计表中所有行的数量,包括NULL值。执行时不会忽略任何行。通常......
  • MySQL 中 int(11) 的 11 表示什么?
    MySQL中int(11)的11表示什么?在MySQL中,int(11)中的11并不表示整数的取值范围,而是用于显示宽度(DisplayWidth)。它的含义和具体影响如下:1.显示宽度的定义显示宽度是指在使用ZEROFILL属性时,MySQL返回查询结果时显示的最小数字宽度。如果存储的整数值不足指定的宽......
  • MySQL 的乐观锁和悲观锁是什么?
    MySQL的乐观锁和悲观锁是什么?在并发环境下,为了避免数据竞争和保证数据一致性,可以使用不同的锁策略。乐观锁和悲观锁是两种常见的并发控制机制,它们在锁定数据时的理念和实现方式上有显著区别。1.悲观锁(PessimisticLock)定义悲观锁是一种保守的并发控制策略,假设数据在被访问......
  • MySQL 中如果发生死锁应该如何解决?
    MySQL中如果发生死锁应该如何解决?死锁是指多个事务在执行过程中因资源争用形成的循环等待,导致无法继续执行。MySQL会自动检测死锁并选择一个事务进行回滚,但我们可以通过优化设计和操作来避免和解决死锁问题。1.MySQL如何检测死锁?死锁检测:MySQL的InnoDB存储引擎会维护......
  • 如何使用 MySQL 的 EXPLAIN 语句进行查询分析?
    如何使用MySQL的EXPLAIN语句进行查询分析?EXPLAIN是MySQL提供的分析SQL查询执行计划的工具,用于了解查询语句的执行过程,帮助优化查询性能。1.EXPLAIN的使用方法基本语法EXPLAINSELECT*FROMtable_nameWHEREconditions;或者:EXPLAINFORMAT=JSONSELECT*FRO......
  • Y20030002Java+Jsp+Servlet+MySQL的问卷调查小程序的设计与实现(附源码 配置 文档)
    Java+Servlet+MySQL的问卷调查小程序的设计与实现1.摘要2.系统功能分析3.系统功能结构图4.界面展示5.源码获取1.摘要本系统借助于微信小程序的便捷性和普及性,为用户提供了一个高效、易用的在线问卷调查平台。通过利用微信小程序的方便性和流行性,这个系统为用户打造......
  • 网站mysql密码怎么修改,如何安全地更改MySQL数据库密码
    如果您需要修改网站的MySQL数据库密码,可以按照以下步骤进行操作:备份数据库:在修改数据库密码之前,务必先备份数据库。可以使用phpMyAdmin或其他数据库管理工具进行备份。登录MySQL管理工具:使用phpMyAdmin或其他数据库管理工具(如MySQLWorkbench)登录到您的MySQL服务器。选择......
  • 大数据之信创MySQL替代_国产数据库_OceanBase数据库005_在centos7.9上_安装部署OceanB
    dk是简略的写法: 然后我们再来看一下如何使用dk来部署一下OceanBase官网也很详细.首先去systemctlstartdk 启动dk启动dk以后,然后去拉取镜像可以看到我们电脑中本来就有很多镜像,先全部关掉dk stop'dk ps-qa'......
  • spark将数据输出到hive或mysql中
    hive启动以下服务:start-dfs.shstart-yarn.shmapred--daemonstarthistoryserver/opt/installs/spark/sbin/start-history-server.shhive-server-manager.shstartmetastoreimportosfrompyspark.sqlimportSparkSession"""-----------------------......