lvs+keepalived高可用

1. LVS的介绍

LVSLinux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。目前从内核版本2.4.24以后IPVS已经成为linux官方标准内核的一部分。

虽然lvs已经被Linux集成到内核中了,内核模块为ipvs,但是不能直接配置内核中的ipvs,而需要使用ipvs的管理工具ipvsadm进行管理。通过keepalived也可以管理LVS。

2. LVS的用途

LVS主要用于多服务的负载均衡。如下图所示,通过lvs可以将外部请求负载均衡到后端的多个web服务器上。

 

LVS的优点:

它工作在网络层,可以实现高性能,高可用的服务器集群技术。

它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。

它易用,配置非常简单,且有多种负载均衡的方法。

可扩展性也非常好。

性能好,几乎可以和F5相媲美

 

3. LVS的核心组件

 

LVS的管理工具和内核模块 ipvsadm/ipvs:

  • ipvsadm:用于空间的命令行工具, 用于管理集群服务及集群服务上的RS等;

  • ipvs:工作于内核上的程序, 可根据用户定义的集群实现请求转发。

 

LVS的常用术语:
VS:Virtual Server,虚拟服务器

Director/Balancer:负载均衡器,上图中的lvs调度器

RS:Real Server,后端请求处理服务器,上图中的web服务

CIP:client ip,客户单ip
VIP:Director Virtural IP,负载均衡虚拟IP,应该出现在lvs调度器上和后端的RS上
DIP:Director IP 负载均衡器ip
RIP:Real Server IP,后端请求处理服务器IP

 

 

 

4. LVS的四种模式(DR模式最常用)

NAT 模式 
DR  模式   (重点是DR模式,其他模式了解即可)
tun 隧道模式
full-NAT模式

其中DR模式效率最高

4.1 DR模式

lvs的DR模式最最稳定, 是使用最多的一种模式。DR模式也叫直接路由模式,我们通过一个案例来讲解DR模式。

如下图所示:

环境信息如下:

VIP:集群的VIP是192.168.147.150 DIP:lvs服务器自身的eth0网卡ip是192.168.1.110 RIP:两个RS的ip分别是192.168.1.111,192.168.1.112 另外补充一句:配置lvs,则需要在lvs的服务器上和后端的RS服务器上的lo口(本地环回口)上配置vip的地址。

整体如下图所示,LVS服务器和RS服务器上都有两个IP地址,一个是eth0网口的本地真实IP,另一个是手动配置给lo口的VIP地址。

图片来自网络,侵权即删)

那上图的请求流程是:
1. client APP访问域名www.xxxxx.com
2. DNS将域名www.xxxxx.com解析为VIP地址192.168.147.150
3. Client要访问192.168.147.150,则先通过arp广播查询,找到192.168.147.150对应的mac地址,查询后发现192.168.147.150的ip地址对应的mac是lvs服务器的mac地址,于是,向lvs服务器发起访问请求。
4. lvs收到请求后,通过负载均衡算法,将请求转发给后端的RS。
5. RS收到请求后,将reply回复给client。

 

整个流程看起来挺完美的。
但是!这里遇到了我们的第一个问题,稍微细心的同学肯定也有个疑惑? 本地局域网中有3台机器配置了同样的VIP地址,client端请求VIP地址时,为什么没有把请求打到RS,而是打到了LVS上?
也就是说为什么第3步arp广播请求VIP地址时,将VIP地址解析成了lvs的mac地址,而不是另外两台RS的mac地址?
我们带着问题来思考, 可能才更好的帮助我们来理解LVS的DR模式, 那么要解决这个问题, 我们就需要提到我们刚开始提到的ARP请求了, 我们需要在LVS, RS1, RS2上都需要绑定三个VIP, 如果我们在
RS的服务器上做一些额外的配置,比如配置抑制ARP应答不就可以了。

