LVS (Linux Virtual Server)
原理及更多介绍查看
以下记录一些常用信息,来自互联网整理
LVS 相关术语:
- DS:Director Server。指的是前端负载均衡器节点。
- RS:Real Server。后端真实的工作服务器。
- VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
- DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
- RIP:Real Server IP,后端服务器的IP地址。
- CIP:Client IP,访问客户端的IP地址。
LVS 的三种模型及其特点:
一:LVS-NAT模型的特性:

- RS应该使用私有地址,RS的网关必须指向DIP
- DIP和RIP必须在同一个网段内
- 请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈
- 支持端口映射
- RS可以使用任意操作系统
- 缺陷:对Director Server压力会比较大,请求和响应都需经过director server
二:LVS-DR模型的特性

- 特点1:保证前端路由将目标地址为VIP报文统统发给Director Server,而不是RS
- RS可以使用私有地址;也可以是公网地址,如果使用公网地址,此时可以通过互联网对RIP进行直接访问
- RS跟Director Server必须在同一个物理网络中
- 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
- 不支持地址转换,也不支持端口映射
- RS可以是大多数常见的操作系统
- RS的网关绝不允许指向DIP(因为我们不允许他经过director)
- RS上的lo接口配置VIP的IP地址
- 缺陷:RS和DS必须在同一机房中
三:LVS-Tun模型特性

- RIP、VIP、DIP全是公网地址
- RS的网关不会也不可能指向DIP
- 所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
- 不支持端口映射
RS的系统必须支持隧道
其实企业中最常用的是 DR 实现方式,而 NAT 配置上比较简单和方便,后边实践中会总结 DR 和 NAT 具体使用配置过程。
LVS 的八种调度算法
1. 轮叫调度 rr
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。
2. 加权轮叫 wrr
这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
3. 最少链接 lc
这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1
4. 加权最少链接 wlc
这个算法比 lc 多了一个权重的概念。
5. 基于局部性的最少连接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
6. 复杂的基于局部性最少的连接算法 lblcr
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
7. 目标地址散列调度算法 dh
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
8. 源地址散列调度算法 sh
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
提示
关于调度算法看到了另一个版本,是10 个调度算法,除了 rr,wrr,lc,wlc,lblc,wlblc,dh,sh 另外还有 nq ,sed 。在kernel-3.10.0-123.el7.x86_64 中的模块中包含了 ip_vs_sed,和 ip_vs_nq
配置参考:
centos 6/7 第一步 ,安装ipvsadm 软件,然后确认有没有加载ip_vs 模块
yum -y install ipvsadm
lsmod | grep ip_vs
#如果没有加载模块,手动加载相应
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- nf_conntrack_ipv4
查看可用的ip_vs 模块
[root@test02 ~]# find /lib/modules/$(uname -r)/ -iname "*ip_vs*"
/lib/modules/3.10.0-123.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_dh.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_ftp.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_lblc.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_lblcr.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_lc.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_nq.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_pe_sip.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_rr.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_sed.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_sh.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_wlc.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/net/netfilter/ipvs/ip_vs_wrr.ko