《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)

news2025/1/19 2:37:18

在这里插入图片描述

文章目录

  • 6.1 设置和管理复制
    • 6.1.1 基础知识
    • 6.1.2 重点案例:使用 Python 设置 MySQL 主从复制
    • 6.1.3 拓展案例 1:自动故障转移
    • 6.1.4 拓展案例 2:设置双主复制
  • 6.2 复制的类型和策略
    • 6.2.1 基础知识
    • 6.2.2 重点案例:使用 Python 设置半同步复制
    • 6.2.3 拓展案例 1:监控半同步复制的延迟
    • 6.2.4 拓展案例 2:动态切换复制类型
  • 6.3 解决复制冲突
    • 6.3.1 基础知识
    • 6.3.2 重点案例:使用 Python 检测并解决主键冲突
    • 6.3.3 拓展案例 1:自动解决数据不一致
    • 6.3.4 拓展案例 2:使用 Python 实现自定义冲突解决策略

6.1 设置和管理复制

在 MySQL 的世界里,复制不仅仅是数据的翻版,它是提高数据可用性、可靠性和灾难恢复能力的关键技术。让我们深入了解如何启动你的复制之旅,确保你的数据不会因为任何意外而遗失。

6.1.1 基础知识

复制允许数据从一个 MySQL 服务器(主服务器)同步到一个或多个 MySQL 服务器(从服务器)。这个过程可以是异步的,也可以是半同步的,取决于你对数据一致性的需求。

  • 主从复制配置:在主服务器上,你需要启用二进制日志并创建一个具有复制权限的用户。在从服务器上,你需要配置连接到主服务器的信息,包括主服务器的 IP 地址、复制用户的用户名和密码,以及要从哪个点开始复制的二进制日志文件名和位置。

  • 启动复制过程:在从服务器上执行 CHANGE MASTER TO 命令以指定主服务器的详情,然后启动复制进程。

  • 监控复制状态:使用 SHOW SLAVE STATUS\G 来检查从服务器的复制状态,确保 Slave_IO_RunningSlave_SQL_Running 都是 Yes

6.1.2 重点案例:使用 Python 设置 MySQL 主从复制

假设你负责一个在线商店的数据库管理工作,需要设置复制来增加数据的可用性和备份。

步骤

  1. 在主服务器上配置

    • 编辑 MySQL 配置文件(通常是 /etc/my.cnf/etc/mysql/mysql.conf.d/mysqld.cnf),启用二进制日志并指定服务器 ID。

      [mysqld]
      log_bin=mysql-bin
      server_id=1
      
    • 重启 MySQL 服务使配置生效。

    • 创建复制用户。

      CREATE USER 'replicator'@'%' IDENTIFIED BY 'password';
      GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%';
      FLUSH PRIVILEGES;
      
  2. 在从服务器上配置

    • 同样地编辑 MySQL 配置文件,指定一个唯一的服务器 ID。

      [mysqld]
      server_id=2
      
    • 重启 MySQL 服务。

    • 使用 Python 连接到从服务器的 MySQL 实例,并配置复制。

      import mysql.connector
      
      conn = mysql.connector.connect(host='slave_host', user='root', password='yourpassword')
      cursor = conn.cursor()
      cursor.execute(f"CHANGE MASTER TO MASTER_HOST='master_host', MASTER_USER='replicator', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=  154;")
      cursor.execute("START SLAVE;")
      

6.1.3 拓展案例 1:自动故障转移

假设主服务器突然宕机,你需要快速将从服务器提升为新的主服务器,同时保持业务的连续性。

  1. 在从服务器上停止复制进程,并提升为主服务器。

    cursor.execute("STOP SLAVE;")
    cursor.execute("RESET MASTER;")
    
  2. 更新应用配置,将数据库连接指向新的主服务器。

6.1.4 拓展案例 2:设置双主复制

