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 
相关推荐
程序员JerrySUN8 分钟前
Linux 文件系统实现层详解:原理、结构与驱动衔接
android·linux·运维·数据库·redis·嵌入式硬件
HainesFreeman2 小时前
Linux、Ubuntu和CentOS的关系与区别
linux·ubuntu·centos
yuanManGan2 小时前
Linux基本指令(一)
linux·运维·服务器
珹洺3 小时前
Linux操作系统从入门到实战(十)Linux开发工具(下)make/Makefile的推导过程与扩展语法
linux·运维·服务器
星哥说事3 小时前
Linux管理不用记命令!Linux安装可视化管理工具Cockpit安装使用
linux
不会敲代码的XW5 小时前
LVS(Linux Virtual Server)详细笔记(理论篇)
linux·笔记·lvs
路飞雪吖~5 小时前
【Linux】线程创建&&等待&&终止&&分离
linux·开发语言
♛暮辞6 小时前
centos 安装java 环境
java·linux·centos
不脱发的程序猿6 小时前
嵌入式Linux:进程间通信机制
linux
喧星Aries7 小时前
进程的内存映像,只读区,可读写区,堆,共享库,栈详解
linux·操作系统·计算机组成原理