• LVS做集群四层负载均衡的简单理解


    背景:业务中主要是TCP/SSL连接,要做四层负载均衡。
    之前做负载均衡,调研了nginx(见之前的nginx实现后端服务负载均衡nginx负载均衡监测后台服务状态)。
    nginx作为一个应用,做四层负载均衡效率低。lvs是linux内核的,非应用,用它做四层负载均衡效率更高更合适。所以会见到lvs+nginx做四层七层负载均衡这种组合。

    一、集群

    一般我们遇到的:
    负载均衡集群
    高可用集群

    和分布式的区别:
    集群是一群机器做同样的事情,分布式是不同的机器负责不同的事情

    二、负载均衡

    常用的软件负载均衡:
    lvs 四层
    nginx(tengine)七层
    haproxy

    硬件也有,不展开了。

    三、LVS

    1 应用方式

    类似于nginx的应用方式。客户请求流量先到达lvs,再由lvs做负载均衡。
    举例:一台linux服务器启用lvs实现负载均衡的作用,其他的是业务服务器(RS)。
    我们主要在lvs服务器上面做配置。业务服务器可能会有额外的配置(除了ip,如何配置取决于lvs的负载均衡方式,比如,下面会介绍):
    在lvs上开启ipvs,配置ip、RS地址、负载均衡方式。
    业务服务器:配置ip

    2 负载均衡模式

    为了描述,定义:

    名称简写
    客户的ipCIP
    lvs服务器对外的IPVIP
    lvs服务器真实的IPDIP
    业务服务器的IPRIP
    lvs服务器DS

    请求Request流量都要经过DS:数据包的源地址一定是CIP;
    响应Response流量根据经过和不经过DS分为两类:

    响应流量经过DS的两种模式:

    都是lvs做nat转换,区别在于究竟NAT了什么部分:
    NAT
    请求包数据包源地址不变,NAT目的地址;响应包NAT请求地址
    请求:
    DS接收的数据包:源地址:CIP 目的地址:VIP
    发送给RS的数据包:源地址:CIP 目的地址:RIP
    响应:
    DS接收的数据包:源地址:RIP 目的地址:CIP
    发送给客户的数据包:源地址:VIP 目的地址:CIP

    Full-NAT(不常用)
    请求包和相应包数据包源地址、目的地址都NAT
    请求:
    DS接收的数据包:源地址:CIP 目的地址:VIP
    发送给RS的数据包:源地址:DIP 目的地址:RIP
    响应:
    DS接收的数据包:源地址:RIP 目的地址:DIP
    发送给客户的数据包:源地址:VIP 目的地址:CIP

    响应流量不经过DS的两种模式:

    需要改变业务服务器的配置!
    业务服务器也都配置虚拟IP为VIP。

    直接路由DR
    业务服务器要关闭对arp请求的响应。

    有两种做法(分别见参考1和2)
    1.绑定vip之后,配置忽略arp广播
    ip addr add dev lo 192.168.246.160/32 #在lo接口上绑定VIP
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore #忽略arp广播
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce #匹配精确ip地址回包
    2.创建一个dummy网卡
    ip addr add dev dummy0 192.168.0.222/32

    DS通过改变数据包的mac地址,将流量发给RS。
    请求:
    DS接收的数据包:源地址:CIP 目的地址:VIP
    数据帧:目的MAC地址:DS的MAC地址
    发送给RS的数据包:源地址:CIP 目的地址:VIP
    数据帧:目的MAC地址:RS的MAC地址

    响应:RS直接发给客户!
    RS发送的数据包:源地址:VIP 目的地址:CIP

    IP隧道 IP tunnel(不常用)
    RS需要支持ipip协议,必须加载ipip模块,解封装数据包来获得原始包。
    集群服务器如果是虚拟机,那么其物理机器上不能有ipip隧道设备

    DS通过将原请求数据包在封装一层,发给RS。RS解封装得原数据包,直接回复响应给客户。

    请求:
    DS接收的数据包:源地址:CIP 目的地址:VIP
    发送给RS的数据包:源地址:DIP 目的地址:RIP 载荷内容:接收的数据包

    响应:RS直接发给客户!
    RS发送的数据包:源地址:VIP 目的地址:CIP

    特性比较

    负载
    响应过lvs可能是瓶颈,所以大流量的情况下考虑响应不过lvs的两种。
    服务器结点数目
    NAT 10-20
    IP tunnel 100
    DR >100

    网络配置要求
    NAT 模式 和 Full-NAT模式:只需要DS一个有公网ip作为VIP,RS和DS三层可达。
    DR模式:只需要一个有公网ip作为VIP,要求负载均衡器的网卡必须与物理网卡在一个物理段上
    IP tunnel模式:只需要一个有公网ip作为VIP,RS需要支持IPTUNNEL协议

    网关
    NAT : DS
    DR和IP tunnel:自己的路由器

    RS网络和DS的关系:
    NAT:局域网与外部网络
    DR:DS和RS在同一个子网,RS也配置VIP
    IP tunnel:DS和RS可以不在一个子网

    DS和RS的端口对应关系
    NAT模式下,这两个端口可以不相同,DS会做好转换
    DR模式下,因为不会对传输层做修改,所以这两个端口必须相同

    3 原理

    ipvs

    工作在内核,处理请求转发。

    “IPVS通过在Netfilter框架中的不同位置(LOCAL_IN/FORWARD/LOCAL_OUT)注册自己的处理函数来捕获数据包,并根据与IPVS相关的信息表对数据包进行处理,按照IPVS规则中定义的不同的包转发模式,对数据包进行不同的转发处理。”

    IPVS相关的信息表:用户维护
    包转发模式:负载均衡模式

    管理工具ipvsadm

    命令行工具,用户空间
    向IPVS中写入规则

    一些命令:

    // 添加vip
    ip addr add dev ens33 192.168.1.10/32
    
    • 1
    • 2
    // 添加一个虚拟服务器
    ipvsadm -A -t 192.168.1.10:80 -s rr
    
    • 1
    • 2

    -A:append:添加一个虚拟服务器
    -t:tcp-service:对tcp协议作转发
    -s:schduler:均衡算法
    rr:round robin:将工作平均分配给可用的真实服务器的算法

    // 添加后端服务器
    ipvsadm -a -t 192.168.1.10:80 -r 192.168.1.101:80 -g -w 1
    
    • 1
    • 2

    -a:append:添加一个后端真实服务器
    -t:tcp-service:转发tcp协议
    -r:real-server:后端真实服务器地址
    -w:weight:权重
    -g:Direct Routing,默认模式,也成网关模式(gatewaying);
    -m:NAT,也称作伪装模式(masquerading)。
    -i:IP Tunneling,也称作 ipip 封包模式(ipip encapsulation);

    四、其他

    负载均衡算法

    轮询
    加权轮询

    最小连接数:维护后端服务器的连接数
    加权最小连接数:连接数/权重,选取值最小的RS

    基于本地的最少连接数:维护目的IP地址:RS映射表
    具有多副本的LBLC:映射表中RS是set,用加权最小连接数选一个RS
    目的地址匹配:静态哈希表
    源地址匹配:静态哈希表
    最短期望延迟:连接数+1/权重,选取值最小的RS
    Never Queue:有空闲用空闲,无空用最短期望延迟调度

    LVS双机热备方案

    如 LVS + Keepalived

    Netfilter框架

    疑问:路由决策和LOCAL_OUT的先后顺序?

    1. Linux内核源码之Netfilter框架
    2. Nftables - 数据包流和 Netfilter 钩子
    3. ipvs hook点在netfilter中的位置以及优先级

    参考

    1. 负载均衡(四层) LVS(看完就能去上班)
    2. 《一篇搞懂》系列之二——IPVS
    3. LVS负载均衡高可用解决方案
  • 相关阅读:
    Java项目:SSM网上药品销售商城网站系统
    leetcode动态规划系列(求路径篇)
    安卓学习笔记
    别做重复低质的工作内容摸鱼了,18k强者分享自动化测试秘籍
    流程编排、如此简单-通用流程编排组件JDEasyFlow介绍
    RADIUS 如何提高 WiFi 无线网络安全性
    并列连词详解
    Oracle数据库修改库名(db_name)和实例名
    centos、Fedora/Red Hat Enterprise Linux 和 Ubuntu/Debian
    react context
  • 原文地址:https://blog.csdn.net/weixin_43941593/article/details/136304684