二、高可用架构(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
(备)yum install -y nginx keepalived rsync inotify-tools systemctl enable nginx keepalived
在 web1(作为代码主)创建一个 rsync 推送脚本:
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" EOFchmod +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使用
vim /etc/keepalived/check_nginx.sh
#!/bin/bash curl -s --head http://127.0.0.1:80/ | grep "200 OK" >/dev/null 2>&1 if [ $? -eq 0 ]; thenexit 0 elseexit 1 fi
chmod +x /etc/keepalived/check_nginx.sh
1、web1(MASTER)
cat >/etc/keepalived/keepalived.conf <<EOF vrrp_script chk_http {script "/etc/keepalived/check_nginx.sh" #脚本interval 2timeout 2fall 2rise 2weight -20 #权重priority 150 减去20要比wbe2的小才行 }vrrp_instance VI_1 {state MASTERinterface ens33 # 改成你的网卡名virtual_router_id 51priority 150advert_int 1authentication {auth_type PASSauth_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 #看看自己网卡名}} EOFsystemctl restart keepalived
2、web2(BACKUP)
cat >/etc/keepalived/keepalived.conf <<EOF vrrp_script chk_http {script "/etc/keepalived/check_nginx.sh"interval 2timeout 2fall 2rise 2weight -20 }vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 140advert_int 1authentication {auth_type PASSauth_pass 123456}unicast_src_ip 192.168.200.31unicast_peer {192.168.200.30}track_script {chk_http}virtual_ipaddress {192.168.200.100/24 dev ens33 label ens33:1} } EOFsystemctl restart keepalived
3、验证
ip addr
在 web1 上停止 nginx
systemctl stop nginx
VIP 自动漂移到 web2,再次访问 VIP 能否正常
三、MySQL 主从复制(GTID)
1. 主库配置(db1)wbe1
vim /etc/my.cnf
[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
systemctl restart mysqld
创建复制账号
mysql -uroot -pCREATE USER 'repl'@'192.168.200.%' IDENTIFIED BY 'Repl@123456'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.200.%'; FLUSH PRIVILEGES;
2. 初始化从库数据(在主库 db1(web1) 上执行备份)
mysqldump -uroot -p --single-transaction --routines --triggers --events --hex-blob --master-data=2 --databases wordpress > /tmp/wp.sqlscp /tmp/wp.sql 192.168.200.31:/tmp/##会有警告,但没什么问题,关于gtid的
你的 MySQL 启用了 GTID (全局事务ID)
当前导出的数据库是 部分数据库(wordpress),
默认情况下,导出的 SQL 文件会包含这些 GTID 信息
如果你以后导入,可能会引入 GTID 相关事务冲突
补充:
##去掉 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
[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 的语句直接报错,以保证复制的安全性。重启:
systemctl restart mysqld
导入数据:
mysql -uroot -p < /tmp/wp.sql
建立复制(GTID自动定位):
mysql -uroot -pCHANGE MASTER TOMASTER_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: Yes
、Slave_SQL_Running: Yes
且无错误。
###接下来阶段3:监控与告警