Linux Virtual Server(LVS) 学习笔记分享

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 工具用法:

  1. 查看规则
$ ipvsadm -Ln
  1. 创建集群
# 指定 暴露VIP的80服务,-t 为 tcp 协议, 默认算法为 wlc 就是轮询
$ ipvsadm -A -t 10.10.10.100:80 
  1. 为集群添加 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
  1. 清空集群
$ ipvsadm -C
  1. ipvs 内核文件
# 1. ipvs 规则
$ cat /proc/net/ip_vs

# 2. ipvs 连接
$ cat /proc/net/ip_vs_conn
  1. 规则保存
# 保存规则
$ ipvsadm-save > /PATH/TO/IPVSADM_FILE
$ ipvsadm -S > /PATH/TO/IPVSADM_FILE

#会自动保存规则至/etc/sysconfig/ipvsadm
$ systemctl stop ipvsadm.service 
  1. 规则重载
$ 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 等工具去观察结果。

  1. 启用 iptables TRACE 功能.
$ modprobe nf_log_ipv4
$ sysctl -w net.netfilter.nf_log.2=nf_log_ipv4
  1. 在 RAW 表中设置钩子条件.(TRACE 功能只支持 RAW 表)
# 出入口方向可以通过 PREROUTING/POSTROUTING 来调整。
# 规则请通过实际环境调整
$ iptables -t raw -A PREROUTING -s "$host" -p tcp --dport 80 -j TRACE
  1. 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 访问流程

  1. 客户端请求 LVS 虚拟服务。
  2. PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP,将数据包发往 INPUT 链
  3. IPVS 是工作在 INPUT 链上的,请求到达 INPUT 时,IPVS 对比数据包是否请求集群服务,如果用户请求的就是定义的集群服务,那么此时 IPVS 会修改数据包里的 DEST IP/PORT 为算法挑选的后端 RS,并将新的数据包经由 OUTPUTPOSTROUTING 链,最终发送给目标 RS
  4. RS 收到数据包后,开始构建响应请求,此时报文的源 IP 为 RIP,目标 IP 为 CIP, 最后通过网关(DIP)将响应报文送出。
  5. 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 注意事项

  1. DIPVIP 必须不在同一网段,实际情况应该是 VIP 为对外服务, DIPRIP 处于相同网络。 否则无法正常响应报文。 因为当 ClientRS 在同一物理网络下,RS 在收到 DS 调度过来的请求报文的时候,RS 的响应报文会直接通过二层发送给 Client,这会导致客户端发起 RST 报文,因为客户端认为 RS 不是它之前发起连接的目标。
  2. RS 的网关必须指向 DIP,否则无法正确路由响应报文。
  3. 在这个模式下,DS 压力较大,因为请求和响应报文均需要经由 DS 转发。

3. VS-DR

在此模式下,负载均衡器只接收用户的请求报文,而响应报文则由后端服务器直接响应,这样就避免了 NAT 模式的缺点, 负载均衡器可以承受大量的请求。重点将请求报文的目标 MAC 地址设定为挑选出的 RS-MAC ,当 RS 接收到这个数据包之后,将源 MAC 替换成自己的 MAC,目标 MAC地址为客户端地址。

3.1 访问流程

  1. 客户端对 VIP 发起请求,请求到达调度器
  2. IPVS 检查 DEST IP/PORT 如果它们匹配虚拟服务,则通过调度算法选出后端 RS,然后调度器将数据包直接路由到目标服务器(将报文中数据帧的 MAC 地址更改为所选服务器的 MAC 地址),此时数据包处于半连接状态。
  3. 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 注意事项

  1. 调度器的 DIP 不能作为 VIP 使用,因为每个 RS 都配置了 VIP,在调度器修改 MAC 地址的时候需要发送 arp 广播,如果使用 DIP 作为 VIP,RS 在收到 arp 后就无法返回响应,因为本地存在 VIP。
  2. RS 默认网关不能指向 DIP
  3. DS 和 RS 必须在同一物理网络,因此不支持跨网络的集群服务.
  4. DR 模式下,LVS 不支持端口映射,即 LVS PORTRS 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 隧道技术,也会产生大量的网络开销。

特点:

  1. RS 的 OS 必须支持 ip 隧道技术
  2. RIP,DIP 可以是公网 IP,RIP 可以和互联网通信
  3. RS 网关不能指向 DS
  4. RS 可以跨机房
7 个赞

linux do 中少有的Linux相关知识又多了一篇

1 个赞

图挂了

图,需要转一下

爽学了

不知道为什么,我的图床没办法使用,只能放链接了。点击可以跳转,试过md 和 html 格式都不行

图片直接上传本论坛就可以啊

good,搞定了,我以为还是那种md格式的方式

可以了 感谢。以为还是传统的md格式

很经典的Linux知识

软件开发配置调优

好同志