第99章:负载均衡LVS

 广义上的负载均衡器大概可以分为 3 类,包括:DNS 方式实现负载均衡、硬件负载均衡、软件负载均衡。

 

 

复制代码
LVS 相关组件
----------------------------------
IPVS
    LVS 是基于内核态的 netfilter 框架实现的 IPVS 功能,工作在内核态。那么用户是如何配置 VIP 等相关信息并传递到 IPVS 呢,就需要用到了 ipvsadm 工具。
ipvsadm 工具
    ipvsadm 是 LVS 用户态的配套工具,可以实现 VIP 和 RS 的增删改查功能。它是基于 netlink 或 raw socket 方式与内核 LVS 进行通信的,如果 LVS 类比于 netfilter,那么 ipvsadm 就是类似 iptables 工具的地位。
keepalived
    ipvsadm 是一个命令行工具,如果 LVS 需要配置的业务非常复杂,ipvadm 就很不方便了。keepalived 最早就是为了 LVS 而生的,非官方开发的,它提供了配置文件的形式配置管理(持久化),服务的增删改查,操作非常方便。另外,keepalived 支持配置虚拟的 VIP,能够实现 LVS 的高可用,实际生产环境中一般离不开它。
LVS 相关组件
复制代码
复制代码
LVS基本原理
------------------------------------
LVS 是基于 netfilter 框架,主要工作于 INPUT 链上,在 INPUT 上注册 ip_vs_in HOOK 函数,进行 IPVS 主流程,大概原理如图所示:
    
当用户访问 www.sina.com.cn 时,用户数据通过层层网络,最后通过交换机进入 LVS 服务器网卡,并进入内核网络层。
进入 PREROUTING 后经过路由查找,确定访问的目的 VIP 是本机 IP 地址,所以数据包进入到 INPUT 链上
IPVS 是工作在 INPUT 链上,会根据访问的 vip+port 判断请求是否 IPVS 服务,如果是则调用注册的 IPVS HOOK 函数,进行 IPVS 相关主流程,强行修改数据包的相关数据,并将数据包发往 POSTROUTING 链上。(此处有疑问,在lvs的3种模式的示意图中,ipvs都是把数据包发往output链的!)
POSTROUTING 上收到数据包后,根据目标 IP 地址(后端服务器),通过路由选路,将数据包最终发往后端的服务器上。
开源 LVS 版本有 3 种工作模式:DR 模式、NAT 模式、Tunnel 模式
另外还有一种FullNAT模式不存在于开源LVS中
LVS基本原理
复制代码

 

复制代码
开源LVS的优缺点及使用场景(DR模式/NAT模式/Tunnel模式)
===============================================
DR模式的优点
    a. 响应数据不经过 lvs,性能高
    b. 对数据包修改小,信息保存完整(携带客户端源 IP)
DR模式的缺点
    a. lvs 与 rs 必须在同一个物理网络(不支持跨机房)
    b. rs 上必须配置 lo 和其它内核参数
    c. 不支持端口映射
DR模式的使用场景
    如果对性能要求非常高,可以首选 DR 模式,而且可以透传客户端源 IP 地址。
-------------------------------------------
NAT模式优点
    a. 能够支持 windows 操作系统
    b. 支持端口映射。如果 rs 端口与 vport 不一致,lvs 除了修改目的 IP,也会修改 dport 以支持端口映射。
NAT模式缺点
    a. 后端 RS 需要配置网关
    b. 双向流量对 lvs 负载压力比较大
NAT模式的使用场景
    如果你是 windows 系统,使用 lvs 的话,则必须选择 NAT 模式了。
------------------------------------------
Tunnel模式的优点
    a. 单臂模式,对 lvs 负载压力小
    b. 对数据包修改较小,信息保存完整
    c. 可跨机房(不过在国内实现有难度)
