LVS基本介绍
-
LVS(Linux Virtual Server)是一个开源的负载均衡解决方案,它基于Linux平台,通过将多个服务器组成一个虚拟服务器集群,实现高效的流量分发和管理。LVS的核心功能是在网络的第四层(传输层)上进行智能的流量分配,从而提高网络吞吐量和系统可用性。
-
LVS项目由章文嵩博士在1998年发起,是中国最早出现的自由软件项目之一。它被集成到Linux内核中,利用内核模块实现IP层面的数据请求负载均衡调度。LVS能够使得终端用户通过外部负载均衡服务器访问后端的Web服务器,而用户感知到的是一个统一的服务,实际上请求被分配到了后端的多个服务器上。
LVS企业架构示意图
LVS中的IP地址术语
IP类型 | 缩写 | 描述 | 用途 |
虚拟IP | VIP (Virtual IP) | LVS集群对外提供服务的IP地址,客户端请求直接发送到此地址 | 接收进入的请求并分发到后端真实服务器 |
调度器IP | DIP (Director IP) | LVS调度器用于与后端真实服务器通信的IP地址 | 在NAT模式下,作为私网接口与真实服务器通信 |
真实服务器IP | RIP (Real IP) | 后端真实服务器的IP地址,与LVS调度器通信 | 接收来自LVS的请求并处理,然后直接或通过LVS发送响应 |
LVS的工作模式
1、LVS/NAT模式
-
网络地址转换(NAT):在这种模式下,LVS充当一个路由器和NAT设备。客户端的原始请求到达LVS后,LVS会修改请求的数据包,将目标IP地址从VIP改为选定的真实服务器(RS)的IP地址(RIP),同时也会修改目标端口(如果使用端口映射)。然后,请求被发送到后端的RS。
-
数据流向:RS处理请求并生成响应,响应包的源IP是RS的IP地址,目标IP是客户端的IP地址。当响应包返回到LVS时,LVS再次修改数据包,将源IP地址从RS的IP地址改为VIP,并将源端口改回客户端的端口,然后将响应转发给客户端。
-
特点:NAT模式下,LVS处理所有的请求和响应,因此可能成为性能瓶颈。但它的优点是安全性较高,因为RS的IP地址不会被客户端直接看到
2、LVS/DR模式(直接路由模式)
-
直接路由(Direct Routing):在DR模式下,LVS仅修改请求数据包的目标MAC地址,使其直接发送到选定的RS,而不是通过LVS转发。这样,请求的IP地址保持不变,目标MAC地址改为RS的MAC地址。
-
数据流向:RS处理请求后,响应包的源MAC和源IP是RS的地址和IP,目标MAC和目标IP是客户端的地址和IP,因此响应包直接发送给客户端,不再经过LVS。
-
网络要求:由于MAC地址是针对特定网络段的,所以RS和LVS必须位于同一个物理网络段中。
NAT模式下实验准备工作
- VMware的网卡设置:一个网卡设置仅主机模式,网段为192.168.0.0/24 另一个网卡设置仅主机模式,网段为172.25.254.0/24
- 准备四台环境干净的虚拟机
- 防火墙及其selinux都处于关闭状态
LVS网络配置
[root@lvs ~]# vmset.sh eth0 172.25.254.100 lvs
[root@lvs ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@lvs ~]# vmset.sh eth1 192.168.0.100 lvs
[root@lvs ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
[root@lvs ~]# nmcli connection reload
[root@lvs ~]# nmcli connection up eth1
修改 ARP 内核配置做ARP抑制
[root@lvs ~]# cat >> /etc/sysctl.conf << EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.all.arp_announce = 2
> EOF
LVS配置
安装部署
[root@lvs ~]# yum install ipvsadm -y
编写策略
[root@lvs ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
#虚拟VIP为172.25.254.100,算法为轮询
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10:80 -m
[root@lvs ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20:80 -m
# 查看
[root@lvs ~]# 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
-> 192.168.0.10:80 Masq 1 0 0
-> 192.168.0.20:80 Masq 1 0 0
RS1
[root@webserver ~]# vmset.sh eth0 192.168.0.10 webserver
[root@webserver ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@webserver ~]# nmcli connection reload
[root@webserver ~]# nmcli connection up eth0
安装web服务
[root@webserver ~]# yum install httpd -y
[root@webserver ~]# echo webserver 192.168.0.10 > /var/www/html/index.html
[root@webserver ~]# systemctl enable --now httpd
测试(在客户机上测试)
DR模式下实验准备工作
客户机
IP:172.25.254.200/24
gateway:172.25.254.100
Route
#!/bin/bash
rm -fr /etc/NetworkManager/system-connections/$1.nmconnection
cat > /etc/NetworkManager/system-connections/$1.nmconnection <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1
[ipv4]
address1=$2/24,172.25.254.2
method=manual
dns=114.114.114.114;
EOF
chmod 600 /etc/NetworkManager/system-connections/$1.nmconnection
nmcli connection reload
nmcli connection up $1
hostnamectl hostname $3
cat > /etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
$2 $3
EOF
[root@route ~]# vmset.sh eth0 172.25.254.100 route
[root@route ~]# vmset.sh eth1 192.168.0.100 route
[root@route ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
[root@route ~]# nmcli connection reload
[root@route ~]# nmcli connection up eth1
打开内核路由功能
[root@lvs ~]# cat >> /etc/sysctl.conf << EOF
> net.ipv4.conf.all.arp_ignore = 1
> EOF
LVS配置
[root@lvs1 ~]# vmset.sh eth1 192.168.0.50 lvs
[root@lvs1 ~]# vim /etc/NetworkManager/system-connections/eth1.nmconnection
[root@lvs1 ~]# nmcli connection reload
[root@lvs1 ~]# nmcli connection up eth1
添加vip,采用环回,注意环回的掩码需要使用32位
[root@lvs1 ~]# ip a a 192.168.0.200/32 dev lo
安装lvs软件
[root@lvs ~]# dnf install ipvsadm -y
编写策略
[root@lvs1 ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@lvs1 ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -m
[root@lvs1 ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -m
RS1
[root@webserver ~]# vmset.sh eth0 192.168.0.10 webserver
[root@webserver ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@webserver ~]# nmcli connection reload
[root@webserver ~]# nmcli connection up eth0
修改网关
安装web服务
[root@webserver ~]# yum install httpd -y
[root@webserver ~]# echo webserver 192.168.0.10 > /var/www/html/index.html
[root@webserver ~]# systemctl enable --now httpd
修改rip,使RS主机VIP不对外响应
[root@webserver ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
添加vip,采用环回,注意环回的掩码需要使用32位
[root@webserver ~]# ip a a 192.168.0.200/32 dev lo
RS2
[root@webserver2 ~]# vmset.sh eth0 192.168.0.20 webserver2
[root@webserver2 ~]# vim /etc/NetworkManager/system-connections/eth0.nmconnection
[root@webserver2 ~]# nmcli connection reload
[root@webserver2 ~]# nmcli connection up eth0
修改网关
修改rip,使RS主机VIP不对外响应
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
添加vip,采用环回,注意环回的掩码需要使用32位
[root@webserver2 ~]# ip a a 192.168.0.200/32 dev lo
安装web服务
[root@webserver2 ~]# yum install httpd -y
[root@webserver2 ~]# echo webserver2 192.168.0.20 > /var/www/html/index.html
[root@webserver2 ~]# systemctl enable --now httpd
测试(在客户机上测试)
[root@client ~]# for i in {1..10}
> do
> curl 192.168.0.200
> done
werbserver2 192.168.0.20
webserver 192.268.0.10
werbserver2 192.168.0.20
werbserver2 192.168.0.20
webserver 192.268.0.10
werbserver2 192.168.0.20
werbserver2 192.168.0.20
webserver 192.268.0.10
werbserver2 192.168.0.20
werbserver2 192.168.0.20
[root@client ~]#