二、高可用架构(Nginx + Keepalived + MySQL 主从)

接着阶段一
客户端 → VIP(192.168.200.100) → [web1/nginx+php-fpm+keepalived 192.168.200.30]

↘ [web2/nginx+php-fpm+keepalived 192.168.200.31]

WordPress 代码在两台 web 同步(rsync)

MySQL 主库:db1 192.168.200.30

MySQL 从库:db2 192.168.200.31

因为之前已经有一台web1了,现在只需要加一台(能省则省)

配置一台与web1相同配置的机器

一、Nginx + Keepalived 高可用(web1 与 web2)

web1:192.168.200.30(主),web2:192.168.200.31(备)

bash 复制代码
yum install -y nginx keepalived rsync inotify-tools
systemctl enable nginx keepalived

web1(作为代码主)创建一个 rsync 推送脚本:

bash 复制代码
cat >/usr/local/bin/wp-sync.sh <<'EOF'
#!/usr/bin/env bash
SRC="/usr/share/nginx/html/wordpress/"
DST="192.168.200.31:/usr/share/nginx/html/wordpress/"
rsync -az --delete "$SRC" "$DST"
EOF


chmod +x /usr/local/bin/wp-sync.sh
/usr/local/bin/wp-sync.sh

##方便一些

##设置定时
echo '*/2 * * * * root /usr/local/bin/wp-sync.sh >/var/log/wp-sync.log 2>&1' >/etc/cron.d/wp-sync
systemctl restart crond

使用 rsync 进行同步,参数解释:

  • -a:归档模式,保持文件权限、符号链接等属性

  • -z:传输时压缩,提高传输效率

  • --delete:删除目标目录中在源目录已经不存在的文件,保证两边目录完全一致

  • "$SRC" "$DST":从源目录复制到目标目录

二、 Keepalived 配置(VRRP心跳 + Nginx健康检查)

就是写一个脚本,结合keepalived使用

bash 复制代码
vim /etc/keepalived/check_nginx.sh
bash 复制代码
#!/bin/bash
curl -s --head http://127.0.0.1:80/ | grep "200 OK" >/dev/null 2>&1
if [ $? -eq 0 ]; then
    exit 0
else
    exit 1
fi
bash 复制代码
chmod +x /etc/keepalived/check_nginx.sh

1、web1(MASTER)

bash 复制代码
cat >/etc/keepalived/keepalived.conf <<EOF
vrrp_script chk_http {
    script "/etc/keepalived/check_nginx.sh"   #脚本
    interval 2
    timeout 2
    fall 2
    rise 2
    weight -20   #权重priority 150 减去20要比wbe2的小才行
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33                     # 改成你的网卡名
    virtual_router_id 51
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    } 
    unicast_src_ip 192.168.200.30      ##单点单播
    unicast_peer {
        192.168.200.31
    }
    track_script {
        chk_http
    }
    virtual_ipaddress {
        192.168.200.100/24 dev ens33 label ens33:1    #看看自己网卡名
    }

}
EOF




systemctl restart keepalived

2、web2(BACKUP)

bash 复制代码
cat >/etc/keepalived/keepalived.conf <<EOF
vrrp_script chk_http {
    script "/etc/keepalived/check_nginx.sh"
    interval 2
    timeout 2
    fall 2
    rise 2
    weight -20
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 140
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    unicast_src_ip 192.168.200.31
    unicast_peer {
        192.168.200.30
    }
    track_script {
        chk_http
    }
    virtual_ipaddress {
        192.168.200.100/24 dev ens33 label ens33:1
    }
}
EOF


systemctl restart keepalived

3、验证

bash 复制代码
ip addr

在 web1 上停止 nginx

bash 复制代码
systemctl stop nginx

VIP 自动漂移到 web2,再次访问 VIP 能否正常

三、MySQL 主从复制(GTID)

1. 主库配置(db1)wbe1

vim /etc/my.cnf

sql 复制代码
[mysqld]
server-id=1
log_bin=mysql-bin
binlog_format=ROW
gtid_mode=ON
enforce_gtid_consistency=ON
log_slave_updates=ON
# 建议
innodb_flush_log_at_trx_commit=1
sync_binlog=1
sql 复制代码
systemctl restart mysqld

创建复制账号

sql 复制代码
mysql -uroot -p

CREATE USER 'repl'@'192.168.200.%' IDENTIFIED BY 'Repl@123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.200.%';
FLUSH PRIVILEGES;

2. 初始化从库数据(在主库 db1(web1) 上执行备份)

bash 复制代码
mysqldump -uroot -p --single-transaction --routines --triggers --events --hex-blob --master-data=2 --databases wordpress > /tmp/wp.sql



scp /tmp/wp.sql 192.168.200.31:/tmp/



##会有警告,但没什么问题,关于gtid的
  • 你的 MySQL 启用了 GTID (全局事务ID)

  • 当前导出的数据库是 部分数据库(wordpress)

  • 默认情况下,导出的 SQL 文件会包含这些 GTID 信息

  • 如果你以后导入,可能会引入 GTID 相关事务冲突

补充:

bash 复制代码
##去掉 GTID 信息,加
--set-gtid-purged=OFF

##例如:

mysqldump -uroot -p \
  --single-transaction --routines --triggers --events --hex-blob \
  --set-gtid-purged=OFF \
  --databases wordpress > /tmp/wp.sql

3. 从库配置与导入(db2)web2

vim /etc/my.cnf

bash 复制代码
[mysqld]
server-id=2
relay_log=relay-log
read_only=ON
gtid_mode=ON
enforce_gtid_consistency=ON
  • server-id=2 表示这台数据库的 ID 是 2(主从复制要求每台 MySQL 有唯一的 ID,主库一般是 1,从库是 2、3...)。

  • relay_log=relay-log 指定从库存放中继日志文件的前缀,从库会把主库传过来的 binlog 先写到 relay log,再应用到本地数据库。

  • read_only=ON 把从库设置成只读模式,防止业务误写,从而保证主从一致性(不过 root 等超级用户和复制线程还是能写)。

  • **gtid_mode=ON**开启 GTID(全局事务 ID)复制模式,让每个事务有唯一 ID,这样主从切换或恢复时不需要人工去找 binlog 文件和位置,复制更可靠。

  • enforce_gtid_consistency=ON 强制所有事务都必须兼容 GTID,不支持 GTID 的语句直接报错,以保证复制的安全性。

重启:

bash 复制代码
systemctl restart mysqld

导入数据:

bash 复制代码
mysql -uroot -p < /tmp/wp.sql

建立复制(GTID自动定位):

bash 复制代码
mysql -uroot -p

CHANGE MASTER TO
  MASTER_HOST='192.168.200.30',
  MASTER_USER='repl',
  MASTER_PASSWORD='Repl@123456',
  MASTER_AUTO_POSITION=1;

START SLAVE;
SHOW SLAVE STATUS\G

确认 Slave_IO_Running: YesSlave_SQL_Running: Yes 且无错误。

###接下来阶段3:监控与告警