共计 5670 个字符,预计需要花费 15 分钟才能阅读完成。
先简单的介绍下关于 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 – 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 are part 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}
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 – 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.
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.
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 地址。
学习 LVS+Keepalived 必须阅读的三个文档。
1、《Keepalived 权威指南》下载见 http://www.linuxidc.com/Linux/2012-05/60951.htm
2、《LVS 手册》http://www.linuxidc.com/Linux/2016-03/129233.htm
3、《Red_Hat_Enterprise_Linux-5-Virtual_Server_Administration-zh-CN》http://www.linuxidc.com/Linux/2016-03/129234.htm
4、通过 LVS 实现 WEB 站点的 MySQL 高可用 http://www.linuxidc.com/Linux/2013-06/86390.htm
5、LVS+Apache+PHP+MySQL 读写分离 http://www.linuxidc.com/Linux/2012-12/77027.htm
6、MySQL LVS 负载均衡 http://www.linuxidc.com/Linux/2012-09/69862.htm
企业 Web 高可用集群实战之 LVS+Keepalived+MySQL HA http://www.linuxidc.com/Linux/2012-09/70097.htm
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2016-12/138116.htm