LVS 负载均衡


工作原理

LVS 根据请求报文的目标 IP 和目标协议及端口将其调度转发至某 RS,根据调度算法来挑选 RS

LVS 集群类型中的术语

VS:Virtual Server,Director Server (DS)

???Dispatcher (调度器),Load Balancer

RS:Real Server(lvs),upstream server (nginx)

???backend server (haproxy)

CIP:Client IP 客户端 IP

VIP: Virtual serve IP VS 外网的 IP

DIP: Director IP VS 内网的 IP

RIP: Real server IP 内部服务器 IP(例如 httpd)

访问流程:CIP <——> VIP == DIP <——> RIP

LVS: ipvsadm/ipvs

ipvsadm:用户空间的命令行工具,规则管理器, 用于管理集群服务及 RealServer

ipvs:工作于内核空间 netfilter 的 INPUT 钩子上的框架

LVS 集群的类型

lvs-nat:修改请求报文的目标 IP,多目标 IP 的 DNAT

lvs-dr:操纵封装新的 MAC 地址

lvs-tun:在原请求 IP 报文之外新加一个 IP 首部

lvs-fullnat:修改请求报文的源和目标 IP

LVS-NAT 模式

本质是多目标 IP 的 DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的 RS 的 RIP 和 PORT 实现转发

(1)RIP 和 DIP 应在同一个 IP 网络,且应使用私网地址; RS 的网关要指向 DIP

(2)请求报文和响应报文都必须经由 Director 转发, Director 易于成为系统瓶颈

(3)支持端口映射,可修改请求报文的目标 PORT

(4)VS 必须是 Linux 系统, RS 可以是任意 OS 系统

(5)RIP 与 DIP 在同一IP网络, RIP 的网关要指向 DIP

(6)支持端口映射

(7)Director 要打开核心转发功能

LVS-DR 模式

LVS-DR: Direct Routing,直接路由, LVS 默认模式,应用最广泛,通过为请求报文重新封装一个 MAC 首部进行转发,源 MAC 是 DIP 所在的接口的 MAC,目标 MAC 是某挑选出的 RS 的 RIP 所

在接口的 MAC 地址;源I P/PORT,以及目标 IP/PORT 均保持不变

(1) Director 和各 RS 都配置有 VIP

(2) 确保前端路由器将目标 IP 为 VIP 的请求报文发往 Director 在前端网关做静态绑定 VIP 和 Director 的 MAC 地址在 RS 上使用 arptables 工具

    arptables -A IN -d $VIP -j DROP

    arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP

    在 RS 上修改内核参数以限制 arp 通告及应答级别

    /proc/sys/net/ipv4/conf/all/arp_ignore

    /proc/sys/net/ipv4/conf/all/arp_announce

(3) RS 的 RIP 可以使用私网地址,也可以是公网地址; RIP 与 DIP 在同一 IP 网络;RIP 的网关不能指向 DIP,以确保响应报文不会经由 Director

(4) RS和Director要在同一个物理网络

(5)请求报文要经由 Director,但响应报文不经由 Director,而由 RS 直接发往 Client

(6)不支持端口映射(端口不能修败)

(7) RS 可使用大多数 OS 系统

LVS-TUN 模式

转发方式:不修改请求报文的 IP 首部(源 IP 为 CIP,目标 IP 为 VIP),而在原 IP 报文之外再封装一个 IP 首部(源 IP 是 DIP,目标 IP 是 RIP),将报文发往挑选出的目标 RS; RS 直接响应给

客户端(源 IP 是 VIP,目标 IP 是 CIP)

(1) DIP, VIP, RIP 都应该是公网地址

(2) RS 的网关一般不能指向 DIP

(3) 请求报文要经由 Director,但响应不经由 Director

(4) 不支持端口映射

(5) RS 的 OS 须支持隧道功能

LVS-FULLNAT 模式

LVS-FULLNAT:通过同时修改请求报文的源 IP 地址和目标 IP 地址进行转发

CIP --> DIP

VIP --> RIP

(1) VIP 是公网地址, RIP 和 DIP 是私网地址,且通常不在同一 IP 网络;因此,RIP 的网关一般不会指向 DIP

(2) RS 收到的请求报文源地址是 DIP,因此,只需响应给 DIP;但 Director 还要将其发往 Client

(3) 请求和响应报文都经由 Director

(4) 支持端口映射

注意:此类型kernel默认不支持

LVS 工作模式总结

 VS/NATVS/TUNVS/DR
Server any tunneling non-arp device
server network private lan/wan lan
server number low(10~20) high(100) high(100)
server gateway load balancer own router own router

lvs-nat 与 lvs-fullnat:请求和响应报文都经由 Director

??lvs-nat: RIP 的网关要指向 DIP

??lvs-fullnat: RIP 和 DIP未必在同一 IP 网络,但要能通信


lvs-dr 与 lvs-tun:请求报文要经由 Director,但响应报文由 RS 直接发往 Client

??lvs-dr:通过封装新的 MAC 首部实现,通过 MAC 网络转发

??lvs-tun:通过在原 IP 报文外封装新 IP 头实现转发,支持远距离通信

