温馨提示×

如何在Ubuntu上实现MariaDB高可用性

小樊
37
2025-12-26 10:52:21
栏目: 云计算

在 Ubuntu 上实现 MariaDB 高可用的三种主流方案


方案一 主从复制配合 Keepalived VIP 切换

  • 适用场景:读多写少、可接受异步复制的主从架构,通过 Keepalived 提供 VIP 自动漂移,应用侧无需改造连接地址。
  • 核心思路:两台 MariaDB 配置为互为主从(双主),Keepalived 监控本机 3306 并在主机故障时将 VIP 漂移到备机。
  • 关键配置与步骤(两台均执行基础安装与加固):
    1. 安装 MariaDB:sudo apt-get install mariadb-server -y
    2. 修改配置(/etc/mysql/mariadb.conf.d/50-server.cnf):
      • bind-address = 0.0.0.0
      • server-id = 1/2(两台不同)
      • log_bin = /var/log/mysql/mysql-bin.log
      • expire_logs_days = 10
    3. 创建复制用户并授权(主从互建):
      • CREATE USER ‘replicator’@‘%’ IDENTIFIED BY ‘YourPass’;
      • GRANT REPLICATION SLAVE ON . TO ‘replicator’@‘%’; FLUSH PRIVILEGES;
    4. 初始化复制(在从库执行,使用 SHOW MASTER STATUS 的 File/Position):
      • CHANGE MASTER TO MASTER_HOST=‘对端IP’, MASTER_USER=‘replicator’, MASTER_PASSWORD=‘YourPass’, MASTER_LOG_FILE=‘…’, MASTER_LOG_POS=…;
      • START SLAVE;
      • 验证:SHOW SLAVE STATUS\G 中 Slave_IO_Running/Slave_SQL_Running 均为 Yes
    5. 安装与配置 Keepalived(两台):
      • 监控脚本示例(/usr/local/bin/check_mysql.sh):
        #!/usr/bin/env bash
        mysqladmin --connect-timeout=3 ping &>/dev/null || exit 1
      • keepalived.conf 关键片段:
        vrrp_script chk_mysql { script “/usr/local/bin/check_mysql.sh” interval 2 fall 2 rise 2 }
        vrrp_instance VI_1 {
        state MASTER/BACKUP; interface eth0; virtual_router_id 51; priority 100/90;
        advert_int 1; unicast_src_ip 本机IP; unicast_peer { 对端IP }
        virtual_ipaddress { 192.168.1.100/24 }
        track_script { chk_mysql }
        }
    6. 测试:停止主库或关闭 3306,观察 VIP 漂移与业务恢复。
  • 优点:部署简单、成本低;缺点:异步复制存在数据延迟/丢失风险,需应用容忍或配合半同步。

