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/NAT | VS/TUN | VS/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