IPVS的高可用实战

LVS+Keepalived的组合,可以理解为一个既能打又能抗的黄金搭档

简单来说:LVS负责高效地分配流量(干活),而Keepalived则确保这个分配工作本身不会中断(保命)

一、LVS原理

LVS(Linux虚拟服务器):负责"干活"的流量分发官

LVS是集成在Linux内核中的负载均衡器,性能极高,能轻松处理海量并发请求。

它的工作原理就像一个快递站的分拣中心

  1. 接收请求 :所有用户请求都发送到一个统一的虚拟IP地址(VIP)

  2. 智能分发:LVS根据预设的算法(如轮询、最少连接等),将请求高效地转发给后端的真实服务器(Real Server)。

  3. 处理响应:真实服务器处理完请求后,直接将结果返回给用户(在效率最高的DR模式下),不再经过LVS,避免其成为瓶颈

二、keepalived原理

Keepalived:负责"保命"的高可用守护神

Keepalived最初就是为LVS设计的,它的核心是实现了VRRP(虚拟路由冗余协议)

它的工作就像给"分拣中心"主任配了个随时待命的影子替身

  1. 心跳检测:主服务器(MASTER)和备用服务器(BACKUP)之间通过VRRP协议持续通信,互报平安。

  2. 故障切换 :如果备用机收不到主机的"心跳",就会判定主机故障,并立即抢过虚拟IP(VIP) 绑定在自己身上。

  3. 自动恢复:当原主机恢复后,Keepalived可以配置让它重新抢回VIP,或保持当前状态。

此外,Keepalived还能主动健康检查后端真实服务器,自动剔除故障机器,并在其恢复后重新加入

三、架构全景:各司其职

一个典型的LVS+Keepalived集群由以下部分组成:

  • 两台LVS服务器(主/备):安装Keepalived,通过VRRP协议共享一个VIP。

  • 多台真实服务器(Real Server):实际处理业务请求(如Nginx、Tomcat)。

  • 共享存储(可选):保证数据一致性。

四、操作实战

以下是搭建一个基础的高可用负载均衡环境的核心步骤。

  1. 环境准备 :准备至少4台Linux服务器(2台做LVS,2台做Real Server),并规划好IP。
  • LVS主服务器(KA1):172.25.254.50

  • LVS备服务器(KA2):172.25.254.60

  • 虚拟IP (VIP):172.25.254.100

  • 真实服务器RS1:172.25.254.10

  • 真实服务器RS2:172.25.254.20

  1. 安装软件:在所有服务器上关闭防火墙和SELinux。

    • 在两台LVS服务器上安装Keepalived和LVS管理工具:yum install -y keepalived ipvsadm

    • 在Real Server上只需安装并启动你的Web服务(如Nginx)。本次实战实验使用Nginx

在RS1中

bash 复制代码
echo 172.25.254.10 - RS1 /usr/share/nginx/html/index.html
systemctl enable --now nginx.service

在RS2中

bash 复制代码
echo 172.25.254.20 - RS2 /usr/share/nginx/html/index.html
systemctl enable --now nginx.service

测试

2.配置Keepalived(核心) :编辑主LVS的 /etc/keepalived/keepalived.conf。(此处做了日志分离),各位按照实际情况进行调整

    • 定义全局参数 :设置路由标识 router_id

    • 定义VRRP实例 :设置初始状态(state MASTER)、虚拟IP(virtual_ipaddress)等。备用服务器配置类似,只需将 state 改为 BACKUP,并确保 priority 值低于主机。

    • 配置LVS集群 :指定LVS的工作模式(如DR)、调度算法(如rr轮询)和后端真实服务器列表(real_server)。备用服务器的配置与主机完全一致

在KA1+2中配置keepalived

bash 复制代码
​
vim /etc/keepalived/conf.d/webvip.conf 


vrrp_instance WEB_VIP {
    state MASTER
    interface eth0
    virtual_router_id 51
    #preempt_delay 10
    priority 100
    advert_int 1
    #unicast_src_ip 172.25.254.50               #指定单播源地址,通常是本机IP
    #unicast_peer {
    #  172.25.254.60                                            #指定单播接收地址
    #}
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.100/24 dev eth0 label eth0:0
    }
    #notify_master "/etc/keepalived/scripts/waring.sh master"
    #notify_backup "/etc/keepalived/scripts/waring.sh backup"
    #notify_fault "/etc/keepalived/scripts/waring.sh fault"
}


vrrp_instance DB_VIP {                          #第二个虚拟路由。以backup身份设定
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        172.25.254.200/24 dev eth0 label eth0:1
    }
}

