12. mysql 学习笔记 - 数据复制与高可用性

59 阅读11分钟

在实际的应用场景中,MySQL 数据复制与高可用性解决方案通常用于以下几种情况,帮助提高系统的可靠性、可扩展性和性能。以下是一些常见的实际应用场景和如何结合主从复制、双主复制、MHA、Galera Cluster 和 ProxySQL 等技术来解决问题的具体案例:

1. 实际应用场景

1. 负载均衡与高可用性(Web 应用、线上服务)

场景描述:

在一个大型的互联网服务平台(如电商网站、社交平台或新闻网站),每秒钟会产生大量的数据库查询和写入请求。单台数据库服务器通常无法处理所有的请求,且如果主数据库宕机,整个系统可能会出现故障,导致用户无法访问。

解决方案:

主从复制 + ProxySQL + 读写分离

  • 主从复制:通过设置主库和从库,主库负责处理写请求,从库负责处理读请求。这样,可以减轻主库的压力,提升系统的整体性能。

  • ProxySQL:作为 MySQL 代理,ProxySQL 可以在应用层面实现 读写分离。所有的写操作会被路由到主库,而所有的读操作会被路由到从库,从而减轻主库的负载,并提高读请求的吞吐量。

  • 高可用性:通过设置多个从库,可以提高读操作的可用性。而使用 ProxySQL 可以帮助在从库故障时,自动将读请求重定向到其他从库。

  • 容灾与故障恢复:如果主库发生故障,ProxySQL 可以将写请求路由到一个新的主库,确保系统的持续可用。

案例:

电商平台:处理用户订单、商品信息、支付等事务,读操作(如商品浏览、用户信息查询)可以分发到多个从库,写操作(如订单提交)集中在主库上,负载均衡可以提高系统的响应速度和处理能力。

2. 灾难恢复(高可用架构)

场景描述:

在一些关键业务系统中(如金融、医疗、电力等行业),数据的丢失或系统停机会带来巨大的损失。因此,确保系统在任何情况下都能高效恢复、避免单点故障至关重要。

解决方案:

MySQL 主从复制 + MHA(Master High Availability)

  • 主从复制:采用主从复制结构,将数据从主库复制到从库,确保从库有完整的数据副本作为备份。

  • MHA:MHA 是 MySQL 数据库的高可用性解决方案,支持在主库宕机时,自动将从库提升为主库,并重新配置其他从库。这样可以保证故障转移后的最小中断时间。

案例:

  • 金融交易平台:交易数据需要确保高度一致性并避免数据丢失。通过 MHA 配置,若主库发生故障,系统会自动将其中一个从库提升为主库,确保交易平台无缝过渡,避免数据丢失。

3. 多数据中心容灾(跨地域高可用性)

场景描述:

大型企业通常会部署多个数据中心,以确保在一个数据中心发生灾难时,业务依然能够继续运行。此时,数据库需要跨多个地理位置进行同步,以确保数据一致性和业务可用性。

解决方案:

Galera Cluster + 多数据中心部署

  • Galera Cluster:作为一种同步多主集群解决方案,Galera Cluster 支持跨多个数据中心的同步复制。所有节点(无论是在主数据中心还是备用数据中心)都可以同时进行读写操作。

  • 多数据中心部署:通过在多个地理位置部署 Galera 集群,可以确保一个数据中心发生故障时,其他数据中心仍能继续提供服务,保证高可用性。

案例:

  • 全球电商平台:为了保证全球用户在不同地区访问时的低延迟和高可用性,电商平台可以在多个地区部署 Galera Cluster,确保不同地区的数据保持同步,并且在一个地区发生故障时,系统可以自动将流量转发到其他地区的数据中心。

4. 数据分析与报表系统(分库分表、性能优化)

场景描述:

在需要处理海量数据的场景中,如大数据分析、日志处理和报表系统,数据库可能面临单表过大导致查询性能低下的情况。需要通过分库分表的方式来优化性能,同时保持系统的高可用性。

解决方案:

