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

[经验分享] lvs的dr模式详细讲解

[复制链接]

尚未签到

发表于 2019-1-2 14:02:35 | 显示全部楼层 |阅读模式
  lvs的dr模式详细讲解
  一,环境介绍
  三台虚拟机来做lvs的负载均衡实验,vm01是负载均衡器,只有一块网卡,vm02和vm03是真正的web服务器
vm01
eth0:192.168.46.131
vip:192.168.46.200
vm02
eth1:192.168.46.130
vm03
eth1:192.168.46.134  
  ,lvs的dr模式的工作原理
官方的原理说明:Director接收用户的请求,然后根据负载均衡算法选取一台realserver,将包转发过去,最后由realserver直接回复给用户。
实例场景设备清单:

  client是与vip同一网段的机器。如果是外部的用户访问,将client替换成gateway即可,因为IP包头是不变的,变的只是源mac地址。
①client向目标vip发出请求,Director接收。此时IP包头及数据帧头信息如下:

②VS根据负载均衡算法选择一台active的realserver(假设是192.168.57.122),将此RIP所在网卡的mac地址作为目标mac地址,发送到局域网里。此时IP包头及数据帧头信息如下:

③realserver(192.168.57.122)在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文。随后重新封装报文,发送到局域网。此时IP包头及数据帧头信息如下:

④如果client与VS同一网段,那么client(192.168.57.135)将收到这个回复报文。如果跨了网段,那么报文通过gateway/路由器经由Internet返回给用户。
  
  
  三,负载均衡器安装
  IPVS是整个负载均衡的基础,如果没有这个基础,那么故障隔离和失败切换就没有意义
[root@vm01 ~]# yum install -y ipvsadm
[root@vm01 ~]# lsmod  |grep ip_vs
[root@vm01 ~]# modprobe  ip_vs
[root@vm01 ~]# lsmod  |grep ip_vs
ip_vs                 122241  0  这里不能靠进程来判断是不是加载了ip_vs模块,因为这里就是一个命令,没有产生进程。
  

  四,创建lvsdr模式启动脚本
  ipvsadm的命令参考:
  -A--add-service在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也
就是增加一台新的虚拟服务器。
-E--edit-service编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D--delete-service删除内核虚拟服务器表中的一条虚拟服务器记录。
-C--clear清除内核虚拟服务器表中的所有记录。
-R--restore恢复虚拟服务器规则
-S--save保存虚拟服务器规则,输出为-R选项可读的格式
-a--add-server在内核虚拟服务器表的一条记录里添加一条新的真实服务器
记录。也就是在一个虚拟服务器中增加一台新的真实服务器
-e--edit-server编辑一条虚拟服务器记录中的某条真实服务器记录
-d--delete-server删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l--list显示内核虚拟服务器表
-Z--zero虚拟服务表计数器清零(清空当前的连接数量等)
--settcptcpfinudp设置连接超时值
--start-daemon启动同步守护进程。他后面可以是master或backup,用来说
明LVSRouter是master或是backup。在这个功能上也可以采用keepalived的
VRRP功能。
--stop-daemon停止同步守护进程
-h--help显示帮助信息
其他的选项:
-t--tcp-serviceservice-address说明虚拟服务器提供的是tcp的服务
[vip:port]or[real-server-ip:port]
-u--udp-serviceservice-address说明虚拟服务器提供的是udp的服务
[vip:port]or[real-server-ip:port]
-f--fwmark-servicefwmark说明是经过iptables标记过的服务类型。
-s--schedulerscheduler使用的调度算法,有这样几个选项
rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
默认的调度算法是:wlc.
-p--persistent[timeout]持久稳固的服务。这个选项的意思是来自同一个客
户的多次请求,将被同一台真实的服务器处理。timeout的默认值为300秒。
-M--netmasknetmaskpersistentgranularitymask
-r--real-serverserver-address真实的服务器[Real-Server:port]
-g--gatewaying指定LVS的工作模式为直接路由模式(也是LVS默认的模式)
-i--ipip指定LVS的工作模式为隧道模式
-m--masquerading指定LVS的工作模式为NAT模式
-w--weightweight真实服务器的权值
--mcast-interfaceinterface指定组播的同步接口
-c--connection显示LVS目前的连接如:ipvsadm-L-c
--timeout显示tcptcpfinudp的timeout值如:ipvsadm-L--timeout
--daemon显示同步守护进程状态
--stats显示统计信息
--rate显示速率信息
--sort对虚拟服务器和真实服务器排序输出
--numeric-n输出IP地址和端口的数字形式
[root@vm01 ~]# vim  /etc/init.d/lvsdr
#!/bin/bash
VIP=192.168.46.200
RIP1=192.168.46.130
RIP2=192.168.46.134
case "$1" in
start)
echo "start LVS of DirectorServer DR"
/sbin/iptables -F
/sbin/ipvsadm -C
/sbin/ifconfig eth2:0 $VIP  broadcast $VIP  netmask 255.255.255.0  up
/sbin/ipvsadm  -A -t $VIP:80  -s rr
/sbin/ipvsadm  -a -t $VIP:80  -r  $RIP1 -g
/sbin/ipvsadm  -a -t $VIP:80  -r  $RIP2 -g
/sbin/ipvsadm
;;
stop)
echo "stop  LVS of DirectorServer DR"
echo "0" >/proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth0:0 down
;;
*)
echo "argements error"
;;
esac
[root@vm01 ~]#chown +x  /etc/init.d/lvsdr  
  五,vm02和vm03上的配置