很好,解决方法就是在RS的服务器上通过修改Linux内核参数,如下:
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
为了帮助大家更好的理解三个vip之间的关系, 我们举个例子来说: 
LVS服务器是正常的, 当DNS在请求的时候会解析出来VIP的地址, 但是并不知道, 具体的mac地址是哪一个, 那LVS服务器会通过ARP请求, 告知别人自己的mac地址, 别人就缓存下来了, 反之, 我们的RS是抑制ARP应答的, 其实他就是一个哑巴, 他不会响应arp的请求报文, 这样别人就不知道他的mac地址, 即使他有VIP地址, 所以DNS只会把请求转发到LVS上, 而不能转发到RS上。

但是这里又遇到了我们的第二个问题, 那就是我们抑制了RS的arp报文,也就不知道RS的mac地址了,那么LVS如何把请求转发给RS呢?

解决了上面的问题, 那新的问题又来了,既然我们说RS禁止了ARP请求, 那LVS是如何把请求转发给RS的呢?其实我告诉你, 是通过修改mac地址, 进行转发的, 这个是DR模式的核心技术,修改mac地址。
OK,这里我们清楚了,client请求到了lvs,lvs通过修改目的mac地址为RS的mac,将请求转发给RS。
但是还有一个问题?
LVS又是如何知道RS的mac地址呢, 毕竟RS上的arp都被抑制了,这里我可以提前告诉你lvs就是通过arp请求知道RS的mac地址的, 那有些人就会问我, 你这个不是自相矛盾吗?

首先我们看一下, 我们的vip都是绑定在lo上的, 我们要理解上面我提出的这个问题, 就要深入的了解一下linux内核参数的配置信息了。

 有关arp_ignore的相关介绍:

arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询

看了上述的介绍,我们明白了,我们设置的arp_ignore内核参数是1, 就是只回答目标IP地址是来访网络接口本地地址的ARP查询请求,即: 只回答本地网卡eth0上的ARP请求。

 

我们就拿上面的图举例:

LVS服务器:

DIP: 绑定的网卡eth0: 192.168.1.110

VIP: 绑定的网卡是lo:0: 192.168.147.150

RS服务器:
RIP: 绑定的网卡是eth0: 192.168.1.111

VIP: 绑定的网卡lo:0: 192.168.147.150
其实客户端在发送ARP请求的时候, 询问的是VIP的mac地址, LVS服务器进行了正确的ARP请求回应, 而当循环RS服务器的mac地址的时候, 这个时候, 我们网卡的IP地址是: 192.168.1.111/112, RS是做过阉割的, 所以不给与回应。当LVS服务器发起ARP请求的时候, 循环192.168.1.111或者192.168.1.112的mac地址, 这个时候, RS本地的网卡地址, 就是LVS需要访问的ip地址, 就进行ARP请求的回应. 所有LVS服务器就缓存了RS服务器的mac地址。上面的问题是不是都迎刃而解了

 最后一个问题:我们说在响应client时,是由RS直接返回给client的,这个是怎么做到的呢?

这个问题太好, 我们一般接收的请求, 应该都是哪里来, 哪里回, 那RS是如何做到直接返回个客户端的呢?好的, 既然我们前面提到了在RS上进行设计linux内核参数的更改, 分别是arp_ignore和arp_announce两个内核参数, 既然arp_ignore是禁止arp请求的,我们上面已经介绍过了,  arp_announce内核参数是做什么的嗯? 我们下面就来讲解一下这个参数的作用吧。既然存在, 那就是有意义的, arp_announce这个内核参数, 其实就是让RS可直接返回给客户端。

有关arp_announce的相关介绍:

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

0 - (默认) 在任意网络接口上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.

 其实我们RS可以直接返回给客户端, 就是arp_announce设置为2起到的作用, 他会自主的选择一个地址, 即VIP地址, 返回给我们的客户端, 其实就是利用了一个欺骗的技术, 让客户端不会把我们返回的请求丢弃掉, 让他以为RS返回的请求是正常的。

 

 


使用DR模式:
lvs 负载均衡器主要做的是修改目的mac,将mac改为某一台real_server real server 主要做的是 1.绑定vip 2.抑制arp

数据包流程: 客户求请求由LVS接受,但是由Real Server返还给用户信息,不经过LVS转发. 这里引发一个问题: 当用户请求时,源IP是CIP,目标地址是VIP;LVS调度器将请求转发给Real Server处理后再发送给用户,这个时候源IP是RIP,目标地址是CIP,但是用户并没有请求RIP,用RIP响应请求时CIP不会接受,所以需要用VIP响应请求。

 

