Linux Virtual Server
1. 作用
LVS 是一种集成在 Kerner
中的 IP 负载均衡技术,基于 layer-4
,主要是为了解决互联网上的流量剧增,从而导致后端服务器过载。基于调度程序的负载均衡集群,对客户端是透明无感知的,并且可以自动剔除故障服务器。达到后端服务的高可用,LVS 官方拥有 3 种工作模式。
1.2 内核模块
ipvs 是内核功能, 查看内核是否加载 ipvs
$ lsmod|grep ip_vs
$ modprobe ip_vs
1.3 ipvs 工具
由于 ipvs 工作在内核空间, 用户无法直接操作,需要 ipvsadm 工具来操作。
$ apt install ipvsadm
ipvsadm 工具用法:
- 查看规则
$ ipvsadm -Ln
- 创建集群
# 指定 暴露VIP的80服务,-t 为 tcp 协议, 默认算法为 wlc 就是轮询
$ ipvsadm -A -t 10.10.10.100:80
- 为集群添加 RS
# -m 指定使用 nat 模式, -r 指定添加 rs 的地址。
$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.101:80 -m
$ ipvsadm -a -t 10.10.10.100:80 -r 10.10.10.102:80 -m
- 清空集群
$ ipvsadm -C
- ipvs 内核文件
# 1. ipvs 规则
$ cat /proc/net/ip_vs
# 2. ipvs 连接
$ cat /proc/net/ip_vs_conn
- 规则保存
# 保存规则
$ ipvsadm-save > /PATH/TO/IPVSADM_FILE
$ ipvsadm -S > /PATH/TO/IPVSADM_FILE
#会自动保存规则至/etc/sysconfig/ipvsadm
$ systemctl stop ipvsadm.service
- 规则重载
$ ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
$ systemctl start ipvsadm.service #会自动加载/etc/sysconfig/ipvsadm中规则
调度策略:
参考互联网文章: https://keepalived-doc.readthedocs.io/zh-cn/latest/IPVS调度算法.html
# --scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq|fo|ovf|mh,
# -w 指定权重.
1.4 DEBUG
以下 3 种模型均通过 iptables Log
配合 tcpdump
等工具去观察结果。
- 启用 iptables TRACE 功能.
$ modprobe nf_log_ipv4
$ sysctl -w net.netfilter.nf_log.2=nf_log_ipv4
- 在 RAW 表中设置钩子条件.(TRACE 功能只支持 RAW 表)
# 出入口方向可以通过 PREROUTING/POSTROUTING 来调整。
# 规则请通过实际环境调整
$ iptables -t raw -A PREROUTING -s "$host" -p tcp --dport 80 -j TRACE
- ping 指定源 IP
$ ping -I "$SRC_IP" "$DEST_IP"
2. VS-NAT
使用 NAT 模式的 DS 优点是真实服务器可以运行任何支持 TCP/IP 协议的操作系统,RS 服务器可以使用私有地址。缺点是随着 RS 的增加,DS可能成为系统的瓶颈,因为网络接口的吞吐量最终受到限制,因为请求和响应报文都需要被 DS 重写。 也可以尝试嵌套 LVS 负载均衡器,在第一层使用 VS-TUN 模式,或者 VS-DR 模式,第二层使用 VS-NAT 模式。
2.1 访问流程
- 客户端请求 LVS 虚拟服务。
- PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP,将数据包发往 INPUT 链
IPVS
是工作在INPUT
链上的,请求到达 INPUT 时,IPVS 对比数据包是否请求集群服务,如果用户请求的就是定义的集群服务,那么此时 IPVS 会修改数据包里的DEST IP/PORT
为算法挑选的后端RS
,并将新的数据包经由OUTPUT
→POSTROUTING
链,最终发送给目标 RS- RS 收到数据包后,开始构建响应请求,此时报文的源 IP 为 RIP,目标 IP 为 CIP, 最后通过网关(DIP)将响应报文送出。
- DS 在收到数据包后,此时会将源 IP 地址修改为自己的 VIP 地址,然后响应给客户端。 此时报文的源 IP 为 VIP,目标 IP 为 CIP
序号 | 源 | 目的 |
---|---|---|
1 | CIP: 1.1.1.1:xxx | VIP: 10.10.10.10:80 |
2 | CIP: 1.1.1.1:xxx | RIP: 10.10.10.100:80 |
3 | RIP: 10.10.10.100:80 | CIP: 1.1.1.1:xxx |
4 | VIP: 10.10.10.10:80 | CIP: 1.1.1.1:xxx |
2.2 部署过程
-
DS
# 1. 加载ip_vs 模块 # 2. 部署 LVS 服务, -m 代表 NAT 模式. $ ipvsadm -A -t <VIP:PORT> -s <算法> $ ipvsadm -a -t <VIP:PORT> -r <RIP:PORT> -m # 3. 开启内核转发. echo 1 > /proc/sys/net/ipv4/ip_forward
-
RS
# 1. 将网关指向 DS 的 DIP $ ip r del default via <默认网关地址> $ ip r add default via <DIP>
2.3 注意事项
DIP
和VIP
必须不在同一网段,实际情况应该是VIP
为对外服务,DIP
和RIP
处于相同网络。 否则无法正常响应报文。 因为当Client
和RS
在同一物理网络下,RS
在收到DS
调度过来的请求报文的时候,RS 的响应报文会直接通过二层发送给 Client,这会导致客户端发起RST
报文,因为客户端认为 RS 不是它之前发起连接的目标。- RS 的网关必须指向 DIP,否则无法正确路由响应报文。
- 在这个模式下,DS 压力较大,因为请求和响应报文均需要经由 DS 转发。
3. VS-DR
在此模式下,负载均衡器只接收用户的请求报文,而响应报文则由后端服务器直接响应,这样就避免了 NAT
模式的缺点, 负载均衡器可以承受大量的请求。重点将请求报文的目标 MAC
地址设定为挑选出的 RS-MAC
,当 RS 接收到这个数据包之后,将源 MAC 替换成自己的 MAC,目标 MAC地址为客户端地址。
3.1 访问流程
- 客户端对 VIP 发起请求,请求到达调度器
- IPVS 检查
DEST IP/PORT
如果它们匹配虚拟服务,则通过调度算法选出后端 RS,然后调度器将数据包直接路由到目标服务器(将报文中数据帧的MAC
地址更改为所选服务器的MAC
地址),此时数据包处于半连接状态。 - RS 收到包后由于
VIP
在自己的环回别名接口上,所以在本地处理报文,直接向客户端发送响应报文。
3.2 部署过程
-
DS
# 配置集群. -g 指明 lvs 模式为 DR. $ ipvsadm -A -t <VIP:PORT> -s <算法> $ ipvsadm -a -t <VIP:PORT> -r <RIP:PORT> -g
-
RS
# 增加 VIP $ ip a add "$vip" dev lo # 如果你的 vip 配置在了物理接口上, 需要抑制 arp 广播和响应. lo 接口默认是不会响应和广播 arp 的. $ echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce $ echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
3.3 注意事项
- 调度器的
DIP
不能作为VIP
使用,因为每个 RS 都配置了 VIP,在调度器修改 MAC 地址的时候需要发送 arp 广播,如果使用 DIP 作为 VIP,RS 在收到 arp 后就无法返回响应,因为本地存在 VIP。 - RS 默认网关不能指向 DIP
- DS 和 RS 必须在同一物理网络,因此不支持跨网络的集群服务.
- DR 模式下,LVS 不支持端口映射,即
LVS PORT
和RS PORT
必须一致, 因为 DR 模式下不修改DEST IP/PORT
4. VS-TUN
在 TUN 模式中,负载均衡器(DS)只是将请求按照特定的调度策略分配给 RS 真实服务器直接将响应数据返回给客户端,因此负载均衡器可以处理大量的请求,支持大量的 RS, TUN 模式中要求所有 server DS/RS 均支持 IP Tunneling
/IP Encapsulation
。在请求到达 DS 后,DS 通过隧道技术,在原有的报文外侧中再封装一层报文,源 IP 为 DIP,目的 IP 为 RIP,随后由 RS 处理请求。 在这种模式中由于使用 IP 隧道技术,也会产生大量的网络开销。
特点:
- RS 的 OS 必须支持 ip 隧道技术
- RIP,DIP 可以是公网 IP,RIP 可以和互联网通信
- RS 网关不能指向 DS
- RS 可以跨机房