设为首页 收藏本站
查看: 1543|回复: 0

[经验分享] LVS之NAT模型、DR模型配置和持久连接

[复制链接]

尚未签到

发表于 2017-7-9 18:38:44 | 显示全部楼层 |阅读模式
  前言:继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

  查看集群服务:
DSC0000.png

  访问测试:
DSC0001.png

DSC0002.png

  查看连接状态:
DSC0003.png

  也可以使用其他算法,调整为权重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倍左右:
DSC0004.png

  保存规则:
  [iyunv@myhost01 ~]# service ipvsadm save
  ipvsadm: Saving IPVS table to /etc/sysconfig/ipvsadm:      [确定]
  保存其他地方:
  [iyunv@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

DSC0005.png

  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
DSC0006.png

DSC0007.png

  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

DSC0008.png

DSC0009.png

  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
  验证不再给出。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-392150-1-1.html 上篇帖子: 真正理解红黑树,真正的(Linux内核里大量用到的数据结构,且常被二货问到) 下篇帖子: Linux ipip隧道及实现
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表