接着阶段一
客户端 → 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
(备)
bashyum install -y nginx keepalived rsync inotify-tools systemctl enable nginx keepalived
在 web1(作为代码主)创建一个 rsync 推送脚本:
bashcat >/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使用
bashvim /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
bashchmod +x /etc/keepalived/check_nginx.sh
1、web1(MASTER)
bashcat >/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)
bashcat >/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、验证
baship addr
在 web1 上停止 nginx
bashsystemctl 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
sqlsystemctl restart mysqld
创建复制账号
sqlmysql -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) 上执行备份)
bashmysqldump -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 的语句直接报错,以保证复制的安全性。重启:
bashsystemctl restart mysqld
导入数据:
bashmysql -uroot -p < /tmp/wp.sql
建立复制(GTID自动定位):
bashmysql -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: Yes
、Slave_SQL_Running: Yes
且无错误。
###接下来阶段3:监控与告警