在某些场景下,你可能需要两个数据库服务器互为主备,以实现高可用性。

  1. 在两个服务器上互相配置对方为主服务器,确保开启二进制日志并设置不同的 server_id
  2. 使用 Python 在两个服务器上互相执行 CHANGE MASTER TO,指定对方的详情。

通过以上案例,你不仅学会了如何使用 Python 来设置和管理 MySQL 的复制,还探索了如何在实际生产环境中应用复制来提高数据的可用性和灾难恢复能力。这些技能对于任何希望确保数据安全和业务连续性的数据库管理员来说都是宝贵的资产。

在这里插入图片描述


6.2 复制的类型和策略

在 MySQL 的世界里,复制不只是一个简单的数据复制过程。根据业务需求的不同,你可以选择不同类型的复制策略,每种策略都有其独特的优势和应用场景。

6.2.1 基础知识

  • 异步复制:这是 MySQL 复制的默认模式。在这种模式下,主服务器在更新自己的数据后不会等待从服务器确认就继续处理其他操作,这可能会导致主从服务器之间的数据延迟。
  • 半同步复制:在半同步复制中,主服务器在提交事务前至少需要一个从服务器发回确认,这样可以确保数据在主服务器和至少一个从服务器之间是一致的,减少了数据丢失的风险。
  • 组复制:这是 MySQL 5.7 版本引入的一个新特性,提供了一种基于组成员资格的复制方式,可以实现多主复制,所有的写操作都会被复制到组内的其他成员,确保数据的一致性。

6.2.2 重点案例:使用 Python 设置半同步复制

假设你的在线商店数据非常重要,不能容忍任何数据丢失,你决定使用半同步复制来确保数据的一致性。

步骤

  1. 首先,确保主服务器和至少一个从服务器安装了半同步复制插件。

    INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
    INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
    
  2. 在主服务器上启用半同步复制。

    SET GLOBAL rpl_semi_sync_master_enabled = 1;
    SET GLOBAL rpl_semi_sync_master_timeout = 1000;  -- 1 second
    
  3. 在从服务器上启用半同步复制。

    SET GLOBAL rpl_semi_sync_slave_enabled = 1;
    
  4. 使用 Python 脚本来自动化这一过程,假设你已经建立了与数据库的连接。

    import mysql.connector
    
    def configure_semi_sync(host, user, password, is_master=True):
        conn = mysql.connector.connect(host=host, user=user, password=password)
        cursor = conn.cursor()
        if is_master:
            cursor.execute("INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'")
            cursor.execute("SET GLOBAL rpl_semi_sync_master_enabled = 1")
            cursor.execute("SET GLOBAL rpl_semi_sync_master_timeout = 1000")
        else:
            cursor.execute("INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'")
            cursor.execute("SET GLOBAL rpl_semi_sync_slave_enabled = 1")
        conn.close()
    
    # Configure the master
    configure_semi_sync('master_host', 'root', 'master_password', is_master=True)
    # Configure the slave
    configure_semi_sync('slave_host', 'root', 'slave_password', is_master=False)
    

6.2.3 拓展案例 1:监控半同步复制的延迟

为了确保你的半同步复制运行顺畅,监控复制延迟是非常重要的。

使用 Python 查询 SHOW SLAVE STATUS 并解析 Seconds_Behind_Master 来监控延迟。

conn = mysql.connector.connect(host='slave_host', user='root', password='yourpassword')
cursor = conn.cursor()
cursor.execute("SHOW SLAVE STATUS")
slave_status = cursor.fetchone()
delay = slave_status[cursor.column_names.index('Seconds_Behind_Master')]
print(f"Current replication delay: {delay} seconds")

6.2.4 拓展案例 2:动态切换复制类型

在某些情况下,你可能需要根据负载动态切换复制类型,比如从半同步复制切换回异步复制以减少写操作的延迟。

使用 Python 脚本来动态调整复制类型。