#vim /etc/init.d/lvsdrrip
#!/bin/bash
#DR server
VIP=192.168.46.200
case "$1" in
start)
echo "start LVS of DR"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add  -host  $VIP dev lo:0
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
;;
stop)
echo "stop LVS of DR"
/sbin/ifconfig lo:0 down
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage:$0 {start|stop}"
esac
exit 1  
注:DR模式VIP必须跟服务器同一网段
echo"1";echo"2"是为了抑制arp广播作用
#chmodo+x/etc/init.d/lvsdr
#servicelvsdrripstart
  
  

  六,测试
[root@vm01~]#ipvsadm  -lnc
IPVS  connection     entries
pro expire state source  virtual  destination
TCP01:56 FIN_WAIT  192.168.1.203:35952  192.168.1.30:80 192.168.1.202:80
TCP01:44 FIN_WAIT  192.168.1.203:35951  192.168.1.30:80 192.168.1.201:80  
  可以看到这些连接被平均的分配两个主机上了

  
  
  七,关于lvs的dr模式的一些疑问
1.LVS/DR如何处理请求报文的,会修改IP包内容吗?
1.1vs/dr本身不会关心IP层以上的信息,即使是端口号也是tcp/ip协议栈去判断是否正确,vs/dr本身主要做这么几个事:
1)接收client的请求,根据你设定的负载均衡算法选取一台realserver的ip;
2)以选取的这个ip对应的mac地址作为目标mac,然后重新将IP包封装成帧转发给这台RS;
3)在hashtable中记录连接信息。
vs/dr做的事情很少,也很简单,所以它的效率很高,不比硬件负载均衡设备差多少。
数据包、数据帧的大致流向是这样的:client-->VS-->RS-->client
1.2前面已作了回答,vs/dr不会修改IP包的内容.

2.RealServer为什么要在lo接口上配置VIP?在出口网卡上配置VIP可以吗?
2.1既然要让RS能够处理目标地址为vip的IP包,首先必须要让RS能接收到这个包。
在lo上配置vip能够完成接收包并将结果返回client。
2.2答案是不可以将VIP设置在出口网卡上,否则会响应客户端的arprequest,造成client/gatewayarptable紊乱,以至于整个loadbalance都不能正常工作。

