《基于Keepalived+LVS+Web+NFS的高可用集群搭建》

发布于:2025-05-27 ⋅ 阅读:(53) ⋅ 点赞:(0)

目  录

1 项目概述

1.1 项目背景

1.2 项目功能

2 项目的部署

2.1  部署环境介绍

2.2  项目的拓扑结构

2.3  项目环境调试

2.4  项目的部署

2.5  项目功能的验证

2.6  项目对应服务使用的日志

3 项目的注意事项

3.1 常见问题与解决方案

3.2 项目适用背景


1 项目概述

1.1 项目背景

乙公司近年来业务规模快速扩张,线上用户量和访问量激增,现有单台Web服务器已无法承载高并发请求,导致以下问题频发:

服务响应延迟:用户访问网页时常出现卡顿,平均响应时间超过3秒,严重影响用户体验。

频繁服务中断:高峰期服务器CPU和内存利用率长期超过90%,多次因资源耗尽触发宕机。

业务损失风险:618、双十一等大促期间,订单提交失败率高达15%,直接影响公司营收。

为保障业务连续性并提升服务质量,需对现有架构进行升级,核心需求包括:

高并发支持:单台服务器峰值QPS不足1000,需扩展至多节点分担流量。

高可用保障:消除单点故障,实现故障自动切换,确保服务SLA≥99.9%。

资源统一管理:静态内容(商品图片、HTML模板)需多节点实时同步,避免人工维护不一致。

经技术评估,采用 LVS-DR + Keepalived + NFS + Nginx 架构实现:

负载均衡:通过LVS(Linux Virtual Server)将流量分发至多台Web服务器,支持横向扩展。

故障自动转移:Keepalived实现主备节点VIP漂移,切换时间<2秒。

共享存储:NFS统一托管静态资源,确保各节点内容一致性。

性能监控:集成Prometheus对服务器状态、流量调度实时监控。

本项目实施后,乙公司服务器压力问题将得到根本解决,为后续业务增长提供稳定技术支撑。

1.2 项目功能

1.1.1项目优势

高可用性:无单点故障,主备切换时间秒级。

高性能:DR模式避免LVS Director成为带宽瓶颈。

低成本:完全基于开源软件,无需硬件负载均衡设备。

易扩展:横向增加Real Server即可提升处理能力。

1.1.2 功能介绍

(1)负载均衡(LVS-DR)

功能描述:

通过Linux Virtual Server(LVS)的直接路由(DR)模式,将客户端请求分发到多台后端Real Server(Web服务器)。

调度算法:支持轮询(rr)、加权轮询(wrr)等,本项目采用rr实现简单均衡。

高性能:DR模式下,Real Server直接响应客户端,避免LVS Director成为带宽瓶颈。

技术实现:

LVS Director通过内核模块ip_vs管理流量转发。

Real Server需绑定VIP到本地回环接口(lo:1),并配置ARP抑制。

(2)高可用(Keepalived)

功能描述:

实现LVS Director的主备故障自动切换,避免单点故障。

VIP漂移:主节点故障时,备节点自动接管虚拟IP(10.1.1.140)。

健康检查:定期检测Real Server的80端口,自动剔除故障节点。

技术实现:

基于VRRP协议(虚拟路由冗余协议)实现主备协商。

通过TCP_CHECK机制监控Real Server状态。

(3)统一内容分发(NFS共享存储)

功能描述:

使用NFS(网络文件系统)在多台Web服务器间共享静态资源(如HTML、图片等),确保内容一致性。

实时同步:所有Web服务器挂载同一NFS目录,文件修改即时生效。

权限控制:通过/etc/exports限制仅允许Real Server访问。

技术实现:

NFS服务端导出目录:/nfs/web。

Web客户端挂载:mount -t nfs 10.1.1.134:/nfs/web /var/www/html/shared。

(4)Web服务(Nginx)

功能描述:

部署Nginx作为Real Server的Web服务器,提供静态内容服务。

多节点区分:通过不同index文件(如index1.html、index2.html)标识不同Real Server。

容灾测试:关闭任意Web节点后,LVS自动将流量切至存活节点。

技术实现:

Nginx配置根目录指向NFS共享路径:root /var/www/html/shared。

监听VIP和本地IP的80端口。

(5)自动化运维支持

日志监控:

Keepalived日志(/var/log/messages):记录VIP漂移和健康检查事件。

