LVS 笔记
LVS(Linux Virtual Server) 意为Linux虚拟服务器,是针对高可伸缩、高可用网络服务要求基于 IP 层和内容请求分发的负载均衡调度解决方案
一、LVS 负载均衡技术
1.1、Virtual Server via Network Address Translation(VS/NAT)
此种负载均衡技术实质上通过重写请求和响应报文的目标地址及源地址实现网络地址转换的;在请求时,前端负载均衡器首先根据特定算法选择使用哪个后端真实服务器,然后改写请求报文的目标地址再将请求报文转发给后端的真实服务器;后端服务器返回时,前端负载均衡器再次改写响应报文的源地址,并完成响应转发;由于请求响应报文都需要通过前端负载均衡器进行地址重写,所以此种负载均衡技术对前端负载均衡器性能要求较高,业务量大的情况下前端负载均衡器可能成为瓶颈
1.2、Virtual Server via IP Tunneling(VS/TUN)
TUN 模式采用 NAT 技术,在请求时,前端负载均衡器通过 IP 隧道 直接转发给后端特定的的真实服务器(根据指定算法);响应时后端真实服务器直接返回报文给客户端;由于响应报文不需要再经过前端负载均衡器,所以极大地提高了吞吐量,但是使用此种模式后端服务器必须支持 IP 隧道协议
1.3、Virtual Server via Direct Routing(VS/DR)
相对于 VS/TUN 方式,由于 TUN 方式仍需要打开 IP 隧道,所以在请求时仍有很大开销;而此种模式通过直接改写请求报文的 MAC 地址实现,MAC 地址改写后直接根据指定算法转发到后端服务器,后端服务器响应时也直接返回给客户端而不经过前端负载均衡器,所以此种模式吞吐量会更大;虽然没有了 IP 隧道开销,但是此种模式要求前端负载均衡器必须与后端真实服务器必须在同一网段下,而由于同一网段下机器数量有限,所以也限制了应用范围
二、负载均衡调度算法
2.1、轮询算法(RR)
轮询(Round Robin) 算法简称 RR,负载均衡器通过轮询调度算法将外部请求轮流分配到集群的各个后端服务器上,对待后端服务器属于 “无差别攻击”,所以也会忽略后端服务器的实际负载等
2.2、加权轮询算法(WRR)
加权轮询(Weighted Round Robin) 根据真实服务器的不同处理能力(自动询问)来处理请求分发,轮询时处理能力强的服务器会得到更多的请求分发
2.3、最少连接算法(LC)
使用最少链接(Least Connections)时,前端负载均衡器会自动选择后端真实服务器中连接数最少的服务器进行请求分发,如果后端服务器性能相近,则能够很好地负载均衡,否则可能造成性能问题
2.4、加权最少连接算法
加权最少连接算法算法(Weighted Least Connections)即在 LC 基础上增加服务器性能权重,通过自动询问后端服务器性能和连接情况综合分发请求
2.5、基于局部性最少链接算法(LBLC)
基于局部性最少连接算法(Locality-Based Least Connections)类似 IP 亲和技术加上最少链接算法;请求分发时,前端负载均衡器根据请求目标 IP 查找该请求目标 IP 最近使用的服务器,如果该服务器没有超载则将请求分发给该服务器;否则采用最小连接算法选择一台服务器分发请求
2.6、带复制的基于局部性最少连接算法(LBLCR)
带复制的基于局部性最少连接算法(Locality-Based Least Connections with Replications) 也是针对 IP 的负载均衡技术;与 LBLC 相比,该算法维护一个从目标 IP 到服务器组的映射关系;分发请求时,根据目标 IP 选择对应的服务器组,然后按照最小链接算法选择一台服务器进行请求分发,如果选中的服务器已经超载,则使用最小链接算法从服务器组外选择一台服务器进行请求分发,同时将该服务器加入到目标 IP 对应的服务器组中
2.7、目标地址散列算法(DH)
目标地址散列算法(Destination Hashing)使用请求的目标 IP 地址作为散列键,然后从静态分配的散列表中找出对应的真实服务器进行请求分发,如果该服务器超载,则返回空
2.8、源地址散列算法(SH)
同 DH 类似,只不过散列键换成请求源 IP 地址而已
三、LVS 负载均衡配置
3.1、软件安装
1 |
|
安装后总共3个可执行文件,如下
命令 | 作用 |
---|---|
ipvsadm | LVS 主程序,负责 RS 天剑、删除和修改 |
ipvsadm-save | 备份 LVS 配置 |
ipvsadm-restore | 恢复 LVS 配置 |
ipvsadm
常用参数如下
参数 | 说明 |
---|---|
-A | 在内核虚拟服务器列表中添加一条新的虚拟服务器记录 |
-E | 编辑在内核虚拟服务器列表中的一条虚拟服务器记录 |
-D | 删除内和虚拟服务器列表中的一条虚拟服务器记录 |
-C | 清除内核虚拟服务器列表所有记录 |
-R | 恢复虚拟服务器规则 |
-S | 保存虚拟服务器规则,输出为 -R 可读的格式 |
-a | 在内核虚拟服务器列表中添加一条真实服务器记录 |
-e | 编辑内核虚拟服务器中一条真实服务器记录 |
-d | 删除内核虚拟服务器列表中一条真实服务器记录 |
-L 、-l | 显示内核虚拟服务器列表 |
-Z | 内核虚拟服务器列表计数器清零(清除链接数量等) |
-set | - tcp tcpfin udp 设置连接超时值 |
--start-daemon | 启动同步守护进程 |
--stop-daemon | 停止同步守护进程 |
-daemon | 显示同步守护进程状态 |
-h | 帮助信息 |
-t | 声明该虚拟服务器提供的是 TCP 服务(用于添加时) |
-u | 声明该虚拟服务器提供的是 UDP 服务(用于添加时) |
-f | 声明是经过 iptables 标记过的服务类型 |
-s | 使用的负载均衡调度算法(rr、wrr、lc、wlc、lblc、lblcr、dh、sh、sed、nq) |
-p | 声明提供持久服务 |
-r | 声明是一台真是的服务器 |
-g | 指定 LVS 工作模式为直接路由模式 |
-i | 指定 LVS 工作模式为隧道模式 |
-m | 指定 LVS 工作模式为 NAT 模式 |
-w | 设置真实服务器的权重值 |
-c | 显示 LVS 目前的连接数 |
-timeout | 显示 tcp tcpfin udp 的超时时间 |
--stats | 显示统计信息 |
--rate | 显示速率信息 |
--sort | 对虚拟服务器和真实服务器排序输出 |
-n | 输出 IP 地址和端口的数字形式 |
3.2、基于 NAT 模式
服务器列表
IP | 节点 |
---|---|
192.168.1.100 | 前端负载均衡器 |
192.168.1.150 | 虚拟 IP |
192.168.1.104 | 真实服务器 |
192.168.1.105 | 真实服务器 |
3.2.1、前端负载均衡器配置
1 |
|
3.2.2、后端真实服务器配置
1 |
|
3.2.3、测试 LVS
在两台后端服务器上分别安装 nginx,并更改 index 页面,打印当前服务器 IP,最后在前端负载均衡器上测试访问虚拟 IP,此时前端负载均衡器将会自动根据算法负载到后端;此例中可以看到不断请求虚拟 IP 时,实际后端在做轮训
3.3、基于 DR 模式
3.3.1、前端负载均衡器配置
服务器列表同上面的相同,ipvsadm 安装掠过
1 |
|
1.3.2、后端真实服务器配置
后端配置同上,测试掠过
3.4、基于 TUN 模式
从上面两个配置可以看到,不同模式实际上只是修改前端负载均衡器创建后端真实服务器的命令参数不通而已(-m
、-g
、-i
);唯一要注意的是不同模式对后端服务器要求可能不通,比如 DR 要求前端负载均衡器与后端真实服务器在同一网段,TUN 要求后端真实服务器支持 IP 隧道协议等,所以 TUN 模式在此也不在演示;关于上面修改内核参数的做法最好在 sysctl.conf
中修改保证永久生效