先简单的介绍下关于LVS负载均衡

LVS(Linux  Virtual Server)Linux服务器集群系统

针对高可伸缩,高可用服务的需求,给予IP层和内容请求分发的负载均衡调度解决方法,并在Linux的内核中实现,将一组服务器构成一个实现可伸缩,高可用网络服务的虚拟服务器
负载均衡
1.大量的兵法访问或数据流量分担到多态节点设备分别处理,减少用户的等待时间
2.单个重负载的运算分担到多态节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户
负载调度器
一组服务器通过高速的局域网或者地理分布的广域网相互相连,在他们的前端有一个负载均衡调度器(Load Balancer),负载均衡调度器能无缝的将网络请求调度到真实的服务器上,从而使得服务器集群的结构对用户是透明的,用户通过访问集群系统提供的网络 服务,就像访问一台高性能,高可用的服务器。
IP负载均衡技术(三种)
1.VS/NAT(网络地址转换)
通过网络地址转换,调度器重写请求报文的目标地址,根据预设的调度算法,将请求分发给后端的真实服务器,真实服务器的响应报文通过调度器时,报文的源地址被重写,再返回到客户端,完成整个调度的过程
2.VS/TUN(IP隧道模式)
调度器将请求的报文通过IP隧道转发至真实服务器,而真实的服务器直接将结果返回给用户,调度器只处理请求报文,由于一般网路服务的应答大于请求,采用IP隧道模式,集群系统的最大吞吐量可以提高10倍。
3.VS/DR(直接路由)
通过改写请求报文的MAC地址,将请求发送到真是服务器,真实服务器将响应直接返回给用户,之际额路由模式可以极大的提高集群系统 的伸缩性,这种方法没有IP隧道的开销,集群中真实的服务器也没有必要必须支持IP隧道协议,只是需要调度器与真实服务器有一块网卡连在同一物理网段上。
其中在这三种IP负载均衡的技术中,DR和TUN模式都需要在真实服务器上对arp_ignore和arp_announce参数进行配置,主要是实现禁止响应对VIP的ARP请求。

在lvs环境中,需要设定以下的参数

echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore

echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce

echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce

先来看看关于arp_ignore和arp_announce的有关介绍

有关arp_ignore的相关介绍:
arp_ignore - INTEGERDefine different modes for sending replies in response toreceived ARP requests that resolve local target IP addresses:0 - (default): reply for any local target IP address, configuredon any interface1 - reply only if the target IP address is local addressconfigured on the incoming interface2 - reply only if the target IP address is local addressconfigured on the incoming interface and both with thesender's IP address are part from same subnet on this interface3 - do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied4-7 - reserved8 - do not reply for all local addressesThe max value from conf/{all,interface}/arp_ignore is usedwhen ARP request is received on the {interface}

arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式0

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

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

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

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

4-7 - 保留未使用

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

有关arp_announce的相关介绍:

arp_announce - INTEGERDefine different restriction levels for announcing the localsource IP address from IP packets in ARP requests sent oninterface:0 - (default) Use any local address, configured on any interface1 - Try to avoid local addresses that are not in the target'ssubnet for this interface. This mode is useful when targethosts reachable via this interface require the source IPaddress in ARP requests to be part of their logical networkconfigured on the receiving interface. When we generate therequest we will check all our subnets that include thetarget IP and will preserve the source address if it is fromsuch subnet. If there is no such subnet we select sourceaddress according to the rules for level 2.2 - Always use the best local address for this target.In this mode we ignore the source address in the IP packetand try to select local address that we prefer for talks withthe target host. Such local address is selected by lookingfor primary IP addresses on all our subnets on the outgoinginterface that include the target IP address. If no suitablelocal address is found we select the first local addresswe have on the outgoing interface or on all other interfaces,with the hope we will receive reply for our request andeven sometimes no matter the source IP address we announce.The max value from conf/{all,interface}/arp_announce is used.Increasing the restriction level gives more chance forreceiving answer from the resolved target while decreasingthe level announces more valid sender's information.

arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口

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

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

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

关于对arp_announce 理解的一点补充

Assume that a linux box X has three interfaces - eth0, eth1 and eth2. Each interface has an IP address IP0,

IP1 and IP2. When a local application tries to send an IP packet with IP0 through the eth2.  Unfortunately,

