简述MySQL主从复制原理和机制

news/2024/9/2 3:45:44 标签: 数据库, mysql, 主从复制

MySQL的主从复制是一种常用的数据库高可用性和读写分离的解决方案,它通过将一个MySQL服务器(主服务器)的数据变更实时同步到一个或多个MySQL服务器(从服务器)上,从而构建一个数据一致性的分布式数据库系统。主从复制不仅增强了数据库的可靠性,还提升了系统的并发处理能力,并减少了数据丢失的风险。

一、主从复制的概念

主从复制的核心思想是在主数据库(Master)上执行的所有数据修改操作(如INSERT、UPDATE、DELETE等)都会被记录下来,并通过一定的机制传输到从数据库(Slave)上,使得从数据库的数据能够实时或接近实时地与主数据库保持一致。主数据库通常用于处理实时的业务数据更新,而从数据库则可以用于读操作、数据备份或作为灾难恢复的一部分。

二、主从复制的作用

在企业应用中,单点的MySQL数据库往往面临单点故障、并发处理能力不足和数据丢失等风险。通过实施主从复制,可以有效解决这些问题:

  1. 避免单点故障:当主数据库出现故障时,可以迅速将服务切换到从数据库,确保服务的连续性和可用性。
  2. 提升并发处理能力:通过读写分离,主数据库专门处理写操作,而从数据库处理读操作,显著提高了系统的并发处理能力。
  3. 减少数据丢失风险:即使主数据库的数据因某种原因丢失,由于从数据库上保存了完整的数据副本,也可以快速恢复数据。
三、主从复制的原理和机制

MySQL主从复制的实现依赖于二进制日志(Binary Log,简称bin-log)和复制线程。其过程大致可以分为以下三个步骤:

  1. Master记录更新到Bin-log
    • 当主数据库发生数据更新事件时(如INSERT、UPDATE、DELETE),这些变更会被记录到二进制日志(bin-log)中。二进制日志是MySQL用来记录所有修改了数据库数据的SQL语句的日志文件。
  2. Slave请求并获取Bin-log
    • 数据库(Slave)通过IO线程连接到主数据库(Master),并请求二进制日志的内容。
    • Master上的binlog dump线程读取bin-log中的日志事件,并将其发送给Slave的IO线程。
    • Slave的IO线程将这些日志事件写入到本地的中继日志(Relay Log)中,中继日志是Slave用来临时存储从Master接收到的二进制日志内容的文件。
  3. Slave执行中继日志中的事件
    • Slave上的SQL线程会实时监控中继日志的内容,一旦发现有新的日志事件,就将其解析成SQL语句,并在Slave数据库上执行这些SQL语句,从而实现数据的同步。

示例场景

场景一:简单的数据复制

假设你有一个电商平台,其主数据库(Master)负责处理所有用户的订单创建、更新和删除操作。随着业务的增长,读请求(如查询订单详情)变得越来越多,超过了单个数据库的处理能力。为了减轻主数据库的压力,并提升读操作的响应速度,你决定设置一个从数据库(Slave)来专门处理读请求。

  1. 数据库(Master)操作
    • 用户创建了一个新订单,这个操作被记录在主数据库的二进制日志(bin-log)中。
    • bin-log dump线程读取到这个新订单的操作日志,并准备发送给从数据库
  2. 数据库(Slave)操作
    • Slave的IO线程连接到Master,请求最新的bin-log日志。
    • Master的binlog dump线程将包含新订单操作的日志发送给Slave的IO线程。
    • Slave的IO线程将这些日志写入到自己的中继日志(Relay Log)中。
    • Slave的SQL线程从中继日志中读取这些操作,并在自己的数据库上执行它们,从而在从数据库中复制了主数据库的新订单数据。
场景二:故障转移

在上面的电商平台场景中,如果主数据库因为硬件故障或维护而暂时不可用,你可以通过以下步骤将服务切换到从数据库

  1. 检测故障
    • 监控系统检测到主数据库无法响应或连接超时。
  2. 切换服务
    • 管理员手动或自动将读写操作切换到从数据库(如果设置为只读从库,则需要临时修改配置以允许写操作)。
    • 或者,如果配置了多个从数据库并使用了负载均衡器,可以直接将流量导向其他健康的从数据库
  3. 数据一致性
    • 在故障转移过程中,需要确保从数据库的数据与主数据库在故障发生前的状态尽可能一致。这通常依赖于bin-log的完整性和同步延迟。
  4. 恢复主数据库

