当前位置: 首页 > article >正文

【数据库知识】mysql进阶-Mysql数据库的主从复制

mysql主从复制

    • 概述
      • 一、数据同步机制
      • 二、复制流程
      • 三、保证数据一致性的措施
      • 四、复制拓扑结构
      • 五、应用场景与优势
    • 双主复制的过程
      • 一、配置前的准备
      • 二、配置主服务器
      • 三、配置从服务器(相对角色)
      • 四、验证复制状态
      • 五、处理潜在的问题
    • 双主复制如何解决冲突问题

概述

MySQL主从复制(Master-Slave Replication)是MySQL中一种常见的高可用性和扩展性方案,其辅助原理主要涉及数据的同步机制、复制流程、以及保证数据一致性的措施。以下是对MySQL主从复制辅助原理的详细解释:

一、数据同步机制

MySQL主从复制的核心原理是基于二进制日志(Binary Log,简称binlog)来实现的。主服务器(Master)将所有数据更改操作(如INSERT、UPDATE、DELETE)记录到二进制日志中,随后从服务器(Slave)会从这些日志中读取数据变更并应用到自己的数据集上。

二、复制流程

MySQL的主从复制可以分为以下三个步骤:

  1. 主库记录二进制日志:当主库上有事务提交或数据更改时,这些变更操作会被记录到二进制日志中。二进制日志记录了所有对数据库进行修改的操作(不包括SELECT等查询操作),而且是以事件(event)的形式存储的。
  2. 从库读取并写入中继日志:从库上有一个I/O线程,它负责连接主库并从主库的二进制日志中读取数据。这些数据在从库上会被写入中继日志(Relay Log),中继日志是从库上的二进制日志的副本。
  3. 从库应用中继日志:从库上的SQL线程会读取中继日志中的事件,并将这些事件逐条应用到从库数据库上,从而使从库的数据与主库保持一致。

三、保证数据一致性的措施

  1. 复制模式

    • 异步复制:这是默认的复制方式。主服务器执行完写操作后,并不等待从服务器确认已经复制,因此速度较快,但可能存在数据不一致的风险。
    • 半同步复制:在这种模式下,主服务器在确认至少有一个从服务器已经接收到并开始执行写操作的binlog事件后,才会认为写操作完成。这提高了数据的一致性,但可能会降低性能。
  2. 全局事务ID(GTID):MySQL 5.6及之后版本引入了GTID机制。GTID为每个事务分配一个唯一的标识符,并将其在主从库之间传播。这样主库和从库可以通过GTID精确地跟踪和重放事务,简化了复制的管理和故障恢复。

  3. 锁机制和事务原子性:通过行锁、表锁等机制控制并发访问,防止数据冲突;同时确保事务中的操作要么全部成功,要么全部失败,不会影响数据的一致性。

四、复制拓扑结构

MySQL主从复制可以支持多种拓扑结构,以满足不同的业务需求,包括:

  1. 一主一从:最简单的结构,主库处理写请求,从库处理读请求。
  2. 一主多从:主库将数据同步给多个从库,从库用于读操作或备份,适合读写分离和负载均衡。
  3. 级联复制:从库充当其他从库的主库,适合层级式架构以减少主库负担。
  4. 双主复制(双向复制):两个服务器彼此之间互为主从,适合高可用或双向写入场景,但要避免数据冲突。

五、应用场景与优势

MySQL主从复制的应用场景广泛,包括读写分离、高可用性和故障切换、数据备份等。其优势在于可以提高数据库的读写性能、保证数据的一致性、实现故障转移和扩展性等。

综上所述,MySQL主从复制通过记录二进制日志、利用复制线程和SQL线程实现数据的同步,并通过多种措施保证数据的一致性。这种机制使得MySQL主从复制成为一种非常灵活且强大的高可用性和扩展性方案。

双主复制的过程

