行业资讯

基于 CentOS7 搭建 5 节点三层高可用 Web 集群(Nginx+Keepalived+Tomcat+MySQL 主从)

发布时间:2026/7/22 12:33:19
基于 CentOS7 搭建 5 节点三层高可用 Web 集群(Nginx+Keepalived+Tomcat+MySQL 主从) 本文记录了本人从零规划、搭建一套 5 节点 CentOS7 高可用 Web 业务集群的完整实操全过程采用经典三层架构前端通过 NginxKeepalived 基于 VRRP 协议实现负载均衡与虚拟 IP 故障自动漂移消除网关单点故障中间层部署两台 Tomcat 服务器承载 Web 应用分担访问压力底层使用 MySQL 5.7 搭建一主一从二进制日志复制架构实现数据实时热备份。 整套环境依托 VMware 虚拟机模板批量克隆部署搭建过程中踩坑并解决了网段不匹配、端口不通、数据库同步异常、权限策略报错等大量运维常见问题同时完成主节点宕机故障模拟演练验证集群业务连续性。1.模板机初始化 5 台虚拟机批量克隆与网络规划用户访问VIP192.168.2.100 → Keepalived自动把流量切到主NginxNginx做负载均衡转发给Tomcat应用Tomcat读写MySQL主从数据库。虚拟机名称集群角色分配静态 IP预装软件centos-masterNginx 主节点192.168.2.10Nginx、Keepalivedcentos-backupNginx 备节点192.168.2.11Nginx、Keepalivedcentos-appTomcat 应用服务器192.168.2.12JDK1.8、Tomcat8centos-mysql1MySQL 主库192.168.2.14MySQL5.7centos-mysql2MySQL 从库192.168.2.15MySQL5.7统一对外 VIP192.168.2.100准备先对模板机进行初始化切换root模式全程用root操作关闭防火墙设置开机不自启systemctl stop firewild systemctl disable firewalld关闭SElinux永久关闭安装必备基础依赖包作用• net-tools提供ifconfig查看网卡IP• wget下载安装包• vim编辑器• openssl/pcre后面编译Nginx必备依赖执行备份原yum源的命令把系统默认文件做备份避免后续出现问题无法回滚下载阿里云Centos7源文件若提示wget找不到可用curl版本刷新yum缓存换源必做查看源文件是否替换成功安装epel扩展源后面装keepalivednginx需要用设置主机名模板机临时名字克隆后每台再单独改优化SSH连接可选系统时间同步集群时间须统一注模板机保持DHCP自动获取即可以上执行完成后关机halt克隆卡隆方式要选择 完整克隆依次克隆出五台机器并分别命名以第一台Nginx主节点master为例:修改主机名修改网卡配置为静态IP清空原有的内容只修改IPADDR对应的地址BOOTPROTOstaticONBOOTyesIPADDR192.168.2.10 # 每台替换成表格里的对应IPNETMASK255.255.255.0GATEWAY192.168.2.2DNS18.8.8.8DNS2114.114.114.114重启网卡服务生效验证本机IPifconfig连通性测试在任意一台机器ping其他所有ip能通代表网络环境已经搭建完成2.NginxKeepalived 主备负载均衡部署与漂移测试目的实现负载均衡故障自动切换VIP后端转发到Tomcat——两台机器都安装NginxKeepalived192.168.2.10192.168.2.11yum install -y nginx keepalived # 设置开机自启systemctl enable nginx keepalivedsystemctl start nginx——编辑配置文件两台配置一样vim /etc/nginx/nginx.conf删掉全部原有内容写入如下配置user nginx;worker_processes auto;error_log /var/log/nginx/error.log;pid /run/nginx.pid;events {worker_connections 1024;}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for;access_log /var/log/nginx/access.log main;sendfile on;keepalive_timeout 65;# 后端Tomcat服务器集群upstream tomcat_pool {server 192.168.2.12:8080;}server {listen 80;server_name _;location / {proxy_pass http://tomcat_pool;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}}}检查配置nginx -tsystemctl restart nginx配置Keepalived虚拟IP漂移1.主节点master192.168.2.10vim /etc/keepalived/keepalived.conf完整配置global_defs {router_id NGINX_MASTER}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.2.100/24}}2.备节点backup192.168.2.11vim /etc/keepalived/keepalived.conf完整配置global_defs {router_id NGINX_BACKUP}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.2.100/24}}两台启动Keepalivedsystemctl start keepalived在主节点查看是否生成VIPip addr此时192.168.2.100在主节点上在主节点上执行systemctl stop keepalived然后去backup执行ip addr会发现VIP已经自动切换回来代表双击热备成功3.Tomcat 集群部署 Nginx 反向代理配置登录192.168.2.12 centos-app安装JDK8yum install -y java-1.8.0-openjdk-devel验证是否安装成功java -versionjavac -version下载并解压Tomcat8.5# 下载安装包wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.98/bin/apache-tomcat-8.5.98.tar.gz# 解压到 /usr/local 目录tar -zxvf apache-tomcat-8.5.98.tar.gz -C /usr/local/编写测试页面验证Nginx转发vim /usr/local/tomcat8/webapps/ROOT/index.jsp% page contentTypetext/html;charsetUTF-8 languagejava %htmlbodyh2Server Node: 192.168.2.12 Tomcat/h2pAccess VIP: 192.168.2.100/p/body/htmlEOF启动Tomcat/usr/local/tomcat8/bin/startup.sh避坑为避免系统里不存在这个文件夹路径等可先查找本机真正的网络根目录执行find / -name webapps正常会输出类似/usr/share/tomcat/webapps 这才是真实路径然后再用正确路径创建测试页面:cat /usr/share/tomcat/webapps/ROOT/index.jsp EOF% page contentTypetext/html;charsetUTF-8 languagejava %htmlbodyh2Server Node: 192.168.2.12 Tomcat/h2pAccess VIP: 192.168.2.100/p/body/html验证是否创建成功ls /usr/share/tomcat/webapps/ROOT/ 出现index.jsp即为成功放行端口并重启服务firewall-cmd --add-port8080/tcp --permanentfirewall-cmd --reload浏览器验证避坑1. 只去连VIP 192.168.2.100主备节点没启动KeepalivedVIP不存在必然失败2. 桥接没绑定正确物理网卡虚拟机拿到别的网段IP局域网不通3. 重启后防火墙自动开启之前临时关闭的设置失效高可用故障漂移测试1. 关闭当前承载VIP的主Nginx主机2. 持续刷新网页只会短暂卡顿一下页面立刻恢复访问3. 查看备用机VIP已经自动漂移过来实现故障自动切换4.MySQL 一主一从搭建主机centos-mysql1 192.168.2.14主库 Master从机centos-mysql2 192.168.2.15从库 Slave两台机器执行前置操作# 关闭防火墙systemctl stop firewalldsystemctl disable firewalldsetenforce 0两台机器安装MySQL5.7安装yum源rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm安装服务yum install -y mysql-community-serversystemctl start mysqldsystemctl enable mysqld获取初始临时密码grep temporary password /var/log/mysqld.log登录并修改密码mysql -uroot -pALTER USER rootlocalhost IDENTIFIED BY Root123456;exit;配置Master主库192.168.2.14编辑配置文件vi /etc/my.cnf写入[mysqld]server-id1log-binmysql-binbinlog-formatROWdatadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sock保存退出重启MySQLsystemctl restart mysqld登录MySQL创建账号mysql -uroot -pRoot123456执行CREATE USER repl% IDENTIFIED BY Repl123456;GRANT REPLICATION SLAVE ON *.* TO repl%;FLUSH PRIVILEGES;-- 锁定库防止配置期间数据变动FLUSH TABLES WITH READ LOCK;查看主库状态记录File和Position SHOW MASTER STATUS;配置Slave主库192.168.2.15编辑配置文件vi /etc/my.cnf写入[mysqld]server-id2log-binmysql-bindatadir/var/lib/mysqlsocket/var/lib/mysql/mysql.sock保存退出重启MySQLsystemctl restart mysqld登录MySQL绑定主库mysql -uroot -pRoot123456把下面对应参数换成刚才SHOW MASTER STATUS查询出来的值STOP SLAVE;CHANGE MASTER TOMASTER_HOST192.168.2.14,MASTER_USERrepl,MASTER_PASSWORDRepl123456,MASTER_LOG_FILEmysql-bin.000002,#填查到的file名称MASTER_LOG_POS747;#填查到的Position数字启动同步START SLAVE;检查同步状态SHOW SLAVE STATUS\G必须同时满足两个Yes才算成功• Slave_IO_Running: Yes• Slave_SQL_Running: Yes验证同步效果切回主库MySQL窗口解锁表UNLOCK TABLES;主库新建库插入测试数据CREATE DATABASE test_db;USE test_db;CREATE TABLE t(id INT);INSERT INTO t VALUES(100);若能从从库查询到这条数据代表主从搭建完成项目总结与后续规划本次搭建的三层高可用集群是传统企业机房非常经典的部署方案完美结合了 TCP/IP 网络原理、VRRP 冗余协议、Linux 系统运维、Web 服务与数据库冗余设计等理论知识。通过亲手完成环境规划、配置部署、错误排查、故障验证彻底理解了单点故障带来的业务风险以及负载均衡、主备切换、数据备份的设计意义。访问链路浏览器 → 192.168.2.100Nginx虚拟VIP→ 两台Nginx负载均衡 → Tomcat应用节点 → MySQL主库写入、从库同步备份。现阶段整套集群已经可以稳定运行为了进一步提升项目深度后续计划分步完成升级编写 Shell 批量运维脚本替代重复手动命令提升部署效率接入 PrometheusGrafana 监控体系实现服务器、服务、数据库状态实时监测与异常告警完成 MySQL 读写分离改造搭配 Redis 缓存优化数据库访问压力使用 Docker 完成服务容器化部署进一步可向 K8s 编排方向延伸将整套架构迁移至公有云服务器适配线上生产环境部署逻辑。本文仅作为个人原创项目实训笔记可供参考学习禁止商用二次转载。