Keepalived+LVS高可用集群
一、核心概念理解
1.1 LVS(Linux Virtual Server)
LVS 是基于 Linux 内核的开源负载均衡解决方案,工作在 OSI 模型的第四层(传输层)。它主要有三种模式,各自有着独特的工作原理和适用场景。
-
NAT(网络地址转换)模式:负载均衡器(Director)同时处理入站和出站流量。它会修改数据包的源 IP 地址(SNAT)和目标 IP 地址(DNAT),使得后端真实服务器(Real Server)的网关需要设置为负载均衡器的 IP 地址。这种模式的优点是支持端口映射,配置相对简单,适合小规模集群。但缺点也很明显,当流量较大时,负载均衡器会成为瓶颈,因为所有流量都要经过它转发。
-
DR(直接路由)模式:这是生产环境中常用的模式。负载均衡器仅处理入站请求,通过修改数据包的目标 MAC 地址将请求转发给后端服务器。后端服务器直接将响应返回给客户端,无需经过负载均衡器。这种模式下,所有节点需处于同一局域网,并且后端服务器需要注意 VIP 地址的绑定和抑制 ARP 的问题。DR 模式的性能非常高,因为响应不经过负载均衡器,大大减轻了其负担,适合大规模的 Web 服务等对性能要求较高的场景。
-
TUN(隧道)模式:数据包会被封装在 IP 隧道中进行传输,后端服务器可以直接返回响应给客户端,并且可以在广域网中使用。不过,由于其配置相对复杂,现在基本被 HAProxy 等其他工具取代。
1.2 Keepalived
Keepalived 是一款功能强大的开源软件,主要有以下核心功能:
-
基于 VRRP 协议实现高可用性:VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)允许多个服务器共享一个虚拟 IP 地址(VIP)。在一个高可用集群中,Keepalived 会选举出一个主服务器(Master),负责处理流量。如果主服务器发生故障,备用服务器(Backup)会根据 VRRP 协议接管 VIP,继续提供服务,从而实现无缝的故障转移,确保服务的持续性。例如,在一个 Web 服务集群中,当主 Web 服务器出现硬件故障或软件异常时,备用 Web 服务器能迅速接替其工作,用户几乎不会察觉到服务中断。
-
健康检查功能:Keepalived 可以对后端服务器进行健康检查。它支持多种检查方式,如 TCP_CHECK(检查指定端口是否开放)、HTTP_GET(发送 HTTP 请求检查响应状态码)、MISC_CHECK(执行自定义脚本进行复杂检查,比如检查数据库连接是否正常)。通过持续监控后端服务器的状态,Keepalived 能及时发现故障服务器,并将其从负载均衡池中移除,避免向不可用的服务器发送请求,直到服务器恢复正常。
-
配置管理 LVS:Keepalived 可以动态生成和管理 LVS 的规则,简化了 LVS 的配置过程。它与 LVS 紧密结合,为构建高可用负载均衡集群提供了便利。
二、DR 模式部署实战
2.1 网络拓扑规划
角色 | IP 地址 | 软件 |
---|---|---|
LVS - Master | 192.168.10.105(DIP)192.168.10.172(VIP) | Keepalived + LVS |
LVS - Backup | 192.168.10.104(DIP)192.168.10.172(VIP) | Keepalived + LVS |
Web - Server2 | 192.168.10.103(RIP) lo:0 192.168.10.172 | httpd |
Web - Server1 | 192.168.10.102(RIP) lo:0 192.168.10.172 | httpd |
客户端 | 192.168.10.0/24 网段任意 IP | - |
2.2 LVS 主备节点配置(两台上操作)
编辑配置文件
[root@lvs_keep_master ~]# cd /etc/keepalived/
[root@lvs_keep_master keepalived]# ls
keepalived.conf.sample
[root@lvs_keep_master keepalived]# cp keepalived.conf.sample keepalived.conf
[root@lvs_keep_master keepalived]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived # 表明这是 Keepalived 的配置文件global_defs {router_id LVS_01 # 定义 Keepalived 实例的唯一标识,在集群环境中用于区分不同的 Keepalived 节点,这里命名为 LVS_01
}vrrp_instance VI_1 { # 定义一个 VRRP 实例,实例名称为 VI_1state MASTER # 该节点的初始状态为 MASTER(主节点),备用节点应设置为 BACKUPinterface ens160 # 指定绑定虚拟 IP 的物理网络接口,这里使用 ens160 接口virtual_router_id 51 # 虚拟路由器 ID,同一 VRRP 组内的节点该 ID 需相同,用于标识一个 VRRP 集群priority 100 # 设置该节点在 VRRP 组中的优先级,数值越高越优先成为主节点,这里优先级为 100advert_int 1 # 定义 VRRP 组内节点之间发送心跳通告的时间间隔,单位为秒,这里间隔为 1 秒authentication { # 配置 VRRP 认证信息,用于保证节点间通信的安全性auth_type PASS # 认证类型为密码认证auth_pass 1111 # 认证密码,同一 VRRP 组内的节点密码需一致}virtual_ipaddress {192.168.10.172 # 定义虚拟 IP 地址,客户端通过该 IP 访问负载均衡后的服务}
}virtual_server 192.168.10.172 80 { # 定义一个虚拟服务器,绑定虚拟 IP 192.168.10.172 和端口 80delay_loop 6 # 设置健康检查的时间间隔,单位为秒,这里每隔 6 秒检查一次后端服务器状态lb_algo rr # 负载均衡算法采用轮询(Round Robin),将请求依次轮流分配到后端服务器lb_kind DR # 指定 LVS 的工作模式为直接路由(Direct Routing)模式# persistence_timeout 50 # 会话保持时间,注释掉表示未启用会话保持功能,若启用可确保同一客户端请求在一定时间内被转发到同一后端服务器protocol TCP # 服务使用的协议为 TCP 协议real_server 192.168.10.102 80 { # 定义后端真实服务器 1,IP 为 192.168.10.102,端口为 80weight 1 # 设置该服务器的权重,权重越高分配到的请求越多,这里权重为 1TCP_CHECK{ # 采用 TCP 检查方式监控后端服务器状态connect_timeout 3 # 连接超时时间,尝试连接服务器超过 3 秒则认为连接失败retry 3 # 重试次数,连接失败后最多重试 3 次delay_before_retry 3 # 每次重试的间隔时间,单位为秒,这里间隔 3 秒}}real_server 192.168.10.103 80 { # 定义后端真实服务器 2,IP 为 192.168.10.103,端口为 80weight 1 # 设置该服务器的权重为 1TCP_CHECK{ # 同样采用 TCP 检查方式监控该服务器状态connect_timeout 3 # 连接超时时间为 3 秒retry 3 # 连接失败后重试 3 次delay_before_retry 3 # 重试间隔 3 秒}}
}
MASter模式强制抢占模式
backup 默认不抢占
验证
[root@lvs_keep_master keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host noprefixroute valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:4b:2c:33 brd ff:ff:ff:ff:ff:ffinet 192.168.10.104/24 brd 192.168.10.255 scope global noprefixroute ens160valid_lft forever preferred_lft foreverinet 192.168.10.172/32 scope global ens160 !!!!#192.168.10.172这个vip由优先级最高者承担valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe4b:2c33/64 scope link noprefixroute valid_lft forever preferred_lft forever
2.3 安装并配置http(两台上操作)
代码
[root@web1 ~]# dnf -y install httpd
[root@web1 ~]# echo "web1" >/var/www/html/index.html
[root@web1 ~]# systemctl start httpd
[root@web1 ~]# ip addr add 192.168.10.172/32 dev lo label lo:0
[root@web1 ~]# vim /etc/rc.local
ip addr add 192.168.10.172/32 dev lo label lo:0
[root@web1 ~]# chmod +x /etc/rc.local
解释
1. 安装并配置 HTTP 服务
[root@web1 ~]# dnf -y install httpd
[root@web1 ~]# echo "web1" >/var/www/html/index.html
[root@web1 ~]# systemctl start httpd
- 安装 Apache HTTP 服务器:
dnf -y install httpd
- 创建测试页面:使用
echo "web1" >/var/www/html/index.html
创建一个简单的 HTML 文件,内容为 “web1” - 启动 HTTP 服务:
systemctl start httpd
2. 配置 VIP 绑定到回环接口
[root@web1 ~]# ip addr add 192.168.10.172/32 dev lo label lo:0
- 添加 VIP 到本地回环接口:将虚拟 IP (192.168.10.172) 绑定到 lo 接口(即 127.0.0.1)
- 为什么需要这样做?:在 LVS DR 模式下,后端服务器必须能够接收并响应发往 VIP 的请求
3. 设置开机自动绑定 VIP
[root@web1 ~]# vim /etc/rc.local
ip addr add 192.168.10.172/32 dev lo label lo:0
[root@web1 ~]# chmod +x /etc/rc.local
- 编辑启动脚本:在
/etc/rc.local
中添加命令,确保每次系统启动时都绑定 VIP - 赋予执行权限:
chmod +x /etc/rc.local
使脚本可以被执行
关键点解释
- DR 模式工作原理:
- LVS 负载均衡器接收请求,修改 MAC 地址后转发给后端服务器
- 后端服务器直接回应客户端,无需通过负载均衡器
- 因此,后端服务器必须能够处理发往 VIP 的流量
- 为什么绑定到 lo 接口?:
- 在 DR 模式中,VIP 只需要在负载均衡器上对外可见
- 后端服务器通过 lo 接口接收 VIP 流量,但不会将其作为出站 IP
- 这样可以确保响应数据包直接返回给客户端,而不是通过负载均衡器
- 为什么需要开机自动绑定?:
- 如果服务器重启,VIP 绑定会丢失
- 通过
/etc/rc.local
确保系统启动时自动恢复 VIP 绑定
这个配置是 LVS DR 模式的标准做法,确保后端服务器能够正确响应发往 VIP 的请求,同时保持流量的直接路由。
2.4验证集群服务是否正确
客户端访问我的vip 192.168.10.172
我们使用的是rr
[root@bogon ~]# curl 192.168.10.172
web1
[root@bogon ~]# curl 192.168.10.172
web2
关闭master lvs验证vip漂移
[root@lvs_keep_master keepalived]# systemctl stop keepalived ###在master上关闭
[root@lvs_keep_backup keepalived]# ip a ###backup上查看
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host noprefixroute valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:5c:e8:d8 brd ff:ff:ff:ff:ff:ffinet 192.168.10.105/24 brd 192.168.10.255 scope global noprefixroute ens160valid_lft forever preferred_lft foreverinet 192.168.10.172/32 scope global ens160 ###vipvalid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe5c:e8d8/64 scope link noprefixroute valid_lft forever preferred_lft forever
验证keepalived健康检查
[root@web2 ~]# systemctl stop httpd ###关闭web2
[root@lvs_keep_backup 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.10.172:80 rr-> 192.168.10.102:80 Route 1 0 19
###这里已经删除了103的条目客户端访问vip[root@bogon ~]# curl 192.168.10.172
web1
[root@bogon ~]# curl 192.168.10.172
web1
[root@bogon ~]# curl 192.168.10.172
web1