LVS (Linux Virtual Server) 是一种高性能的负载均衡解决方案,它基于 Linux 内核实现。LVS 可以用来构建高可用性和高性能的 Web 服务器集群。LVS 支持多种负载均衡算法和模式,可以有效地分发网络请求到多台后端服务器上。
LVS 的主要组成部分
1. Director(调度器):
- 负责接收客户端的请求,并根据一定的策略将请求分发给后端的真实服务器 (Real Server)。
- Director 可以是一台专门的机器,也可以是集群中的一台或多台机器。
2. Real Servers(真实服务器):
- 后端服务器,负责处理 Director 分发过来的请求,并将响应结果返回给 Director 或直接返回给客户端。
LVS 的工作模式
LVS 主要有三种工作模式:
1. NAT (Network Address Translation):
- 在这种模式下,Director 负责接收客户端的请求,然后通过 NAT 技术将请求转发给后端的真实服务器。
- 真实服务器处理请求后,将响应发送回 Director,Director 再将响应中的源 IP 地址转换为客户机 IP 地址,并转发给客户机。
- NAT 模式下的 Director 必须有足够的性能来处理大量的转发请求。
2. DR (Direct Routing):
- 在 DR 模式下,Director 和所有的真实服务器必须位于同一个物理网络中,并且共享同一个 IP 地址。
- 当 Director 收到请求时,它会修改请求的目的 MAC 地址,使得请求直接路由到真实的服务器。
- 真实服务器处理完请求后,直接将响应发回给客户端,无需经过 Director。
3. TUN (IP Tunneling):
- TUN 模式下,Director 和真实服务器可以在不同的物理网络中,但必须支持 IP 隧道技术。
- Director 收到请求后,将请求封装成一个新的 IP 数据包,并通过隧道发送给真实服务器。
- 真实服务器处理完请求后,再将响应封装成新的 IP 数据包,并通过隧道发送回客户端。
LVS 调度算法分类
1. 静态调度算法:
- 这些算法在调度时不会考虑后端服务器的实际负载情况。
- 一旦调度决策做出后,后续的数据包会遵循同样的规则进行分发。
2. 动态调度算法:
- 这些算法会根据后端服务器的当前负载情况以及其他条件实时地调整调度决策。
- 能够更好地适应后端服务器的动态变化。
LVS 静态调度算法
1. Round Robin (RR):
- 最基本的调度算法,按照顺序将请求分发给后端服务器。
- 适用于所有服务器性能相当的情况。
2. Weighted Round Robin (WRR):
- 为每台服务器分配一个权重值,根据权重值按比例分发请求。
- 适用于服务器性能不一的情况,性能较好的服务器可以承担更多的请求。
3. Destination Hash (DH):
- 根据目标 IP 地址进行哈希计算,将请求分发到特定的后端服务器。
- 适合于特定 IP 地址对应特定服务器的情况。
4. Source Hash (SH):
- 根据客户端 IP 地址进行哈希计算,将来自同一客户端的请求始终分发给同一台服务器。
- 实现会话保持,适用于需要保持会话状态的应用。
5. Weighted Fail Over (WFO):
- 当主服务器不可用时,将请求分发到备用服务器。
- 可以为备用服务器设置权重,决定备用服务器的优先级。
LVS 动态调度算法
1. Least Connections (LC):
- 根据每台服务器当前的连接数来决定将请求分发给哪一台服务器。
- 将请求分发给连接数最少的服务器。
2. Weighted Least Connections (WLC):
- 考虑服务器的权重和当前连接数,优先将请求分发给权重较高且连接数较少的服务器。
- 是 LVS 默认使用的调度算法。
3. Locality-Based Least Connections (LBLC):
- 考虑客户端 IP 地址的地理位置信息,将请求分发给地理位置相近的服务器。
- 适合于地理分布广泛的应用场景。
4. Locality-Based Least Connections with Replication (LBLCR):
- 与 LBLC 类似,但在 LBLC 的基础上增加了复制机制,可以提高容错能力。
5. Shortest Expected Delay (SED):
- 根据服务器的响应时间和连接数综合考虑,尽可能将请求分发给响应时间最短的服务器。
6. Never Queue (NQ):
- 当所有服务器都繁忙时,丢弃新的请求而不是排队等待。
- 适用于对响应时间要求较高的场景。
调度算法表格
ipvsadm 实验练习
一、NAT模式
实验前期准备
在使用虚拟机搭建环境时记得将往桥接lvs上添加对应网卡
lvs主机IP对应配置记得分nat和仅主机模式网卡对应的IP
vim /etc/NetworkManager/system-connections/eth0.nmconnection #打开配置文件
cat /etc/NetworkManager/system-connections/eth0.nmconnection #修改配置文件
打开lvs内核路由功能
sysctl -a | grep ip_forward #查看内核路由是否开启
vim /etc/sysctl.conf #在文件末尾添加
net.ipv4.ip_forward = 1
与配置lvs相同分别配置主机1 主机2
在两台主机上开启http功能
之后将参数上传并打开服务
检查初步配置是否正确
curl 192.168.0.10
环境搭建完毕开始实验
安装对应软件
dnf install ipvsadm -y #安装ipvsadm
配置信息实现简单的轮询调度
ipvsadm -A -t 172.25.254.100:80 -s rr
[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
在客户端测试是否正确
总结1 全部配置完成后一定要查看路由表是否生效。
实验二、DR模式
实验前期准备
保存上个实验所用的虚拟机在原有的主机上增加一台新的lvs 将原有lvs可以直接充当网关
新加入的lvs选择仅主机模式
在新加入的lvs中安装对应的软件
同时修改IP和网关
vim /etc/NetworkManager/system-connections/eth0.nmconnection #打开配置文件
cat /etc/NetworkManager/system-connections/eth0.nmconnection #修改配置文件
刷新路由
在两台主机与新lvs上配置
ip a a 192.168.0.200/32 dev lo
在两台主机上配置VIP不对外相应
[root@web2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@web2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_ignore
[root@web2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
测试
防火墙标签解决轮询错误
在两台主机中安装和启动mod_ssl ,apache。
yum install mod_ssl -y
systemctl restart httpd
在vs调度器中设定端口标签,让80和443端口成为一个整体
iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666
配置调度规则
[root@apache ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666
[root@apache ~]# ipvsadm -C
[root@apache ~]# ipvsadm -A -f 666 -s rr
[root@apache ~]# ipvsadm -a -f 666 -r 192.168.0.10 -g
[root@apache ~]# ipvsadm -a -f 666 -r 192.168.0.20 -g
查看规则是否生效
ipvsadm -Ln
测试
curl -k https://192.168.0.200;curl 192.168.0.200