logo

MySQL双主共享存储:基于磁盘阵列的高可用配置指南

作者:rousong2025.10.14 02:02浏览量:14

简介:本文详细介绍MySQL双主架构下共享磁盘阵列的配置方法,涵盖存储设计、数据同步、故障切换等核心环节,提供可落地的技术方案与运维建议。

MySQL双主共享存储:基于磁盘阵列的高可用配置指南

一、技术架构概述

MySQL双主共享存储架构通过物理磁盘阵列实现数据层的集中管理,结合双主复制机制构建高可用数据库集群。该方案的核心优势在于:

  1. 数据一致性保障:所有写操作通过共享存储直接作用于同一份数据文件,避免逻辑复制可能产生的数据分叉
  2. 故障切换效率:主库故障时,备库可直接挂载存储设备,切换时间可控制在秒级
  3. 资源利用率优化:相比传统主从架构,共享存储模式可节省50%以上的存储空间

典型架构包含以下组件:

  • 共享存储层:SAN/iSCSI磁盘阵列,配置RAID 10提供冗余
  • 数据库层:两台MySQL实例配置为互为主备
  • 监控层:Keepalived+VIP实现服务漂移
  • 仲裁层:第三方仲裁服务防止脑裂

二、存储层配置要点

2.1 磁盘阵列选型标准

  1. IOPS要求:单盘IOPS需达到2000+,建议采用15K SAS硬盘
  2. 带宽指标:阵列控制器需支持8Gb FC或10Gb iSCSI
  3. 冗余设计:双控制器+双电源+多路径软件
  4. 容量规划:预留30%空间用于binlog存储和临时表

配置示例(Linux LVM):

  1. # 创建物理卷
  2. pvcreate /dev/sdb /dev/sdc
  3. # 创建卷组
  4. vgcreate mysql_vg /dev/sdb /dev/sdc
  5. # 创建逻辑卷(使用条带化)
  6. lvcreate -i 2 -I 64k -L 500G -n mysql_lv mysql_vg
  7. # 格式化文件系统
  8. mkfs.xfs /dev/mysql_vg/mysql_lv

2.2 存储访问控制

  1. 多路径配置

    1. # 安装多路径软件
    2. yum install device-mapper-multipath
    3. # 配置/etc/multipath.conf
    4. devices {
    5. device {
    6. vendor "NETAPP"
    7. product "LUN"
    8. path_grouping_policy multibus
    9. path_checker tur
    10. failback immediate
    11. no_path_retry 5
    12. }
    13. }
  2. 权限管理

    1. -- MySQL中配置专用用户
    2. CREATE USER 'storage_admin'@'192.168.1.%' IDENTIFIED BY 'SecurePass123!';
    3. GRANT SELECT, RELOAD, PROCESS ON *.* TO 'storage_admin'@'192.168.1.%';

三、MySQL双主配置详解

3.1 基础配置参数

my.cnf核心配置项:

  1. [mysqld]
  2. # 共享存储配置
  3. datadir = /mnt/mysql_share/data
  4. innodb_data_home_dir = /mnt/mysql_share/data
  5. innodb_log_group_home_dir = /mnt/mysql_share/logs
  6. # 双主复制配置
  7. server-id = 1 # 主库1配置为1,主库2配置为2
  8. log-bin = mysql-bin
  9. binlog_format = ROW
  10. sync_binlog = 1
  11. innodb_flush_log_at_trx_commit = 1
  12. # 半同步复制配置
  13. plugin-load = semisync_master.so
  14. rpl_semi_sync_master_enabled = 1
  15. rpl_semi_sync_master_timeout = 1000

3.2 复制链路建立

  1. 初始数据同步

    1. # 在主库1执行
    2. mysqldump --all-databases --single-transaction --master-data=2 > full_backup.sql
    3. # 在主库2恢复
    4. mysql < full_backup.sql
  2. 配置复制账户

    1. CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_pass';
    2. GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
  3. 启动复制

    1. -- 在主库2执行
    2. CHANGE MASTER TO
    3. MASTER_HOST='主库1IP',
    4. MASTER_USER='repl',
    5. MASTER_PASSWORD='repl_pass',
    6. MASTER_AUTO_POSITION=1;
    7. START SLAVE;

