当前位置: 首页 > news >正文

二、高可用架构(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: YesSlave_SQL_Running: Yes 且无错误。

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

http://www.dtcms.com/a/344003.html

相关文章:

  • 集成算法(聚类)
  • Vue生命周期以及自定义钩子和路由
  • Manus AI 与多语言手写识别技术全解析
  • c++最新进展
  • linux下top命令分析内存不足vs负载过高
  • MeterSphere接口自动化多场景批量运行复制引用
  • 疯狂星期四文案网第47天运营日记
  • 云市场周报 (2025.08.22):阿里云RDS降价、腾讯云Serverless容器新品发布
  • Adobe Photoshop 2025 版本介绍与使用指南
  • AE下载安装教程(附安装包)Adobe Media Encoder超详细图文安装教程
  • Azure TTS Importer:一键导入,将微软TTS语音接入你的阅读软件!
  • 开发避坑指南(30):Vue3 表格动态增加删除行解决方案
  • 数据库备份sql文件过大,phpAdmin无法执行Sql
  • 深入理解Spring事务传播行为:原理、应用与实践
  • Vue Teleport 原理解析与React Portal、 Fragment 组件
  • 高德地图自定义marker,点击、悬停显示信息框
  • 智能合约漏洞检测技术综述:守护区块链世界的“自动售货机”
  • syn和quote的简单使用——生成结构体
  • Java基础 8.22
  • 在自动驾驶中ESKF实现GINS时,是否将重力g作为变量考虑进去的目的是什么?
  • 从Transformer到扩散模型:解锁大模型背后的技术魔法
  • 微信小程序,事件总线(Event Bus) 实现
  • Git 提交除某个文件外的其他所有文件
  • linux搭建本地yum源仓库
  • windows安装Elasticsearch,ik分词器,kibana可视化工具
  • Go初级二
  • 集群与负载均衡:HAProxy 与 Nginx 实践
  • 第41周——人脸图像生成
  • Java 性能优化实战(三):并发编程的 4 个优化维度
  • 第3课:Flutter基础组件