lvs全称Linux Virtual Server,是一款经典的负载均衡软件。其负载均衡方式为IP负载均衡,是众多负载均衡中效率最高的。LVS最大的特点是接受用户连接请求的服务器自身并不对请求产生应答,而是通过负载均衡调度,让真实服务器生成应答包并发送给用户
一、原理介绍
lvs中,接收用户请求并实现负载均衡的的服务器称为Director,负责对客户产生应答的服务器称为Real Server(后称RS)。在LVS的三种工作模式中,Direct Routing(后称DR)模式要求Director和Real Server处于同一子网,即要求RS可以接收Director的二层广播;NAT要求应答数据包经由Director的网络返回客户。因此DR模式和NAT模式都不适合公司使用。剩下的隧道模式正好可以支持Director和RS跨过WAN,因此在部署中使用隧道模式。
lvs隧道模式使用的是ip-ip隧道,是GRE隧道的其中一种,因此LVS隧道要求RS支持ip-ip隧道。已知CentOS 6已经原生提供ip-ip隧道支持,无需对内核进行额外的配置或更改。而CentOS 5等可能需要用insmod或重新编译内核等方式加上ip-ip模块。
lvs隧道模式:如何工作?
CIP为客户IP地址,VIP为对外服务的IP地址,DIP为Director用于和RS组建隧道的IP地址,RIP为为RS的IP地址。
- 客户访问网站,访问的是对外服务的IP地址,即VIP。因此客户电脑发送的IP包,源IP地址为CIP,目标IP为VIP,用(CIP, VIP)表示
- 经过路由,IP包到达Director,Director发现目标地址VIP正好是自己,接收这个包。
- LVS对客户IP包进行封装,发送给RS去处理,源IP地址为DIP,目标IP为RIP。经过封装后,IP包内容为[DIP, RIP(CIP, VIP)]
- RS收到3中所述IP包后,发现目标IP是自己,接收数据包。解包后,发现IP包还经过一层封装,继续解包,得到(CIP, VIP)的包。
- RS看到(CIP, VIP)后,因为RS配置了一个IP地址为VIP的虚拟隧道接口,也就是说,(CIP, VIP)的目的地址还是自己。
- 这时候,如果系统没有把包过滤掉,并且有监听在VIP的程序,该程序就会接收此包,并产生应答,并且按照默认路由返回给客户。
lvs基本工作过程:
客户请发送向负载均衡服务器发送请求。负载均衡器接受客户的请求,然后先是根据LVS的调度算法(8种)来决定要将这个请求发送给哪个节点服务器。然后依据自己的工作模式(3种)来看应该如何把这些客户的请求如何发送给节点服务器,节点服务器又应该如何来把响应数据包发回给客户端。
LVS的三种工作模式:
- VS/NAT模式(Network address translation)
- VS/TUN模式(tunneling)
- DR模式(Direct routing)
二、LVS部署安装
环境
服务器 | ip | 备注 |
---|---|---|
lvs负载均衡器 | 192.168.1.110 | vip地址:192.168.1.120 |
http服务器RS1 | 192.168.1.101 | 部署nginx测试 |
http服务器RS2 | 192.168.1.103 | 部署nginx测试 |
- 安装lvs软件
lsmod | grep ip_vs
输出如下,如果没有输出则需要执行modprobe ip_vs把ipvs模块加载进系统
ip_vs_rr 1420 1ip_vs 125694 3 ip_vs_rrlibcrc32c 1246 1 ip_vsipv6 334932 25 ip_vs
安装lvs管理工具ipvsadm(centos6已自带,无需安装)
yum install -y ipvsadm
- 配置lvs负载均衡器(DR模式,服务器:192.168.1.110)
- 负载均衡器上配置vip地址
命令 | 说明 |
---|---|
ifconfig eth0:1 192.168.1.120 netmask 255.255.255.0 | 绑定vip到网卡eth0:1 |
route add -host 192.168.1.120 dev eth0 | 所有目标地址是192.168.1.120的数据包都从本机eth0接口发送出去 |
- ipvsadm添加lvs服务
| 命令 | 说明 | | ipvsadm -C | 清除lvs原先配置 | ipvsadm -A -t 192.168.1.120:80 -s rr -p 20 | 为Director添加处理规则:隧道处理来自vip192.168.1.120 80端口的访问,并且使用rr的负载均衡调度,保持会话20秒 | | ipvsadm -a -t 192.168.1.120:80 -r 192.168.1.101:80 -g -w 10 | 为Director添加RS1节点(192.168.1.101),工作模式为DR模式,权重为10 | | ipvsadm -a -t 192.168.1.120:80 -r 192.168.1.103:80 -g -w 10 | 为Director添加RS1节点(192.168.1.103),工作模式为DR模式,权重为10 |
- 查看VIP和RS是否已经配置成功
ipvsadm -L -n
- 输出如下
IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.1.120:80 rr persistent 20 -> 192.168.1.103:80 Route 10 0 0 -> 192.168.1.104:80 Route 10 0 0
- 配置RS节点服务器(192.168.1.103、192.168.1.104)
命令 | 说明 |
---|---|
ifconfig lo:0 192.168.1.120 netmask 255.255.255.255 up | RS主机需要绑定VIP地址在LO接口上才能接收目标地址为VIP的包,否则会无法匹配当台机器IP而把数据包丢弃,但由于RS的VIP不是用来通讯,并且这里一定要设置24位掩码 |
route add -host 192.168.1.120 dev lo | 所有目标地址是192.168.1.120的数据包都从本机lo接口发送出去 |
echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore echo "2">/proc/sys/net/ipv4/conf/all/arp_announce | arp抑制,拒绝接受arp更新并不发送arp宣告,避免当192.168.1.120 arp广播时,RS节点也回应导致ARP欺骗,永久修改要修改sysctl.conf参考:http://suchalin.blog.163.com/blog/static/55304677201022643431355/ |
- 测试lvs是否生效
- 分别从不同机器访问http://192.168.1.120/并观察RS1、RS2的http日志
- 如果平均两台都有访问日志即已经将192.168.1.120负载均衡到两台RS节点
- 动态的查看ipvsadm的会话分配
watch ipvsadm -L -n
- ipvsadm添加LVS服务
参数 | 参数说明 |
---|---|
-A | -A --add-service添加一个带选项的虚拟服务。Add a virtual service. A serviceaddress is uniquely defined by a triplet: IP address, portnumber, and protocol. Alternatively a virtualservice may be defined by a firewall-mark. |
-t | 指定虚拟服务器的IP地址和端口 |
-s -s,--scheduler scheduling-method | 调度算法 |
-p | 会话保持按秒计算 |
-a | -a在对应的VIP下添加RS节点 |
-g | 指定此LVS的工作模式为-g -g为DR模式 |
-i | 指定LVS的工作模式为-i -i为tunnel模式 |
-m | 指定LVS的工作模式为NAT模式 |
-w | 指定RS节点的权重 |
-D | 删除虚拟服务格式:ipvsadm-D -t |
-C | -C, --clear Clear the virtual server table清空lvs原有的配置。 |
-set | 设置tcp tcpfn udp 的连接超时时间(一般来说高并发的时候小一点点。 |
-b | fullnat模式 |
- ipvsadm -ln:检查当前运行中的配置
- ipvsadm -L -n:同上
- ipvsadm -ln --stats:检查当前运行状态信息
- ipvsadm -ln --rate:检查当前各RealServer的流量速度
- ipvsadm -ln --connection/-c:检查当前回话连接的分配情况
- ipvsadm -ln --persistent-conn:检查当前保持中的连接分配情况
ip地址欺骗问题
由lvs的工作方式可知,RS在应答客户的时候,所用IP地址并不是它自己的IP地址,而是一个虚拟的,在Director上真实存在的IP地址。因此对于ISP来说,这个数据包是疑似IP地址欺骗攻击的。对于这个问题,大部分的IDC会用uRPF技术去追踪包的路由路径,如果发现源IP地址不在IDC内,则认为是一个IP地址欺骗的包,然后将其丢弃。