基于 LVS+Keepalived+NFS 的高可用 Web 集群构建与验证

2.1 主机规划

主机 系统 软件 IP
client redhat9.7 192.168.72.115/24
lvs-master redhat9.7 ipvsadm keepalived VIP:192.168.72.100/32 DIP:192.168.72.116/24
lvs-backup redhat9.7 ipvsadm keepalived VIP:192.168.72.100/32 DIP:192.168.72.117/24
rs1 redhat9.7 nginx, nfs-utils 192.168.72.118/24
rs2 redhat9.7 nginx, nfs-utils 192.168.72.119/24
nfs redhat9.7 nfs-utils 192.168.72.120/24

使用脚本修改ip+主机名

#!/bin/bash

useage: sudo ./init_sys.sh <hostname> <ip_address> gateway dns

RED='\033[0;31m'

GREEN='\033[0;32m'

YELLOW='\033[1;33m'

NC='\033[0m'

log_info() {

echo -e "{GREEN}\[INFO\]{NC} $1"

}

log_warn() {

echo -e "{YELLOW}\[WARN\]{NC} $1"

}

log_error() {

echo -e "{RED}\[ERROR\]{NC} $1"

}

check_root() {

if \[ $EUID -ne 0 ]; then

log_error "此脚本必须以root权限运行"

exit 1

fi

}

usage() {

echo "用法: $0 <hostname> <ip_address> gateway dns_servers"

echo ""

echo "参数说明:"

echo " hostname 要设置的主机名"

echo " ip_address 要设置的静态IP地址 (如: 192.168.72.100)"

echo " gateway 网关地址 (如: 192.168.72.2)"

echo " dns_servers DNS服务器,逗号分隔 (可选,默认: 8.8.8.8,223.5.5.5)"

echo ""

echo "示例:"

echo " $0 myserver 192.168.72.100 192.168.72.2 8.8.8.8,223.5.5.5"

echo " $0 webserver 10.0.0.50"

exit 1

}

get_interface() {

尝试获取第一个活动的非环回接口

local interface=(ip route \| grep default \| head -1 \| awk '{print 5}' 2>/dev/null)

if \[ -z "$interface" ]; then

如果没有默认路由,获取第一个非环回接口

interface=(ip link show \| grep -v lo \| grep 'state UP' \| head -1 \| awk -F': ' '{print 2}')

fi

if \[ -z "$interface" ]; then

log_error "无法自动检测网络接口"

read -p "请输入网络接口名称 (如: eth0, ens160): " interface

fi

echo "$interface"

}

set_hostname() {

local hostname=$1

log_info "正在设置主机名为: $hostname"

/usr/bin/hostnamectl set-hostname $hostname

log_info "主机名设置完成"

}

set_static_ip() {

local interface=$(get_interface)

local ip=$1

local gateway=${2:-"192.168.72.2"}

local dns=${3:-"223.5.5.5,8.8.8.8"}

log_info "正在为接口 interface 配置静态IP: ip"

nmcli c modify interface ipv4.method manual ipv4.addresses ip/24 ipv4.gateway gateway ipv4.dns dns connection.autoconnect yes

nmcli c up $interface

}

main() {

if \[ $# -lt 2 ]; then

usage

fi

check_root

set_hostname "$1"

set_static_ip "2" "3" "$4"

}

main "$@"

执行以下命令关闭防火墙,selinux

2.3 搭建NFS

1、安装nfs-utils工具

2、创建共享目录和文件

3、给共享目录设置权限

4、配置nfs

5、配置生效

6、启动服务

7、验证配置

2.4 搭建web1

1、安装nginx和nfs-utils

2、挂载目录

3、启动nginx

4、运行测试

5、配置VIP

2.4 搭建web2

1、安装nginx和nfs-utils

2、挂载目录

3、启动nginx

4、运行测试

5、配置vip

2.5 搭建lvs-master

1、安装ipvsadm和keepaived

2、创建lvs的配置文件

3、启动lvs

4、配置keepalived

复制代码
[root@lvs-master ~]# cp /etc/keepalived/keepalived.conf{,.bak}
[root@lvs-master ~]# vim /etc/keepalived/keepalived.conf

文件的内容如下:

复制代码
global_defs {
   router_id LVS_master
}
​
vrrp_script chk_nginx {
   script "/etc/keepalived/check_nginx.sh"
   interval 2
   fall 3
   rise 2
}
​
vrrp_instance VI_1 {
    state MASTER
    interface ens160
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.184.100
    }
    #track_script {
    #    chk_nginx
    #}
}
​
virtual_server 192.168.184.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP
​
    real_server 192.168.184.118 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
​
    real_server 192.168.184.119 80 {
        weight 1
        TCP_CHECK {
            connect_port 80
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
}

5、编写检查脚本

复制代码
[root@lvs-master ~]# vim /etc/keepalived/check_nginx.sh

脚本内容如下:

复制代码
#!/bin/bash
​
count=`ps -C nginx --no-header | wc -l`
if [ $count -eq 0 ]; then
    /usr/bin/systemctl start nginx
    sleep 1
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
        /usr/bin/systemctl stop keepalived
    fi
fi

然后给这个脚本可执行权限

6、查看LVS规则

7、启动keepalived

systemctl start keepalived.service

8、查看VIP

2.6 搭建lvs-backup

1、安装ipvsadm和keepalived

2、创建lvs配置文件

3、启动lvs

4、配置keepalived

1. 从lvs-master服务器上复制配置文件

global_defs {

router_id LVS_backup

}

vrrp_script chk_nginx {

script "/etc/keepalived/check_nginx.sh"

interval 2

timeout 2

weight -20

fall 3

rise 2

}

vrrp_instance VI_1 {

state BACKUP

interface ens160

virtual_router_id 51

priority 90

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.184.100

}

#track_script {

chk_nginx

#}

}

virtual_server 192.168.184.100 80 {

delay_loop 6

lb_algo rr

lb_kind DR

protocol TCP

real_server 192.168.184.118 80 {

weight 1

TCP_CHECK {

connect_port 80

connect_timeout 3

retry 3

delay_before_retry 3

}

}

real_server 192.168.184.119 80 {

weight 1

TCP_CHECK {

connect_port 80

connect_timeout 3

retry 3

delay_before_retry 3

}

}

}

5、确保脚本文件的可执行权限

6、启动keepalived

7、查看lvs规则

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

此时,备用服务器中是没有负载均衡规则的。

8、查看VIP

此处也没有VIP,因为VIP在 master 主机上。

2.7 配置内核参数

由于我们采用的 DR 模式,因此我们需要为两台 RS 服务器配置内核参数。

2.8 运行测试

1、在lvs-master和lvs-backup都正常的情况下

3、关闭rs1上的nginx服务

2. 然后再查看lvs-master上的LVS规则

3. 再次把rs1上的nginx服务启动

4. 然后再查看lvs-master上的LVS规则

相关推荐
大树882 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质2 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
小宇宙Zz2 天前
Maven依赖冲突
java·服务器·maven
Inhand陈工2 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
网络研究院2 天前
2026年网络安全
网络·安全·法律·法规·趋势·发展
酣大智2 天前
ARP代理--工作原理
运维·网络·arp·arp代理
treesforest2 天前
AI安全系统如何识别异常访问?IP风险识别正在成为关键能力
网络·人工智能·tcp/ip·安全·web安全
shushangyun_2 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
古城小栈2 天前
Unix 与 Linux 异同小叙
linux·服务器·unix