def switch_replication_mode(host, user, password, mode='ASYNC'):
    conn = mysql.connector.connect(host=host, user=user, password=password)
    cursor = conn.cursor()
    if mode == 'SEMI_SYNC':
        cursor.execute("SET GLOBAL rpl_semi_sync_master_enabled = 1")
    else:
        cursor.execute("SET GLOBAL rpl_semi_sync_master_enabled = 0")
    conn.close()

# Switch to asynchronous replication
switch_replication_mode('master_host', 'root', 'master_password', mode='ASYNC')

通过以上案例,你不仅学会了如何根据业务需求选择合适的复制策略,还掌握了使用 Python 来配置和监控 MySQL 复制的技巧,确保你的数据库复制策略既灵活又可靠。

在这里插入图片描述


6.3 解决复制冲突

在 MySQL 复制过程中,冲突是不可避免的。它们通常发生在多主复制环境中,或者当从服务器试图应用已经在主服务器上更改过的数据时。有效地管理和解决这些冲突对于保持数据一致性和系统稳定性至关重要。

6.3.1 基础知识

复制冲突主要包括两类:

  • 主键冲突:当两个或更多的服务器试图插入具有相同主键的记录时发生。
  • 数据不一致:当不同的更改被应用到同一数据集上,导致数据在主从服务器之间不一致。

解决复制冲突的策略包括:

  • 冲突检测与解决机制:一些高级复制技术(如 MySQL Group Replication)内置了冲突检测与解决机制。

  • 避免写入冲突:通过应用设计或数据库架构来避免潜在的写入冲突。

  • 手动解决冲突:通过审查冲突数据并手动解决。

6.3.2 重点案例:使用 Python 检测并解决主键冲突

假设你在一个多主复制环境中工作,需要确保数据的一致性,你可以使用 Python 来帮助检测和解决可能的主键冲突。

步骤

  1. 编写一个 Python 脚本来查询可能的主键冲突。

    import mysql.connector
    from mysql.connector import Error
    
    try:
        conn = mysql.connector.connect(host='host', user='user', password='password', database='dbname')
        cursor = conn.cursor()
        cursor.execute("SELECT id, COUNT(*) c FROM tablename GROUP BY id HAVING c > 1")
        for (id, count) in cursor:
            print(f"Duplicate ID: {id}, Count: {count}")
    except Error as e:
        print(f"Error: {e}")
    finally:
        if conn.is_connected():
            cursor.close()
            conn.close()
    
  2. 手动或自动解决检测到的冲突。这可能包括删除重复的记录或合并数据。

6.3.3 拓展案例 1:自动解决数据不一致

在某些情况下,你可能需要自动解决由于网络分区或其他问题导致的数据不一致问题。

  1. 使用 Python 定期检查并修复数据不一致。

    # 假设有两个连接,conn_master 和 conn_slave 分别连接到主和从服务器
    cursor_master = conn_master.cursor()
    cursor_slave = conn_slave.cursor()
    
    # 检查并解决数据不一致
    cursor_master.execute("SELECT id, data FROM tablename")
    master_data = cursor_master.fetchall()
    for (id, data) in master_data:
        cursor_slave.execute("SELECT data FROM tablename WHERE id = %s", (id,))
        slave_data = cursor_slave.fetchone()
        if slave_data is None or slave_data[0] != data:
            print(f"Data inconsistency detected for ID: {id}. Updating slave...")
            cursor_slave.execute("REPLACE INTO tablename (id, data) VALUES (%s, %s)", (id, data))
            conn_slave.commit()
    

6.3.4 拓展案例 2:使用 Python 实现自定义冲突解决策略

在一些高级应用场景中,可能需要根据业务逻辑实现自定义的冲突解决策略。在一些高级应用场景中,可能需要根据业务逻辑实现自定义的冲突解决策略。

  1. 设计一个策略来决定当冲突发生时保留哪条记录。

    # 假设基于最新的时间戳来解决冲突
    cursor.execute("SELECT id, MAX(updated_at) FROM tablename GROUP BY id HAVING COUNT(*) > 1")
    for (id, latest) in cursor:
        cursor.execute("DELETE FROM tablename WHERE id = %s AND updated_at < %s", (id, latest))
        print(f"Resolved conflict for ID: {id}, keeping record with latest updated_at: {latest}")
        conn.commit()
    