所以DR原理是:
DR模式下LVS和Real server都需要配备一样的VIP(Real Server通过将VIP绑定在loopback实现).
但是 同一个局域网中,多台服务器出现同样的IP地址会引起冲突(arp协议的ip地址冲突检测机制,免费arp),so 那么如何工作下去?
需要在调度服务器上设置一个VIP和DIP, 每个RS也有一个RIP和VIP,但是RS需要对VIP地址做隐藏,不会应答ARP广播,只有在响应CIP时,作为源地址使用.
当产生请求时,LVS将目标mac修改为RS中的MAC,然后转发到相应的RS上处理,此时源,目的IP都没有改变,RS收到LVS转发来的包时,发现mac是自己的,IP也是自己的,所以合法接收,并直接回复,不经过LVS.

注意: 免费arp,主机发送自己的ip查询mac,如果没有应答ok,有应答出事.

 

DR模式的案例:

 

==其他的几种模式==

4.2 NAT模式简介:
这个是通过网络地址转换的方法来实现调度的。
   首先调度器(LB)接收到客户的请求数据包时(请求的目的IP为VIP),根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。然后调度就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP),这样真实服务器(RS)就能够接收到客户的请求数据包了。真实服务器响应完请求后,查看默认路由(NAT模式下我们需要把RS的默认路由设置为LB服务器。)把响应后的数据包发送给LB,LB再接收到响应包后,把包的源地址改成虚拟地址(VIP)然后发送回给客户端。
原理图简述:
1)客户端请求数据,目标IP为VIP
2)请求数据到达LB服务器,LB根据调度算法将目的地址修改为RIP地址及对应端口(此RIP地址是根据调度算法得出的。)并在连接HASH表中记录下这个连接。
3)数据包从LB服务器到达RS服务器webserver,然后webserver进行响应。Webserver的网关必须是LB,然后将数据返回给LB服务器。
4)收到RS的返回后的数据,根据连接HASH表修改源地址VIP&目标地址CIP,及对应端口80.然后数据就从LB出发到达客户端。
5)客户端收到的就只能看到VIP\DIP信息。
 
 
4.3 TUN模式
采用NAT模式时,由于请求和响应的报文必须通过调度器地址重写,当客户请求越来越多时,调度器处理能力将成为瓶颈。为了解决这个问题,调度器把请求的报文通过IP隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文,由于一般网络服务应答数据比请求报文大很多,采用VS/TUN模式后,集群系统的最大吞吐量可以提高10倍。
VS/TUN的工作流程图如下所示,它和NAT模式不同的是,它在LB和RS之间的传输不用改写IP地址。而是把客户请求包封装在一个IP tunnel里面,然后发送给RS节点服务器,节点服务器接收到之后解开IP tunnel后,进行响应处理。并且直接把包通过自己的外网地址发送给客户不用经过LB服务器。
 
 
原理图过程简述:
1)客户请求数据包,目标地址VIP发送到LB上。
2)LB接收到客户请求包,进行IP Tunnel封装。即在原有的包头加上IP Tunnel的包头。然后发送出去。
3)RS节点服务器根据IP Tunnel包头信息(此时就又一种逻辑上的隐形隧道,只有LB和RS之间懂)收到请求包,然后解开IP Tunnel包头信息,得到客户的请求包并进行响应处理。
4)响应处理完毕之后,RS服务器使用自己的出公网的线路,将这个响应数据包发送给客户端。源IP地址还是VIP地址。(RS节点服务器需要在本地回环接口配置VIP,后续会讲)
 
 

4.4 LVS的FULLTUN模式

fullnat模式听名字也是nat模式的一种, 那full是什么意思呢? 就是全部的nat模式, nat模式中, 我们是需要设置RS的网关地址为LVS的内网服务器地址, 那fullnat模式, 就是我们最通常容易理解的类型, 我们通过下面的图来了解吧,, 主要是就包的请求地址改变有不同。

 

nat模式:

