LVS两段式介绍
ipvs:工作在内核空间,TCP/IP协议栈INPUT钩子函数上的框架(Linux2.5内核之后内置ipvs代码,LVS跟netfilter不能同时使用)。
ipvsadm:工作在用户空间,负责管理集群服务编写规则的命令行工具,需要手动安装。
1 |
$ yum install ipvsadm |
ipvsadm管理命令
一、管理集群服务
1)添加集群
1 |
ipvsadm -A -t|u|f service-address [-s scheduler] |
2)修改集群
1 |
ipvsadm -E -t|u|f service-address [-s scheduler] |
3)删除集群
1 |
ipvsadm -D -t|u|f service-address |
参数解释:
1 2 3 4 |
-t #TCP协议集群,如[IP:PORT]; -u #UDP协议集群,如[IP:PORT]; -f #FWM防火墙标记,如[MARK NUMBER]; -s #调度算法,如[rr|wrr|sh|dh|lc|wlc|lblc|lblcr]; |
使用示例:
1 2 3 4 5 6 7 8 |
# 添加一个VIP为172.29.32.205:80的集群,调度算法为wrr加权轮询; $ ipvsadm -A -t 172.29.32.205:80 -s wrr # 修改VIP的端口为8080; $ ipvsadm -E -t 172.29.32.205:8080 -s wrr # 删除集群; $ ipvsadm -D -t 172.29.32.205:80 |
二、管理集群中的RealServer
1)添加RealServer
1 |
ipvsadm -a -t|u|f service-address -r service-address [-g|-i|-m] [-w weight] |
2)修改RealServer
1 |
ipvsadm -e -t|u|f service-address -r service-address [-g|-i|-m] [-w weight] |
3)删除RealServer
1 |
ipvsadm -d -t|u|f service-address -r service-address |
参数解释:
1 2 3 4 5 6 7 8 |
-t|u|f service-address #这个地址是前面创建好的集群服务; -r service-address #定义RealServer地址,在NAT模式中可使用端口映射; -g #表示使用DR模型; -i #表示使用TUN模型; -m #表示使用NAT模型; -w #定义权重值,如果使用加权轮询,LVS会根据权限比例分配客户端连接请求; -p #定义tcp超时时间,默认为120秒; --set 900 120 300 #定义tcp/tcpfin/udp的超时时间,默认为900/120/300秒; |
使用示例:
1 2 3 4 5 6 7 8 |
# 添加一条RealServer,地址为172.29.32.201:80,调度模式为DR,权重为5; $ ipvsadm -a -t 172.29.32.205:80 -r 172.29.32.201:80 -g -w 5 # 修改RealServer条目的端口为8080; $ ipvsadm -e -t 172.29.32.205:80 -r 172.29.32.201:8080 -g -w 5 # 删除RealServer条目; $ ipvsadm -d -t 172.29.32.205:80 -r 172.29.32.201:80 |
三、查看集群状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 查看集群状态,包含RealServer条目; $ ipvsadm -L # 显示为数字格式,但必须配合-L一块使用且-L必须在-n前面,也可以合并使用,如-Ln; $ ipvsadm -Ln # 显示当前连接数; $ ipvsadm -Lnc # 显示统计数据 $ ipvsadm -Ln --stats # 显示速率; $ ipvsadm -Ln --rate # 显示tcp/tcpfin/udp的会话超时时长,默认是900、120/300; $ ipvsadm -Ln --timeout # 显示进程状态; $ ipvsadm -Ln --daemon # 对集群服务做排序默认升序; $ ipvsadm -Ln --sort |
四、清空所有集群服务
1 |
$ ipvsadm -C |
五、导入导出ipvs规则
1 2 3 4 5 |
# 导出ipvs规则; $ ipvsadm -S > /PATH # 导入ipvs规则; $ ipvsadm -R < /PATH |
六、查看ipvsadm版本号
1 |
$ ipvsadm --version |
LVS NAT模式介绍
NAT模型显然根据名字都可以看出来,是通过网络地址转换来实现的,他的工作方式是,首先用户请求到达前端的负载均衡器(即Director Server),然后负载均衡器根据事先定义好的调度算法将用户请求的目标地址修改为RIP(后端的应用服务器,即Real Server),源地址修改为DIP(后端服务器连接调度器的接口)。 应用程序服务器处理好请求之后将结果返回给用户,期间必须要经过负载均衡器,负载均衡器将报文的源地址改为用户请求的目标地址,再转发给用户,从而完成整个负载均衡的过程。
如下图所示:
NAT模式中且不需要在RealServer上做任何设置,其只要能提供一个tcp/ip的协议栈即可,甚至其无论基于什么OS都行。基于VS/NAT,所有的入站数据包均由Director进行目标地址转换后转发至内部的RealServer,RealServer响应的数据包再由Director转换源地址后发回客户端。VS/NAT模式不能与netfilter兼容,因此,不能将VS/NAT模式的Director运行在netfilter的保护范围之中。现在已经有补丁可以解决此问题,但尚未被整合进ip_vs code。
NAT模式的特点如下:
1)所有的节点必须在一个IP网络中。
2)Real Server的网关必须是DIP。
3)RIP通常是私有地址仅用于各集群节点间的通信。
4)调度器位于Client和RealServer之间并处理进出的所有通信,当负载过大的时候,负载均衡器将是整个集群的瓶颈。
5)支持端口映射。
6)Real Server可以使用任意操作系统。
7)最多支持8个节点。
LVS NAT模式实验配置
1)环境配置
client一台,地址172.16.16.10。
Directory一台,两块网卡,外网地址172.16.16.1,内网为192.168.10.1。
Realserver1一台,安装HTTP服务,地址为192.168.10.2,网关为192.168.10.1。
Realserver2一台,安装HTTP服务,地址为192.168.10.3,网关为192.168.10.1。
PS:LVS NAT模式下,realserver的网关必须为DIP地址才行。
2)Directory配置
首先清空所有iptables规则避免影响ipvsadm
1 2 |
$ iptables -F $ service iptables save |
设置两个网卡的地址
1 2 |
$ ifconfig eth0 172.16.16.1/16 $ ifconfig eth1 192.168.10.1/24 |
打开路由功能
1 |
$ echo 1 > /proc/sys/net/ipv4/ip_forward |
配置集群管理为加权轮询
1 |
$ ipvsadm -A -t 172.16.16.1:80 -s wrr |
添加2条RealServer
1 2 |
$ ipvsadm -a -t 172.16.16.1:80 -r 192.168.10.2:80 -m -w 5 $ ipvsadm -a -t 172.16.16.1:80 -r 192.168.10.3:80 -m -w 5 |
查看配置信息
1 2 3 4 5 6 7 |
$ ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.16.1:80 wrr -> 192.168.10.2:80 Masq 5 0 0 -> 192.168.10.3:80 Masq 5 0 0 |
3)RealServer1配置
1 2 3 4 5 |
# 配置网卡地址; $ ifconfig eth0 192.168.10.2/24 # 添加网关; $ route add default gw 192.168.10.1 |
安装nginx
1 2 3 |
$ yum install nginx $ nginx $ echo 192.168.10.2 > /usr/share/nginx/html/index.html |
4)RealServer2配置
1 2 3 4 5 |
# 配置网卡地址; $ ifconfig eth0 192.168.10.3/24 # 添加网关; $ route add default gw 192.168.10.1 |
安装nginx
1 2 3 |
$ yum install nginx $ nginx $ echo 192.168.10.3 > /usr/share/nginx/html/index.html |
5)测试效果
可以使用客户端访问172.16.16.1查看轮询访问变化,如下:
1 2 3 4 5 6 7 8 |
$ curl http://172.16.16.1 192.168.10.2 $ curl http://172.16.16.1 192.168.10.3 $ curl http://172.16.16.1 192.168.10.2 $ curl http://172.16.16.1 192.168.10.3 |
或者使用ab压力测试访问172.16.16.1查看加权轮询变化。
1 |
$ ab -n 10000 -c 100 http://172.16.16.1 |
查看当前连接数
1 2 3 4 5 6 7 |
$ ipvsadm -L -n -c IPVS connection entries pro expire state source virtual destination TCP 00:08 TIME_WAIT 172.16.16.10:56447 172.16.16.1:80 192.168.10.2:80 TCP 01:18 TIME_WAIT 172.16.16.10:56484 172.16.16.1:80 192.168.10.3:80 TCP 01:18 TIME_WAIT 172.16.16.10:56486 172.16.16.1:80 192.168.10.3:80 TCP 01:18 TIME_WAIT 172.16.16.10:56485 172.16.16.1:80 192.168.10.2:80 |
通过当前连接数,可以看出连接协议,以及tcp keepalive的剩余时间和状态信息。还有源和目标IP以及虚拟IP。
查看统计信息
1 2 3 4 5 6 7 |
$ ipvsadm -L -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes -> RemoteAddress:Port TCP 172.16.16.1:80 11 61 34 7168 7669 -> 192.168.10.2:80 5 28 21 2834 5570 -> 192.168.10.3:80 6 33 13 4334 2099 |
由于是NAT模式,所以当访问几次之后,可以看到,指标Conns、InPkts、OutPkts、InBytes、OutBytes都有数据才正确,因为进出数据包都经过调度器,所以任何一个参数值为空都是不正确的。而DR模式则不然。
最后,还可以更改RealServer的权重,再使用AB压力测试一下,看看统计信息是否跟权重调整的对比。
PS:你在测试过程中,当LVS调度算法使用轮询或加权轮询默认时,如果你使用浏览器(同一个IP)访问VIP,可能会出现跟你想象的轮询调度不一样的结果,那就是一直刷新网页却无法轮询,每次都需要等待2分钟才有轮询效果。而如果你使用curl这种工具进行访问VIP则可以每次都轮询,主要因为浏览器默认使用了keepalive,而curl没有使用,当然这是LVS的默认特性,详情请看。
NAT模式服务控制脚本
Director脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#!/bin/bash # # chkconfig: 2345 88 12 # description: LVS script for VS/NAT . /etc/rc.d/init.d/functions VIP=172.16.16.1 DIP=192.168.10.1 RIP1=192.168.10.2 RIP2=192.168.10.3 INT=eth0 case "$1" in start) /sbin/ifconfig $INT:1 $VIP netmask 255.255.255.0 up # Since this is the Director we must be able to forward packets echo 1 > /proc/sys/net/ipv4/ip_forward # Clear all iptables rules. /sbin/iptables -F # Reset iptables counters. /sbin/iptables -Z # Clear all ipvsadm rules/services. /sbin/ipvsadm -C # Add an IP virtual service for VIP 192.168.0.219 port 80 # In this recipe, we will use the round-robin scheduling method. # In production, however, you should use a weighted, dynamic scheduling method. /sbin/ipvsadm -A -t $VIP:80 -s wrr # Now direct packets for this VIP to # the real server IP (RIP) inside the cluster /sbin/ipvsadm -a -t $VIP:80 -r $RIP1 -m -w 5 /sbin/ipvsadm -a -t $VIP:80 -r $RIP2 -m -w 5 /bin/touch /var/lock/subsys/ipvsadm.lock ;; stop) # Stop forwarding packets echo 0 > /proc/sys/net/ipv4/ip_forward # Reset ipvsadm /sbin/ipvsadm -C # Delete lock file rm -rf /var/lock/subsys/ipvsadm.lock ;; status) [ -e /var/lock/subsys/ipvsadm.lock ] && echo "ipvs is running..." || echo "ipvsadm is stopped..." ;; *) echo "Usage: $0 {start|stop}" ;; esac |
当脚本写好之后就可以保存到/etc/init.d/ipvs文件,然后可以使用service管理。
1 2 3 4 |
$ chmod a+x /etc/init.d/ipvs $ chkconfig --add ipvs $ chkconfig --list ipvs ipvs 0:off 1:off 2:on 3:on 4:on 5:on 6:off |
启动服务
1 2 |
$ service ipvs start Starting ipvs (via systemctl): [ OK ] |
1 2 3 4 5 6 7 |
$ ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.16.1:80 wrr -> 192.168.10.2:80 Masq 5 0 0 -> 192.168.10.3:80 Masq 5 0 0 |
LVS NAT模式测试到此结束。