Nginx日志(/var/log/nginx/access.log):统计客户端访问情况。

一键启停:

通过systemctl管理服务(如systemctl restart keepalived)。

2 项目的部署

2.1  部署环境介绍

系统版本: CentOS 7.x

软件版本:

keepalived-1.3.5, ipvsadm-1.27, nginx-1.20.1, nfs-utils-1.3.0

2.2  项目的拓扑结构

2.3  项目环境调试

LVS-master

10.1.1.130

LVS-node01

10.1.1.131

Web01-RS

10.1.1.132

Web02-RS

10.1.1.133

NFS

10.1.1.134

VIP

10.1.1.140

全部机子都需要操作

2.3.1配置静态ip

以10.1.1.130为例

vi /etc/sysconfig/network-scripts/ifcfg-ens33

systemctl restart network

2.3.2关闭防火墙和selinux(环境是centos7,个别机子需要关闭两个防火墙)

systemctl stop firewalld

systemctl disable firewalld

systemctl stop iptables

systemctl disable iptables

vi /etc/selinux/config

将enforcing修改成disabled

#重启生效

reboot

2.3.3连通性测试

ping www.baidu.com

ping 10.1.1.140

ping 10.1.1.131

ping 10.1.1.132

ping 10.1.1.133

ping 10.1.1.134

2.4  项目的部署

2.4.1  Master节点操作(keepalived主节点10.1.1.130)

(1)修改主机名

hostnamectl set-hostname master-hn

bash

(2)安装keepalived  ipvsadm

yum -y install keepalived ipvsadm

(3)加载内核模块

modprobe  ip_vs

(4)备份keepalived配置文件

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

(5)修改配置文件

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

   router_id LVS_MASTER

}

vrrp_instance VI_1 {

    state MASTER

    interface ens33

    virtual_router_id  10

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        10.1.1.140

    }

}

virtual_server 10.1.1.140 80 {

   delay_loop 15

   lb_algo rr

    lb_kind DR

!    persistence_timeout 50

    protocol TCP

    real_server 10.1.1.132 80 {

        weight 1

       TCP_CHECK {

        connect_port 80

        connect_timeout 3

        nb_get_retry 3

        delay_before_retry 4

       }

    }

     real_server 10.1.1.133 80 {

        weight 1

       TCP_CHECK {

        connect_port 80

        connect_timeout 3

        nb_get_retry 3

        delay_before_retry 4

       }

    }

}

2.4.2 node01节点操作keepalived备节点(10.1.1.131)

(1)克隆一台master节点作为node01节点并且修改ip为10.1.1.131,并且修改主机名为node01

hostnamectl set-hostname node01-hn

Bash

(2)修改备机keepalived配置文件

修改router id

修改state BACKUP

修改优先权(低于master)

注意:只需要修改这三个地方

2.4.3 keepalived服务启动,查看,关闭的方法介绍

(1)主备启动keepalived并设置开机自启和查看状态

systemctl start keepalived  #开启服务

systemctl enable keepalived  #开机自启

systemctl status keepalived  #查看状态

systemctl stop keepalived  #关闭服务

systemctl restart keepalived  #重启服务

(2)检查VIP绑定

ip addr show dev ens33

实际状态为 MASTER 的主服务器将为 ens33 接口自动添加 VIP 地址,通过 ip 命令可以查看。

10.1.1.140 是一个浮动 VIP(虚拟 IP),同一时间只有一个节点会持有这个 VIP,/32 表示这是一个单机 IP,此时只有主节点会有这个ip,从节点时没有的

(3)查看LVS规则,列出所有RS及调度状态(RR/WLC等)

ipvsadm -ln

      

(4)正常状态确认

VIP绑定正确

主节点(10.1.1.130)成功持有VIP 10.1.1.140(ip addr show显示10.1.1.140/32),备节点未绑定VIP,符合预期。

IPVS规则完整

主备节点的 ipvsadm -ln 均显示两台Real Server(10.1.1.132和10.1.1.133),调度算法为轮询(rr),转发模式为DR(Route)。

主备切换逻辑

备节点(node01)重启Keepalived后未抢占VIP,说明 state BACKUP 和 priority 配置已生效。

2.4.4 NFS配置(10.1.1.134)

(1)修改主机名

hostnamectl set-hostname NFS-hn

Bash

(2)安装 NFS 工具

yum install -y nfs-utils

