数字档案馆同城灾备系统高可用架构实战指南
一、架构设计与环境规划
本文档采用MySQL主从复制 + Rsync实时同步 + Keepalived双机热备的架构方案,实现数字档案馆系统的同城灾备。该方案确保在主机房发生故障时,备机房能自动接管服务,且数据零丢失或接近零丢失。
服务器规划:
- 主节点(Master): 192.168.1.10,承担读写及档案文件存储服务。
- 备节点(Backup): 192.168.1.11,实时同步数据及文件,平时处于备用状态。
- 虚拟IP(VIP): 192.168.1.100,对外提供服务的统一入口。
基础环境要求:
- 操作系统:CentOS 7.9 x64(最小化安装)。
- 软件版本:MySQL 5.7、Rsync 3.1.2、Keepalived 2.0.20。
二、基础环境初始化
在上分别执行以下操作,确保环境一致性。
1. 关闭防火墙与SELinux(生产环境建议配置防火墙规则,此处为演示方便):
```bash systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config ```2. 安装基础依赖包:
```bash yum install -y vim wget net-tools lrzsz gcc gcc-c++ make pcre pcre-devel zlib zlib-devel openssl openssl-devel libnl3-devel libnfnetlink-devel mysql-devel ```3. 时间同步(确保数据一致性):
```bash yum install -y ntp systemctl start ntpd systemctl enable ntpd ```三、核心数据灾备:MySQL主从复制
数字档案馆的元数据(如档案目录、用户权限)存储在MySQL中,需配置主从复制。
1. 安装MySQL
在两台机器上执行:
```bash wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm rpm -ivh mysql57-community-release-el7-11.noarch.rpm yum install -y mysql-server systemctl start mysqld systemctl enable mysqld ```2. 配置主节点(192.168.1.10)
编辑配置文件 /etc/my.cnf,在 [mysqld] 区域添加:
```ini [mysqld] server-id = 1 log-bin = mysql-bin binlog-format = ROW expire_logs_days = 7 max_binlog_size = 100M sync_binlog = 1 innodb_flush_log_at_trx_commit = 1 ```重启MySQL并创建复制用户:
```bash systemctl restart mysqld 获取临时密码 grep 'temporary password' /var/log/mysqld.log 登录MySQL(修改密码操作略,假设root密码已改为Root@123) mysql -uroot -pRoot@123 ```在MySQL命令行执行:
```sql CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123'; GRANT REPLICATION SLAVE ON . TO 'repl'@'%'; FLUSH PRIVILEGES; SHOW MASTER STATUS; ```记录下 File 和 Position 的值,后续配置从库时需要用到。
3. 配置备节点(192.168.1.11)
编辑配置文件 /etc/my.cnf,在 [mysqld] 区域添加:
```ini [mysqld] server-id = 2 relay-log = mysql-relay-bin read_only = 1 ```重启MySQL并配置同步:
```bash systemctl restart mysqld mysql -uroot -pRoot@123 ```在MySQL命令行执行(替换Master_Log_File和Exec_Master_Log_Pos为主库查到的值):
```sql CHANGE MASTER TO MASTER_HOST='192.168.1.10', MASTER_USER='repl', MASTER_PASSWORD='Repl@123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154; START SLAVE; SHOW SLAVE STATUS\G ```确保 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes。
四、档案文件灾备:Rsync + Inotify实时同步
数字档案馆包含大量电子文件(PDF、OFD、图片等),需使用Rsync配合Inotify实现文件级实时同步。
1. 配置主节点(Rsync服务端)
安装并配置Rsync服务:
```bash yum install -y rsync ```编辑配置文件 /etc/rsyncd.conf(创建新文件):
```ini uid = root gid = root use chroot = no max connections = 4 log file = /var/log/rsyncd.log [digital_archives] path = /data/archives comment = Digital Archives Files ignore errors = true read only = false list = false auth users = archsync secrets file = /etc/rsync.pass ```创建密码文件并赋权:
```bash echo "archsync:Rsync@123" > /etc/rsync.pass chmod 600 /etc/rsync.pass mkdir -p /data/archives systemctl start rsyncd systemctl enable rsyncd ```2. 配置备节点(Rsync客户端 + Inotify监控)

