温馨提示×

MySQL在Linux上如何配置高可用架构

小樊
40
2025-12-20 01:01:09
栏目: 云计算

在 Linux 上搭建 MySQL 高可用架构的可落地方案


一、方案选型与适用场景

  • 一主多从 + 读写分离 + VIP/HAProxy/Keepalived

    • 特点:实现读写分离读扩展,主库宕机需手动/半自动切换;配置简单、成本低。
    • 适用:大多数业务的标准高可用入门与稳态方案。
  • 双主互备(Active/Standby)+ Keepalived

    • 特点:两台互为主从,同一时刻仅一台可写,配合 VIP 与脚本实现自动故障转移;写冲突需业务侧规避。
    • 适用:写高可用要求较高、可接受“单主写入”约束的场景。
  • 双主双从(或一主多从扩展)

    • 特点:在双主基础上增加只读从库,既提升读能力又保留切换能力。
    • 适用:读写都高、希望有更多读副本的业务。
  • 同步多主(Galera Cluster / MySQL Cluster)

    • 特点:多主可写、强一致(Galera),或官方 NDB 集群(内存型、复杂度高);对网络与时延敏感。
    • 适用:强一致与高并发写入、对运维复杂度有准备的场景。

二、快速落地 主从复制 + Keepalived 高可用

  • 架构要点

    • 主库开启 binlog,从库通过 IO/SQL 线程回放;应用写主读从;对外通过 VIPHAProxy 访问,故障时切换 VIP/后端。
  • 主库配置(示例)

    • my.cnf
      [mysqld]
      server-id = 1
      log_bin = /var/log/mysql/mysql-bin.log
      binlog_do_db = your_db   # 可选:仅复制指定库
      
    • 创建复制用户并获取位点
      CREATE USER 'repl'@'%' IDENTIFIED BY 'StrongPass!';
      GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
      FLUSH PRIVILEGES;
      FLUSH TABLES WITH READ LOCK;
      SHOW MASTER STATUS;   -- 记录 File 与 Position
      UNLOCK TABLES;
      
    • 重启 MySQL 使配置生效。
  • 从库配置(示例)

    • my.cnf
      [mysqld]
      server-id = 2
      relay_log = /var/log/mysql/mysql-relay-bin.log
      log_bin = /var/log/mysql/mysql-bin.log   # 便于级联复制
      read_only = 1
      
    • 建立复制
      CHANGE MASTER TO
        MASTER_HOST='master_ip',
        MASTER_USER='repl',
        MASTER_PASSWORD='StrongPass!',
        MASTER_LOG_FILE='mysql-bin.000001',   -- 替换为 SHOW MASTER STATUS 的 File
        MASTER_LOG_POS=123;                  -- 替换为 Position
      START SLAVE;
      
    • 检查状态
      SHOW SLAVE STATUS\G
      -- 确保 Slave_IO_Running=Yes、Slave_SQL_Running=Yes
      
    • 提示:主从库时间需同步(如 chrony/ntpd),避免复制异常。
  • 高可用接入(VIP 示例)

    • 两台数据库主机部署 Keepalived,配置同一 VIP;健康检查脚本探测本地 MySQL(如 SELECT 1),失败则降低本机优先级,实现自动漂移;应用连接 VIP 即可。

三、进阶 双主互备 + Keepalived 自动切换

  • 适用前提

    • 同一时刻仅一台可写,避免自增主键冲突与写冲突;双主用于故障切换而非同时写入。
  • MySQL 关键配置(双主)

    • 两端开启 GTID(便于切换与恢复)
      [mysqld]
      gtid_mode = ON
      enforce_gtid_consistency = TRUE
      log-bin = /binlog/bin
      binlog_format = ROW
      sync_binlog = 1
      log-slave-updates = 1
      
    • 自增主键防冲突
      auto_increment_increment = 2
      auto_increment_offset   = 1   # 另一台设为 2
      
    • 说明:双主两端 server-id 必须唯一;建议配合半同步复制提升切换时数据安全性。
  • Keepalived 要点

    • 配置 VRRP 实例与 VIP,权重/优先级策略保证主机宕机或 MySQL 异常时VIP 漂移到备机;健康检查建议调用 mysqladmin ping 或执行轻量 SQL。

四、一致性、切换与运维要点

  • 复制一致性

    • 优先使用 ROW 格式;开启 gtid_mode=ONenforce_gtid_consistency;对关键库表开启半同步降低数据丢失风险;从库设置 read_only=1 防止误写。
  • 切换与脑裂防护

    • 定义清晰的主写规则切换流程;使用 VIPHAProxy 健康检查联动;通过 防火墙/ACL 限制旧主在故障恢复后误写;必要时引入 MHA/Orchestrator 做主库自动切换与数据一致性校验。
  • 监控与备份

    • 监控复制延迟(Seconds_Behind_Master)、连接数、错误日志;定期做全量+增量备份(如 xtrabackup),并演练恢复流程;对大表与热点数据评估分库分表缓存策略。

0