LVS之NAT模型、DR模型配置和持久连接
前言:继LVS概述,本篇实现NAT模型和DR模型下的负载均衡。
NAT模型:
LVS-NAT基于cisco的LocalDirector。VS/NAT不需要在RealServer上做任何设置,其只要能提供一个tcp/ip的协议栈即可,甚至其无论基于什么OS。基于VS/NAT,所有的入站数据包均由Director进行目标地址转换后转发至内部的RealServer,RealServer响应的数据包再由Director转换源地址后发回客户端。
VS/NAT模式不能与netfilter兼容,因此,不能将VS/NAT模式的Director运行在netfilter的保护范围之中。现在已经有补丁可以解决此问题,但尚未被整合进ip_vs code。
环境:
director:
公网VIP:192.168.2.168
私网DIP:172.16.2.170
realserver网关指向DIP
realserver1 RIP:172.16.2.171 Gateway 172.16.2.170 安装apache
realserver2 RIP:172.16.2.172 Gateway 172.16.2.170 安装apache
各节点之间的时间偏差不应该超出1秒钟;
使用校时协议NTP:Network Time Protocol
director上定义集群:
打开网卡转发:echo 1 > /proc/sys/net/ipv4/ip_forward 轮调算法: ipvsadm -A -t 192.168.2.168:80 -s rr ipvsadm -a -t 192.168.2.168:80 -r 172.16.2.171 -m ipvsadm -a -t 192.168.2.168:80 -r 172.16.2.172 -m
查看集群服务:
访问测试:
查看连接状态:
也可以使用其他算法,调整为权重wrr:
ipvsadm -E -t 192.168.2.168:80 -s wrr ipvsadm -e -t 192.168.2.168:80 -r 172.16.2.171 -m -w 3 ipvsadm -e -t 192.168.2.168:80 -r 172.16.2.172 -m -w 1 测试:ab -n 1000 -c 100 http://192.168.2.168/index.html
测试结果,连接3倍左右:
保存规则:
[root@myhost01 ~]# service ipvsadm save
ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm: [确定]
保存其他地方:
[root@myhost01 ~]# ipvsadm -S > /home/zdjiang/ipvsadm.web
重新载入:
ipvsadm -R < /home/zdjiang/ipvsadm.web
NAT模型实现起来较为简单。
DR模型:
ARP问题:
__________
| |
| client |
|________|
|
|
(router)
|
|
| __________
| DIP | |
|------| director |
| VIP |__________|
|
|
|
------------------------------------
| | |
| | |
RIP1, VIP RIP2, VIP RIP3, VIP
______________ ______________ ______________
| | | | | |
| realserver1 | | realserver2 | | realserver3 |
|______________| |______________| |______________|
在如上图的VS/DR或VS/TUN应用的一种模型中(所有机器都在同一个物理网络),所有机器(包括Director和RealServer)都使用了一个额外的IP地址,即VIP。当一个客户端向VIP发出一个连接请求时,此请求必须要连接至Director的VIP,而不能是RealServer的。因为,LVS的主要目标就是要Director负责调度这些连接请求至RealServer的。
因此,在Client发出至VIP的连接请求后,只能由Director将其MAC地址响应给客户端(也可能是直接与Director连接的路由设备),而Director则会相应的更新其ipvsadm table以追踪此连接,而后将其转发至后端的RealServer之一。
如果Client在请求建立至VIP的连接时由某RealServer响应了其请求,则Client会在其MAC table中建立起一个VIP至RealServer的对就关系,并以至进行后面的通信。此时,在Client看来只有一个RealServer而无法意识到其它服务器的存在。
为了解决此问题,可以通过在路由器上设置其转发规则来实现。当然,如果没有权限访问路由器并做出相应的设置,则只能通过传统的本地方式来解决此问题了。这些方法包括:
1、禁止RealServer响应对VIP的ARP请求;
2、在RealServer上隐藏VIP,以使得它们无法获知网络上的ARP请求;
3、基于“透明代理(Transparent Proxy)”或者“fwmark (firewall mark)”;
4、禁止ARP请求发往RealServers;
传统认为,解决ARP问题可以基于网络接口,也可以基于主机来实现。Linux采用了基于主机的方式,因为其可以在大多场景中工作良好,但LVS却并不属于这些场景之一,因此,过去实现此功能相当麻烦。现在可以通过设置arp_ignore和arp_announce,这变得相对简单的多了。
Linux 2.2和2.4(2.4.26之前的版本)的内核解决“ARP问题”的方法各不相同,且比较麻烦。幸运的是,2.4.26和2.6的内核中引入了两个新的调整ARP栈的标志(device flags):arp_announce和arp_ignore。基于此,在DR/TUN的环境中,所有IPVS相关的设定均可使用arp_announce=2和arp_ignore=1/2/3来解决“ARP问题”了。
arp_ignore: 定义接收到ARP请求时的响应级别;
0:只要本地配置的有相应地址,就给予响应;
1:仅在请求的目标地址配置请求到达的接口上的时候,才给予响应;
arp_announce:定义将自己地址向外通告时的通告级别;
0:将本地任何接口上的任何地址向外通告;
1:试图仅向目标网络通告与其网络匹配的地址;
2:仅向与本地接口上地址匹配的网络进行通告;
在RealServers上,VIP配置在本地回环接口lo上。如果回应给Client的数据包路由到了eth0接口上,则arp通告或请应该通过eth0实现,因此,需要在sysctl.conf文件中定义如下配置:
#vim /etc/sysctl.conf
net.ipv4.conf.eth0.arp_ignore = 1
net.ipv4.conf.eth0.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
以上选项需要在启用VIP之前进行,否则,则需要在Drector上清空arp表才能正常使用LVS。
到达Director的数据包首先会经过PREROUTING,而后经过路由发现其目标地址为本地某接口的地址,因此,接着就会将数据包发往INPUT(LOCAL_IN HOOK)。此时,正在运行内核中的ipvs(始终监控着LOCAL_IN HOOK)进程会发现此数据包请求的是一个集群服务,因为其目标地址是VIP。于是,此数据包的本来到达本机(Director)目标行程被改变为经由POSTROUTING HOOK发往RealServer。这种改变数据包正常行程的过程是根据IPVS表(由管理员通过ipvsadm定义)来实现的。
如果有多台Realserver,在某些应用场景中,Director还需要基于“连接追踪”实现将由同一个客户机的请求始终发往其第一次被分配至的Realserver,以保证其请求的完整性等。其连接追踪的功能由Hash table实现。Hash table的大小等属性可通过下面的命令查看:
# ipvsadm -lcn
为了保证其时效性,Hash table中“连接追踪”信息被定义了“生存时间”。LVS为记录“连接超时”定义了三个计时器:
1、空闲TCP会话;
2、客户端正常断开连接后的TCP会话;
3、无连接的UDP数据包(记录其两次发送数据包的时间间隔);
上面三个计时器的默认值可以由类似下面的命令修改,其后面的值依次对应于上述的三个计时器:
# ipvsadm --set 28800 30 600
数据包在由Direcotr发往Realserver时,只有目标MAC地址发生了改变(变成了Realserver的MAC地址)。Realserver在接收到数据包后会根据本地路由表将数据包路由至本地回环设备,接着,监听于本地回环设备VIP上的服务则对进来的数据库进行相应的处理,而后将处理结果回应至RIP,但数据包的原地址依然是VIP。
ipvs的持久连接:
无论基于什么样的算法,只要期望源于同一个客户端的请求都由同一台Realserver响应时,就需要用到持久连接。比如,某一用户连续打开了三个telnet连接请求时,根据RR算法,其请求很可能会被分配至不同的Realserver,这通常不符合使用要求。
环境:
director:
VIP eth0:0:192.168.2.170
DIP eth0:192.168.2.168
realserver1 RIP eth0:192.168.2.171 VIP lo:0 192.168.2.170
realserver2 RIP eth0:172.168.2.172 VIP lo:0 192.168.2.170
各节点之间的时间偏差不应该超出1秒钟;
realserver先设置arp,再设置lo:0
改2个接口,一个all的,一个eth0或lo的
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce ifconfig lo:0 192.168.2.170 broadcast 192.168.2.170 netmask 255.255.255.255 up route add -host 192.168.2.170 dev lo:0 director配置: ifconfig eth0:0 192.168.2.170 broadcast 192.168.2.170 netmask 255.255.255.255 up route add -host 192.168.2.170 dev eth0:0 echo 1 > /proc/sys/net/ipv4/ip_forward /sbin/ipvsadm -C ipvsadm -A -t 192.168.2.170:80 -s wlc ipvsadm -a -t 192.168.2.170:80 -r 192.168.2.171 -g -w 2 ipvsadm -a -t 192.168.2.170:80 -r 192.168.2.172 -g -w 1
LVS持久连接:
无论使用算法,LVS持久都能实现在一定时间内,将来自同一个客户端请求派发至此前选定的RS。
为什么使用持久连接,为了用户访问的session和cookie,也可以使用session共享替代持久连接。
持久连接模板(内存缓冲区):
每一个客户端 及分配给它的RS的映射关系;
ipvsadm -A|E ... -p timeout:
timeout: 持久连接时长,默认300秒;单位是秒;
在基于SSL,需要用到持久连接;
PPC:将来自于同一个客户端对同一个集群服务的请求,始终定向至此前选定的RS; 持久端口连接
PCC:将来自于同一个客户端对所有端口的请求,始终定向至此前选定的RS; 持久客户端连接
把所有端口统统定义为集群服务,一律向RS转发;
PNMPP:持久防火墙标记连接
iptables -t mangle -A PREROUTING -d $VIP -p tcp --dport $ClusterPORT -i $INCARD -j MARK --set-mark 10
PPC:
ipvsadm -E -t 192.168.2.170:80 -s rr -p 600
PCC:把所有端口统统定义为集群服务
ipvsadm -A -t 192.168.2.170:0 -s rr -p 600
ipvsadm -a -t 192.168.2.170:0 -r 192.168.2.172 -g
ipvsadm -a -t 192.168.2.170:0 -r 192.168.2.171 -g
PNMPP:持久防火墙标记连接
把80和23归并为同一个realserver
80: RS1 注:一般和443归并
22: 同一个RS
ipvsadm -C
iptables -t mangle -A PREROUTING -d 192.168.2.170 -i eth0 -p tcp --dport 80 -j MARK --set-mark 10
iptables -t mangle -A PREROUTING -d 192.168.2.170 -i eth0 -p tcp --dport 22 -j MARK --set-mark 10
ipvsadm -A -f 10 -s rr
ipvsadm -a -f 10 -r 192.168.2.171 -g
ipvsadm -a -f 10 -r 192.168.2.172 -g
上面,没有使用持久连接,启用持久连接:ipvsadm -E -f 10 -s rr -p 600
验证不再给出。
LVS之NAT模型、DR模型配置和持久连接的更多相关文章
- LVS nat模型+dr模型
nat模型 在 rs1 和 rs2 安装httpd 并配置测试页,启动 [root@rs1 ~]# yum install httpd -y[root@rs1 ~]# echo "thi ...
- Lvs之NAT、DR、TUN三种模式的应用配置案例
LVS 一.LVS简介 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的 ...
- 关于LVS中默认的DR模型图
虽然常用,但是关于DR模型最大的一个缺点就是Director和RS必须在同一个网络中,通过交换机连接,中间不能有路由
- LVS之NAT和DR服务脚本
NAT服务控制脚本 #!/bin/bash # # chkconfig: - 88 12 # description: LVS script for VS/NAT # . /etc/rc.d/init ...
- LVS之NAT、DR、TUNNEL实验
1.LVS-NAT规则+WRR算法 服务器 IP地址 作用 系统版本 RS1 10.0.0.8/24GW:10.0.0.101 网站服务器 Rocky8.6 RS2 10.0.0.18/24GW:10 ...
- LVS的工作模式介绍和NAT模式&DR模式实验步骤
一:LVS介绍 二.LVS的NAT和DR模式的实验及配置步骤 一.LVS的简单介绍 linux virtual server 简单来讲lvs是一段内核代码 类似于netfilter本身是一框架但不提供 ...
- LVS的DR模型配置
LVS的DR模型配置 介绍 下图为DR模型的通信过程,图中的IP不要被扑结构中的IP迷惑,图里只是为了说明DR的通信原理,应用到本例中的拓扑上其工作原理不变. 拓扑结构 服务器 IP地址 角色 Srv ...
- lvs dr 模型配置详解
前期准备: 两台服务器 note01(lvs服务器) note02(real sever) 1 首先在note01配置子网卡: ifconfig eth0: :2意思是eth0的子接口,随便一个数字就 ...
- LVS负载均衡器DR模型的实现
概述: 在大规模互联网应用中,负载均衡设备是必不可少的一个节点,源于互联网应用的高并发和大流量的冲击压力,我们通常会在服务端部署多个无状态的应用服务器和若干有状态的存储服务器(数据库.缓存等等) 一. ...
随机推荐
- NSOperation, NSOperationQueue 原理探析
通过GNUstep的Foundation来尝试探索下NSOperation,NSOperationQueue 示例程序 写一个简单的程序 - (void)viewDidLoad { [super vi ...
- 如何搜索IP的地理位置
如何搜索IP的地理位置 http://www.ip138.com/ 打开上边这个网页以后,会显示自身的IP及地理位置,,,,也可以搜索别人的IP和地理位置,手机号等:截图如下:
- ruby的sort方法的重新认识
ruby中的sort方法,这个方法可以加一个两个参数的block,这个block可以返回1 0 -1来表示这两个参数大于 等于 小于示例: str = ["192.160.175" ...
- openstack neutron中涉及的网络设备
一.openstack neutron网络设备介绍 Bridge(网桥) 用于将两个LAN连接起来,主要靠的MAC地址学习机制.当网桥的Port收到包时会将包的源mac和port ID关联起来记入ma ...
- Android tesseract-orc之扫描身份证号码
踩了不少坑,终于把这个扫描版的身份证识别做出来了,图片识别引擎用的是tesseract,在已经训练好样本的情况下,感觉识别率还是一般般~ 下面说一说大概几个坑. 一. 编译tesseract-orc ...
- IntelliJ IDEA 缺少 javax 包 支持
在初次使用 IntelliJ IDEA 中,当你使用javax.servlet包下的类时(例:javax.servlet.http.HttpServlet), 在你会发现在IntelliJ IDEA里 ...
- C#创建文件夹并设置权限
原文地址:https://www.cnblogs.com/top5/archive/2010/04/12/1710141.html /* 需要添加以下命名空间: using System.IO; ...
- Spark技术栈
- jQuery $.ajax 参数说明及调用注意事项
$.ajax参数设置 备注:data.contentType.dataType属性值很重要!!! async 类型:Boolean 默认值: true.默认设置下,所有请求均为异步请求.如果需要发送同 ...
- Win8.1开机自启动程序
动机: 开机自启动goagent与锐捷 问题: goagent没有自启动选项;锐捷开启"登录后启动"却一直没有启动 解决方案: 使用计划任务启动goagent+彻底关闭UAC使锐捷 ...