安装工具:
```bash yum install -y rsync Inotify-tools需要EPEL源 yum install -y epel-release yum install -y inotify-tools ```创建密码文件(注意只需密码):
```bash echo "Rsync@123" > /etc/rsync_client.pass chmod 600 /etc/rsync_client.pass mkdir -p /data/archives ```编写实时同步脚本 /usr/local/bin/rsync_monitor.sh:
```bash !/bin/bash src='/data/archives/' des='digital_archives' ip='192.168.1.10' user='archsync' /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f %e' -e modify,delete,create,attrib $src | while read file do /usr/bin/rsync -avz --delete --progress $src $user@$ip::$des --password-file=/etc/rsync_client.pass echo "$file was rsynced" >> /tmp/rsync.log 2>&1 done ```赋予执行权限并后台运行:
```bash chmod +x /usr/local/bin/rsync_monitor.sh nohup /usr/local/bin/rsync_monitor.sh & echo "nohup /usr/local/bin/rsync_monitor.sh &" >> /etc/rc.local chmod +x /etc/rc.local ```五、服务高可用:Keepalived双机热备
通过Keepalived管理VIP漂移,实现业务应用的无感知切换。
1. 安装Keepalived
在两台机器上执行:
```bash yum install -y keepalived ```2. 编写MySQL检测脚本
在两台机器上创建 /etc/keepalived/check_mysql.sh:
```bash !/bin/bash MYSQL_OK=0 检测MySQL服务是否存活 if /usr/bin/mysql -uroot -pRoot@123 -e "show status;" &>/dev/null then MYSQL_OK=1 else MYSQL_OK=0 fi 检测Rsync服务是否存活(主节点需要) if systemctl status rsyncd | grep "active (running)" &>/dev/null then RSYNC_OK=1 else RSYNC_OK=0 fi 如果是主节点,必须同时满足MySQL和Rsync正常 if [ $MYSQL_OK -eq 1 ] && [ $RSYNC_OK -eq 1 ]; then exit 0 else exit 1 fi ```赋予执行权限:
```bash chmod +x /etc/keepalived/check_mysql.sh ```3. 配置主节点Keepalived(192.168.1.10)
编辑 /etc/keepalived/keepalived.conf:
```ini ! Configuration File for keepalived global_defs { router_id MYSQL_MASTER_1 } vrrp_script check_mysql { script "/etc/keepalived/check_mysql.sh" interval 2 weight -20 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER interface ens33 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.100 } track_script { check_mysql } } ```注意: interface ens33 需根据实际网卡名称修改(使用 ip a 查看)。
4. 配置备节点Keepalived(192.168.1.11)
编辑 /etc/keepalived/keepalived.conf:
```ini ! Configuration File for keepalived global_defs { router_id MYSQL_BACKUP_1 } vrrp_script check_mysql { script "/etc/keepalived/check_mysql.sh" interval 2 weight -20 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.1.100 } track_script { check_mysql } } ```5. 启动服务
在两台机器上执行:
```bash systemctl start keepalived systemctl enable keepalived ```检查主节点IP,应包含 192.168.1.100:
```bash ip addr show ens33 ```六、灾备切换演练与验证
完成配置后,必须进行破坏性测试,确保灾备方案有效。
1. 模拟主节点故障
在主节点(192.168.1.10)上停止MySQL服务:
```bash systemctl stop mysqld ```2. 观察VIP漂移
在备节点(192.168.1.11)执行 ip addr show ens33。
预期结果:192.168.1.100 已漂移至备节点网卡上。
3. 验证业务连通性
在客户端尝试连接VIP:
```bash mysql -h 192.168.1.100 -uroot -pRoot@123 -e "SELECT @@hostname;" ```预期结果:能够成功登录,且显示的hostname为备节点的名称。
4. 验证数据一致性
在备节点插入测试数据,然后恢复主节点MySQL服务,观察主库是否同步了备库在切换期间产生的新数据(注意:主从切换通常涉及手动提升备库为新主库,上述自动切换主要解决高可用,若主库彻底损坏需重新搭建主从)。
恢复主节点:
```bash systemctl start mysqld ```此时由于优先级不同,VIP会自动漂移回主节点(除非配置了非抢占模式 nopreempt)。