ipvs scheduler:根据其调度时是否考虑各 RS 当前的负载状态,静态方法和动态方法

静态方法:仅根据算法本身进行调度

1、 RR: roundrobin,轮询

2、 WRR: Weighted RR,加权轮询

3、 SH: Source Hashing,实现 session sticky,源 IP 地址 hash;将来自于同一个 IP 地址的请求始终发往第一次挑中的 RS,从而实现会话绑定

4、 DH: Destination Hashing;目标地址哈希,第一次轮询调度至 RS,后续将发往同一个目标地址的请求始终转发至第一次挑中的 RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商

动态方法:主要根据每 RS 当前的负载状态及调度算法进行调度 Overhead=value 较小的 RS 将被调度

1、 LC: least connections 适用于长连接应用

  Overhead=activeconns256+inactiveconns

2、 WLC: Weighted LC,默认调度方法

  Overhead=(activeconns256+inactiveconns)/weight

3、 SED: Shortest Expection Delay,初始连接高权重优先

  Overhead=(activeconns+1)*256/weight

4、 NQ: Never Queue,第一轮均匀分配,后续 SED

5、 LBLC: Locality-Based LC,动态的 DH 算法,使用场景:根据负载状态实现正向代理

6、 LBLCR: LBLC with Replication,带复制功能的 LBLC,解决 LBLC 负载不均衡问题,从负载重的复制到负载轻的 RS

ipvs

grep -i -A 10 “ipvs” /boot/config-VERSION-RELEASE.x86_64

支持的协议: TCP, UDP, AH, ESP, AH_ESP, SCTP

ipvs集群

管理集群服务

管理服务上的 RS

ipvsadm 包构成

程序包: ipvsadm

Unit File: ipvsadm.service

主程序: /usr/sbin/ipvsadm

规则保存工具: /usr/sbin/ipvsadm-save

规则重载工具: /usr/sbin/ipvsadm-restore

配置文件: /etc/sysconfig/ipvsadm-config

ipvsadm

核心功能:

集群服务管理:增、删、改

集群服务的RS管理:增、删、改、查

-A –add-service 在内核的虚拟服务器表中添加一条新的虚拟服务器记录,也就是增加一台新的虚拟服务器

-E –edit-service 编辑内核虚拟服务器表中的一条虚拟服务器记录

-D –delete-service 删除内核虚拟服务器表中的一条虚拟服务器记录

-C –clear 清除内核虚拟服务器表中的所有记录

-R –restore 恢复虚拟服务器规则

-S –save 保存虚拟服务器规则,输出为 -R 选项可读的格式

-a –add-server 在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录,也就是在一个虚拟服务器中增加一台新的真实服务器

-e –edit-server 编辑一条虚拟服务器记录中的某条真实服务器记录

-d –delete-server 删除一条虚拟服务器记录中的某条真实服务器记录

-L|-l –list 显示内核虚拟服务器表

-Z –zero 虚拟服务表计数器清零(清空当前的连接数量等)

–set tcp tcpfin udp 设置连接超时值

–start-daemon 启动同步守护进程。他后面可以是 master 或 backup,用来说明 LVS Router 是 master 或是backup,在这个功能上也可以采用 keepalived 的 VRRP 功能

–stop-daemon 停止同步守护进程

-h –help 显示帮助信息

其他的选项:
-t –tcp-service service-address 说明虚拟服务器提供的是 tcp 的服务 [vip:port] or [real-server-ip:port]

-u –udp-service service-address 说明虚拟服务器提供的是 udp 的服务[vip:port] or [real-server-ip:port]

-f –fwmark-service fwmark 说明是经过 iptables 标记过的服务类型

-s –scheduler scheduler 使用的调度算法,有这样几个选项 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是:wlc

-p –persistent [timeout] 持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理,timeout 的默认值为 300 秒

-M –netmask netmask persistent granularity mask

-r –real-server server-address 真实的服务器 [Real-Server:port]

-g –gatewaying 指定 LVS 的工作模式为直接路由模式(也是 LVS 默认的模式)

-i –ipip 指定 LVS 的工作模式为隧道模式

-m –masquerading 指定 LVS 的工作模式为 NAT 模式

-w –weight weight 真实服务器的权重

–mcast-interface interface 指定组播的同步接口

-c –connection 显示 LVS 目前的连接 如:ipvsadm -L -c

–timeout 显示 tcp tcpfin udp 的 timeout 值 如:ipvsadm -L –timeout

–daemon 显示同步守护进程状态

–stats 显示统计信息

–rate 显示速率信息

–sort 对虚拟服务器和真实服务器排序输出

–numeric -n 输出 IP 地址和端口的数字形式

保存:建议保存至 /etc/sysconfig/ipvsadm

???ipvsadm-save > /PATH/TO/IPVSADM_FILE

???ipvsadm -S > /PATH/TO/IPVSADM_FILE

???systemctl stop ipvsadm.service

重载:
???ipvsadm-restore < /PATH/FROM/IPVSADM_FILE

???systemctl restart ipvsadm.service

lvs