the target node’s mac address is not resolved. Thelinux box X will send the ARP request to know

the mac address of the target(or the gateway). In this case what is the IP source address of the

“ARP request message”? The IP0- the IP source address of the transmitting IP or IP2 - the outgoing

interface?  Until now(actually just 3 hours before) ARP request uses the IP address assigned to

the outgoing interface(IP2 in the above example) However the linux’s behavior is a little bit

different. Actually the selection of source address in ARP request is totally configurable

bythe proc variable “arp_announce”

If we want to use the IP2 not the IP0 in the ARP request, we should change the value to 1 or 2.

The default value is 0 - allow IP0 is used for ARP request.

其实就是路由器的问题,因为路由器一般是动态学习ARP包的(一般动态配置DHCP的话),当内网的机器要发送一个到外部的ip包,那么它就会请求 路由器的Mac地址,发送一个arp请求,这个arp请求里面包括了自己的ip地址和Mac地址,而linux默认是使用ip的源ip地址作为arp里面 的源ip地址,而不是使用发送设备上面的 ,这样在lvs这样的架构下,所有发送包都是同一个VIP地址,那么arp请求就会包括VIP地址和设备 Mac,而路由器收到这个arp请求就会更新自己的arp缓存,这样就会造成ip欺骗了,VIP被抢夺,所以就会有问题。

arp缓存为什么会更新了,什么时候会更新呢,为了减少arp请求的次数,当主机接收到询问自己的arp请求的时候,就会把源ip和源Mac放入自 己的arp表里面,方便接下来的通讯。如果收到不是询问自己的包(arp是广播的,所有人都收到),就会丢掉,这样不会造成arp表里面无用数据太多导致 有用的记录被删除。

在设置参数的时候将arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不做出响应,默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送mac地址
文章转载自:http://www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html

arp_announce和arp_ignore 详细解说

版本V1.0
时间2012-06-16
版权GPL
作者itnihao
说明,本文档来自网络整理和个人理解综合整理
原文地址http://itnihao.blog.51cto.com/1741976/75247

 

lvs在DR模式下需要关闭arp,设置参数的意思可以参考下文

arp_announce和arp_ignore

用来屏蔽arp请求,比较难理解,先看看linux核心2.6的定义:

==============================arp_announce=============================

arp_announce - INTEGER 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. This mode is useful when target hosts reachable via this interface require the source IP address in ARP requests to be part of their logical network configured on the receiving interface. When we generate the request we will check all our subnets  that include the target IP and will preserve the source address if it is from such subnet. If there is no such subnet we select source address according to the rules for level

2 - Always use the best local address for this target. In this mode we ignore the source address in the IP packet and try to select local address that we prefer for talks with the target host. Such local address is selected by looking for primary IP addresses on all our subnets on the outgoing interface that include the target IP address. If no suitable local address is found we select the first local address we have on the outgoing interface or on all other interfaces, with the hope we will receive reply for our request and even sometimes no matter the source IP address we announce. The max value from conf/{all,interface}/arp_announce is used. Increasing the restriction level gives more chance for receiving answer from the resolved target while decreasing the level announces more valid sender's information.

#对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口

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

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

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

===========================arp_ignore============================

arp_ignore - INTEGER Define different modes for sending replies in response to received ARP requests that resolve local target IP addresses:

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 arepart from same subnet on this interface

3 - do not reply for local addresses configured with scope host,only resolutions for global and link addresses are replied

4-7 - reserved

8 - do not reply for all local addresses

The max value from conf/{all,interface}/arp_ignore is used when ARP request is received on the {interface}  
定义对目标地址为本地IP的ARP询问不同的应答模式0

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

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

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

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

4-7 - 保留未使用

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

arp_ignore 设置为1,这个比较好理解,当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不响应,默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送mac地址应答。

arp_announce 这个就比较难解释了,先看一段英文的:

Assume that a linux box X has three interfaces - eth0, eth1 and eth2. Each interface has an IP address IP0, IP1 and IP2. When a local application tries to send an IP packet with IP0 through the eth2.  Unfortunately, the target node’s mac address is not resolved. Thelinux box X will send the ARP request to know the mac address of the target(or the gateway). In this case what is the IP source address of the “ARP request message”? The IP0- the IP source address of the transmitting IP or IP2 - the outgoing interface?  Until now(actually just 3 hours before) ARP request uses the IP address assigned to the outgoing interface(IP2 in the above example) However the linux’s behavior is a little bit different. Actually the selection of source address in ARP request is totally configurable bythe proc variable “arp_announce”

