档案软件两地三中心高可用架构实战部署指南
架构拓扑与环境规划
在档案管理系统中,数据的完整性与业务的连续性至关重要。本文将基于 Linux 系统,使用 MySQL(数据库)、Rsync(文件同步)和 Keepalived(VIP 漂移)构建一套标准的“两地三中心”高可用架构。
服务器规划:
- 生产中心(主节点 A): 192.168.1.10(负责读写,承载主业务流量)
- 同城灾备中心(从节点 B): 192.168.1.20(实时同步,提供热备)
- 异地灾备中心(从节点 C): 192.168.2.10(异步同步,防止城市级灾难)
- 虚拟浮动IP(VIP): 192.168.1.100(对外提供服务的统一入口)
核心同步逻辑:
数据流向为 A(主) -> B(从/中继) -> C(从)。档案文件通过 Rsync 从 A 实时推送到 B,B 定时推送到 C。
基础环境初始化
在所有三台服务器上执行以下基础环境配置,确保环境一致性。
1. 安装基础工具包:
执行以下命令安装必要的网络和编译工具:
```bash yum install -y net-tools vim gcc make wget lrzsz psmisc ```2. 配置主机名与 hosts 解析:
分别在 A、B、C 三台机器上执行主机名设置,并配置 hosts 文件以便互相识别。
```bash 在节点 A 执行 hostnamectl set-hostname archive-master echo "192.168.1.10 archive-master" >> /etc/hosts echo "192.168.1.20 archive-slave-local" >> /etc/hosts echo "192.168.2.10 archive-slave-remote" >> /etc/hosts 在节点 B 执行 hostnamectl set-hostname archive-slave-local echo "192.168.1.10 archive-master" >> /etc/hosts echo "192.168.1.20 archive-slave-local" >> /etc/hosts echo "192.168.2.10 archive-slave-remote" >> /etc/hosts 在节点 C 执行 hostnamectl set-hostname archive-slave-remote echo "192.168.1.10 archive-master" >> /etc/hosts echo "192.168.1.20 archive-slave-local" >> /etc/hosts echo "192.168.2.10 archive-slave-remote" >> /etc/hosts ```3. 关闭防火墙与 SELinux:
为了简化实操步骤,避免端口拦截导致同步失败,暂时关闭防火墙。
```bash systemctl stop firewalld systemctl disable firewalld setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config ```数据库级联同步实战
档案软件的核心数据存储在 MySQL 中。我们将配置 MySQL 的主从复制,形成 A -> B -> C 的级联同步架构。
1. 安装 MySQL 8.0
在所有节点执行以下命令安装 MySQL 仓库及服务:
```bash yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm yum install -y mysql-server systemctl start mysqld systemctl enable mysqld ```获取初始 root 密码:
```bash grep 'temporary password' /var/log/mysqld.log ```修改 root 密码为 Admin@123(所有节点执行相同操作):
```bash mysql -uroot -p'初始密码' -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'Admin@123'; flush privileges;" ```2. 配置主节点 A (Master)
编辑节点 A 的 /etc/my.cnf 文件,在 [mysqld] 下添加如下配置:
```ini server-id=1 log-bin=mysql-bin binlog_format=ROW gtid_mode=ON enforce_gtid_consistency=ON ```重启 MySQL 并创建用于同步的账户:
```bash systemctl restart mysqld mysql -uroot -p'Admin@123' -e "CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123'; GRANT REPLICATION SLAVE ON . TO 'repl'@'%'; FLUSH PRIVILEGES;" ```3. 配置从节点 B (Slave/Relay)
编辑节点 B 的 /etc/my.cnf 文件。节点 B 既是 A 的从库,也是 C 的主库,因此需要开启二进制日志。
```ini server-id=2 log-bin=mysql-bin binlog_format=ROW gtid_mode=ON enforce_gtid_consistency=ON read_only=ON super_read_only=ON log_slave_updates=ON ```重启 MySQL 并配置同步指向节点 A:
```bash systemctl restart mysqld mysql -uroot -p'Admin@123' <4. 配置从节点 C (Remote Slave)
编辑节点 C 的 /etc/my.cnf 文件。节点 C 仅作为只读节点。
```ini server-id=3 gtid_mode=ON enforce_gtid_consistency=ON read_only=ON super_read_only=ON ```重启 MySQL 并配置同步指向节点 B(注意:异地中心通常同步到同城中心,以减轻主库压力):
```bash systemctl restart mysqld mysql -uroot -p'Admin@123' <档案软件包含大量非结构化文件(PDF、图片等)。使用 Rsync + Inotify 实现生产中心到同城中心的实时文件同步。
1. 安装同步工具
在节点 A 和 B 上安装 rsync 和 inotify-tools:
```bash yum install -y rsync inotify-tools ```2. 配置节点 B (接收端)