示例配置

以下是一个简化的MySQL主从复制配置示例(假设已经安装了MySQL并启动了服务):

数据库(Master)配置

  1. 修改my.cnf(或my.ini,取决于操作系统)文件,确保启用了二进制日志:

    [mysqld]  
    log-bin=mysql-bin  
    server-id=1

  2. 重启MySQL服务使配置生效。

修改my.cnf文件,设置唯一的server-id(与Master不同):

  1. 数据库(Slave)配置

    [mysqld]  
    server-id=2  
    relay-log=mysqld-relay-bin  
    read-only=1

  2. 重启MySQL服务。

  3. 在从数据库上执行CHANGE MASTER TO命令来配置主从关系:

    CHANGE MASTER TO  
      MASTER_HOST='master_ip',  
      MASTER_USER='replication_user',  
      MASTER_PASSWORD='replication_password',  
      MASTER_LOG_FILE='recorded_log_file_name',  
      MASTER_LOG_POS=recorded_log_position;

    4.启动从数据库的复制线程:

    START SLAVE;

    5.检查复制状态:

    SHOW SLAVE STATUS\G

    通过这些步骤,你可以设置一个基本的MySQL主从复制环境,并根据需要调整和优化配置。

四、总结

MySQL的主从复制通过记录主数据库的二进制日志、从数据库请求并获取这些日志、然后在从数据库上执行这些日志中的SQL语句来实现数据的同步。为了确保复制过程的顺利进行,主数据库必须开启二进制日志功能,并且整个复制过程中涉及到Master的binlog dump线程、Slave的IO线程和SQL线程三个线程。此外,需要注意的是,数据的同步是由从数据库主动请求主数据库来实现的,而不是主数据库主动推送。这种机制保证了数据的一致性和同步的灵活性。


http://www.niftyadmin.cn/n/5562479.html

相关文章

Shell 构建flutter + Navtive 生成IPA

具体实现: #1. 在工程的根目录下,建立文件夹build_iOS文件,在此文件下建立build_iOS.sh的文件,把以下内容copy进sh文件; #2. 进入build_iOS.sh 文件的目录; #3. 在build_iOS 文件夹配置打包的DEVELOPExportOptionsPlist.plist(dev 构建)或AppStoreExportOptionsP…

【人工智能大模型】文心一言介绍以及基本使用指令

目录 一、产品背景与技术基础 二、主要功能与特点 基本用法 指令的使用 注意事项 文心一言(ERNIE Bot)是百度基于其文心大模型技术推出的生成式AI产品。以下是对文心一言的详细介绍: 一、产品背景与技术基础 技术背景:百度…

IDEA的常见代码模板的使用

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试(Debug) 第七章 …

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署Hallo :针对肖像图像动画的分层音频驱动视觉合成

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 零基础玩转各类开源AI项目 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 本文目标:在Ubuntu系统上部署Hallo&#x…

Grafana :利用Explore方式实现多条件查询

背景 日志统一推送到Grafana上管理。所以,有了在Grafana上进行日志搜索的需求,而进行日志搜索通常需要多条件组合。 解决方案 通过Grafana的Explore的方式实现多条件查询。 直接看操作步骤: 在主页搜索框中输入“Explore” 进入这个界面…

【面试题】数据结构:堆排序的排序思想?

堆排序的排序思想? 堆排序是一种高效的排序算法,其基本思想是利用堆这种数据结构来实现排序。堆是一种特殊的完全二叉树,通常用数组来表示。堆排序的基本步骤如下: 1. 构建初始堆: 将待排序的数组转换成一个最大堆&a…

Linux网络 -- TCP FIN包发送超时时间设置

使用 SO_LINGER 选项控制FIN包发送的超时时间 技术背景 在TCP连接中,当应用程序调用 close 或 shutdown 函数关闭一个socket时,操作系统内核会发送一个FIN包以通知对端连接即将关闭。默认情况下,内核会等待所有未发送的数据发送完毕后再发送…

python3.11SSL: SSLV3_ALERT_HANDSHAKE_FAILURE

参考:python request包 版本不兼容 报错sslv3 alert handshake failure 解决方法-CSDN博客 修改:Python311\Lib\site-packages\urllib3\util\ssl_.py 新版本3.11里默认没有DEFAULT_CIPHERS 补回来: #__imported from 3.6.8 # A secure default. # So…