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

[经验分享] LVS-NAT和LVS-DR模式的实现详解

[复制链接]

尚未签到

发表于 2019-1-5 12:05:57 | 显示全部楼层 |阅读模式
linux下LVS的实现
  在2.4.23之前的linux内核想要使用LVS需要重新编译内核打补丁,之后的LVS直接做进了内核
  使用grep -i -C 5 ipvs /boot/config-`uname -r`可以查看
  ipvsadm工作在用户空间/ipvs工作在内核空间,用户使用ipvsadm进行设置并且传递到内核空间中的ipvs (ipvsadm工具在光盘中的cluster中)
  ipvsadm功能
  定义一个集群服务,定义REALSERVER,集群服务的查看
  -t 基于tcp的集群服务
  -u 基于udp的集群服务
  -f 基于防火墙标记的集群服务
  -A 添加一个服务
  -E 修改一个服务
  -s 调度算法 默认WLC
  -g LVS-DR直接路由模型
  -i LVS-TUN隧道模型
  -m LVS-NAT模型
  -C 清空规则
  -R 从一个文件中恢复规则
  -S 保存对着到文件中
  -L/l -n 查看
  定义集群服务
  添加或修改集群服务:ipvsadm -A|E -t|u|f VIP:port -s 调度算法
  删除一个集群服务:  ipvsadm -D -t|u|f VIP:port
  realserver
  添加或者修改REALSERVER:ipvsadm -a|e -t|u|f VIP:port -r REALSERVER[:port] -g|-i|-m [-w 权重]
  删除一个REALSERVER:    ipvsadm -d -t|u|f VIP:port -r REALSERVER[:port]
  ##########################################################################
  配置LVS-NAT

  这里以HTTP服务为例,前端服务器配置VIP向外响应来自客户的请求,后端两台REALSERVER运行WEB服务,首先在后端的两台web上面配置相同的网页,设置网关都指向前端服务器的DIP
  在director上面的配置
  echo 1 >proc/sys/net/ipv4/ip_forward 打开路由转发
  ipvsadm -A -t 192.168.0.1:80 -s rr 定义一个集群服务,这个VIP在实际应用中应该是外网地址
  ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.2 -m
  ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.3 -m 添加两台REALSERVER
  查看ipvsadm -L -n
  ipvsadm -E -t 192.168.0.1:80 -s wlc 设置算法为wlc
  ipvsadm -e -t 192.168.0.1:80 -r 192.168.1.2 -m -w 4 设置权重为4,即1.2服务器的性能是1.3服务器的4倍
  ab -c -n 10000 http://192.168.0.1/index.html 用ab命令做测试
  watch -n 1 'ipvsadm -L -n' 每秒刷新一次来查看状态变化,可以看到1.2服务器的响应数基本上为1.3服务器的4倍
  ##########################################################################
  配置LVS-DR

  在如上图的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而无法意识到其它服务器的存在。
  为了解决此问题,可以通过在路由器上设置其转发规则来实现(静态的MAC-IP绑定)。当然,如果没有权限访问路由器并做出相应的设置,则只能通过传统的本地方式来解决此问题了。
  这些方法包括:
  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_annouce:Define different restriction levels for announcing the local source IP address from IP packets in ARP requests sent on interface;
  0 - (default) Use any local address, configured on any interface.
  1 - Try to avoid local addresses that are not in the target's subnet for this interface.
  2 - Always use the best local address for this target.
  arp_ignore: Define different modes for sending replies in response to received ARP requests that resolve local target IP address.
  0 - (default): reply for any local target IP address, configured on any interface.
  1 - reply only if the target IP address is local address configured on the incoming interface.
  2 - reply only if the target IP address is local address configured on the incoming interface and both with the sender's IP address are part from same subnet on this interface.
  3 - do not reply for local address configured with scope host,only resolutions for golbal and link addresses are replied.
  4-7 - reserved
  8 - do not reply for all local addresses
  arp_announce:定义了网卡在向外宣告自己的MAC-IP时候的限制级别
  有三个值:
  0:默认值,不管哪块网卡接收到了ARP请求,只要发现本机有这个MAC都给与响应
  1:尽量避免响应ARP请求中MAC不是本网卡的,一个主机有多块网卡,其中一块网卡接收到了ARP请求,发现所请求的MAC是本机另一块网卡的,这个时候接收到ARP请求的这块网卡就尽量避免响应
  2:总是使用最合适的网卡来响应,一个主机有多块网卡,其中一块网卡接收到了ARP请求,发现所请求的MAC是本机另一块网卡的,这个时候接收到ARP请求的这块网卡就一定不响应,只有发现请求的MAC是自己的才给与响应
  arp_ignore:定义了网卡在响应外部ARP请求时候的响应级别
  这里有8个值,但我们只使用了2个
  0:默认值,不管哪块网卡接收到了ARP请求,只要发现本机有这个MAC都给与响应
  1:总是使用最合适的网卡来响应,一个主机有多块网卡,其中一块网卡接收到了ARP请求,发现所请求的MAC是本机另一块网卡的,这个时候接收到ARP请求的这块网卡就一定不响应,只有发现请求的MAC是自己的才给与响应
  在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。
  配置拓扑如下图:

  1.DIP要配置在接口上,VIP要配置在接口别名上
  在前端服务器上的配置(配置VIP)
  ifconfig eth0:0 $192.168.0.1 broadcast $192.168.0.1 netmask 255.255.255.255 up
  route add -host $192.168.0.1 dev eth0:0
  route add -host $192.168.1.1 dev eth0
  echo 1 >/proc/sys/net/ipv4/ip_forward
  2.在REALSERVER上面的配置
  RIP要配置在接口上,VIP要配置在lo的别名上
  定义内核参数,禁止响应对VIP的ARP广播请求
  echo 1>/proc/sys/net/ipv4/conf/lo/arp_ignore
  echo 1>/proc/sys/net/ipv4/conf/all/arp_ignore
  echo 2>/proc/sys/net/ipv4/conf/lo/arp_announce
  echo 2>/proc/sys/net/ipv4/conf/all/arp_announce
  配置VIP
  ifconfig lo:0 $192.168.0.1 broadcast $192.168.0.1 netmask 255.255.255.255 up
  route add -host 192.168.0.1 dev lo:0 确保如果请求的目标IP是$VIP,那么让出去的数据包的源地址也显示为$VIP
  3.在前端服务器配置并启动服务
  ipvsadm -A -t 192.168.0.1:80 -s wlc
  ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.2 -g -w 4
  ipvsadm -a -t 192.168.0.1:80 -r 192.168.1.3 -g -w 2
  ipvsadm -L -n
  ab -c -n 10000 http://192.168.0.1/index.html
  watch -n 1 'ipvsadm -L -n'


运维网声明 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-659642-1-1.html 上篇帖子: 基于corosync/openais和ldirectord实现LVS(DR)的高可用 下篇帖子: LVS的配置详解配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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