MySQL双主复制(Master-Master Replication)是一种高级的数据库复制技术,它允许两个MySQL服务器互为主从,实现数据的双向同步。以下是MySQL双主复制过程的详细说明:

一、配置前的准备

  1. 确保两台服务器硬件和软件配置相同

    • 硬件方面,包括CPU、内存、磁盘等配置应尽可能一致。
    • 软件方面,确保两台服务器上的MySQL版本相同,并且都已启用二进制日志(Binary Log)。
  2. 设定唯一的服务器ID

    • 在两台服务器的MySQL配置文件中(通常是my.cnf或my.ini),设置不同的server-id值。
  3. 启用GTID模式(可选)

    • 如果使用MySQL 5.6及以上版本,可以启用全局事务标识符(GTID)模式,以简化复制的配置和管理。

二、配置主服务器

  1. 修改配置文件

    • 在两台服务器的MySQL配置文件中,添加或修改以下参数:
      [mysqld]
      server-id = [唯一的服务器ID]
      log_bin = mysql-bin  # 启用二进制日志
      gtid_mode = ON       # 如果使用GTID,则启用此选项
      enforce_gtid_consistency = true  # 强制GTID一致性
      
  2. 重启MySQL服务

    • 修改配置文件后,需要重启MySQL服务以使配置生效。
  3. 创建复制用户

    • 在两台服务器上分别创建一个具有复制权限的用户,用于两台服务器之间的同步。
      GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'password';
      FLUSH PRIVILEGES;
      

三、配置从服务器(相对角色)

  1. 查看主服务器状态

    • 在两台服务器上分别执行SHOW MASTER STATUS命令,获取二进制日志文件名和位置。
  2. 执行CHANGE MASTER TO命令

    • 在两台服务器上分别执行以下命令,将对方配置为从服务器。
      CHANGE MASTER TO
        MASTER_HOST='对方服务器IP',
        MASTER_USER='repluser',
        MASTER_PASSWORD='password',
        MASTER_LOG_FILE='对方二进制日志文件名',
        MASTER_LOG_POS=对方二进制日志位置;
      
      如果使用GTID模式,则可以使用MASTER_AUTO_POSITION=1来自动定位日志位置。
  3. 启动从服务器复制

    • 在两台服务器上分别执行START SLAVE命令,启动从服务器复制。

四、验证复制状态

  1. 查看从服务器状态

    • 在两台服务器上分别执行SHOW SLAVE STATUS\G命令,查看从服务器状态。
    • 确保Slave_IO_RunningSlave_SQL_Running都为Yes,表示复制正常。
  2. 测试数据同步

    • 在其中一台服务器上插入或更新数据,然后在另一台服务器上查询,验证数据是否同步。

五、处理潜在的问题

  1. 数据冲突

    • 由于双主复制允许双向写入,因此可能会出现数据冲突。为了避免冲突,可以采取一些措施,如使用唯一键约束、乐观锁、悲观锁等。
  2. 复制延迟

    • 复制延迟是另一个需要注意的问题。可以通过监控复制状态、优化网络性能、调整MySQL配置等方式来减少复制延迟。
  3. 故障切换

    • 在双主复制环境中,如果其中一台服务器出现故障,可以将其从复制关系中移除,并将另一台服务器作为主服务器使用。同时,需要确保故障恢复后能够重新加入复制关系并保持数据一致性。

综上所述,MySQL双主复制过程涉及多个步骤和配置选项,需要仔细规划和执行。同时,也需要关注潜在的问题和风险,并采取相应的措施来确保数据的完整性和一致性。

双主复制如何解决冲突问题

