LVS 介绍:
Linux Virtual Server(LVS)是一个基于Linux内核的开源软件项目,用于构建高性能、高可用性的服务器群集。LVS通过将客户端请求分发到一组后端服务器上的不同节点来实现负载均衡,从而提高系统的可扩展性和可靠性。
LVS的核心组件:
- IPVS(IP Virtual Server):IPVS是LVS的核心模块,它实现了负载均衡的功能。IPVS模块通过拦截传入的流量并进行调度,将请求分发给后端的实际服务器。它存储和管理负载均衡配置,并在内核空间进行数据包的转发。
-
负载均衡器 LB(Load Balancer):负载均衡器是LVS的中心组件,它是位于客户端和后端服务器之间的设备或软件。负载均衡器接收客户端请求,并根据配置的负载均衡策略将请求转发给后端服务器,以实现负载分发和高可用性。
- 后端服务器 RS(Real Server):后端服务器是LVS集群中实际处理客户端请求的服务器节点。它们分担负载并提供服务响应。
-
负载均衡调度算法:LVS支持多种负载均衡调度算法,用于确定请求应该转发到哪个后端服务器上。常见的调度算法包括轮询(Round Robin)、最少连接(Least Connection)、源地址哈希(Source IP Hash)等。通过选择适当的调度算法,可以根据应用需求在后端服务器之间平衡负载。
LVS的工作原理:
-
客户端发送请求:
客户端向LVS负载均衡器发送请求,请求的目标是负载均衡器的虚拟IP(Virtual IP)地址。 -
负载均衡器接收请求:
负载均衡器接收到来自客户端的请求,并根据预先配置的负载均衡算法选择一个后端服务器来处理该请求。 -
负载均衡算法选择后端服务器:
LVS支持多种负载均衡调度算法,例如轮询(Round Robin)、最少连接(Least Connection)、源地址哈希(Source IP Hash)等。根据指定的算法,负载均衡器将请求转发给一个后端服务器。选择后端服务器时考虑服务器的负载情况、可用性和性能指标。 -
请求转发到后端服务器:
负载均衡器将客户端请求转发给选定的后端服务器。根据配置的调度算法,请求可能会被平均地分发到多个后端服务器上,从而实现负载均衡。 -
后端服务器处理请求:
后端服务器接收到来自负载均衡器的请求,并处理该请求。后端服务器执行请求所需的任务,并生成响应。 -
响应返回至客户端:
后端服务器生成的响应流量经过负载均衡器,负载均衡器会将响应的目标地址重写为自己的地址,并将响应返回给客户端。 -
会话保持(可选):
为了保持会话的连贯性,LVS可通过会话保持功能使来自同一客户端的请求始终被分发到同一后端服务器上。这可以通过IP地址、Cookie等方式实现。
LVS负载均衡方式:
- NAT(Network Address Translation)方式:负载均衡器位于前端与客户端之间,调度器将客户端请求的源IP地址和端口转换为自己的IP地址和端口,并将请求转发到后端服务器。后端服务器的响应经过调度器再转发回客户端。
- DR(Direct Routing)方式:负载均衡器位于前端与后端服务器之间,不会修改流量的目标地址。调度器将客户端请求的目标IP地址和端口保持不变,直接将请求转发到后端服务器。后端服务器的响应不经过调度器,直接返回给客户端。
- TUN(IP Tunneling)方式:类似于DR方式,负载均衡器位于前端与后端服务器之间,并使用IP隧道将请求从客户端传递到后端服务器。负载均衡器将请求封装在一个新的IP包中,并将其发送到目标后端服务器上。后端服务器接收到请求后,解析IP隧道并响应客户端。也就是通过创建虚拟设备将数据包从调度器转发到后端服务器。
LVS名词解释:
- VS:Virtual Server 虚拟服务器,通常是分发器,负载均衡集群对外提供的IP+Por
- RS:Real Server 实际提供服务的真实服务器,可被DS划分到一个或多个负载均衡组.
-
DS:Director Server 负载均衡器,将流量分发到后端的真实服务器上.
-
BDS:Backup Director Server,为了保证负载均衡器的高可用衍生出的备份.
- CIP:Client IP 客户的客户端IP。
- VIP:Virtual Server IP,VS的IP。client请求服务的DIP(destination IP address),定义在DS上,client或其网关需要有其路由
- DIP:Director IP 分发器的IP
- RIP:Real Server IP 真实服务器的IP
CIP <–> VIP == DIP <–> RIP 客户端访问VIP,DIP将请求转发到RIP
1、NAT(Network Address Translation):
NAT 是通过网络地址转换的方法来实现调度的。
-
客户端发送请求:客户端向LVS负载均衡器发送请求,请求的目标地址是VIP。
-
负载均衡器接收请求:负载均衡器接收到来自客户端的请求,该请求VIP和CIP。
-
NAT转换:NAT模式下,负载均衡器会将请求包的VIP进行NAT转换,将其替换为负载均衡器的RIP。这样,在后续的网络通信中,响应流量将通过负载均衡器经过NAT转换返回给客户端。
-
负载均衡算法选择后端服务器:LVS负载均衡器根据预先配置的负载均衡算法选择一个后端服务器来处理该请求。
-
请求转发到后端服务器:负载均衡器将经过NAT转换后的请求转发给选定的后端服务器。后端服务器接收到请求后,将其视为来自负载均衡器的请求。
-
后端服务器处理请求, 并生成响应
-
响应返回至客户端:响应经过负载均衡器,负载均衡器进行NAT转换将响应的RIP替换为VIP,然后将响应返回给客户端。
2、DR(Direct Routing):
DR通过修改目标MAC地址来实现调度。DR 模式中,input经过DR,output不经过DR。为了响应对整个群集的访问,DS与RS都需要配置有VIP地址, 且DS与RS要处在同一网段。
-
客户端发送请求:客户端向LVS负载均衡器发送请求,请求的目标地址是VIP。
-
负载均衡器接收请求,并根据预先配置的负载均衡算法选择一个后端服务器来处理该请求。
-
负载均衡器修改目标MAC地址:在DR模式下,负载均衡器会修改请求数据包的目标MAC地址为所选后端服务器的MAC地址,并将数据包转发给后端服务器。这样,数据包越过负载均衡器,直接到达后端服务器。
-
后端服务器接收到来自负载均衡器的请求,并进行相应的处理和计算。
-
后端服务器生成响应,并将响应发送回客户端。在DR模式下,响应数据包将直接发送到客户端,绕过负载均衡器。
3、TUN(IP Tunneling):
在DR方式下,DS只修改数据包中数据链路层的MAC信息,IP信息不修改。于是DS通过MAC来定位RS,由此限制了DS和RS要处于同一网段。那么如果DS可以不通过MAC就可以定位到RS的话,也就不用限制RS和DS处于同一网段了。
TUN模式下,负载均衡器通过建立IP隧道,将请求和响应数据通过隧道在负载均衡器和后端服务器之间进行传输。IP隧道可以理解为IP in IP, 即发送方在IP头的外部再包装一个IP头,接收方先解出第一层IP头,然后再按照正常流程处理剩下的的IP数据包。
- 客户端发送请求:客户端向LVS负载均衡器发送请求,请求的目标地址是VIP。
-
负载均衡器接收请求:负载均衡器接收到来自客户端的请求,并根据预先配置的负载均衡算法选择一个后端服务器来处理该请求。
- 负载均衡器建立隧道:在TUN模式下,负载均衡器会与所选后端服务器建立一个IP隧道,以便在负载均衡器和后端服务器之间传输请求和响应数据。
-
负载均衡器转发请求:负载均衡器将来自客户端的请求打包,并通过隧道发送给后端服务器。
-
RS发现请求报文的IP地址是自己的eth0的IP地址,就剥掉IP隧道包头。
-
RS处理请求,生成响应,并将响应通过隧道发送回客户端。
LVS架构可以提供高性能和高可用性的负载均衡解决方案。通过将客户端请求分发到后端服务器上的多个节点,可以平衡系统负载并提供故障容错能力。同时,LVS具有开源、灵活和可定制的特点,可以根据实际需求进行配置和扩展。
需要注意的是,LVS只提供负载均衡功能,并不处理应用层的逻辑。应用层的会话维护、数据同步等需要通过其他方式来实现,如使用Session Persistence和数据库复制等。
LVS NAT模式配置:
环境说明:
主机名称 | 网卡信息(ens160为nat、ens192为仅主机) | 安装应用 | 系统 |
---|---|---|---|
Client客户端 | 192.168.100.200(ens160) | 无 | RHEL8 |
DS | DIP:192.168.253.142(ens160)–VIP:192.168.227.128(ens224) | ipvsadm | RHEL8 |
RS1 | RIP:192.168.253.143(ens160)–192.168.253.142 | httpd | RHEL8 |
RS2 | RIP:192.168.253.144(ens160)–192.168.253.142 | httpd | RHEL8 |
1、DR、RS1、RS2三台主机都关闭防火墙和selinux
DS:
[root@DS ~]# systemctl stop firewalld
[root@DS ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@DR ~]# vim /etc/sysconfig/selinux
SELINUX=disabled
RS1
[root@RS1 ~]# systemctl stop firewalld
[root@RS1 ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS1 ~]# vi /etc/sysconfig/selinux
SELINUX=disabled
RS2
[root@RS2 ~]# systemctl stop firewalld
[root@RS2 ~]# systemctl disable firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@RS2 ~]# vi /etc/sysconfig/selinux
SELINUX=disabled
2、配置IP信息
DS:添加ens224网卡信息
[root@DR ~]# nmcli connection add con-name ens224 ifname ens224 type ethernet
Connection 'ens224' (922bcff0-35fd-43c2-a608-edb0d58ccec3) successfully added.
[root@DR ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens160
IPADDR=192.168.253.142
PREFIX=24
DNS1=8.8.8.8
[root@DR ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens224
IPADDR=182.168.227.128
PREFIX=24
DNS1=8.8.8.8
[root@DR ~]# systemctl restart NetworkManager
[root@DR ~]# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
[root@DR ~]# nmcli connection up ens224
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
RS1:
[root@RS1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens160
IPADDR=192.168.253.143
PREFIX=24
GATEWAY=192.168.253.142
DNS1=8.8.8.8
[root@RS1 ~]# systemctl restart NetworkManager
[root@RS1 ~]# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
RS2:
[root@RS2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens160
IPADDR=192.168.253.144
PREFIX=24
GATEWAY=192.168.253.142
DNS1=8.8.8.8
[root@RS2 ~]# systemctl restart NetworkManager
[root@RS2 ~]# nmcli connection up ens160
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
3、后端RS1和RS2部署WEB服务器
[root@RS1 ~]# yum -y install httpd
[root@RS1 ~]# echo RS1 > /var/www/html/index.html
[root@RS1 ~]# systemctl restart httpd
[root@RS1 ~]# systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@RS2 ~]# yum -y install httpd
[root@RS2 ~]# echo RS2 > /var/www/html/index.html
[root@RS2 ~]# systemctl restart httpd
[root@RS2 ~]# systemctl enable httpd
4、配置DS
4.1、开启IP转发功能
[root@DR ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@DR ~]# sysctl -p
net.ipv4.ip_forward = 1
4.2、安装ipvsadm并添加规则
[root@DR ~]# yum -y install ipvsadm
[root@DR ~]# ipvsadm -A -t 192.168.227.128:80 -s rr
[root@DR ~]# ipvsadm -a -t 192.168.227.128:80 -r 192.168.253.143:80 -m
[root@DR ~]# ipvsadm -a -t 192.168.227.128:80 -r 192.168.253.144:80 -m
[root@DR ~]# 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.227.128:80 rr
-> 192.168.253.143:80 Masq 1 0 0
-> 192.168.253.144:80 Masq 1 0 0
[root@DR ~]# ipvsadm -Sn > /etc/sysconfig/ipvsadm
[root@DR ~]# systemctl restart ipvsadm.service
[root@DR ~]# systemctl enable ipvsadm.service
Created symlink /etc/systemd/system/multi-user.target.wants/ipvsadm.service → /usr/lib/systemd/system/ipvsadm.service.
5、客户端测试:
[root@RS3 ~]# curl http://192.168.227.128
RS2
[root@RS3 ~]# curl http://192.168.227.128
RS1
[root@RS3 ~]# curl http://192.168.227.128
RS2
[root@RS3 ~]# curl http://192.168.227.128
RS1
配置信息转载自: LVS 教程