通过上述案例,你不仅学习了如何检测和解决 MySQL 复制中的常见冲突类型,还探索了如何利用 Python 实现自动化和自定义的冲突解决策略,从而保证了数据的一致性和系统的稳定性。这些技能对于管理复杂的数据库系统和确保业务连续性至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1441792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

保育员答案在哪搜?这4款足够解决问题 #媒体#其他#其他

学会运用各类学习辅助工具和资料&#xff0c;是大学生培养自主学习能力和信息获取能力的重要途径之一。 1.石墨文档 石墨文档(Shimo Docs)是一款强大的在线文档协作工具。它提供了多人实时协作、版本控制、评论和批注等功能&#xff0c;方便学生在学习中进行文档编写、合作项…

【芯片设计- RTL 数字逻辑设计入门 14 -- 使用子模块实现三输入数的大小比较】

文章目录 三输入数的大小比较问题分析verilog codeTestBench Code综合图仿真波形图 三输入数的大小比较 在数字芯片设计中&#xff0c;通常把完成特定功能且相对独立的代码编写成子模块&#xff0c;在需要的时候再在主模块中例化使用&#xff0c;以提高代码的可复用性和设计的层…

【网工】华为设备命令学习(Telnet)

本次实验AR3为我们实际中远程的路由&#xff0c;AR4模拟我们的设备&#xff0c;最终实现Telnet的远程控制路由&#xff01; 本次笔记主要记录Telnet技术实现原理&#xff0c;后续再补充具体配置代码。 Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登录服务的…

Huggingface上传模型

Huggingface上传自己的模型 参考 https://juejin.cn/post/7081452948550746148https://huggingface.co/blog/password-git-deprecationAdding your model to the Hugging Face Hub&#xff0c; huggingface.co/docs/hub/ad…Welcome&#xff0c;huggingface.co/welcome三句指…

猫头虎分享已解决Bug || CPU过载(CPU Overload):HighCpuUsageWarning, CpuOverloadException

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

基础图算法与社交网络分析

目录 前言1 寻找最短路径的Dijkstra算法1.1 介绍1.2 算法步骤1.3 应用领域1.4 算法优势与限制 2 构建高效网络结构的最小生成树算法2.1 Kruskal算法2.2 应用领域2.3 算法优势与限制 3 中心度算法3.1 PageRank算法3.2 Degree Centrality&#xff08;度中心度&#xff09;3.3 Bet…

Web 目录爆破神器:DirBuster 保姆级教程(附链接)

一、介绍 DirBuster 是一个用于强制目录浏览的渗透测试工具&#xff0c;它主要用于在Web应用程序中识别隐藏的目录和文件。这个工具被设计成非常灵活&#xff0c;可以根据用户的需求进行配置。以下是 DirBuster 的一些主要特点和用法&#xff1a; 主要特点&#xff1a; 字典爆…

Python入门:常用模块—os模块及sys模块

os模块 sys模块 import sys print(sys.argv) # 命令参数list&#xff0c;第一个元素是程序本身路径 print(sys.exit()) # 退出程序&#xff0c;正常退出是exit(0) print(sys.version) # 获取python解释程序的版本信息 print(sys.maxint()) # 最大…

【网络技术】【Kali Linux】Nmap嗅探(二)多设备扫描

上期实验博文&#xff1a;&#xff08;一&#xff09;简单扫描 一、实验环境 本次实验进行Nmap多设备扫描&#xff0c;实验使用 Kali Linux 虚拟机&#xff08;扫描端&#xff09;、Ubuntu 22.04虚拟机&#xff08;被扫描端1&#xff09;、Ubuntu 18.04虚拟机&#xff08;被扫…

微信红包测试用例设计,龙年大吉!