fullnat模式:

 

 

 

5. lvs调度算法

共8种算法,分为两类:
固定调度算法和动态调度算法:
固定调度算法:rr,wrr,dh,sh
动态调度算法:lc,wlc,lblc,lblcr
 
rr: 轮询算法(Round Robin 简称'RR')就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都一样的,调度器会将所有的请求平均分配给每个真实服务器。
 
wrr:加权轮询算法,加权轮询(Weight Round Robin 简称'WRR')算法主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。
 
dh:目标地址散列调度(Destination Hashing 简称'DH')算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。
 
sh:源地址散列调度(Source Hashing  简称'SH')算法先根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同,它的算法流程与目标地址散列调度算法的基本相似。
 
============================================================================================================
lc:最小连接调度(Least Connections 简称'LC')算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中断或者超时,其连接数减1。(集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载。)
 
wlc:加权最少连接(Weight Least Connections 简称'WLC')算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

 

lblc:基于局部的最少连接调度(Locality-Based Least Connections 简称'LBLC')算法是针对请求报文的目标IP地址的 负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和Cache命中率,从而提升整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则使用'最少连接'的原则选出一个可用的服务器,将请求发送到服务器。

 

lblcr:带复制的基于局部性的最少连接(Locality-Based Least Connections with Replication  简称'LBLCR')算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统,它与LBLC算法不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。按'最小连接'原则从该服务器组中选出一一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按'最小连接'原则从整个集群中选出一台服务器,将该服务器加入到这个服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

 

LVS算法选型:
1、一般的网络服务,如http,mail,mysql等常用的LVS调度算法为:
a.基本轮询调度rr
b.加权最小连接调度wlc
c.加权轮询调度wrc
2、基于局部性的最小连接lblc和带复制的给予局部性最小连接lblcr主要适用于web cache和DB cache。
3、源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中,可以保证整个系统的出入口唯一。

 

6. lvs安装

安装LVS软件
 
1)在安装LVS软件之前,先确定两条HTTPserver是能够正常访问的。
 
2)下载软件
 
wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
 
这里我们使用的2.4版本,并且注意内核是2.6版本的,如果你的版本是6.X版本的话,那么可以使用2.6版本
 
3)编译安装
 
需要创建一个软连接:ln -s /usr/src/kernels/2.6.18-238.el5-i686 /usr/src/linux
 
此处红色许根据自己的系统来进行定义,可以使用tab键来补齐。
 
tar -zxf ipvsadm-1.24.tar.gz
 
cd ipvsadm-1.24
 
make
make install
 
lsmod |grep ip_vs 

 

    
如果此时没有显示,则表示系统未将ipvs模块加载进去.
 
ipvsadm --》因为此时系统还没有把ipvs模块加载进系统,需要我们执行ipvsadm命令才会加载进去
 
或者modprobe ip_vs
 
DR模式
在real server上需要做的是:
1.添加lo口的vip
ifconfig lo:0 192.168.255.10/32 up
route add -host 192.168.255.10 dev lo
2.在realserver上抑制rap响应:
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

 

 
小结:
lvs故障排错理论
1.调度器上LVS的规则和IP的正确性
2.RS上做VIP绑定和arp抑制检查
 

lvs实验:

3台机器,一台lvs 2台nginx
3台机器都安装ipvsadm,如果报错说明下列依赖包没有,yum安装
yum install libnl* popt* -y

lvs:
    ipvsadm -C
    ipvsadm -Ln
    ipvsadm -A -t 192.168.255.111:80 -s rr -p 20
    ipvsadm -a -t 192.168.255.111:80 -r 192.168.255.137 -g -w 1
    ipvsadm -a -t 192.168.255.111:80 -r 192.168.255.138 -g -w 1

real server:
  373  cat /proc/sys/net/ipv4/conf/lo/arp*
  374  cat /proc/sys/net/ipv4/conf/all/arp
 若全为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
添加vip地址和路由:
ifconfig lo:0 192.168.255.111/32 up
route add -host 192.168.255.111 dev lo:0

 

posted @ 2020-05-08 16:53  象飞田  阅读(319)  评论(0编辑  收藏  举报