四、高可用实现机制

4.1 故障检测与切换

  1. Keepalived配置示例
    ```conf
    vrrp_script chk_mysql {
    script “/usr/local/bin/check_mysql.sh”
    interval 2
    weight -20
    fall 2
    rise 2
    }

vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass mysql123
}
virtual_ipaddress {
192.168.1.100/24
}
track_script {
chk_mysql
}
}

  1. 2. **切换脚本逻辑**:
  2. ```bash
  3. #!/bin/bash
  4. # check_mysql.sh内容
  5. if ! mysqladmin -uroot -p密码 ping &>/dev/null; then
  6. # 尝试故障转移
  7. systemctl stop mysql
  8. umount /mnt/mysql_share
  9. mount -o remount,rw /dev/mapper/mysql_vg-mysql_lv /mnt/mysql_share
  10. systemctl start mysql
  11. exit 1
  12. fi
  13. exit 0

4.2 数据一致性校验

  1. pt-table-checksum使用

    1. pt-table-checksum --replicate=checksums.checksums \
    2. --databases=mysql,test \
    3. --host=主库IP \
    4. --user=checksum_user \
    5. --password=check_pass
  2. 差异修复脚本

    1. -- 生成修复SQL
    2. SELECT CONCAT('REPLACE INTO ', tbl, ' SELECT * FROM ', tbl,
    3. ' WHERE ', CONCAT_WS(' AND ',
    4. IFNULL(CONCAT('id=', diff.id), '1=0'),
    5. IFNULL(CONCAT('name=', QUOTE(diff.name)), '1=0')))
    6. FROM checksums.checksums diff
    7. JOIN information_schema.tables t ON t.table_schema=diff.db
    8. AND t.table_name=diff.tbl
    9. WHERE diff.this_crc != diff.master_crc;

五、运维最佳实践

5.1 监控指标体系

指标类别 关键指标 告警阈值
存储性能 磁盘队列长度 >2
复制延迟 Seconds_Behind_Master >5秒
锁等待 InnoDB_row_lock_waits >3次/分钟
连接数 Threads_connected >max_connections*0.8

5.2 定期维护任务

  1. 每月执行

    1. # 存储健康检查
    2. smartctl -a /dev/sdb | grep -i realloc
    3. # 表空间整理
    4. mysqlcheck -u root -p --optimize --all-databases
  2. 季度演练

  • 模拟主库故障切换
  • 验证仲裁机制有效性
  • 检查备份恢复流程

六、常见问题解决方案

6.1 存储挂载失败处理

  1. 现象mount: wrong fs type
  2. 解决步骤
    1. # 检查多路径状态
    2. multipath -ll
    3. # 重新加载内核模块
    4. modprobe -r dm-multipath
    5. modprobe dm-multipath
    6. # 强制重新扫描LUN
    7. echo 1 > /sys/block/sdX/device/rescan

6.2 复制中断修复

  1. 错误场景ERROR 1236 (HY000): Could not find first log file name in binary log index file
  2. 修复流程
    1. -- 在主库执行
    2. SHOW MASTER STATUS;
    3. -- 在从库执行
    4. STOP SLAVE;
    5. CHANGE MASTER TO
    6. MASTER_LOG_FILE='记录的文件名',
    7. MASTER_LOG_POS=记录的位置;
    8. START SLAVE;

七、性能优化建议

  1. 存储层优化
  • 启用SSD缓存(如NetApp FlashCache)
  • 配置QoS策略限制非关键业务I/O
  • 使用精简配置(Thin Provisioning)
  1. MySQL层优化

    1. -- 调整InnoDB缓冲池
    2. SET GLOBAL innodb_buffer_pool_size=32G;
    3. -- 优化binlog写入
    4. SET GLOBAL sync_binlog=0; # 生产环境慎用,需配合硬件RAID
  2. 网络层优化

  • 启用Jumbo Frame(MTU=9000)
  • 配置TCP窗口缩放
  • 使用专用存储网络

该架构在金融行业某核心系统实施后,实现RTO<15秒、RPO=0的技术指标,存储成本降低40%,运维工作量减少65%。建议实施前进行充分的压力测试,特别是模拟存储链路中断场景下的数据完整性验证。

相关文章推荐

发表评论

活动