插件窝 干货文章 如何在Linux上设置高可用的数据库集群备份

如何在Linux上设置高可用的数据库集群备份

备份 backup Replication Cluster 630    来源:    2025-04-15

Linux上设置高可用的数据库集群备份方案

方案概述

在Linux环境下设置高可用数据库集群备份需要考虑数据库类型、集群架构和备份策略。以下是针对主流数据库的高可用备份方案。

一、MySQL高可用备份方案

1. 基于Galera Cluster的解决方案

架构组件: - Galera Cluster (Percona XtraDB Cluster/MariaDB Galera Cluster) - HAProxy/ProxySQL用于负载均衡 - 备份节点

实施步骤:

  1. 安装Galera Cluster:

    # Percona XtraDB Cluster示例
    sudo apt-get install percona-xtradb-cluster-57
    
  2. 配置集群节点(/etc/mysql/my.cnf):

    [mysqld]
    wsrep_provider=/usr/lib/galera3/libgalera_smm.so
    wsrep_cluster_name=my_galera_cluster
    wsrep_cluster_address=gcomm://node1_ip,node2_ip,node3_ip
    wsrep_node_name=node1
    wsrep_node_address=node1_ip
    binlog_format=ROW
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    
  3. 设置备份策略:

    • 使用Percona XtraBackup进行热备份
    # 安装XtraBackup
    sudo apt-get install percona-xtrabackup-24
    
    # 完整备份
    innobackupex --user=backup_user --password=password /backup/mysql/
    
  4. 自动化备份脚本(结合cron):

    #!/bin/bash
    DATE=$(date +%Y%m%d_%H%M%S)
    BACKUP_DIR="/backup/mysql/$DATE"
    LOG_FILE="/var/log/mysql_backup.log"
    
    innobackupex --user=backup_user --password=password --no-timestamp $BACKUP_DIR >> $LOG_FILE 2>&1
    innobackupex --apply-log $BACKUP_DIR >> $LOG_FILE 2>&1
    
    # 保留最近7天备份
    find /backup/mysql/ -type d -mtime +7 -exec rm -rf {} \;
    

2. 基于MySQL Group Replication的解决方案

优势: - 原生MySQL解决方案 - 支持多主模式

配置要点:

[mysqld]
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
binlog_checksum=NONE
log_bin=binlog
log_slave_updates=ON
binlog_format=ROW
master_info_repository=TABLE
relay_log_info_repository=TABLE
transaction_write_set_extraction=XXHASH64
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address= "node1:33061"
group_replication_group_seeds= "node1:33061,node2:33061,node3:33061"
group_replication_bootstrap_group=off

二、PostgreSQL高可用备份方案

1. 基于Patroni + PostgreSQL + etcd的方案

架构组件: - PostgreSQL主从复制 - Patroni用于自动故障转移 - etcd用于集群协调 - pgBackRest/WAL-E用于备份

实施步骤:

  1. 安装必要组件:

    # Ubuntu示例
    sudo apt-get install postgresql-12 patroni python3-etcd
    
  2. 配置Patroni(/etc/patroni.yml):

    scope: postgres_cluster
    namespace: /service/
    name: node1
    
    restapi:
     listen: 0.0.0.0:8008
     connect_address: 192.168.1.101:8008
    
    etcd:
     hosts: ["192.168.1.101:2379","192.168.1.102:2379","192.168.1.103:2379"]
    
    bootstrap:
     dcs:
       ttl: 30
       loop_wait: 10
       retry_timeout: 10
       maximum_lag_on_failover: 1048576
       postgresql:
         use_pg_rewind: true
         parameters:
           wal_level: replica
           hot_standby: "on"
           wal_keep_segments: 8
           max_wal_senders: 5
           max_replication_slots: 5
    
    postgresql:
     listen: 0.0.0.0:5432
     connect_address: 192.168.1.101:5432
     data_dir: /var/lib/postgresql/12/main
     bin_dir: /usr/lib/postgresql/12/bin
     pgpass: /tmp/pgpass
     authentication:
       replication:
         username: replicator
         password: securepassword
       superuser:
         username: postgres
         password: securepassword
     create_replica_methods:
       - basebackup
     basebackup:
       max-rate: 100M
    
  3. 设置pgBackRest备份:

    # /etc/pgbackrest.conf
    [global]
    repo1-path=/var/lib/pgbackrest
    repo1-retention-full=2
    log-level-console=info
    
    [db-primary]
    pg1-path=/var/lib/postgresql/12/main
    
  4. 备份命令:

    # 完整备份
    pgbackrest --stanza=db-primary --log-level-console=info backup
    
    # 增量备份
    pgbackrest --stanza=db-primary --type=incr backup
    

三、MongoDB高可用备份方案

1. 基于Replica Set + Ops Manager

架构组件: - MongoDB Replica Set (3节点最小配置) - Ops Manager用于备份管理(可选) - mongodump/mongorestore

实施步骤:

  1. 配置Replica Set:

    // 在每个节点的mongod.conf中
    replication:
     replSetName: "rs0"
     oplogSizeMB: 1024
    
  2. 初始化Replica Set:

    rs.initiate({
     _id: "rs0",
     members: [
       { _id: 0, host: "mongo1:27017" },
       { _id: 1, host: "mongo2:27017" },
       { _id: 2, host: "mongo3:27017", arbiterOnly: true }
     ]
    })
    
  3. 设置备份策略:

    • 使用mongodump进行逻辑备份
    # 完整备份
    mongodump --host rs0/mongo1:27017,mongo2:27017 --out /backup/mongodb/full --oplog
    
    # 增量备份(基于oplog)
    mongodump --host rs0/mongo1:27017 --out /backup/mongodb/incr --oplog
    
  4. 使用文件系统快照(如LVM):

    # 创建快照
    lvcreate --size 1G --snapshot --name mongo-snap /dev/vg00/mongo-lv
    
    # 挂载快照并备份
    mount /dev/vg00/mongo-snap /mnt/snapshot
    rsync -a /mnt/snapshot/ /backup/mongodb/snapshot/
    umount /mnt/snapshot
    lvremove -f /dev/vg00/mongo-snap
    

四、通用备份最佳实践

  1. 3-2-1备份规则:

    • 3份数据拷贝
    • 2种不同介质
    • 1份异地备份
  2. 监控与验证:

    • 实现备份完整性检查
    • 定期测试恢复流程
    • 监控备份作业状态
  3. 加密与安全:

    # 使用GPG加密备份
    gpg --output backup.sql.gpg --encrypt --recipient backup@example.com backup.sql
    
  4. 自动化与调度:

    # 示例cron作业
    0 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
    
  5. 跨区域备份:

    # 使用rsync同步到远程服务器
    rsync -avz -e "ssh -p 2222" /backup/mysql/ user@remote-server:/remote/backup/
    

五、灾难恢复计划

  1. 恢复流程文档化
  2. 定期恢复演练
  3. 关键指标定义:
    • RTO (恢复时间目标)
    • RPO (恢复点目标)

通过以上方案,您可以在Linux环境下建立高可用的数据库集群备份系统,确保业务连续性和数据安全。