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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 《MySQL 简易速速上手小册》第6章:MySQL 复制和分布式数据库(2024 最新版)

05163ff3f5ff78e28cb2b8fc9dac5c9.png

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;
  1. 在从服务器上配置
  • 同样地编辑 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;")
  1. 更新应用配置,将数据库连接指向新的主服务器。

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';
  1. 在主服务器上启用半同步复制。
SET GLOBAL rpl_semi_sync_master_enabled = 1;
SET GLOBAL rpl_semi_sync_master_timeout = 1000;  -- 1 second
  1. 在从服务器上启用半同步复制。
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
  1. 使用 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()
  1. 手动或自动解决检测到的冲突。这可能包括删除重复的记录或合并数据。

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 实现自动化和自定义的冲突解决策略,从而保证了数据的一致性和系统的稳定性。这些技能对于管理复杂的数据库系统和确保业务连续性至关重要。

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7天前
|
关系型数据库 MySQL API
实时计算 Flink版产品使用合集之可以通过mysql-cdc动态监听MySQL数据库的数据变动吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
83 0
|
1天前
|
SQL 关系型数据库 数据库
阿里云数据库 RDS SQL Server版实战【性能优化实践、优点探析】
本文探讨了Amazon RDS SQL Server版在云数据库中的优势,包括高可用性、可扩展性、管理便捷、安全性和成本效益。通过多可用区部署和自动备份,RDS确保数据安全和持久性,并支持自动扩展以适应流量波动。可视化管理界面简化了监控和操作,而数据加密和访问控制等功能保障了安全性。此外,弹性计费模式降低了运维成本。实战应用显示,RDS SQL Server版能有效助力企业在促销高峰期稳定系统并保障数据安全。阿里云的RDS SQL Server版还提供了弹性伸缩、自动备份恢复、安全性和高可用性功能,进一步优化性能和成本控制,并与AWS生态系统无缝集成,支持多种开发语言和框架。
14 2
|
1天前
|
存储 数据可视化 关系型数据库
【MySQL进阶之路 | 基础篇】创建和管理数据库
【MySQL进阶之路 | 基础篇】创建和管理数据库
|
1天前
|
存储 SQL 关系型数据库
【MySQL】数据库基础 -- 详解
【MySQL】数据库基础 -- 详解
|
2天前
|
关系型数据库 MySQL 数据库
如何在MySQL中查看已创建的数据库列表?
【5月更文挑战第22天】如何在MySQL中查看已创建的数据库列表?
10 1
|
3天前
|
Cloud Native 数据管理 关系型数据库
【阿里云云原生专栏】云原生数据管理:阿里云数据库服务的分布式实践
【5月更文挑战第21天】阿里云数据库服务在云原生时代展现优势,应对分布式数据管理挑战。PolarDB等服务保证高可用和弹性,通过多副本机制和分布式事务确保数据一致性和可靠性。示例代码展示了在阿里云数据库上进行分布式事务操作。此外,丰富的监控工具协助用户管理数据库性能,支持企业的数字化转型和业务增长。
170 1
|
3天前
|
存储 关系型数据库 MySQL
MySQL中数据库的相关操作
MySQL中数据库的相关操作
224 62
|
3天前
|
存储 分布式计算 Java
大数据存储技术(3)—— HBase分布式数据库
大数据存储技术(3)—— HBase分布式数据库
65 0
|
4天前
|
关系型数据库 分布式数据库 PolarDB
【PolarDB开源】PolarDB开源之旅:从零开始搭建分布式数据库集群
【5月更文挑战第20天】PolarDB,阿里云自研的云原生分布式数据库,因其高性能、高可用和易用性备受瞩目。本文指导如何搭建PolarDB集群:准备硬件和软件环境,从GitHub克隆源码,构建Docker镜像,部署控制节点和计算节点,最后验证集群状态。通过开源,PolarDB旨在推动数据库技术进步,邀请用户一同探索其潜力,共创未来。
33 4
|
9天前
|
NoSQL Java 关系型数据库
【Redis系列笔记】分布式锁
分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路
139 2