双主复制 + 数据分片 + ProxySQL

  • 双主复制:可以设置双主复制结构,保证两个节点都能处理读写请求,从而提升整体吞吐量。同时,可以通过 ProxySQL 实现负载均衡,将请求智能地分发到两个主库。

  • 数据分片:对于海量数据,通过分库分表策略将数据分布到不同的数据库实例中。这通常涉及数据切分策略,比如按日期、ID 范围等将数据分散存储。

  • ProxySQL:使用 ProxySQL 可以根据业务规则智能地路由到正确的数据库实例进行查询或写入,从而避免单个节点的性能瓶颈。

案例:

  • 日志分析系统:日志系统会收集和存储大量的日志数据,如果所有日志存储在一个数据库中,可能会导致性能瓶颈。通过使用分库分表,并配合双主复制与 ProxySQL 的负载均衡,可以保证系统的高性能和高可用性。

5. 跨地域高可用架构

场景描述:

对于一些全球性或跨地区部署的应用,需要保证不同地区的数据库系统能够在不同区域间高效同步并且具备高可用性。

解决方案:

MySQL 主从复制 + 复制延迟优化 + 数据中心部署

  • 跨地域的主从复制:可以通过设置不同地理区域的主库和从库,将数据从一个区域的数据库复制到另一区域。

  • 复制延迟优化:在跨地域部署时,复制延迟可能会成为一个问题。为此,可以优化网络延迟,减少跨地域复制的时间。或者在应用层通过缓存机制来减小复制延迟带来的影响。

  • ProxySQL 和负载均衡:可以使用 ProxySQL 路由用户请求,确保用户的请求始终能够被路由到离用户最近的数据库节点,从而提高响应速度和容错性。

案例:

  • 全球社交媒体平台:为了解决全球用户的访问延迟和数据一致性问题,社交媒体平台可以部署多个数据中心,并通过主从复制同步数据。使用 ProxySQL 实现流量的自动路由,确保每个用户请求被路由到离其最近的数据库节点。

2. 具体方案

1. 主从复制(Master-Slave Replication)

1.1 主从复制概念

主从复制是 MySQL 中常见的数据库复制方式,其中一个主服务器(Master)将数据变更(如 INSERT、UPDATE、DELETE)传递给多个从服务器(Slave)。这种方式常用于分布式数据库系统中,保证数据的备份、负载均衡和灾难恢复。

  • Master:主数据库,负责写入操作。
  • Slave:从数据库,负责读操作,定期从主数据库获取更新的操作日志,应用在本地数据库上。

1.2 同步复制 vs 异步复制

  • 同步复制:主数据库在提交事务时,需要等待从数据库的确认,确保数据的写入在所有节点上是一致的。优点是数据一致性高,缺点是性能下降,因为主服务器等待从服务器的确认。

  • 异步复制:主数据库在提交事务时不等待从数据库的确认,主库的事务提交后直接返回。这样性能更高,但可能出现数据不一致的情况,因为从库的数据会稍微滞后。

默认情况下,MySQL 使用的是异步复制

1.3 GTID(Global Transaction ID)

GTID 是 MySQL 5.6 引入的一种新的复制机制,GTID 标识了数据库中每个事务的唯一标识符。在 GTID 复制模式下,每个事务都有一个唯一的标识符(GTID),它不仅保证了事务在复制时的顺序性,还避免了传统的基于日志位置的复制中的复杂性(如日志文件同步、位置错误等问题)。

  • GTID 的优点

    1. 不需要手动指定复制位置。
    2. 支持自动故障转移。
    3. 复制的状态管理更加简单。
  • 启用 GTID:首先,主库和从库都需要启用 GTID 支持。

    • 在 MySQL 配置文件中设置:
[mysqld]
gtid_mode = ON
enforce-gtid-consistency = true
  • 查看当前的 GTID 状态
SHOW VARIABLES LIKE 'gtid%';

image.png

1.4 主从复制的基本设置

1. 主库配置(Master)

  • my.cnf 中配置:
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=kylin_admin  # 如果只想复制特定数据库
  • 重启 MySQL 服务。

  • 创建复制用户:

CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%';
FLUSH PRIVILEGES;

从库配置(Slave)

  • my.cnf 中配置:
