当前位置: 首页 > 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.xdnf.cn/news/1348201.html

相关文章:

  • StarRocks启动失败——修复全流程
  • AI生成技术报告:GaussDB与openGauss的HTAP功能全面对比
  • 【COMSOL】Comsol学习案例时的心得记录分享(三)
  • 期货Level2五档订单簿0.25秒级高频分时及日频历史行情数据使用指南
  • 刷题日记0822
  • 实现自己的AI视频监控系统-第一章-视频拉流与解码4(重点)
  • uboot添加ping命令的响应处理
  • 音视频处理工作室:实时通信的媒体层设计
  • Paddle3D-PETRv1 精度测试与推理实践指南
  • 容器安全实践(一):概念篇 - 从“想当然”到“真相”
  • 车载诊断架构 --- EOL引起关于DTC检测开始条件的思考
  • Mongodb操作指南
  • 大麦盒子DM4036-精简固件包及教程
  • 2025.8.22周五 在职老D渗透日记day24:burp+mumu抓包 安卓7.0以上证书配置
  • 电脑端完全免费的动态壁纸和屏保软件(真正免费、无广告、无会员)
  • 二叉搜索树(BST)、AVL树、红黑树
  • 爬虫基础学习-链接协议分析,熟悉相关函数
  • 基于抗辐照性能的ASP4644S电源芯片特性分析与多领域应用验证
  • 笔记本怎么才能更快散热?
  • DataStream实现WordCount
  • 信息结构统一论:物理世界与人类感知、认知及符号系统的桥梁
  • 透射TEM新手入门:衍射斑点标定 1
  • [特殊字符] TTS格局重塑!B站推出Index-TTS,速度、音质、情感表达全维度领先
  • Day25 栈 队列 二叉树
  • 特大桥施工绳断 7 人亡:索力实时监测预警机制亟待完善
  • kvcache比赛记录
  • 集群与负载均衡:HAProxy 与 Nginx 实践
  • 融云Im单独一个拍照或者拍摄插件Plugin
  • 自学嵌入式第二十五天:数据结构-队列、树
  • 配电网重构优化:以减小网损为目标的智能算法实现