LVS+Keepalived的组合,可以理解为一个既能打又能抗的黄金搭档。
简单来说:LVS负责高效地分配流量(干活),而Keepalived则确保这个分配工作本身不会中断(保命)
一、LVS原理
LVS(Linux虚拟服务器):负责"干活"的流量分发官
LVS是集成在Linux内核中的负载均衡器,性能极高,能轻松处理海量并发请求。
它的工作原理就像一个快递站的分拣中心:
-
接收请求 :所有用户请求都发送到一个统一的虚拟IP地址(VIP)。
-
智能分发:LVS根据预设的算法(如轮询、最少连接等),将请求高效地转发给后端的真实服务器(Real Server)。
-
处理响应:真实服务器处理完请求后,直接将结果返回给用户(在效率最高的DR模式下),不再经过LVS,避免其成为瓶颈
二、keepalived原理
Keepalived:负责"保命"的高可用守护神
Keepalived最初就是为LVS设计的,它的核心是实现了VRRP(虚拟路由冗余协议)。
它的工作就像给"分拣中心"主任配了个随时待命的影子替身:
-
心跳检测:主服务器(MASTER)和备用服务器(BACKUP)之间通过VRRP协议持续通信,互报平安。
-
故障切换 :如果备用机收不到主机的"心跳",就会判定主机故障,并立即抢过虚拟IP(VIP) 绑定在自己身上。
-
自动恢复:当原主机恢复后,Keepalived可以配置让它重新抢回VIP,或保持当前状态。
此外,Keepalived还能主动健康检查后端真实服务器,自动剔除故障机器,并在其恢复后重新加入
三、架构全景:各司其职
一个典型的LVS+Keepalived集群由以下部分组成:
-
两台LVS服务器(主/备):安装Keepalived,通过VRRP协议共享一个VIP。
-
多台真实服务器(Real Server):实际处理业务请求(如Nginx、Tomcat)。
-
共享存储(可选):保证数据一致性。
四、操作实战
以下是搭建一个基础的高可用负载均衡环境的核心步骤。
- 环境准备 :准备至少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
-
安装软件:在所有服务器上关闭防火墙和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的请求,需要进行特殊配置。
- 绑定VIP到回环接口 :在
lo接口上绑定VIP,但不响应ARP请求,避免IP冲突。 - 添加路由 :添加一条路由,指明目标为VIP的数据包从
lo接口处理。 - 抑制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,高可用部署成功