[mysqld]
server-id=2  # 从库的 ID 必须与主库不同
relay-log=relay-bin
log-bin=mysql-bin
  • 重启 MySQL 服务。

  • 启动复制进程:

CHANGE MASTER TO
    MASTER_HOST='master_host_ip',
    MASTER_USER='replica_user',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=4;
START SLAVE;
  • 检查复制状态:
SHOW SLAVE STATUS\G

1.5 主从复制的常见问题

  • 复制延迟:主从复制存在一定的延迟,特别是在主库有大量写操作时。

  • 网络问题:网络不稳定可能导致从库同步延迟或中断。

  • 数据一致性问题:在异步复制模式下,主库提交事务时并不等待从库确认,可能出现数据不一致。

2. 双主复制(Master-Master Replication)

2.1 双主复制概念

双主复制是指两个 MySQL 服务器都充当主库,并且互相复制数据。这种方式通常用于负载均衡,两个节点都可以进行读写操作。双主复制的主要优点是能够实现负载均衡,但也可能带来数据同步和冲突的管理问题。

2.2 配置双主复制

1. 主库配置 1

配置主库 1(server-id=1):

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

在 MySQL 中创建复制账户:

CREATE USER 'replica'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;

2. 主库配置 2

配置主库 2(server-id=2):

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

创建复制账户:

CREATE USER 'replica'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';
FLUSH PRIVILEGES;

3. 配置双向复制: 在两台 MySQL 服务器上相互配置为主从关系:

  1. 在服务器 1 上配置复制到服务器 2:
CHANGE MASTER TO
    MASTER_HOST='server2_ip',
    MASTER_USER='replica',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=4;
START SLAVE;
  1. 在服务器 2 上配置复制到服务器 1:
CHANGE MASTER TO
    MASTER_HOST='server1_ip',
    MASTER_USER='replica',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=4;
START SLAVE;

4. 双主复制常见问题

  • 冲突问题:由于两个数据库都可以进行写操作,如果两个数据库在相同的表上进行写操作,可能会导致冲突。

  • 自动解决冲突:通常需要通过业务逻辑或其他手段来解决冲突(如设置主键冲突时如何处理)。

3. MySQL 高可用性解决方案

3.1 MHA(Master High Availability)

MHA 是一个 MySQL 高可用性解决方案,主要通过自动故障转移(failover)和备份来保证 MySQL 集群的高可用性。

  • MHA 组件

    1. MHA Manager:负责管理主从复制的监控,发现主库故障时进行自动故障转移。

    2. MHA Node:节点上运行的服务,负责与 MHA Manager 配合工作,监控和执行故障转移。

  • MHA 安装与配置

    1. 安装 MHA Manager 和 MHA Node。

    2. 配置 MHA Manager 和 MHA Node,指定主库和从库的 IP 地址。

    3. 配置 ssh 免密码登录,以便进行自动化管理。

  • MHA 优势:提供自动化的故障转移和恢复,降低人工干预的需求。

3.2 Galera Cluster

Galera Cluster 是一个同步多主(multi-master)集群解决方案,可以用于 MySQL 和 MariaDB,实现真正的多主同步复制。

  • 特性

    • 支持数据在多个节点之间的同步。

    • 支持自动故障转移。

    • 支持自动节点加入和删除。

  • 安装与配置

    • 安装 Galera Cluster 软件并配置 wsrep 参数。

    • 配置每个节点为一个集群成员。

  • Galera Cluster 优势

    • 提供强一致性和高可用性。

    • 支持多主复制,所有节点都可以进行读写。

3.3 ProxySQL

ProxySQL 是一个高性能的 MySQL 代理,常用于 MySQL 集群或主从复制架构中的负载均衡。

  • 功能

    • 实现负载均衡。

    • 自动故障转移和读写分离。

    • 支持查询缓存和连接池。

  • 使用场景

    • 在主从复制环境中,ProxySQL 可以将读请求分发到从库,写请求分发到主库,从而减轻主库的负担。
  • 安装与配置

    • 安装 ProxySQL 并配置它作为 MySQL 数据库集群的代理。

    • 配置集群中的节点信息,设置负载均衡和路由规则。