方案二 MariaDB Galera Cluster 多主同步

  • 适用场景:需要多主写入、强一致(最终一致)、自动节点故障切换的 3+ 节点集群。
  • 核心思路:基于 Galera 的同步多主复制,任意节点可读写,节点加入/退出自动同步。
  • 关键配置与步骤(所有节点):
    1. 安装 MariaDB(建议 10.1+):sudo apt-get install mariadb-server mariadb-client -y
    2. 编辑 /etc/mysql/mariadb.conf.d/50-server.cnf([mysqld] 段):
      • bind-address = 0.0.0.0
      • server-id = 唯一ID
      • wsrep_on = ON
      • wsrep_provider = /usr/lib/galera/libgalera_smm.so
      • wsrep_cluster_address = gcomm://IP1,IP2,IP3
      • wsrep_node_address = 本机IP;wsrep_node_name = 本机名
      • wsrep_sst_method = xtrabackup-v2(需提前创建 SST 账号)
      • binlog_format = ROW;default_storage_engine = InnoDB
      • innodb_autoinc_lock_mode = 2
    3. 创建 SST 用户(任一节点执行一次即可):
      • CREATE USER ‘sst_user’@‘%’ IDENTIFIED BY ‘SSTPass’;
      • GRANT ALL PRIVILEGES ON . TO ‘sst_user’@‘%’; FLUSH PRIVILEGES;
    4. 初始化集群:在第一个节点执行(仅首次)
      • sudo mysql -u root -p -e “SET GLOBAL wsrep_cluster_address=‘gcomm://’;”
      • sudo systemctl start mariadb
    5. 加入其他节点:
      • 确保 wsrep_cluster_address 指向完整节点列表;
      • sudo systemctl start mariadb
    6. 验证:
      • SHOW STATUS LIKE ‘wsrep_ready’;(应为 ON
      • SHOW STATUS LIKE ‘wsrep_cluster_size’;(应等于节点数)
      • 在任一节点建库/表,其他节点立即可见。
  • 端口要求:开放 3306(MySQL)、4567(Galera 通信)、4568(IST)、4444(SST)。
  • 优点:多主、强一致、自动故障切换;缺点:写放大、对网络质量敏感、需奇数节点或仲裁。

方案三 Heartbeat + DRBD 共享存储主备

  • 适用场景:已有或可接受共享块存储主备 架构,追求接近零数据丢失的切换。
  • 核心思路:DRBD 将块设备实时镜像到备机,Heartbeat 管理 VIP 与 MariaDB 资源的启停与切换。
  • 关键配置与步骤(两台):
    1. 准备:两块服务器各新增一块磁盘(如 /dev/sdb),配置 /etc/hosts 主机名解析。
    2. 安装组件:sudo apt-get install drbd8-utils heartbeat -y
    3. 配置 DRBD(/etc/drbd.d/r0.res):
      • resource r0 { protocol C; device /dev/drbd0; disk /dev/sdb1;
        on node1 { address IP1:7789; meta-disk internal; }
        on node2 { address IP2:7789; meta-disk internal; }
        syncer { rate 100M; } net { cram-hmac-alg sha1; shared-secret “YourSecret”; } }
    4. 初始化并提升主节点:
      • drbdadm create-md r0;systemctl restart drbd
      • 在主机:drbdadm primary r0;mkfs.ext4 /dev/drbd0;mkdir -p /var/lib/mysql
    5. 配置 Heartbeat(/etc/ha.d/ha.cf、/etc/ha.d/haresources、/etc/ha.d/authkeys):
      • haresources 示例:
        node1 192.168.1.100/24 drbddisk::r0 Filesystem::/dev/drbd0::/var/lib/mysql::ext4::noatime mysql
      • authkeys 设置共享密钥;ha.cf 配置心跳接口与节点。
    6. 验证:
      • cat /proc/drbd 应见 Primary/Secondary 与同步进度;
      • ip addr 应仅在主机看到 VIP
      • 停止主机 heartbeat,备机应自动接管 VIP 并挂载 DRBD、启动 MariaDB。
  • 优点:数据一致性高、切换可控;缺点:架构复杂、对共享存储依赖强、扩容不便。

方案对比与选型建议

方案 写入模式 故障切换 一致性 最少节点 端口/依赖 典型场景
主从 + Keepalived 主写从读(可双主) VIP 漂移 最终一致 2 3306 + Keepalived 读多写少、成本敏感
Galera Cluster 多主 自动 强一致(最终一致) 3(建议奇数) 3306/4567/4568/4444 高并发、多主写入
Heartbeat + DRBD 主写备读 自动 接近零丢失 2 DRBD 7789 + Heartbeat 强一致、传统主备
  • 选型要点:
    • 追求多主写入与自动容错,选 Galera
    • 成本与易用为先,且能接受异步,选 主从 + Keepalived
    • 已有SAN/DRBD 等共享存储,且要求最小数据丢失,选 Heartbeat + DRBD

通用部署与运维要点

  • 基础加固:
    • 仅开放必要端口(如 3306/4567/4568/4444);
    • 使用强口令与最小权限账户;执行 mysql_secure_installation;
    • 开启错误日志与慢查询日志,配置合理的备份策略(物理/逻辑)。
  • 复制/集群健康检查:
    • 主从:SHOW SLAVE STATUS\G 检查 Slave_IO_Running/Slave_SQL_Running=Yes
    • Galera:SHOW STATUS LIKE ‘wsrep_ready’; 与 wsrep_cluster_size
    • Keepalived:定期自检脚本与 VRRP 状态;
    • DRBD:cat /proc/drbd 与同步进度。
  • 切换演练:定期在测试环境模拟主库宕机、网络分区、磁盘故障,验证 VIP 漂移、数据一致性与恢复时间。
  • 监控告警:对复制延迟、连接数、线程、磁盘 IO、VIP 绑定状态等关键指标设置阈值告警。

0