文章背景图

Day61-64-MySQL高级下

2026-06-04
0
-
- 分钟
|

Day61-64 - MySQL 高可用集群

本部分涵盖 MySQL 高可用集群架构、性能优化和 MySQL 8.0 新特性。


1. MySQL 高可用概述

1.1 高可用指标

指标 计算公式 说明
可用性 (1 - 故障时间/总时间) × 100% 99.9% = 8.76h/年
RTO Recovery Time Objective 恢复时间目标
RPO Recovery Point Objective 恢复点目标

1.2 高可用方案对比

方案 原理 适用场景
主从复制 数据异步同步 读写分离
MHA 主从 + 自动切换 故障自动转移
MySQL Cluster 多主复制 分布式集群
Galera Cluster 同步多主复制 强一致性场景
MySQL Group Replication 组复制 MySQL 8.0+

2. MHA 高可用方案

2.1 MHA 架构

graph TB
    subgraph MHA架构
        subgraph 主从集群
            Master["主库<br/>Master"]
            Slave1["从库1<br/>Slave1"]
            Slave2["从库2<br/>Slave2"]
        end
        
        MHAnode["MHA Node<br/>监控脚本"]
        MHAmanager["MHA Manager<br/>故障转移"]
    end
    
    MHAnode --> Master
    MHAnode --> Slave1
    MHAnode --> Slave2
    MHAmanager --> MHAnode
    
    Master --> Slave1
    Master --> Slave2

2.2 MHA 工作原理

  1. 监控:MHA Node 每秒 Ping 主库
  2. 检测:主库不可达时触发故障转移
  3. 选主:从多个从库中选择数据最新的作为新主库
  4. 切换:原主库无法恢复时,进行在线切换

2.3 MHA 安装配置

# 安装 MHA Node
yum install -y mha4mysql-node

# 安装 MHA Manager
yum install -y mha4mysql-manager

# 配置 SSH 免密登录
ssh-keygen -t rsa
ssh-copy-id root@slave1

2.4 MHA 配置文件

[server default]
manager_workdir=/var/log/mha/app1
manager_log=/var/log/mha/app1/manager.log
remote_workdir=/var/log/mha/app1

ssh_user=root
ssh_port=22
repl_user=repl
repl_password=repl_pass

master_binlog_dir=/var/lib/mysql
candidate_master=1

3. MySQL 性能优化

3.1 性能优化维度

graph TB
    subgraph 优化层级
        O["MySQL 性能优化"]
        O --> S["SQL优化"]
        O --> S1["索引优化"]
        O --> S2["架构优化"]
        O --> S3["配置优化"]
        O --> S4["硬件优化"]
    end

3.2 SQL 优化 Checklist

检查点 说明
EXPLAIN 分析 确保使用了索引
避免 SELECT * 只查询需要的字段
避免深度分页 使用延迟关联
批量操作 减少网络开销
避免大事务 分解为小事务

3.3 索引优化 Checklist

检查点 说明
覆盖索引 减少回表
最左前缀 遵循索引顺序
前缀索引 减少存储空间
联合索引 减少索引数量

3.4 配置参数优化

[mysqld]
# 连接优化
max_connections = 2000
wait_timeout = 600
interactive_timeout = 600

# 缓存优化
innodb_buffer_pool_size = 12G  # 设置为可用内存的 60-80%
innodb_log_file_size = 2G
innodb_log_buffer_size = 64M

# IO 优化
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

# 线程优化
innodb_read_io_threads = 16
innodb_write_io_threads = 16

3.5 慢查询优化实战

-- 识别慢查询
SELECT 
    digest_text,
    count_star,
    avg_timer_wait / 1000000000000 as avg_seconds,
    sum_timer_wait / 1000000000000 as total_seconds
FROM performance_schema.events_statements_summary_by_digest
ORDER BY avg_timer_wait DESC
LIMIT 10;

-- 分析索引使用
SELECT * FROM mysql.innodb_index_stats 
WHERE database_name = 'app_db';

4. MySQL 分库分表

4.1 分库分表策略

策略 说明 适用场景
垂直分库 按业务拆分不同库 微服务架构
垂直分表 按字段冷热拆分 大宽表
水平分库 数据分到不同库 数据量大
水平分表 数据分到不同表 单表数据多

4.2 分片键选择

-- 按用户ID分片
SELECT * FROM orders WHERE user_id = 1;

-- 按时间分片
SELECT * FROM orders WHERE created_at BETWEEN '2024-01-01' AND '2024-01-31';

4.3 分片中间件

中间件 特点
ShardingSphere-JDBC Java SDK,侵入性强
ShardingSphere-Proxy 代理模式,侵入性低
MyCat 老牌分库分表中间件
Vitess YouTube 开源方案

5. MySQL 备份与恢复

5.1 物理备份

# 使用 xtrabackup 全量备份
xtrabackup --backup \
    --target-dir=/backup/full \
    --user=root \
    --password=123456

# 增量备份
xtrabackup --backup \
    --target-dir=/backup/incr1 \
    --incremental-basedir=/backup/full \
    --user=root \
    --password=123456

# 恢复
xtrabackup --prepare --target-dir=/backup/full
xtrabackup --copy-back --target-dir=/backup/full

5.2 逻辑备份

# mysqldump 全量备份
mysqldump -u root -p \
    --single-transaction \
    --routines \
    --triggers \
    --events \
    --all-databases > /backup/full.sql

# 备份指定库
mysqldump -u root -p \
    --databases app_db > /backup/app_db.sql

# 备份单表
mysqldump -u root -p app_db users > /backup/users.sql

5.3 数据恢复

# 恢复全量备份
mysql -u root -p < /backup/full.sql

# 恢复指定库
mysql -u root -p app_db < /backup/app_db.sql

6. MySQL 监控

6.1 关键监控指标

指标 说明 阈值建议
QPS 每秒查询数 关注趋势
TPS 每秒事务数 关注趋势
连接数 当前连接/最大连接 > 80% 报警
缓冲池命中率 InnoDB 缓冲池命中率 > 95%
锁等待 当前锁等待数量 > 100 报警
慢查询 慢查询数量 关注趋势

6.2 监控工具

工具 说明
Prometheus + Grafana 监控系统
PMM (Percona Monitoring) Percona 监控平台
mysqld_exporter MySQL 监控导出器
show processlist 查看当前连接
-- 查看当前连接
SHOW PROCESSLIST;
SHOW FULL PROCESSLIST;

-- 查看状态
SHOW STATUS LIKE 'Threads%';
SHOW STATUS LIKE 'Connections%';

-- 查看 InnoDB 状态
SHOW ENGINE INNODB STATUS;
原创

Day61-64-MySQL高级下

本文链接: Day61-64-MySQL高级下

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录