linux系统------LVS+KeepAlived+Nginx高可用方案

目录

一、环境搭建

1.环境准备

[2.安装ipvsadm 和 安装 keepalived(Lvs服务器)](#2.安装ipvsadm 和 安装 keepalived(Lvs服务器))

3.为两台RS配置虚拟ip(nginx服务器)

1.配置虚拟网络子接口(回环接口)

2.修改内容如下:

3.配置ARP

二、Keepalived+Lvs+Nginx高可用集群负载均衡的搭建

[1. 配置 LVS-keepalived(主)](#1. 配置 LVS-keepalived(主))

[2. 配置Lvs-keepalived(备)](#2. 配置Lvs-keepalived(备))

3、检查服务和配置

[4. 测试](#4. 测试)

1.测试Lvs

2.测试nginx


一、环境搭建

1.环境准备

HOSTNAME IP 说明
nginx 192.168.100.10 nginx服务器
nginx 192.168.100.11 nginx服务器
Lvs+keepalived(主) 192.168.100.100 Lvs+keepalived(VIP:192.168.100.109)
Lvs+keepalived(备) 192.168.100.101 Lvs+keepalived(VIP:192.168.100.109)

并关闭防火墙和安全上下文

所有计算机节点关闭网络配置管理器,因为有可能会和网络接口冲突:

复制代码
systemctl stop NetworkManager

2.安装ipvsadm 和 安装 keepalived(Lvs服务器)

复制代码
yum install ipvsadm -y
yum install keepalived -y

安装成功进行检测

复制代码
[root@lvs1 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

[root@lvs2 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn

3.为两台RS配置虚拟ip(nginx服务器)

1.配置虚拟网络子接口(回环接口)

(两台服务器配置一样,以下已一台服务器配置作为演示)

配置虚拟网络子接口可以理解为构建一个虚拟ip,这个ip只能返回数据,不能被访问。

1.进入到网卡配置目录,找到 lo(本地环回接口,用户构建虚拟网络子接口),拷贝一份新的随后进行修改:

2.修改内容如下:

(注意:由于没有多的网卡,一下是临时配置在lo下)

复制代码
root@web1 network-scripts]# ifconfig lo:0 192.168.100.109/32
[root@web1 network-scripts]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.100.109/0 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever

3.重启后通过ip addr 查看如下,表示ok:

复制代码
[root@web1 network-scripts]# ifup lo
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/6)

另一台nginx服务配置同上(web2)

3.配置ARP

1.打开sysctl.conf

复制代码
vim /etc/sysctl.conf

2.配置所有网卡、默认网卡以及虚拟网卡的arp响应级别和通告行为,分别对应:all,default,lo

复制代码
[root@web1 ~]# vim /etc/sysctl.conf      #添加配置如下
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.default.arp_ignore=1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce=2

3.刷新配置

复制代码
sysctl -p

4.增加一个网关,用于接收数据报文,当有请求到本机后,会交给lo去处理

复制代码
[root@web1 ~]# route add -host 192.168.100.109 dev lo:0

5.防止重启失效,做如下处理,用于开机自启动

复制代码
vim /etc/profile
route add -host 192.168.100.109 dev lo:0

nginx服务器web2同上操作

二、Keepalived+Lvs+Nginx高可用集群负载均衡的搭建

这种架构目前在很多公司都在采用的高可用高性能架构, 优点如下:

  1. 使用Keepalived + Lvs 后可以实现主备切换高可用

  2. 结合了Lvs 后, 针对于后台的Real Server 这些真实的服务器做健康检查, 如果某台真实的服务器宕机后, Lvs就会自动剔除, 如果恢复后也可以自动加入.

  3. 其实 Keepalived 本身就是为 Lvs 定做了, 他们的匹配度, 结合度非常高, 通过 keepalivd 就可以配置 Lvs与 RS 的关系, 如负载均衡算法, 健康检查配置等.

1. 配置 LVS-keepalived(主)

1、keepalived配置文件, 修改配置信息

复制代码
cd /etc/keepalived
vim keepalived.conf

配置文件如下:

复制代码
! Configuration File for keepalived

global_defs {
   router_id LVS1
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.100.109
    }
}
# LVS 配置: 配置集群访问的 IP+端口, 端口和nginx保持一致, 都是80, IP与端口是空格而不是冒号
virtual_server 192.168.100.109 80 {
    # 健康检查的时间, 单位是秒
    delay_loop 6
    # 配置负载均衡的算法, 默认是 轮询
    lb_algo rr
    # 设置LVS的工作模式 NAT|TUN|DR  lb是load_balance 负载均衡的缩写
    lb_kind DR
    # 会话持久化的时间, 默认是 50 秒
    persistence_timeout 5
    # 协议 -t
    protocol TCP

    # Real Server 配置  nginx服务ip+端口
    real_server 192.168.100.10 80 {
        # 轮询的权重, 默认有多少台, 就设置为多少个 1
        weight 1
        # 设置健康检查, 基于 tcp
        TCP_CHECK {
            # 检查的80端口
            connect_port 80
            # 检查的超时时间 2秒
            connect_timeout 2
            # 重试的次数 我们设置为2, 一般是5-7
            nb_get_retry 2
            # 设置间隔时间 3s
            delay_before_retry 3
        }
    }

    real_server 192.168.100.11 80 {
        weight 1
        # 设置健康检查, 基于 tcp
        TCP_CHECK {
            # 检查的80端口
            connect_port 80
            # 检查的超时时间 2秒
            connect_timeout 2
            # 重试的次数 我们设置为2, 一般是5-7
            nb_get_retry 2
            # 设置间隔时间 3s
            delay_before_retry 3
        }
    }
}

清除负载均衡的规则

复制代码
[root@lvs1 keepalived]# ipvsadm -C

重启keepalived, 使得配置生效

复制代码
[root@lvs1 keepalived]# systemctl restart keepalived.service

2. 配置Lvs-keepalived(备)

步骤同 LVS-keepalived(主)一样 ,只有配置文件不一样

vim /etc/keepalived/keepalived.conf

复制代码
! Configuration File for keepalived
global_defs {
  #主服务器配置不同,名称随便起
   router_id LVS2
}

vrrp_instance VI_1 {
    #主服务器配置不同
    state BACKUP
    interface ens33
    virtual_router_id 51
    #主服务器配置不同,权重需要比主服务器低
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.100.109
    }
}
# LVS 配置: 配置集群访问的 IP+端口, 端口和nginx保持一致, 都是80, IP与端口是空格而不是冒号
virtual_server 192.168.100.109 80 {
    # 健康检查的时间, 单位是秒
    delay_loop 6
    # 配置负载均衡的算法, 默认是 轮询
    lb_algo rr
    # 设置LVS的工作模式 NAT|TUN|DR  lb是load_balance 负载均衡的缩写
    lb_kind DR
    # 会话持久化的时间, 默认是 50 秒
    persistence_timeout 5
    # 协议 -t
    protocol TCP

    # Real Server 配置  nginx服务ip+端口
    real_server 192.168.100.10 80 {
        # 轮询的权重, 默认有多少台, 就设置为多少个 1
        weight 1
        # 设置健康检查, 基于 tcp
        TCP_CHECK {
            # 检查的80端口
            connect_port 80
            # 检查的超时时间 2秒
            connect_timeout 2
            # 重试的次数 我们设置为2, 一般是5-7
            nb_get_retry 2
            # 设置间隔时间 3s
            delay_before_retry 3
        }
    }

    real_server 192.168.100.11 80 {
        weight 1
        # 设置健康检查, 基于 tcp
        TCP_CHECK {
            # 检查的80端口
            connect_port 80
            # 检查的超时时间 2秒
            connect_timeout 2
            # 重试的次数 我们设置为2, 一般是5-7
            nb_get_retry 2
            # 设置间隔时间 3s
            delay_before_retry 3
        }
    }
}

改完配置文件,进行重启keeplivaed,命令同上!

复制代码
[root@lvs2 keepalived]# vim keepalived.conf
[root@lvs2 keepalived]# systemctl restart keepalived.service

3、检查服务和配置

3.1 OpenEuler里自带ipvsadm模块儿 (主和备都需要做)

此时需启动它,得先创建一个ipvsadm文件

复制代码
[root@lvs1 keepalived]# touch /etc/sysconfig/ipvsadm
[root@lvs1 keepalived]# systemctl start ipvsadm
[root@lvs1 keepalived]# lsmod | grep ip_vs
ip_vs_rr               12288  0
ip_vs                 229376  2 ip_vs_rr
nf_conntrack          212992  1 ip_vs
nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs
libcrc32c              12288  2 nf_conntrack,ip_vs
[root@lvs1 keepalived]# systemctl status ipvsadm
● ipvsadm.service - Initialise the Linux Virtual Server
     Loaded: loaded (/usr/lib/systemd/system/ipvsadm.service; disabled; preset: disabl>
     Active: active (exited) since Tue 2025-07-15 16:49:31 CST; 35s ago
    Process: 29784 ExecStart=/bin/bash -c exec /sbin/ipvsadm-restore < /etc/sysconfig/>
   Main PID: 29784 (code=exited, status=0/SUCCESS)

7月 15 16:49:31 lvs1 systemd[1]: Starting Initialise the Linux Virtual Server...
7月 15 16:49:31 lvs1 systemd[1]: Finished Initialise the Linux Virtual Server.

3.2 检查web1 和web2(两台Rs) 的(nginx服务是否启用)

检查web1 和 web2 配置网卡信息是否正确( lo )

3.3 加载主和备 keepalived.conf

复制代码
[root@lvs1 keepalived]# systemctl restart keepalived.service 
[root@lvs2 keepalived]# systemctl restart keepalived.service 

3.4 加载ip_vs模块

复制代码
[root@lvs1]# modprobe ip_vs
[root@lvs2]# modprobe ip_vs

重启完出现相同路由规则标识已配置成功

复制代码
[root@lvs1 keepalived]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.109:80 rr persistent 50
  -> 192.168.100.10:80            Route   1      0          0         
  -> 192.168.100.11:80            Route   1      0          0    

4. 测试

1.测试Lvs

访问192.168.100.109 可以正常访问

停掉 LVS 的 Master 节点

复制代码
[root@lvs1 keepalived]# systemctl stop keepalived.service

观察主节点LVS节点 IP

复制代码
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:6a:66:62 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe6a:6662/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:6a:66:62 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.100/24 brd 192.168.100.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.100.109/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe6a:6662/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

重启Master 节点,我们发现ip又漂移回来了

2.测试nginx

我们关闭10节点的Nginx服务器(假如宕机状态)

复制代码
[root@web1 keepalived]# systemctl stop nginx

进入master节点进行查看集群信息

复制代码
[root@lvs1 keepalived]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.109:80 rr persistent 50
  -> 192.168.100.11:80            Route   1      0          0 
相关推荐
HLC++10 小时前
Linux的进程间通信
android·linux·服务器
groundhappy14 小时前
idalib安装和codex ida-mcp配置
linux·开发语言·python
通信小小昕15 小时前
Ubuntu 26.04 中文输入法安装
linux·运维·ubuntu
张小姐的猫16 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
栩栩云生16 小时前
AI 写代码犯的错,早被写进了错题集
linux·安全·ai编程
imc.1117 小时前
linux基础IO
linux·运维·服务器
BelongPanda19 小时前
Linux Nginx 纯手动 Let‘s Encrypt 泛域名证书配置教程
linux·nginx
酷可达拉斯20 小时前
Linux操作系统-shell编程(0)
linux·运维·服务器·python·云计算
2301_7779983420 小时前
Linux中断机制:操作系统如何高效运行
linux·运维·服务器
yunwei3720 小时前
eBPF 教程:检查 exec 后真正安装的可执行镜像
linux·开源