编辑节点 B 的 /etc/rsyncd.conf,配置接收档案文件的模块:
```ini uid = root gid = root use chroot = no max connections = 4 log file = /var/log/rsyncd.log [archive_data] path = /data/archive/files comment = Archive Files Storage ignore errors = true read only = false list = false auth users = rsync_user secrets file = /etc/rsync.pass ```创建密码文件并赋权(注意:密码文件权限必须为 600):
```bash echo "rsync_user:Rsync@123" > /etc/rsync.pass chmod 600 /etc/rsync.pass mkdir -p /data/archive/files ```启动 rsync 守护进程:
```bash rsync --daemon --config=/etc/rsyncd.conf echo "/usr/bin/rsync --daemon --config=/etc/rsyncd.conf" >> /etc/rc.local chmod +x /etc/rc.local ```3. 配置节点 A (发送端)
创建本地密码文件(只需密码,无需用户名):
```bash echo "Rsync@123" > /etc/rsync_client.pass chmod 600 /etc/rsync_client.pass mkdir -p /data/archive/files ```编写实时同步脚本 /usr/local/bin/sync_archive.sh:
```bash !/bin/bash src=/data/archive/files/ des=archive_data ip="192.168.1.20" user=rsync_user /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,create,delete,move $src | while read file do rsync -avzP --delete --password-file=/etc/rsync_client.pass $src $user@$ip::$des echo "$file was synced" >> /tmp/rsync.log 2>&1 done ```赋予执行权限并后台启动:
```bash chmod +x /usr/local/bin/sync_archive.sh nohup /usr/local/bin/sync_archive.sh & ```应用入口高可用配置
在节点 A 和 B 上安装 Keepalived,通过 VIP 漂移实现应用层的高可用。当节点 A 宕机时,VIP 自动漂移到节点 B。
1. 安装 Keepalived
在节点 A 和 B 上执行:
```bash yum install -y keepalived ```2. 配置节点 A (MASTER)
编辑 /etc/keepalived/keepalived.conf:
```ini ! Configuration File for keepalived global_defs { router_id LVS_MASTER } vrrp_script chk_http_port { script "/usr/local/bin/check_app.sh" interval 2 weight -20 } vrrp_instance VI_1 { state MASTER interface ens33 请根据实际网卡名称修改,使用 ip a 查看 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port } virtual_ipaddress { 192.168.1.100 } } ```3. 配置节点 B (BACKUP)
编辑 /etc/keepalived/keepalived.conf:
```ini ! Configuration File for keepalived global_defs { router_id LVS_BACKUP } vrrp_script chk_http_port { script "/usr/local/bin/check_app.sh" interval 2 weight -20 } vrrp_instance VI_1 { state BACKUP interface ens33 virtual_router_id 51 priority 90 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_http_port } virtual_ipaddress { 192.168.1.100 } } ```4. 健康检查脚本
在节点 A 和 B 上创建应用检测脚本 /usr/local/bin/check_app.sh。此处假设档案软件服务端口为 8080。
```bash !/bin/bash A=`ps -C java --no-header | wc -l` if [ $A -eq 0 ]; then 尝试重启应用(可选) systemctl restart archive-app exit 1 else exit 0 fi ```赋予执行权限并启动 Keepalived:
```bash chmod +x /usr/local/bin/check_app.sh systemctl start keepalived systemctl enable keepalived ```故障切换验证
完成所有配置后,必须进行破坏性测试以确保架构有效。
1. 验证 VIP 存在:
在节点 A 上执行 ip addr,应该能看到 192.168.1.100 绑定在网卡上。
2. 模拟主节点宕机:
在节点 A 上执行以下命令停止 Keepalived 模拟故障:
```bash systemctl stop keepalived ```3. 观察 VIP 漂移:
迅速在节点 B 上执行 ip addr,确认 192.168.1.100 是否已漂移至此节点。
4. 验证数据同步:
在节点 A 的 /data/archive/files/ 目录下创建一个测试文件 test.txt。等待 1-2 秒后,检查节点 B 的对应目录是否存在该文件。
5. 验证数据库同步:
在节点 A 创建测试数据库:
```bash mysql -uroot -p'Admin@123' -e "CREATE DATABASE test_archive_db;" ```在节点 B 和 C 上查询:
```bash mysql -uroot -p'Admin@123' -e "SHOW DATABASES LIKE 'test_archive_db';" ```