If we want to use the IP2 not the IP0 in the ARP request, we should change the value to 1 or 2. The default value is 0 - allow IP0 is used for ARP request.

其实就是路由器的问题,因为路由器一般是动态学习ARP包的(一般动态配置DHCP的话),当内网的机器要发送一个到外部的ip包,那么它就会请求 路由器的Mac地址,发送一个arp请求,这个arp请求里面包括了自己的ip地址和Mac地址,而linux默认是使用ip的源ip地址作为arp里面 的源ip地址,而不是使用发送设备上面的 ,这样在lvs这样的架构下,所有发送包都是同一个VIP地址,那么arp请求就会包括VIP地址和设备 Mac,而路由器收到这个arp请求就会更新自己的arp缓存,这样就会造成ip欺骗了,VIP被抢夺,所以就会有问题。

arp缓存为什么会更新了,什么时候会更新呢,为了减少arp请求的次数,当主机接收到询问自己的arp请求的时候,就会把源ip和源Mac放入自 己的arp表里面,方便接下来的通讯。如果收到不是询问自己的包(arp是广播的,所有人都收到),就会丢掉,这样不会造成arp表里面无用数据太多导致 有用的记录被删除。

What happens when a host receives an ARP request packet?  The ARP request is received and processed by all the hosts in the network,since it is a broadcast packet. The following steps are carried out when a ARP request packet is received by a host:  If the IP address to be resolved is for this host, then the ARP module sends an ARP reply packet with its Ethernet MAC address.  If the IP address to be resolved is for this host, then the ARP module updates its ARP cache with the source Ethernet MAC address to source IP address mapping present in the ARP request packet. If the entry is already present in the cache, it is overwritten. If it is not present, it is added.  If the IP address to be resolved is not for this host, then the ARP module discards the ARP request packet.  Will a host update its ARP cache upon receiving any ARP request?  A host will update its ARP cache, only if the ARP request is for its IP address. Otherwise, it will discard the ARP request.  What is the disadvantage if a host updates its ARP cache upon receiving any ARP request?  The host will exhaust the ARP cache with a lot of unused ARP entries, if it updates the ARP cache for any ARP request.

如果路由器使用静态ARP表,客户端也使用静态网关ARP的话,基本就不用管这两个值了。  也看了一下vpn,用了pppoe协议,也是不需要处理arp请求的。

查看某个设备上面绑定了多少个ip:>ip addr show dev eth0

绑定多个ip(临时,看操作系统不同加在不同的地方):>ip addr add x.x.x.x/32 dev eth0

临时修改arp_announce和arp_ignore:

echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

永久修改:

if  /etc/sysctl.conf is used in the system, we have this config in /etc/sysctl.conf

net.ipv4.conf.eth0.arp_ignore = 1

net.ipv4.conf.eth0.arp_announce = 2

在lvs环境中,需要设定以下的参数

echo"1">/proc/sys/net/ipv4/conf/all/arp_ignore

echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignore

echo"2">/proc/sys/net/ipv4/conf/lo/arp_announce

echo"2">/proc/sys/net/ipv4/conf/all/arp_announce

文章摘自:http://blog.51cto.com/itnihao/752472

转载于:https://www.cnblogs.com/baichuanhuihai/p/8440670.html