Tunnel模式的缺点
    a. 需要在后端服务器安装配置 ipip 模块
    b. 需要在后端服务器 tunl0 配置 vip
    c. 隧道头部的加入可能导致分片,影响服务器性能
    d. 隧道头部 IP 地址固定,后端服务器网卡 hash 可能不均
    e. 不支持端口映射
Tunnel模式的使用场景
    理论上,如果对转发性能要求较高,且有跨机房需求,Tunnel 可能是较好的选择。
开源LVS的优缺点及使用场景(DR模式/NAT模式/Tunnel模式)
复制代码

 

复制代码
LVS概念术语

CIP:Client IP,表示的是客户端 IP 地址。
VIP:Virtual IP,表示负载均衡对外提供访问的 IP 地址,一般负载均衡 IP 都会通过 Virtual IP 实现高可用。
RIP:RealServer IP,表示负载均衡后端的真实服务器 IP 地址。
DIP:Director IP,表示负载均衡与后端服务器通信的 IP 地址。
CMAC:客户端的 MAC 地址,准确的应该是 LVS 连接的路由器的 MAC 地址。
VMAC:负载均衡 LVS 的 VIP 对应的 MAC 地址。
DMAC:负载均衡 LVS 的 DIP 对应的 MAC 地址。
RMAC:后端真实服务器的 RIP 地址对应的 MAC 地址。


grep -i -C10 ipvs /boot/config-3.10.0-1160.el7.x86_64    
LVS概念术语
复制代码

 

复制代码
ipvsadm工具常用参数;ipvsadm工具常用命令
=============================================
ipvsadm工具常用的参数选项有:
    -A   --add-service    添加一条新的虚拟服务
    -E   --edit-service    编辑虚拟服务
    -D   --delete-service    删除虚拟服务
    -C   --clear    清除所有的虚拟服务规则
    -R   --restore    恢复虚拟服务规则

    -a   --add-server    在一个虚拟服务中添加一个新的真实服务器
    -e   --edit-server    编辑某个真实服务器
    -d   --delete-server    删除某个真实服务器
    -L | -l   --list    显示内核中的虚拟服务规则
    -n  --numeric    以数字形式显示IP端口
    -c  --connection    显示ipvs中目前存在的连接,也可以用于分析调度情况
    -Z   --zero    将转发消息的统计清零
    -p  --persistent    配置持久化时间
    --set tcp tcpfin udp    配置三个超时时间(tcp/tcpfin/udp)
    -t | -u    TCP/UDP协议的虚拟服务
    -g | -m | -i    LVS模式为:DR | NAT | TUN
    -w    配置真实服务器的权重
    -s    配置负载均衡算法,如:rr, wrr, lc等
    --timeout    显示配置的tcp/tcpfin/udp超时时间
    --stats    显示历史转发消息统计(累加值)
    --rate    显示转发速率信息(瞬时值)

=================================================
ipvsadm工具常用命令
1. 管理虚拟服务
  ipvsadm -A -t 192.168.1.100:80 -s rr    #添加一个虚拟服务192.168.1.100:80,使用轮询算法
  ipvsadm -E -t 192.168.1.100:80 -s wrr   #修改虚拟服务的算法为加权轮询
  ipvsadm -D -t 192.168.1.100:80          #删除虚拟服务

2. 管理真实服务
  ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.123 -g -w 2     #添加一个真实服务器192.168.1.123,使用DR模式,权重2
  ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.123 -g -w 5     #修改真实服务器的权重
  ipvsadm -d -t 192.168.1.100:80 -r 192.168.1.123             #删除真实服务器