3.RealServer为什么要抑制arp帧?
什么是arp
我们知道,当我们在浏览器里面输入网址时,DNS服务器会自动把它解析为IP地址,浏览器实际上查找的是IP地址而不是网址。那么IP地址是如何转换为第二层物理地址(即MAC地址)的呢?在局域网中,这是通过ARP协议来完成的。ARP协议对网络安全具有重要的意义。通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞。所以网管们应深入理解ARP协议。
  一、什么是ARP协议
  ARP协议是“Addre***esolutionProtocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。
  二、ARP协议的工作原理
在每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的,如附表所示。

  附表
  我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例。当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到了,也就知道了目标MAC地址,直接把目标MAC地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播,目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.1.1的MAC地址是什么?”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应:“192.168.1.1的MAC地址是00-aa-00-62-c6-09”。这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。
  三、如何查看ARP缓存表
  ARP缓存表是可以查看的,也可以添加和修改。在命令提示符下,输入“arp-a”就可以查看ARP缓存表中的内容了,如附图所示。
  用“arp-d”命令可以删除ARP表中某一行的内容;用“arp-s”可以手动在ARP表中指定IP地址与MAC地址的对应。

这个问题在上一问题中已经作了说明,这里结合实施命令进一步阐述。我们在具体实施部署的时候都会作如下调整:
echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/lo/arp_announceecho"1">/proc/sys/net/ipv4/conf/all/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/all/arp_announce我相信很多人都不会弄懂它们的作用是什么,只知道一定得有。我这里也不打算拿出来详细讨论,只是作几点说明,就当是补充吧。
3.1
echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/lo/arp_announce这两条是可以不用的,因为arp对逻辑接口没有意义。
3.2如果你的RS的外部网络接口是eth0,那么
echo"1">/proc/sys/net/ipv4/conf/all/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/all/arp_announce其实真正要执行的是:
echo"1">/proc/sys/net/ipv4/conf/eth0/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/eth0/arp_announce所以我个人建议把上面两条也加到你的脚本里去,因为万一系统里上面两条默认的值不是0,那有可能是会出问题滴。
arp_ignore:
定义对目标地址为本地IP的ARP询问不同的应答模式0

0-(默认值):回应任何网络接口上对任何本地IP地址的arp查询请求

1-只回答目标IP地址是来访网络接口本地地址的ARP查询请求

2-只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内

3-不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应

4-7-保留未使用

8-不回应所有(本地地址)的arp查询

确定了向外发送ARP请求的发出地址也即使VIP地址

arp_announce-INTEGER

对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制:

确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口

0-(默认)在任意网络接口(eth0,eth1,lo)上的任何本地地址

1-尽量避免不在该网络接口子网段的本地地址做出arp回应.当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.

2-对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址.如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.

限制了使用本地的vip地址作为优先的网络接口


4.LVS/DRloadbalancer(director)与RS为什么要在同一网段中?
从第一个问题中大家应该明白vs/dr是如何将请求转发给RS的了吧?它是在数据链路层来实现的,所以director必须和RS在同一网段里面。

5.为什么director上eth0接口除了VIP另外还要配一个ip(即DIP)?
5.1如果是用了keepalived等工具做HA或者LoadBalance,则在健康检查时需要用到DIP。
5.2没有健康检查机制的HA或者LoadBalance则没有存在的实际意义。

6.LVS/DRip_forward需要开启吗?
不需要。因为director跟realserver是同一个网段,无需开启转发。

7.director的vip的netmask一定要是255.255.255.255吗?
lvs/dr里,director的vip的netmask没必要设置为255.255.255.255,也不需要再去
routeadd-host$VIPdeveth0:0director的vip本来就是要像正常的ip地址一样对外通告的,不要搞得这么特殊.
  




运维网声明 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-658708-1-1.html 上篇帖子: 搭建一套LVS 下篇帖子: LVS+keeplived
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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