前言 大家好&#xff0c;我是chowley&#xff0c;在这里祝大家龙年大吉&#xff0c;身体健康&#xff0c;这次来回忆一下当时参加腾讯技术面的场景题&#xff0c;面试官让我测试拼手气红包&#xff0c;不需要考虑其他方面&#xff0c;只在功能方面进行探索。 我先贴一张红包界…

Redis核心技术与实战【学习笔记】 - 26.Redis数分布优化(应对数据倾斜问题)

简述 在切片集群中&#xff0c;数据会按照一定的规则分散到不同的实例上保存。比如&#xff0c;Redis Cluster 或 Codis 会先按照 CRC 算法的计算值对 Slot&#xff08;逻辑槽&#xff09;取模&#xff0c;同时 Slot 又有运维管理员分配到不同的实例上。这样&#xff0c;数据就…

大模型|基础_word2vec

文章目录 Word2Vec词袋模型CBOW Continuous Bag-of-WordsContinuous Skip-Gram存在的问题解决方案 其他技巧 Word2Vec 将词转化为向量后&#xff0c;会发现king和queen的差别与man和woman的差别是类似的&#xff0c;而在几何空间上&#xff0c;这样的差别将会以平行的关系进行表…

基于深度学习算法的轴承故障自主分类

1. 要求 轴承有3种故障&#xff1a;外圈故障&#xff0c;内圈故障&#xff0c;滚珠故障&#xff0c;外加正常的工作状态。如表1所示&#xff0c;结合轴承的3种直径&#xff08;直径1,直径2,直径3&#xff09;&#xff0c;轴承的工作状态有10类&#xff1a; 表1 轴承故障类别 外…

横扫Spark之 - 9个常见的行动算子

水善利万物而不争&#xff0c;处众人之所恶&#xff0c;故几于道&#x1f4a6; 文章目录 1. collect()2. count()3. first()4. take()5. takeOrdered()6. countByKey()7. saveAS...()8. foreach()9. foreachPartition() *** 1. collect() 收集RDD每个分区的数据以数组封装之后发…

【FFmpeg】ffplay 命令行参数 ⑤ ( 设置音频滤镜 -af 参数 | 设置统计信息 -stats 参数 | 设置同步时钟类型 -sync 参数 )

文章目录 一、ffplay 命令行参数 - 音频滤镜1、设置音频滤镜 -af 参数2、常用的 音频滤镜 参数3、音频滤镜链 示例 二、ffplay 命令行参数 - 统计信息1、设置统计信息 -stats 参数2、关闭统计信息 -nostats 参数 三、ffplay 命令行参数 - 同步时钟类型1、设置同步时钟类型 -syn…

Rebuild企业管理系统 SSRF漏洞(CVE-2024-1021)

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

【FPGA Verilog】各种加法器Verilog

1bit半加器adder设计实例 module adder(cout,sum,a,b); output cout; output sum; input a,b; wire cout,sum; assign {cout,sum}ab; endmodule 解释说明 &#xff08;1&#xff09;assign {cout,sum}ab 是连续性赋值 对于线网wire进行赋值&#xff0c;必须以assign或者dea…

报错ValueError: Unknown CUDA arch (8.6) or GPU not supported

文章目录 问题描述解决方案参考文献 问题描述 报错 ValueError: Unknown CUDA arch (8.6) or GPU not supported 本人显卡为 RTX 3060&#xff0c;CUDA 为 10.2&#xff0c;PyTorch 为 1.5 解决方案 修改 C:\Users\Administrator\Envs\test\Lib\site-packages\torch\utils\c…

【前端高频面试题--Vue基础篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;前端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac;前端高频面试题--Vue基础篇 Vue基本原理双向绑定与MVVM模型Vue的优点计算属性与监听属性计算属性监…

多线程基础详解(看到就是赚到)

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 创建线程 1.创建类继承Thread,重写run() 2.实现Runnable,重写run() 3.继承Thread,使用匿名内部类 …