3. 查看统计
  ipvsadm -Ln             #查看当前配置的虚拟服务和各个RS的权重
  ipvsadm -lnc            #查看当前ipvs模块中记录的连接(可用于观察转发情况)
  ipvsadm -Ln --stats | --rate    #查看ipvs模块的转发情况统计
    另外,--stats和--rate统计在分析问题时经常用到,输出各项的含义:
        --stat选项是统计自该条转发规则生效以来的包  
        1. Conns    (connections scheduled)  已经转发过的连接数  
        2. InPkts   (incoming packets)       入包个数  
        3. OutPkts  (outgoing packets)       出包个数  
        4. InBytes  (incoming bytes)         入流量(字节)    
        5. OutBytes (outgoing bytes)         出流量(字节) 
        -------------------------------------------------------------------
        --rate选项是显示速率信息  
        1. CPS      (current connection rate)   每秒连接数  
        2. InPPS    (current in packet rate)    每秒的入包个数  
        3. OutPPS   (current out packet rate)   每秒的出包个数  
        4. InBPS    (current in byte rate)      每秒入流量(字节)  
        5. OutBPS   (current out byte rate)     每秒入流量(字节) 

======================================================
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
DR模式,RS需要配置VIP,所以需要开启arp_ignore、arp_announce
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce


#恢复lvs配置
    /bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm"    
[root@lvs ~]# cat /usr/lib/systemd/system/ipvsadm.service 
    [Unit]
    Description=Initialise the Linux Virtual Server
    After=syslog.target network.target

    [Service]
    Type=oneshot
    ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm"    #恢复lvs配置
    ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm"     #固化lvs配置
    ExecStop=/sbin/ipvsadm -C
    RemainAfterExit=yes

    [Install]
    WantedBy=multi-user.target

