共计 4628 个字符,预计需要花费 12 分钟才能阅读完成。
本文由 LinuxProbe.Com 团队成员 烨子 整理发布,原文来自:51CTO- 许鼎。
1.LVS:Linux Virtual Server
四层交换(路由):根据请求报文的目标 IP 和目标 PORT 将其转发至后端主机集群中的某台服务器(根据调度算法);
不能够实现应用层的负载均衡
lvs(又称 ipvs)是基于内核中的防火墙 netfilter 实现
2.lvs 集群术语:
vs:Virtual Server | 虚拟服务,可称为 Director、Dispatcher 分发器、Balancer 负载均衡器 |
rs:Real Server | 真实服务器 |
CIP:Client IP | 客户端 IP |
VIP:Director Virtual IP | 等同于 FIP(流动 IP),负载均衡器虚拟 IP |
DIP:Director IP | 调度 IP(第二张网卡 IP 地址) |
RIP:Real Server IP | 真实服务器 IP |
3.LVS:ipvsadm/ipvs
(1)ipvsadm: CLI 工具
用户空间的命令行工具,用于管理集群服务及集群服务上的 RS 等;# yum install -y ipvsadm
(2)ipvs:内核存在(CentOS 默认支持)
工作于内核上的 netfilterINPUT 钩子之上的程序代码;其集群功能依赖于 ipvsadm 定义的集群服务器规则;
支持基于 TCP、UDP、SCTP、AH、EST、AH_EST 等协议的众多服务;
4. 负载均衡集群中设计时的要点:
(1)session 保持
session sticky (iphash):IP 地址绑定,来源 IP 记录在 ip hash 表作统一调度
session cluster(multicast/broadcast/unicast):广播集群同步(复制)session,只适用于小规模场景
session server ():session 服务器
(2)数据共享(提供一致性存储)
1) 共享存储;
NAS:Network Attached Storage (文件级别),网络附加存储,文件服务器
SAN:Storage Area Network (块级别),存储区域网络
DS:Distributed Storage,分布式春初
2) 数据同步:rsync … …
1.lvs-nat:地址伪装模型
多目标的 DNAT:通过将请求报文的目标地址和目标端口修改为挑选出某 RS 的 RIP 和 PORT 来实现;
客户端主机发起请求报文 CIP 指向 VIP,通过内核的核心网卡间转发功能,VIP 会将请求交给 DIP 进行调度,DIP 根据设定的算法进行负载均衡给后端的 RS 主机的 RIP,在这个过程中 DIP 调度功能会将目标 IP 地址重写为 RIP。请求和返回请求读要调度 DIP 来进行转换操作。
(1)RIP 和 DIP 应该使用私网地址,RS 的网状应该指向 DIP;
(2)请求和响应报文都要经由 director 转发;极高负载的场景中,Director 可能会成为系统瓶颈(响应报文大);
(3) 支持端口映射(转发);
(4) VS 必须为 Linux,RS 可以为任意操作系统;
(5)RS 的 RIP 与 Director 的 DIP 必须在同一 IP 网络;
2.lvs-dr(direct routing 直接路由):网关模型
通过修改请求报文的 MAC 地址进行转发;IP 首部不会发生变化(源 IP 为 CIP,目标 IP 始终为 VIP)
客户端发起请求,经过层层路由到达离 VS 服务器最近的交换机,通过交换机转发给 VS 服务器,由 VS 服务器负载均衡转发请求给 RS 服务器。在此过程中 VIP 修改 MAC 地址调度请求给真实主机。在此过程中通过 ARP 协议在一个局域网中广播寻找真实主机的 MAC 地址。每个 RS 真实主机的网卡会一个别名地址 VIP,实现全过程源地址为 CIP,目标地址为 VIP 不变。调度基于寻找 MAC。网关模型中的所有主机均要能与外网通信。这样 RS 主机就能够直接响应客户机。
(1)确保前端路由器将目标 IP 为 VIP 的请求报文一定会发送给 Director;
解决方案:
1)静态绑定;
2)禁止 RS 响应 VIP 的 ARP 请求;
a) arptables 上定义;
b) 修改各 RS 的内核参数,并把 VIP 配置在特定的接口上实现禁止其响应;
(2)RS 的 RIP 可以使用私有地址,也可以使用公网地址;
RIP 使用私有地址可以通过在之前加一个路由器的方式和外网通信,直接响应客户机
(3)RS 跟 Director 必须在同一物理网络中;
(4)请求报文必须由 Director 调度,但响应报文必须不能经由 Director;
(5) 不支持端口映射;
(6) 各 RS 可以使用大多数的操作系统;
3.lvs-tun(ip tunneling):IP 隧道模型
转发方式:不修改请求报文的 IP 首部(源 IP 为 CIP,目标 IP 为 VIP),而是在原有的 IP 首部这外再次封装一个 IP 首部(源 IP 为 DIP,目标 IP 为 RIP);
(1)RIP,DIP,VIP 全得是公网地址;
(2)RS 的网关不能也不可能指向 DIP;
(3)请求报文经由 Director 调度,但响应报文将直接发给 CIP;
(4) 不支持端口映射;
(5)RS 的 OS 必须支持 IP 隧道功能;
4.lvs-fullnat:完整模型(同时改变请求报文的源 IP 和目标 IP)
通过同时修改请求报文的源 IP 地址(cip–>dip)和目标 IP 地址(vip–> rip)实现转发;
注意:前三种为标准类型,第四种为后添加类型,内核默认可能不支持,需自编译内核
(1)VIP 是公网地址;RIP 和 DIP 是私网地址,且可以不在同一 IP 网络中,但需要通过路由互相通信;
(2)RS 收到的请求报文的源 IP 为 DIP,因此其响应报文将发送给 DIP;
(3)请求报文和响应报文都必须经由 director;
(4) 支持端口映射;
(5) RS 可使用任意 OS;
1. 静态方法:仅根据算法本身进行调度
(1)RR:round robin,轮询机制,依次分配请求,方式简单但时负载均衡的效果一般
(2)WRR:weighted rr,加权轮询,权重越大承担负载越大
(3)SH:source ip hash,源地址哈希,将来自同一个 ip 请求通过记录在 ip hsash 表中绑定在同一个服务器,实现 session 保持
缺点:调度粒度大,对负载均衡效果差;session 黏性不同,连接时长保持不同
(4)DH:desination ip hash,目标地址哈希。能实现连接追踪,但不考虑负载均衡效果
正向 web 代理,负载均衡内网用户对互联网的请求;
Client–> Director –> Web Cache Server(正向代理)
2. 动态方法:根据算法及各 RS 当前的负载状态进行评估
Overhead | 负载值,VS 转发时记录每个 RS 的 Active 和 Inactive 数量 (甚至权重) 进行算法计算 |
Active | 活动链接值,当发起新请求后保持在 ESTABLISHED 状态时,仍有请求响应 |
Inactive | 非活动链接值,在 ESTABLISHED 状态时,尚未断开保持空闲等待状态 |
(1)LC:least connection,最少连接
Overhead=Active*256+Inactive
后端的 RS 谁的连接少就分发请求至那台 RS,若 overhead 一样则自上而下轮询列表中的 RS
(2)WLC:weighted least connection,加权最小连接
Overhead=(Active*256+Inactive)/weight,计算结果小的将为选中的下一跳 RS 服务器
缺点:当 Overhead 一样时,自上而下轮询响应,权重小的若在列表上方则其会响应
(3)SED:Shortest Expection Delay,最短期望延迟
Overhead=(Active+1)*256/weight
缺点:解决 WLC 问题,但时无法确保权重小的主机一定响应
(4)NQ:never Queue,永不排队,SED 算法改进
RS 权重大小排列,每台 RS 服务器先分配一个请求,其余的按照权重大小计算分配
(5)LBLC:Locality-Based LC,基于本地的最少连接,动态的 DH 连接算法
(6)LBLCR:LBLC with Replication,带复制功能的 LBLC
1. 管理集群服务:
ipvsadm -A|E -t|u|f service-address [-s scheduler][-p [timeout]]
ipvsadm -D -t|u|f service-address
-A:添加
-E:修改
-D:删除
-t, tcp, vip:port TCP 的 ip 和 port
-u, udp, vip:port UDP 的 ip 和 port
-f, fwm, MARK 防火墙标记
-s scheduler:默认为 WLC 调度算法,可省;-p [timeout] : 超出时长,持久连接相关,默认时长为 300 秒
2. 管理集群服务上的 RS:
ipvsadm-a|e -t|u|f service-address -rserver-address [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -rserver-address
-a:添加一个 RS
-e:修改一个 RS
-d:删除一个 RS
server-address 指的是 rip[:port],端口可省表示与之前的 service-address 相同,只有 nat 模式支持端口映射才会使用
[-g|i|m]
-g:GATEWAY(默认),lvs-dr 模型
-i: IPIP,lvs-tun 隧道模型
-m: MASQUERADE,lvs-nat 模型
3. 查看
ipvsadm -L|l[options]
-n:numeric,数字格式显示地址和端口;-c:connection,显示 ipvs 连接;--stats:显示统计数据;--rate:速率
--exact:精确值, 不经过单位换算的数值
4. 清空规则:
ipvsadm -C
5. 数器清零:
ipvsadm -Z [-t|u|f service-address]
6. 保存和重载:
保存:
ipvsadm-S > /PATH/TO/SOME_RULE_FILE
ipvsadm-save > /PATH/TO/SOME_RULE_FILE
重载:
ipvsadm -R < /PATH/FROM/SOME_RULE_FILE
ipvsadm-restore< /PATH/FROM/SOME_RULE_FILE
注意:需要结合重定向一起使用,从自定义的规则文件中导入导出
附录(ipvsadm -h):
ipvsadm-A|E -t|u|f service-address [-s scheduler]
[-p[timeout]] [-M netmask] [-b sched-flags]
ipvsadm-D -t|u|f service-address
ipvsadm-C
ipvsadm-R
ipvsadm-S [-n]
ipvsadm-a|e -t|u|f service-address -r server-address
[-g|i|m][-w weight] [-x upper] [-y lower]
ipvsadm-d -t|u|f service-address -r server-address
ipvsadm-L|l [options]
ipvsadm-Z [-t|u|f service-address]
ipvsadm--set tcp tcpfin udp
ipvsadm-h