在MySQL双主复制环境中,数据冲突是一个需要特别关注的问题。以下是一些常用的解决数据冲突的方法:

  1. 使用唯一键约束

    • 在表中定义唯一键约束,确保每个记录都有唯一的标识。
    • 当插入或更新数据时,如果出现重复的唯一键值,则操作会失败,从而避免数据冲突。
  2. 使用乐观锁

    • 乐观锁是一种在数据更新时检查数据版本的机制。
    • 在表中增加一个版本号字段,每次更新数据时,版本号都会加一。
    • 在执行更新操作时,会比较当前数据的版本号和要更新的数据的版本号,如果不同,则表示数据已经被其他事务修改,当前操作会被回滚。
  3. 使用悲观锁

    • 悲观锁是在数据更新前就加锁,确保数据在更新期间不会被其他事务修改。
    • 可以使用FOR UPDATE语句来加悲观锁。
    • 需要注意的是,悲观锁可能会导致死锁,因此需要合理地设置锁的超时时间。
  4. 使用分布式锁

    • 在多个主机之间协调,确保同一时刻只有一个主机在写数据。
    • 可以使用Redis、ZooKeeper等分布式协调服务来实现分布式锁。
  5. 使用消息队列(MQ)

    • 将数据更新操作转化为消息发送,每个主机从MQ中获取消息并执行更新操作。
    • 通过消息队列的顺序性和可靠性来保证数据的一致性。
  6. 使用数据库中间件

    • 数据库中间件可以帮助管理数据库连接、事务、SQL优化等,也可以提供数据冲突解决的功能。
    • 例如,MyCAT、ShardingSphere等数据库中间件都提供了分布式数据库解决方案。
  7. 业务层解决

    • 调用方在插入数据时,可以带入全局唯一ID,而不依赖于数据库的auto increment,以避免主键冲突。
    • 应用程序需能够适应双主环境的特点,如理解写操作可能在任一节点完成,读取可能返回的数据不一致(在同步延迟期内),并处理可能遇到的冲突。
  8. 配置和管理

    • 确保正确配置server-id属性,并且在复制过滤规则(如binlog-do-dbbinlog-ignore-db)中避免相互引用,以防止因配置错误导致的数据冲突。
    • 监控复制延迟并及时处理滞后节点,以减少因复制延迟导致的数据不一致。

综上所述,解决MySQL双主复制中的数据冲突需要综合考虑多种方法和技术手段。在实际应用中,可以根据具体的业务需求和系统架构来选择合适的方法,并结合业务逻辑进行细化和优化。


http://www.kler.cn/a/405125.html

相关文章:

  • HDMI数据传输三种使用场景
  • RGB与YCbCr转换算法
  • vue使用List.forEach遍历集合元素
  • golang通用后台管理系统10(退出登录,注销token)
  • vue--响应式数据
  • 初识Linux · 线程概念
  • Spring Boot核心概念:日志管理
  • SAP FICO 资产会计AA后台配置 (上)
  • PHP顺序查找和二分查找(也叫做折半查找)算法
  • Block Successive Upper Bound Minimization Method(BSUM)算法
  • Android 使用 LiveData/OnCheckedChangeListener 来监听变量变化
  • C++ 并发专题 - 线程安全的单例模式
  • Apache Maven简介
  • 给机器装上“脑子”—— 一文带你玩转机器学习
  • 博导的角度看,EtherNet/IP转Profinet网关的技术实现和区别
  • 基于Java Springboot社区便民服务管理系统
  • 移动零
  • CircuitBreaker机制详解:Elasticsearch中的资源管理
  • 【GIT】TortoiseGit的变基(Rebase)操作
  • Easyexcel(1-注解使用)
  • 什么是MuLogin虚拟浏览器配置文件?它们有什么作用?
  • MongoDB 监控:确保数据库性能和可靠性
  • 【postgresql初级使用】逻辑复制是对数据库对象进行复制,非常灵活的完成数据归集与分发
  • SpringBoot3+Vue3开发图书馆管理系统
  • ZYNQ-7020嵌入式系统学习笔记(1)——使用ARM核配置UART发送Helloworld
  • 修改this.$confirm的按钮位置、图标、文字及标题