[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  192.168.1.8:80 wrr
    -> 10.0.0.7:80                  Masq    1      0          0         
    -> 10.0.0.17:80                 Masq    1      0          0        

    Masq即NAT模式
    -g | -m | -i    LVS模式为:DR | NAT | TUN
ipvsadm工具常用参数;ipvsadm工具常用命令
复制代码

 

复制代码
ipvsadm 参数-f (多服务的绑定);参数-p 长连接


-f:firewall-mark,通常用于将两个或以上的服务绑定为一个服务进行处理时使用,integer类型
    该功能需要借助于netfilter的mangle链打标记实现,lvs不再以端口区分服务,而是以标记来进行轮询
    使用一个整数值来防火墙标识集群服务,而不是地址、 端口和协议使用它,我们可以通过结合IPtables将多个以调度器为目标的端口定义成一个防火墙标识,由 ipvsdam通过此项关联标识,则可以实现对一个IP多端口调度,即实现后端服务器可以开放多个服务
    [root@yefeng ~]# iptables -t mangle -A PREROUTING -d 10.0.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10
    [root@yefeng ~]# ipvsadm -C
    [root@yefeng ~]# ipvsadm -A -f 10 -s rr
    [root@yefeng ~]# ipvsadm -a -f 10 -r 10.0.0.7 -g
    [root@yefeng ~]# ipvsadm -a -f 10 -r 10.0.0.17 -g
    [root@yefeng ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
    -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    FWM  10 rr
    -> 10.0.0.7:0                   Route   1      0          0         
    -> 10.0.0.17:0                  Route   1      0          0   



-p:timout:persistent connection,持久连接(client短时间内发起的多次请求将会不进行轮询,转发到同一台RS上)
    [root@yefeng ~]# ipvsadm -C
    [root@yefeng ~]# ipvsadm -A -f 10 -s rr -p  #-p开启长连接功能,默认保持360秒
    [root@yefeng ~]# ipvsadm -a -f 10 -r 10.0.0.7 -g
    [root@yefeng ~]# ipvsadm -a -f 10 -r 10.0.0.17 -g
    [root@yefeng ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
    -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    FWM  10 rr persistent 360   #长链接默认保持360秒
    -> 10.0.0.7:0                   Route   1      0          0         
    -> 10.0.0.17:0                  Route   1      0          0  
ipvsadm 参数-f (多服务的绑定);参数-p 长连接
复制代码

 

 

复制代码
实验1:NAT模式
1.配置网卡IP如图所示,无需配置网关
    [csda325@yefeng ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
    BOOTPROTO=static
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=192.168.0.6
    NETMASK=255.255.255.0

    route add default gw  10.0.0.8      #RS需要配置网关
2.RS开启httpd服务
    [root@yefeng ~]# yum -y intall httpd
    [root@yefeng ~]# echo `hostname -I` RS1 > /var/www/html/index.html
    [root@yefeng ~]# systemctl start httpd
3.LVS配置映射规则
    [root@yefeng ~]# echo 1 > /proc/sys/net/ipv4/ip_forward     #LVS开启转发
    [root@yefeng ~]# ipvsadm -A -t 192.168.0.8:80 -s wrr        #创建VIP TCP服务
    [root@yefeng ~]# ipvsadm -a -t 192.168.0.8:80 -r 10.0.0.7:80 -m     #添加RS1服务器
    [root@yefeng ~]# ipvsadm -a -t 192.168.0.8:80 -r 10.0.0.17:80 -m    #添加RS2服务器
    [root@yefeng ~]# 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.0.8:80 wrr
    -> 10.0.0.7:80                  Masq    1      0          0         
    -> 10.0.0.17:80                 Masq    1      0          0   
实验1:NAT模式
复制代码

 

 

复制代码
实验2:DR模式(VIP处于DIP、RIP的网段内)
1.配置网卡IP如图所示,无需配置网关
    [csda325@yefeng ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0
    BOOTPROTO=static
    NAME=eth0
    DEVICE=eth0
    ONBOOT=yes
    IPADDR=192.168.0.6
    NETMASK=255.255.255.0

    #host需要配置路由;LVS、RS需要配置网关
    route add default gw  10.0.0.200      

    LVS配置VIP
    ifconfig lo:0 10.0.0.100  netmask 255.255.255.255 up

    RS配置VIP,并开启arp_ignore,关闭arp_announce
    ifconfig lo:0 10.0.0.100  netmask 255.255.255.255 up
    echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
2.RS开启httpd服务
    [root@yefeng ~]# yum -y intall httpd
    [root@yefeng ~]# echo `hostname -I` RS1 > /var/www/html/index.html
    [root@yefeng ~]# systemctl start httpd
3.路由器开启转发
    [root@yefeng ~]# echo 1 > /proc/sys/net/ipv4/ip_forward     
4.LVS配置映射规则
    [root@yefeng ~]# echo 1 > /proc/sys/net/ipv4/ip_forward 
    [root@yefeng ~]# ipvsadm -A -t 10.0.0.100:80 -s wrr        #创建VIP TCP服务
    [root@yefeng ~]# ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.7         #添加RS1服务器,DR模式不能映射端口,所以可以不指定端口
    [root@yefeng ~]# ipvsadm -a -t 10.0.0.100:80 -r 10.0.0.17:80     #添加RS2服务器
    [root@yefeng ~]# ipvsadm -ln
    IP Virtual Server version 1.2.1 (size=4096)
    Prot LocalAddress:Port Scheduler Flags
    -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
    TCP  10.0.0.100:80 wrr
    -> 10.0.0.7:80                  Route   1      0          0         
    -> 10.0.0.17:80                 Route   1      0          0  
5.host设备进行测试
    curl 10.0.0.100
实验2:DR模式(VIP处于DIP、RIP的网段内)
复制代码

 

 

以下为DR模式下的抓包,观察LVS改写源目MAC

 

 

参考资料:
负载均衡 LVS 总结 - 基本介绍 https://blog.csdn.net/liwei0526vip/article/details/103104393
负载均衡 LVS 总结 - 基础原理 https://blog.csdn.net/liwei0526vip/article/details/103104483
负载均衡 LVS 总结 - 操作实践 https://blog.csdn.net/liwei0526vip/article/details/103104496
使用LVS实现负载均衡原理及安装配置详解 https://www.cnblogs.com/liwei0526vip/p/6370103.html
马哥教育2021-8小时拿下LVS企业级实战 https://www.bilibili.com/video/BV1jV411Y76g?from=search&seid=4962698419664974163

 

posted @   雲淡風輕333  阅读(78)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示