- 博客/
LVS NAT 负载均衡的实现
什么是LVS#
LVS: Linux Virtual Server,即Linux虚拟服务器,是一个虚拟的服务器集群系统
LVS集群由VS(Virtual Server)负责调度,RS(Real Server)负责真正提供服务。VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS,实现负载均衡,而且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。 lvs集群的类型:
- lvs-nat:多目标IP的DNAT(Network Address Translation),通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发—–本文将对nat模式及其实现做详细解释
- lvs-dr:Direct Routing, LVS默认模式, 通过为请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选出的RS的RIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变
- lvs-tun:不修改请求报文的IP首部, 在原请求IP报文之外封装一个IP首部, 将报文发往挑选出的目标RS,RS直接响应给客户端
- lvs-fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发,此类型kernel默认不支持
ipvsadm与ipvs:
- ipvsadm是用户空间的命令行工具,规则管理器,实现用户管理集群服务及RealServer
管理集群服务:增、改、删 增、改:
ipvsadm -A|E -t|u|f service-address
[-s scheduler]
[-p [timeout]]
删除:
ipvsadm -D -t|u|f service-address
管理集群上的RS:增、改、删 增、改:
ipvsadm -a|e -t|u|f service-address -r server-address
[-g|i|m]
[ -w weight] -g: gateway, dr类型,默认 -i: ipip, tun类型 -m: masquerade, nat类型
删:
ipvsadm -d -t|u|f service-address -r serveraddress
- ipvs是工作于内核空间netfilter的INPUT钩子上的框架,此框架使调度器具备调度转发功能,而调度算法又决定挑选哪个RS进行转发
ipvs 调度算法: 根据其调度时是否考虑各RS当前的负载状态,分为静态方法与动态方法
- 静态方法:仅根据算法本身进行调度
- 动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度
LVS-NAT 模式负载均衡的实现#
NAT模式IP调度流程#
客户端向调度器(Director Server,VS)发送请求报文, Director通过将请求报文中的目标地址
和目标端口
修改为某挑出的RS的RIP和PORT实现转发。此模式下请求报文和响应报文都必须经由Director,调度器易于成为系统瓶颈
http服务负载均衡实验–网络拓扑搭建#
使用VMware搭建实验网络拓扑
调度器Director要打开核心转发功能
$ echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
RS 网关要指向DIP
配置RS httpd服务并启动
RS1 –>
$ echo “RS1 SRV” > /var/www/html/index.html
RS2 –>
$ echo “RS2 SRV” > /var/www/html/index.html
Director上管理集群服务并测试#
添加集群服务
$ ipvsadm -A -t 172.16.253.153:80 -s rr -- -s 指定算法为rr轮询
添加集群的RS
$ ipvsadm -a -t 172.16.253.153:80 -r 192.168.196.155 -m -- -m指定为nat模式
$ ipvsadm -a -t 172.16.253.153:80 -r 192.168.196.196 -m
$ ipvsadm -LnIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.253.153:80 rr
-> 192.168.196.155:80 Masq 1 0 0
-> 192.168.196.196:80 Masq 1 0 0
客户端测试
$ for i in {1..10}; do curl 172.16.253.153;sleep 1;done
RS1 SRV
RS2 SRV
RS1 SRV
RS2 SRV
RS1 SRV
RS2 SRV
RS1 SRV
RS2 SRV
RS1 SRV
RS2 SRV
从测试结果可以看出,客户端访问VS,调度器按照轮询算法依次转发给RS1、RS2
本文的实验只演示了RR算法,还有其他算法可以选择,同时LVS-nat模式还支持端口映射,以httpd集群服务为例,RS的服务端口也可以是自定义端口(eg: 8080)。后续会更新 关于LVS-DR模式、集群服务合并及LVS高可用性的实现