virtual_server 172.25.254.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    protocol TCP
    sorry_server 172.25.254.60
    real_server 172.25.254.10 80 {
        weight 1
        TCP_CHECK {
          connect_timeout 5
          retry 3
          delay_before_retry 3
          connect_port 80

    }
}

     real_server 172.25.254.20 80 {
        weight 2
        HTTP_GET {
            connect_timeout 1
            retry 3
            delay_before_retry 1
            url {
                path /
                status_code 200
      }
    }
   }
}

​

重启服务

bash 复制代码
 systemctl restart keepalived.service

在KA1+2中配置LVS策略

bash 复制代码
ipvsadm -A -t 172.25.254.100:80  -s rr
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.10 -g
ipvsadm -a -t 172.25.254.100:80 -r 172.25.254.20 -g

查看策略

bash 复制代码
ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr
  -> 172.25.254.10:80             Route   1      0          0         
  -> 172.25.254.20:80   

在windows中检查配置是否成功

3.配置真实服务器(以DR模式为例):为了让Real Server能正确处理发往VIP的请求,需要进行特殊配置。

  1. 绑定VIP到回环接口 :在lo接口上绑定VIP,但不响应ARP请求,避免IP冲突。
  2. 添加路由 :添加一条路由,指明目标为VIP的数据包从lo接口处理。
  3. 抑制ARP响应 :修改内核参数 (arp_ignore, arp_announce),让服务器忽略对VIP的ARP请求,确保只有LVS响应。

配置RS1+2

bash 复制代码
[root@rs1+2 ~]# cd /etc/NetworkManager/system-connections/
[root@rs1+2 system-connections]# ls
eth0.nmconnection
[root@rs1+2 system-connections]# cp eth0.nmconnection lo.nmconnection -p
[root@rs1+2 system-connections]# vim lo.nmconnection

[connection]
id=lo
type=loopback
interface-name=lo


[ipv4]
method=manual
address1=127.0.0.1/8
address2=172.25.254.100/32


[root@rs1+2 system-connections]# nmcli connection reload
[root@rs1+2 system-connections]# nmcli connection up lo
[root@rs1+2 system-connections]# 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 172.25.254.100/32 scope global lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:1a:e2:01 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 172.25.254.10/24 brd 172.25.254.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::ac3b:5c1c:bb2a:628e/64 scope link noprefixroute
       valid_lft forever preferred_lft forever


[root@rs1+2 system-connections]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.lo.arp_ignore=1

[root@rs1+2 system-connections]# sysctl  -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1

​​​​​​​4.启动与验证

#友情提示:不要再KA1和KA2中访问vip,会检测不出效果,因为LVS的DR模式要求请求必须从客户端经过LVS进入RS,如果从LVS本机访问VIP,数据包不会经过LVS的转发链条,可能导致连接失败或进入死循环

#在ka1中开启独立的shell

root@KA1 \~# watch -n 1 ipvsadm -Ln

bash 复制代码
[root@KA1 ~]# watch -n 1 ipvsadm -Ln

#在RS1中关闭web服务查看lvs策略是否变化

#把ka1中的keepalived关闭查看ka2中是否自动生成lvs策略

测试:

关闭KA1keepalived服务

观察KA2

此时仍能正常访问10.20,高可用部署成功

相关推荐
王琦03183 小时前
Linux的文件管理
linux·运维·服务器
xlq223223 小时前
高并发服务器day13
运维·服务器
Android系统攻城狮3 小时前
Linux PipeWire深度解析之pw_stream_new调用流程与实战(四十二)
linux·运维·服务器·音频进阶·pipewire音频进阶
Ivan CloudBay3 小时前
CDN 能完全隐藏源服务器 IP 吗?
运维·服务器·tcp/ip
七夜zippoe3 小时前
OpenClaw Prompt 工程:从角色设定到 Skill 封装的 Agent 输出质量方法论
java·服务器·prompt·openclaw·skill封装
AAA@峥3 小时前
OpenStack Keystone 认证服务完整学习指南
服务器·云计算·openstack
沉迷学习 日益消瘦4 小时前
13-Ingress 生产实战
运维·kubernetes
Dawn-bit5 小时前
Linux日志处理三剑客之基础篇:(基础正则+扩展正则)
linux·运维·服务器·正则表达式·云计算·运维开发
暗影凋落5 小时前
docker-image 工具展示更详细镜像层内容
运维·docker·容器
深圳市爱派派智能科技有限公司5 小时前
“进迭时空 RISC-V 集群服务器 CSB1-N10SPK3:10 节点 K3,600 TOPS 绿色算力“
运维·服务器·risc-v·k3·进迭时空·集群服务器