LVS负载均衡中arp_ignore和arp_annonuce参数配置相关推荐

  1. LVS负载均衡群集的了解与基本配置(一)

    前言: 今天要给大家介绍的是LVS群集,在企业中应用非常广泛,是为了实现负载均衡, 提高服务器的工作效率,当其中有服务器发生故障的时候也不会影响客户的访问.   一.群集技术概述 1.群集的含义 来源 ...

  2. nginx+tomcat集群负载均衡中的多虚拟主机配置

    虽然夜深了,但是还是解决了这个困扰我一个晚上的问题,记录下来备查. 接着我前不久写的这一篇来的:Linux下nginx和tomcat的整合http://hi.baidu.com/gnaiqeh/blo ...

  3. 构建百万访问量电子商务网站之LVS负载均衡(前端四层负载均衡器)[连载之电子商务系统架构]...

    构建百万访问量电子商务网站之LVS负载均衡(前端四层负载均衡器)[连载之电子商务系统架构] 版本:V1 出处:http://jimmyli.blog.51cto.com/我站在巨人肩膀上Jimmy L ...

  4. LVS负载均衡基础总结

    提高服务器响应能力的方法: scale on  在原有服务器的基础上进行升级或者直接换一台新的性能更高的服务器. scale out  横向扩展,将多台服务器并发向外响应客户端的请求.优点:成本低,扩 ...

  5. 十 LVS 负载均衡

    回顾nginx 反向代理负载均衡 负载均衡的妙用 负载均衡(Load Balance)集群提供了一种廉价.有效.透明的方法, 来扩展网络设备和服务器的负载.带宽.增加吞吐量.加强网络数据处理能力. 提 ...

  6. LVS负载均衡DR模式安装和配置过程详解

    ===============================为什么使用LVS负载均衡============================= **nginx反向代理** 用作负载均衡优点: 工作在 ...

  7. LVS负载均衡环境搭建

    LVS+Keepalived构建拓扑图 准备工作 因为搭建了两套环境,所以括号中的是我另一个的环境,紫色标识 RIP: 10.1.31.161+10.1.31.163    (home:192.168 ...

  8. LVS负载均衡—基于Keepalived做高可用

    备注:开通虚拟IP时,一定备注清楚作为LVS使用,系统底层要进行一些策略 的配置 一.架构 先看看:高可用软件keepalived详解 Lvs+Keepalived的基本使用架构如下图如下: 当然,我 ...

  9. LVS负载均衡与DR模式

    LVS负载均衡与DR模式 一.DR模式的特点 二.LVS-DR中的ARP问题 1.VIP地址相同导致响应冲突 2.返回报文时源地址使用VIP,导致网关设备的ARP缓存表紊乱 三.DR模式 LVS负载均 ...

  10. Linux中级实战专题篇:LVS负载均衡集群部署

    LVS负载均衡 一,负载均衡集群相关介绍 1,集群是什么 集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能.可靠性.灵活性方面的相对较高的收益,其任务调度 ...

最新文章

  1. 学习IT技术你需要的是书?视频教程?还是老师?
  2. 为什么使用LM386可以直接收听调频电台节目?
  3. 一份邀请函引发的中国芯片新猜想
  4. fckeditor编辑器上传文件出现invalid Request问题解决
  5. 关于自定义可以点击的的布局
  6. [Buzz Today]2012.08.08
  7. 洛谷 P1417 烹调方案 (01背包拓展)
  8. 摇杆怎么映射到键盘_[评测]YAMAHA PSRSX900:雅马哈升级幅度最大的高端编曲键盘键盘中国原创评测...
  9. 信息安全工程师笔记-网络安全主动防御技术与应用
  10. python输入姓名 性别身高_python简单实现学生管理系统
  11. 【Elasticsearch】Get 查询获取不到数据,但是用 _search 就可以查询到
  12. 【超参数寻优】交叉验证(Cross Validation)超参数寻优的python实现:单一参数寻优
  13. (bfs)广度优先 实现图的遍历
  14. python 判断中文字符数量_python判断列表里数量python中文乱码问题大总结
  15. docker学习笔记一:基本安装和设置容器静态ip
  16. 前端非框架类知识点汇总
  17. SSD固态硬盘特性术语bit位设置
  18. CSS font-size单位
  19. 【软件测试】翻了下招聘APP只会点点点,很慌......测试业务?技术?
  20. 理想汽车高管解读财报:被认定为软件企业 获增值税退税2.8亿

热门文章

  1. 130 个相见恨晚的超实用网站,一次性分享出来,十倍提高工作效率
  2. 用IO多路复用,实现每秒百万并发的原理你懂吗?
  3. 每天都在和Maven打交道?你真的了解它吗?
  4. 10个最佳的网站和App开发工具
  5. 华为正式发布鸿蒙OS操作系统,分布式架构首次用于终端
  6. Mysql——应用学习之旅
  7. CTF加密题型解析:RSA算法的CTF解法之一
  8. 【shell】通过shell编写ping包及arp的监控并发送短信
  9. mysql函数操作(5)
  10. Moss网站在不同服务器的迁移