(3)创建共享目录(把文件内容共享给web服务器),设置权限

mkdir -p /nfs/web

chmod 777 /nfs/web

(4)修改exports文件,把web服务器ip暴露给nfs,允许 Web 主机 IP 访问

vi /etc/exports

/nfs/web 10.1.1.132(rw,sync,no_root_squash,no_subtree_check)

/nfs/web 10.1.1.133(rw,sync,no_root_squash,no_subtree_check)

(5)启动nfs并设置开机自启

2.4.5 web(10.1.1.132和10.1.1.132)配置,搭建(RS真实后端服务器)

Web02除了IP为10.1.1.133,其他配置和web01相同

(1)修改主机名:

hostnamectl set-hostname web01-hn

Bash

(2)安装 NFS 客户端工具

yum install -y nfs-utils

(3)启动nsf服务

systemctl start nfs-server

systemctl enable nfs-server

(4)创建本地挂载点,并且把共享目录挂载到本地挂载点

mkdir -p /var/www/html/shared

mount -t nfs 10.1.1.134:/nfs/web /var/www/html/shared

如果一直挂载不能成功,查看配置都没有问题,可能是centos的防火墙iptables的问题,需要关掉重新挂载

(5)设置永久挂载

vi /etc/fstab

10.1.1.134:/nfs/web  /var/www/html/shared  nfs  defaults  0  0

mount -a测试挂载,如果无报错,说明修复成功。

    (6)df -h | grep nfs  # 查看挂载信息

    cat /var/www/html/shared/index.html  # 应显示 NFS 服务端的 IP

    (7)安装nginx

    yum install -y epel-release  # 安装 EPEL 仓库

    yum install -y nginx

    (8)启动nginx

    systemctl start nginx

    systemctl status nginx

    systemctl enable nginx

    如果启动失败

    查看80端口是否被别的应用占用,比如apache

    ss -tulnp | grep ':80'

    如果被占用可以关闭并禁止开机自启,再进行启动nginx

    systemctl stop httpd

    systemctl disable httpd

    (9)检查nfs中共享目录的内容web01和web02中是否能查看

    cd /var/www/html/shared/

    cat index.html

    2.5  项目功能的验证

    2.5.1 验证VIP漂移和LVS流量分发是否均衡

    (1)原来的状态

    关闭主机点的keepalived后的状态对比

    2.5.2 验证NFS共享

    Nfs服务器上:

    (1)查看nfs配置

    exportfs -v

    (2)创建测试文件

    echo $(hostname -I | awk '{print $1}') > /nfs/web/index.html  # 写入本机 IP 到 HTML 文件

    (3)进行测试

    暴露共享位置,一定要先启动服务再暴露位置,不然会报错

    showmount -e 10.1.1.134

    showmount -e localhost  # 显示本地导出的 NFS 共享目录

    Web01/02上:

    showmount -e 10.1.1.134  # 替换为你的 NFS 服务器 IP

    2.5.3 nginx网页测试

    (1)查看nginx的网页文件存储目录

    rpm -ql nginx |grep html

    (2)为了区分web01与web02的内容,配置nginx

    在服务器134上:

    cd /nfs/web/

    ls

    mv index.html index1.html

    echo "Web01 index.html" > index1.html

    echo "Web02 index.html" > index2.html

    在web01和web02上查看是否共享配置文件:

    Web01和web02上操作:

    vi /etc/nginx/conf.d/web01.conf

    server {

            listen 80;

        server_name 10.1.1.132;

        location / {

            root   /var/www/html/shared;

            index  index1.html;

        }

    }

    systemctl restart nginx

    vi /etc/nginx/conf.d/web02.conf

    server {

            listen 80;

        server_name 10.1.1.133;

        location / {

            root   /var/www/html/shared;

            index  index2.html;

        }

    }

    配置内核参数

    vi /etc/sysctl.conf

    net.ipv4.conf.lo.arp_ignore = 1

    net.ipv4.conf.all.arp_announce = 2

    net.ipv4.conf.lo.arp_announce = 2

    net.ipv4.ip_forward=0

    sysctl -p 更新

    添加虚拟IP(两台web对要)

    yum install -y net-tools  #安装工具包

    ifconfig lo:1 10.1.1.140 netmask 255.255.255.255 broadcast 10.1.1.140 up

    增加路由

    route add -host 10.1.1.140 dev lo:1

    route -n

    (3)正式测试nginx网页

    在网页输入虚拟ip,10.1.1.140,出现以下界面

    关掉web02

    可看到web01内容

    如果再启动web02,关掉web01

    又可以看到web02内容

    2.6  项目对应服务使用的日志

    2.6.1 Keepalived(LVS主备节点)

    日志文件:/var/log/messages

    作用:主日志文件,记录VRRP状态切换、VIP漂移、健康检查结果

    journalctl -u keepalived

    查找方法:grep keepalived /var/log/messages

    示例:

    日志文件:journalctl -u keepalived

    作用:Systemd日志,详细记录服务启停和错误(需配置log_facility后更完整)

    查看方法:journalctl -u keepalived -f

    示例:

    2.6.2 LVS(IPVS内核模块)

    日志文件:ipvsadm -lcn

    作用:实时连接状态,显示当前活动的LVS连接和RS状态

    查看方法:watch -n 1 ipvsadm -lcn

    示例:

    2.6.3 NFS Server(10.1.1.134)

    日志文件:/var/log/messages

    作用:记录NFS服务启停、客户端挂载/访问权限错误

    查看方法:grep nfs /var/log/messages

    示例:

    2.6.4 Nginx(Web1/Web2节点)

    日志文件:/var/log/nginx/access.log

    作用:所有客户端访问记录(IP、请求路径、状态码等

    查看方法:tail -f /var/log/nginx/access.log

    示例:

    日志文件:/var/log/nginx/error.log

    作用:Nginx错误日志(配置错误、权限问题等)

    查看方法:tail -f /var/log/nginx/error.log

    示例:

    日志文件:/var/log/messages

    作用:系统级Nginx服务启停记录(通过Systemd管理时)

    查看方法:grep nginx /var/log/messages

    示例:

    3 项目的注意事项

    3.1 常见问题与解决方案

    3.1.1 VIP无法漂移

    原因:VRRP组播通信被防火墙阻止,或主备节点优先级配置错误。

    解决:

    检查防火墙是否放行VRRP协议:firewall-cmd --add-rich-rule='rule protocol value="vrrp" accept' --permanent

    确认主节点priority高于备节点(如主100,备50)。

    使用tcpdump -i ens33 vrrp抓包验证组播通信。

    3.1.2 LVS规则中缺少部分Real Server

    原因:Real Server的健康检查失败(Nginx未启动或端口不通)。

    解决:

    在LVS节点测试RS端口:telnet 10.1.1.132 80

    检查RS的Nginx状态:systemctl status nginx

    查看Keepalived日志:grep "TCP_CHECK" /var/log/messages

    3.1.3 NFS挂载失败

    原因:防火墙未放行NFS端口(2049、111),或SELinux限制。

    解决:

    开放NFS端口:firewall-cmd --add-service=nfs --permanent

    临时关闭SELinux:setenforce 0

    检查挂载日志:grep mountd /var/log/messages

    3.1.4 备节点异常持有IPVS规则

    原因:备节点误配置为state MASTER。

    解决:

    修改备节点配置:state BACKUP,并降低priority(如50)。

    清理异常规则:ipvsadm -C && systemctl restart keepalived

    3.1.5 访问VIP返回502错误

    原因:Real Server未正确绑定VIP到本地回环接口。

    解决:

    在RS上执行:ifconfig lo:1 10.1.1.140 netmask 255.255.255.255 up

    添加永久路由:echo "route add -host 10.1.1.140 dev lo:1" >> /etc/rc.local

    3.1.6 NFS共享内容不同步

    原因:挂载点权限不足或客户端未重新挂载。

    解决:

    服务端设置权限:chmod -R 777 /nfs/web

    客户端强制重新挂载:mount -o remount /var/www/html/shared

    3.2 项目适用背景

    适用场景

    高并发Web服务:需要横向扩展多台Web服务器分担流量压力。

    静态资源一致性:通过NFS共享HTML、图片等静态文件,确保各节点内容一致。

    低成本高可用:利用开源软件(LVS+Keepalived)替代硬件负载均衡设备。

    不适用场景

    高性能数据库集群:LVS的DR模式不适合频繁写入的数据库负载均衡。

    跨地域部署:NFS对网络延迟敏感,异地场景建议改用CDN或分布式存储(如MinIO)。


    网站公告

    今日签到

    点亮在社区的每一天
    去签到