lvs+keepalived集群架构服务

一,LVS功能详解

 

1.1 LVS(Linux Virtual Server)介绍

LVS是Linux Virtual Server 的简写(也叫做IPVS),意即Linux虚拟服务器,是一个虚拟的服务器集群系统,可以在UNIX/LINUX平台下实现负载均衡集群功能。

 

1.2 企业网站LVS集群架构图

image_1ctflvluuq31mrre1d1bdn1449.png-727.2kB

 

1.3 IPVS软件工作层次图

image_1ctfm01hb7gm1tnev7n1hju9njm.png-24.3kB

从上图我们看出,LVS负载均衡调度技术是在Linux内核中实现的,因此,被称之为Linux虚拟服务器(Linux Virtual Server)。我们使用该软件配置LVS时候,不能直接配置内核中的ipbs,而需要使用ipvs管理工具ipvsadm进行管理,或者通过Keepalived软件直接管理ipvs。

 

1.4 LVS体系结构与工作原理简单描述

  • LVS集群负载均衡器接受服务的所有入站客户端计算机请求,并根据调度算法决定哪个集群节点应该处理回复请求。负载均衡器(简称LB)有时也被称为LVS Director(简称Director)。

  • LVS虚拟服务器的体系结构如下图所示,一组服务器通过高速的局域网或者地理分布的广域网相互连接,在他们的前端有一个负载调度器(Load Balancer)。 负载调度器能无缝地将网络请求调度到真实服务器上,从而使得服务器集群的结构对客户是透明的,客户访问集群系统提供的网络服务就像访问一台高性能,高可用的服务器一样。客户程序不受服务器集群的影响不需要作任何修改。系统的伸缩性通过在服务集群中透明地加入和删除一个节点来达到,通过检测节点或服务进程故障和正确地重置系统达到高可用性。由于我们的负载调度技术是在Linux内核中实现的,我们称之为Linux虚拟服务器(Linux Virtual Server)。

 

1.5 LVS 基本工作过程图

LVS基本工作过程如下图所示:

image_1ctfm1pg5f6i194t4v1qsr1p9i2m.png-315.1kB

为了方便大家探讨LVS技术,LVS社区提供了一个命名的约定,内容如下表:

image_1ctfm2ji9pup203nusmlsvp63j.png-33.5kB

LVS集群内部的节点称为真实服务器(Real Server),也叫做集群节点。请求集群服务的计算机称为客户端计算机。 
与计算机通常在网上交换数据包的方式相同,客户端计算机,Director和真实服务器使用IP地址彼此进行通信。

不同架构角色命名情况如下图:

image_1ctfm33sn1d75110vs8l1fuc15pi40.png-342.1kB

 

1.6 LVS集群的3种常见工作模式介绍与原理讲解

IP虚拟服务器软件IPVS

  • 在调度器的实现技术中,IP负载均衡技术是效率最高的。在已有的IP负载均衡技术中有通过网络地址转换(Network Address Translation)将一组服务器构成一个高性能的,高可用的虚拟服务器,我们称之为VS/NAT技术(Virtual Server via Network Address Translation),大多数商业化的IP负载均衡调度器产品都是使用NAT的方法,如Cisco的额LocalDirector,F5,Netscaler的Big/IP和Alteon的ACEDirector。

  • 在分析VS/NAT 的缺点和网络服务的非对称性的基础上,我们提出通过IP隧道实现虚拟服务器的方法VS/TUN(Virtual Server via IP Tunneling)和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),他们可以极大地提高系统的伸缩性。所以,IPVS软件实现了这三种IP负载均衡技术。淘宝开源的模式FULLNAT.

LVS的四种工作模式

  1. NAT(Network Address Translation)
  2. TUN(Tunneling)
  3. DR(Direct Routing)
  4. FULLNAT(Full Network Address Translation)
 

1.6.1 NAT模式-网络地址转换<==收费站模式(了解即可)

Virtual Server via Network Address Translation(VS/NAT)

调度时:目的IP改成RIP(DNAT) 
返回时:源IP改成VIP(SNAT)

image_1cvac3prqq2t1a3o15lj9th17c39.png-338.6kB


image_1cvac4lf2q201cnfmav1m3pu82m.png-313kB

NAT模式特点小结:

  1. NAT技术将请求的报文(DNAT)和响应的报文(SNAT),通过调度器地址重写然后在转发发给内部的服务器,报文返回时在改写成原来的用户请求的地址。
  2. 只需要在调度器LB上配置WAN公网IP即可,调度器也要有私有LAN IP和内部RS节点通信。
  3. 每台内部RS节点的网关地址,必须要配成调度器LB的私有LAN内物理网卡地址(LDIP),这样才能确保数据报文返回时仍然经过调度器LB。
  4. 由于请求与响应的数据报文都经过调度器LB,因此,网站访问量大时调度器LB有较大瓶颈,一般要求最多10-20台节点。
  5. NAT模式支持对IP及端口的转换,即用户请求10.0.0.1:80,可以通过调度器转换到RS节点的10.0.0.2:8080(DR和TUN模式不具备的)
  6. 所有NAT内部RS节点只需要配置私有LAN IP即可。
  7. 由于数据包来回都需要经过调度器,因此,要开启内核转发net.ipv4.ip_forward=1,当然也包括iptables防火墙的forward功能(DR和TUN模式不需要)。
 

1.6.2 TUN模式-(了解即可)

image_1cvac5jod19brdkvpi7qs81ho013.png-347.4kB

增加一个IP头部。通过IP隧道进行通信(可以跨网段找到RS节点) 
TUN模式特点小结:

  1. 负载均衡器通过把请求的报文通过IP隧道的方式转发至真实服务器,而真实服务器将响应处理后直接返回给客户端用户。
  2. 由于真实服务器将响应处理后的报文直接返回给客户端用户,因此,最好RS有一个外网IP地址,这样效率才会更高。理论上:只要能出网即可,无需外网IP地址。
  3. 由于调度器LB只处理入站请求的报文。因此,此集群系统的吞吐量可以提高10倍以上,但隧道模式也会带来一定得系统开销。TUN模式适合LAN/WAN。
  4. TUN模式的LAN环境转发不如DR模式效率高,而且还要考虑系统对IP隧道的支持问题。
  5. 所有的RS服务器都要绑定VIP,抑制ARP,配置复杂。
  6. LAN环境一般多采用DR模式,WAN环境可以用TUN模式,但是当前在WAN环境下,请求转发更多的被haproxy/nginx/DNS调度等代理取代。因此,TUN模式在国内公司实际应用的已经很少。跨机房应用要么拉光纤成局域网,要么DNS调度,底层数据还得同步。
  7. 直接对外的访问业务,例如:Web服务做RS节点,最好用公网IP地址。不直接对外的业务,例如:MySQL,存储系统RS节点,最好用内部IP地址。
 

1.6.3 DR模式-直接路由模式(重点)

Virtual Server via Direct Routing(VS/DR)

VS/DR模式是通过改写请求报文的目标MAC地址,将请求发给真实服务器的,而真实服务器将响应后的处理结果直接返回给客户端用户。同VS/TUN技术一样,VS/DR技术可极大地提高集群系统的伸缩性。而且,这种DR模式没有IP隧道的开销,对集群中的真实服务器也没有必须支持IP隧道协议的要求,但是要求调度器LB与正式服务器RS节点都有一块网卡连在同一物理网段上,即必须在同一个局域网环境。

image_1cvac6k701i1g1atuf9514p51bp51g.png-355.5kB


image_1cv7c9su4sp51aki176nnae1n8n9.png-912.7kB

只修改目标MAC地址,通过MAC找到RS节点(无法跨网段找到RS节点) 
DR模式特点小结:

  1. 通过在调度器LB上修改数据包的目的MAC地址实现转发。(源IP地址仍然是CIP,目的IP地址仍然是VIP)
  2. 请求的报文经过调度器,而RS响应处理后的报文无需经过调度器LB,因此,并发访问量大时使用效率很高(和NAT模式相比)
  3. 因DR模式是通过MAC地址的改写机制实现的转发,因此,所有RS节点和调度器LB只能在一个局域网LAN中(缺点)
  4. RS节点的默认网关不需要是调度器LB的DIP,而直接是IDC机房分配的上级路由器的IP(这是RS带有外网IP地址的情况),理论讲:只要RS可以出网即可,不是必须要配置外网IP
  5. 由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求的报文的目的端口(缺点)
  6. 当前,调度器LB支持几乎所有的UNIX,LINUX系统,但目前不支持WINDOWS系统。真实服务器RS节点可以是WINDOWS系统。
  7. 总的来说DR模式效率很高,但是配置也较麻烦,因此,访问量不是特别大的公司可以用haproxy/nginx取代之。这符合运维的原则:简单,易用,高效。日2000W PV或并发请求1万以下都可以考虑用haproxy/nginx(LVS NAT模式)
  8. 直接对外的访问业务,例如:Web服务做RS节点,RS最好用公网IP地址。如果不直接对外的业务,例如:MySQl,存储系统RS节点,最好只用内部IP地址。
 

1.6.4 FULLNAT模式-(了解即可)

image_1ctfmd3dk9pcfbp12m513se1rsu61.png-177.4kB


image_1ctfmd6k610if1p10c061iu5ues6e.png-213.9kB


image_1ctfmd9osecl1ga11nu4eeg1t7f6r.png-212.4kB

淘宝的LVS应用模式

FULLANT特点:

  1. 源IP改成不同的VIP和目的IP改成RIP
  2. RS处理完毕返回时,返回给不同的LVS调度器
  3. 所有LVS调度器之间通过session表进行Client Address的共享
 

1.7 LVS的调度算法

  • LVS的调度算法决定了如何在集群节点之间分布工作负荷。

  • 当Director调度器收到来自客户端计算机访问它的VIP上的集群服务的入站请求时,Director调度器必须决定哪个集群节点应该处理请求。Director调度器可用于做出该决定的调度方法分成两个基本类别: 
    固定调度方法:rr,wrr,dh,sh 
    动态调度算法:wlc,lc,lblc,lblcr,SED,NQ

10种调度算法见如下表格(rr,wrr,wlc重点):

image_1ctfmf8qtj2mmeg132v1afkav478.png-70.3kB

 

1.8 LVS的调度算法的生产环境选型

  • 一般的网络服务,如Http,Mail,MySQL等,常用的LVS调度算法为: 
    • 基本轮叫调度rr算法
    • 加权最小连接调度wlc
    • 加权轮叫调度wrr算法
  • 基于局部性的最少链接LBLC和带复制的基于局部性最少链接LBLCR主要适用于Web Cache和Db Cache集群,但是我们很少这样用。(都是一致性哈希算法)
  • 源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中,它们可以保证整个系统的唯一出入口。
  • 最短预期延时调度SED和不排队调度NQ主要是对处理时间相对比较长的网络服务。

实际使用中,这些算法的适用范围不限于这些。我们最好参考内核中的连接调度算法的实现原理,根据具体业务需求合理的选型。

 

1.9 LVS集群的特点

LVS集群的特点可以归结如下:

(1)功能:

实现三种IP负载均衡技术和10种连接调度算法的IPVS软件。在IPVS内部实现上,采用了高效的Hash函数和垃圾回收机制,能正确处理所调度报文相关的ICMP消息(有些商品化的系统反而不能)。虚拟服务的设置数目没有限制,每个虚拟服务都有自己的服务器集。它支持持久的虚拟服务(如HTTP Cookie 和HTTPS等需要该功能的支持),并提供详尽的统计数据,如连接的处理速率和报文的流量等。针对大规模拒绝服务(Deny of service)攻击,实现了三种防卫策略:有基于内容请求分发的应用层交换软件KTCPVS,它也是在Linux内核中实现。有相关的集群管理软件对资源进行检测,能及时将故障屏蔽,实现系统的高可用性。主,从调度器能周期性地进行状态同步,从而实现更高的可用性。

(2)适用性

  1. 后端真实服务器可运行任何支持TCP/IP的操作系统,包括Linux,各种Unix(如FreeBSD,Sun Solaris,HP Unix等),Mac/OS和windows NT/2000等。

  2. 负载均衡调度器LB能够支持绝大多数的TCP和UDP协议:

image_1ctfmiso3kuu65p14nv1qiu1lq17l.png-11.1kB

无需对客户机和服务作任何修改,可适用大多数Internet服务。

  1. 调度器本身当前不支持windows系统。支持大多数的Linux和UINIX系统。

(3)性能

LVS服务器集群系统具有良好的伸缩性,可支持几百万个并发连接。配置100M网卡,采用VS/TUN或VS/DR调度技术,集群系统的吞吐量可高达1Gbits/s;如配置千兆网卡,则系统的最大吞吐量可接近10Gbits/s

(4)可靠性

LVS服务器集群软件已经在很多大型的,关键性的站点得到很好的应用,所以它的可靠性在真实应用得到很好的证实。

(5)软件许可证

LVS集群软件是按GPL(GNU Public License)许可证发行的自由软件,这意味着你可以得到软件的源代码,有权对其进行修改,但必须保证你的修改也是以GPL方式发行。

 

1.10 LVS的官方中文阅读资料

image_1ctfmkoqn13he1g16oeuf5f20v82.png-25.4kB

 

二,手动实现LVS的负载均衡功能(DR模式)

 

2.1 安装LVS软件

 

2.1.1 LVS应用场景说明

1. 数据库及memcache等对内业务的负载均衡环境

image_1cvascgct1tm1avu17o6ios6e79.png-16.5kB

特别提示:上面的环境为内部环境的负载均衡模式,即LVS服务是对内部业务的,如数据库及memcache等的负载均衡

2. web服务或web cache等负载均衡环境

image_1ctfmmeosfqd1804ccg1lv51djl8s.png-17.5kB

提示: 
这个表格一般是提供Web或Web cache负载均衡的情况,此种情况特点为双网卡环境。这里把192.168.0.0/24假设为内网卡,192.168.200.0/24假设为外网卡。

 

2.1.2 实验一概述

image_1ctfmmu5ouvb145d1o6q19v7138t99.png-31.8kB


image_1ctfmnea81r6soqh4vovv32o89m.png-30.1kB


内部IP(eth)外部IP(eth1)角色备注
192.168.200.69 LVS负载均衡器 VIP:192.168.200.240网关为:192.168.200.100
192.168.200.96 Web01节点 网关为:192.168.200.100
192.168.200.97 Web02节点 网关为:192.168.200.100
192.168.200.98 内网客户端 网关为:192.168.200.100
192.168.1.100 外网客户端 不配网关
192.168.200.100 192.168.1.200 网关型防火墙 双网卡无网关
 

2.1.3 两台Web配置简单的nginx服务

过程略。

 
  1. echo "`hostname -I` sl" > /usr/local/nginx/html/index.html --->测试用
 

2.1.4 开始安装LVS

以下的安装都是在LVS LB 192.168.200.69上

 

1)下载相关软件包

wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz # <===适合5.x系统

wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz # <===适合6.x系统

 

2)安装准备命令

lsmod | grep ip_vs #查看linux内核是否有ipvs服务

uname -r #查看内核版本

cat /etc/redhat-release #查看系统版本

yum -y install kernel-devel #光盘安装

ls -ld /usr/src/kernels/2.6.32-431.el6.x86_64/ #安装完就会出现此目录

ln -s /usr/src/kernels/2.6.32-431.el6.x86_64/ /usr/src/linux #做一个软连接

ll -d /usr/src/linux/

image_1cvakq3ub13mgi4r1ev49vhgpv9.png-21.7kB


image_1cval9igu60q12hr1l3889515ilm.png-114.5kB

 

特别注意

此ln命令的链接路径要和uname -r输出结果内核版本对应,工作中如果做安装虚拟化可能有多个内核路径 
如果没有/usr/src/kernels/2.6.32-431.el6.x86_64/路径,很可能是因为缺少kernel-devel软件包。可通过yum进行安装 
centos5.x版本不能用ipvs1.26

 

lvs+keepalived所有包

链接:https://pan.baidu.com/s/1sZUVJA-9d1KHhsxVePssSQ 
提取码:wnyt

 

3)安装lvs命令

yum -y install libnl* popt* #需要通过公网源安装

tar xf ipvsadm-1.26.tar.gz -C /usr/src

cd /usr/src/ipvsadm-1.26/

make #直接编译不需要./configure

make install

which ipvsadm

/sbin/ipvsadm

 
  1. IP Virtual Server version 1.2.1 (size=4096)
  2. Prot LocalAddress:Port Scheduler Flags
  3. -> RemoteAddress:Port Forward Weight ActiveConn InActConn

lsmod | grep ip_vs #执行完/sbin/ipvsadm就会有信息

 
  1. ip_vs 125220 0
  2. libcrc32c 1246 1 ip_vs
  3. ipv6 317340 270 ip_vs,ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6
  4. #==>出现这个内容就表示LVS已经安装好,并加载到了内核

image_1cvalnoap15mdal21hoorjnvil13.png-160.7kB


image_1cvalp720m05o39eql1lob1frq1g.png-38kB

 

LVS安装小结

1,CentOS5.X安装lvs,使用1.24版本。 
2,CentOS6.X安装lvs,使用1.26版本。 
3,安装lvs后,要执行ipvsadm把ip_vs模块加载到内核。

 

2.2 手动配置LVS负载均衡服务

 

2.2.1 手工添加lvs转发

 

(1)配置LVS虚拟IP(VIP)

ifconfig eth0:0 192.168.200.240/24

ifconfig eth0:0

image_1cvalr5f811k0g9rjir17ob1d5m1t.png-27.7kB

 

(2)手工执行配置添加LVS服务并增加两台RS

ipvsadm -C #清空ipvs历史设置,因为是刚配置的所以没有历史

ipvsadm --set 30 5 60 #设置超时时间,为了测试效果不写(tcp tcpfin udp)

ipvsadm -A -t 192.168.200.240:80 -s rr -p 20 --->为了测试效果,这里不需要写-p参数

ipvsadm -a -t 192.168.200.240:80 -r 192.168.200.96:80 -g -w 1

ipvsadm -a -t 192.168.200.240:80 -r 192.168.200.97:80 -g -w 1

image_1cvalu4na1cop1va6ru61dpf1tav2a.png-21.9kB

 

配置添加参数说明

 
  1. #说明:
  2. -A:添加一个虚拟路由主机(LB
  3. -t:指定虚拟路由主机的VIP地址和监听端口
  4. -s:指定负载均衡算法
  5. -p:指定会话保持时间
  6. #说明:
  7. -a:添加RS节点
  8. -t:指定虚拟路由主机的VIP地址和监听端口
  9. -r:指定RS节点的RIP地址和监听端口
  10. -g:指定DR模式
  11. -w:指定权值
 

(3)查看lvs配置结果

ipvsadm -L -n

 
  1. IP Virtual Server version 1.2.1 (size=4096)
  2. Prot LocalAddress:Port Scheduler Flags
  3. -> RemoteAddress:Port Forward Weight ActiveConn InActConn
  4. TCP 192.168.200.240:80 rr
  5. -> 192.168.200.96:80 Route 1 0 0
  6. -> 192.168.200.97:80 Route 1 0 0

image_1cvaluqor79d1lvs15s1b1kdt52n.png-29kB

 

(4)ipvs配置删除方法

ipvsadm -D -t 192.168.200.240:80 -s rr #删除虚拟路由主机

ipvsadm -d -t 192.168.200.240:80 -r 192.168.200.96:80 #删除RS节点

此时,可以打开浏览器访问http://192.168.200.240体验结果,如果没意外,是无法访问的。(RS将包丢弃了)

image_1ctfmsfa8raq2uc1tttqn11va3aj.png-501.6kB

 

2.2.2 手工在RS端绑定

 

在Web01上操作

ifconfig lo:0 192.168.200.240/32 up #掩码必须设置32

ifconfig lo:0

image_1cvamaqsvmvr19gkd2k18e9126334.png-27.3kB

 

在Web02上操作

ifconfig lo:0 192.168.200.240/32 up #掩码必须设置32

ifconfig lo:0

image_1cvamb3hi1i90trgabl1rp26033h.png-27.8kB

 

2.2.3 浏览器测试LVS转发效果

image_1cvap6u7o1ub41p9i1ck516514lp55.png-11.5kB


image_1cvap8eugek7fcvimq1lkv3an5i.png-15.7kB

注意: 
在测试时候你会发现刷新看的都是同一个RS节点 
这是因为浏览器的缓存问题 
因为没有-p:指定会话保持时间,所以直接再次可以访问 
不需要等一段时间以后,刷新就会重新负载均衡到新RS节点了

 

2.2.4 关于DR模式RS节点的ARP抑制的问题

image_1ctfmu7h2gom1s85ho81ttu1gcrbq.png-501.6kB

  • 因为在DR模式下,RS节点和LVS同处一个局域网网段内。
  • 当网关通过ARP广播试图获取VIP的MAC地址的时候
  • LVS和节点都会接收到ARP广播并且LVS和节点都绑定了192.168.200.240这个VIP,所以都会去响应网关的这个广播,导致冲突现象。
  • 因此,我们需要对RS节点做抑制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

image_1cvan7mttujtbrm1ij6bqfr0f3u.png-30.3kB


image_1cvan80i511bc1n5l1fn81d38a9l4b.png-30.5kB

 

2.2.5 配置网关型防火墙

防火墙的双网卡都不要设置网关,因为自己的就网关

ip a

route -n --->防火墙不需要配置网关,因此没有默认路由信息

vim /etc/sysctl.conf --->开启网卡路由转发

 
  1. net.ipv4.ip_forward = 1 #修改为1

sysctl -p --->让配置即刻生效

image_1cvanm5jnjh7g7r18qp1nkb58o4o.png-121.6kB

 

特别提示

Web01,Web02,LVS负载均衡器,以及内网客户端均将网关设置成网关型防火墙的eth0:192.168.200.100

 

2.2.6 配置内网客户端

内网客户端用于模拟lvs应用于内网的负载均衡情况 
比如lvs数据库读负载均衡,比如lvs memcached缓存组负载均衡 
由于这类型的负载均衡请求都是由内网服务器发起,因此用内网客户端来模拟

 

内网客户端访问测试

hostname -I #内网客户端IP

route -n #默认路由为网关防火墙

curl 192.168.200.240

image_1cvapc42l1s3os5j188hg5t1as65v.png-52.7kB

从上面可以看出,内网客户端模拟访问lvs负载均衡器,成功!

 

2.2.7 配置外网客户端

外网客户端模拟的是lvs转发外网用户访问需求给RS节点处理的情况 
模拟外网客户端,要求客户端不能配置任何网关

image_1cvapmqec17778cd8u1b19ebk6c.png-30.2kB

由于外网客户端要访问内网的LVS需要经过网关防火墙的跳转,因此需要在防火墙服务器上做iptables的DNAT和SNAT,配置如下:

hostname -I 
192.168.200.100 (内网网卡) 192.168.1.100(外网网卡)

route -n

iptables -t nat -A PREROUTING -i eth1 -d 192.168.1.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.200.240:80

iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -o eth1 -j SNAT --to-source 192.168.1.100

iptables -t nat -L -nv

image_1cvararc21bt11gvcbh71d581oqf6p.png-91.3kB

 

进行外网客户端访问LVS负载均衡器测试

访问防火墙的外网网卡IP经过iptables的跳转访问道了内网的lvs调度器,进而返回Web节点处理结果

image_1cvardlmmd6115tmi951dd21ch876.png-115.5kB

 

特别提示

由于浏览器缓存及LVS默认会话保持等影响,个人简单的测试切换RS的几率要很多次并且间隔一定时间访问才行。尽可能关闭浏览器换不同的客户端IP来测试,效果更明显一些。用单机测试是有这种情况(负载均衡的算法倾向于一个客户端IP定向到一个后端服务器,以保持会话连贯性),如果用两三台机器去测试也许就不一样。 
在测试访问的同时可以通过ipvsadm -Lnc来查看访问结果,如下所示:

ipvsadm -lnc

 
  1. IPVS connection entries
  2. pro expire state source virtual destination
  3. TCP 00:41 FIN_WAIT 192.168.1.200:43145 192.168.200.240:80 192.168.200.97:80
  4. TCP 00:40 FIN_WAIT 192.168.1.200:43143 192.168.200.240:80 192.168.200.97:80
  5. TCP 00:28 FIN_WAIT 192.168.1.200:43140 192.168.200.240:80 192.168.200.96:80
  6. TCP 00:29 FIN_WAIT 192.168.1.200:43141 192.168.200.240:80 192.168.200.97:80
  7. TCP 00:41 FIN_WAIT 192.168.1.200:43144 192.168.200.240:80 192.168.200.96:80
  8. TCP 00:39 FIN_WAIT 192.168.1.200:43142 192.168.200.240:80 192.168.200.96:80
  9. TCP 00:43 FIN_WAIT 192.168.1.200:43146 192.168.200.240:80 192.168.200.96:80

image_1cvarf0kt1v9ubm1q88nid1bvq7j.png-44.2kB

 

2.3 arp抑制技术参数说明

  •  arp_ignore-INTRGER
  • 定义对目标地址为本地IP的ARP询问不同的应答模式 
    • 0(默认值):回应任何网络接口上对任何本地IP地址的arp查询请求。
    • 1:只回答目标IP地址是来访网络接口本地地址的ARP查询请求
    • 2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内。
    • 3:不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应。
    • 4-7:保留未使用
    • 8:不回应所有(本地地址)的arp查询。
  • arp_announce-INTEGER
  • 对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制:确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口。 
    • 0(默认值):在任意网络接口(eth0,eth1,lo)上的任何本地地址
    • 1:尽量避免不在该网络接口子网段的本地地址做出arp回应,当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用。此时会检查来访IP是否为所有接口上的子网段内IP之一。如果该来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理。
    • 2:对查询目标使用最适当的本地地址,在此模式下将忽略这个IP数据包的源地址并尝试选择能与该地址通信的本地地址,首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址。如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送。限制了使用本地的vip地址作为优先的网络接口。
 

2.4 开发脚本配置LVS负载均衡器端

 

2.4.1 LVS负载均衡器端自动配置脚本:

 
  1. [root@lvs01 scripts]# cat ipvs_server.sh
  2. #!/bin/bash
  3. # author:Mr.chen
  4. #LVS scripts
  5. . /etc/init.d/functions
  6. VIP=192.168.0.240
  7. SUBNET="eth0:`echo $VIP | awk -F "." '{print $4}'`"
  8. PORT=80
  9. RIP=(
  10. 192.168.0.223
  11. 192.168.0.224
  12. )
  13. function start(){
  14. if [ `ifconfig | grep $VIP | wc -l` -ne 0 ];then
  15. stop
  16. fi
  17. ifconfig $SUBNET $VIP broadcast $VIP netmask 255.255.255.0 up
  18. ipvsadm -C
  19. ipvsadm --set 30 5 60
  20. ipvsadm -A -t $VIP:$PORT -s rr -p 20
  21. for ((i=0;i<${#RIP[*]};i++))
  22. do
  23. ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]} -g -w 1
  24. done
  25. }
  26. function stop(){
  27. ipvsadm -C
  28. if [ `ifconfig | grep $VIP | wc -l` -ne 0 ];then
  29. ifconfig $SUBNET down
  30. fi
  31. route del -host $VIP dev eth0 &>/dev/null
  32. }
  33. case "$1" in
  34. start)
  35. start
  36. echo "ipvs is started"
  37. ;;
  38. stop)
  39. stop
  40. echo "ipvs is stopped"
  41. ;;
  42. restart)
  43. stop
  44. echo "ipvs is stopped"
  45. start
  46. echo "ipvs is started"
  47. ;;
  48. *)
  49. echo "USAGE:$0 {start | stop | restart}"
  50. esac
 

2.4.2 RS节点Web服务器端自动配置脚本

 
  1. [root@web01 scripts]# cat rs_server.sh
  2. #!/bin/bash
  3. # author:Mr.chen
  4. # RS_sever scripts
  5. . /etc/rc.d/init.d/functions
  6. VIP=192.168.0.240
  7. case "$1" in
  8. start)
  9. echo "start LVS of REALServer IP"
  10. interface="lo:`echo $VIP | awk -F "." '{print $4}'`"
  11. /sbin/ifconfig $interface $VIP broadcast $VIP netmask 255.255.255.255 up
  12. route add -host $VIP dev $interface
  13. echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
  14. echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
  15. echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
  16. echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
  17. ;;
  18. stop)
  19. interface="lo:`echo $VIP | awk -F "." '{print $4}'`"
  20. /sbin/ifconfig $interface down
  21. echo "STOP LVS of REALServer IP"
  22. echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
  23. echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
  24. echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
  25. echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
  26. ;;
  27. *)
  28. echo "Usage: $0 {start|stop}"
  29. exit 1
  30. esac
 

三,企业LVS负载均衡高可用最优方案(LVS+Keepalived)

 

3.1 实验二概述

image_1ctfn6smsos1r1u1m3him31bamd1.png-31.7kB


image_1ctfn76r4dd9119b29t1imp10e8de.png-22.8kB

 

3.2 LVS负载均衡器主和备安装LVS软件

安装过程过程略

模拟了真实环境主备都添加了一块新的网卡eth1

image_1cvd5k8491ivd1klj1ubh157j1do9m.png-39.7kB


image_1cvd5l28dp8h87af2q14tqpk613.png-39.8kB

 

3.3 两台Web服务器安装Web服务

安装过程略

 

3.4 LVS负载均衡器主和备安装Keepalived软件

yum -y install keepalived #光盘安装即可

image_1cvd26ua2jtk12rpo2o1okspvm9.png-131.6kB

 

3.5 仅实现LVS负载均衡器主和备的keepalived高可用功能

 

LVS负载均衡器主的keepalived配置文件内容如下

vim /etc/keepalived/keepalived.conf

cat /etc/keepalived/keepalived.conf

 
  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. 1123400300@qq.com
  5. }
  6. notification_email_from yunjisuan
  7. smtp_server 127.0.0.1
  8. smtp_connect_timeout 30
  9. router_id LVS_01
  10. }
  11. vrrp_instance VI_1 {
  12. state MASTER
  13. interface eth1
  14. virtual_router_id 55
  15. priority 150
  16. advert_int 1
  17. authentication {
  18. auth_type PASS
  19. auth_pass 1111
  20. }
  21. virtual_ipaddress {
  22. 192.168.200.240/24 dev eth0 label eth0:240
  23. }
  24. }

image_1cvd5mm61ji0taa1dqi15vd13li20.png-52kB

 

LVS负载均衡器备的keepalived配置文件内容如下

vim /etc/keepalived/keepalived.conf

cat /etc/keepalived/keepalived.conf

 
  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. 1123400300@qq.com
  5. }
  6. notification_email_from yunjisuan
  7. smtp_server 127.0.0.1
  8. smtp_connect_timeout 30
  9. router_id LVS_02
  10. }
  11. vrrp_instance VI_1 {
  12. state BACKUP
  13. interface eth1
  14. virtual_router_id 55
  15. priority 100
  16. advert_int 1
  17. authentication {
  18. auth_type PASS
  19. auth_pass 1111
  20. }
  21. virtual_ipaddress {
  22. 192.168.200.240/24 dev eth0 label eth0:240
  23. }
  24. }

image_1cvd5olke1851avr1jt817ve1b52d.png-52.3kB

 

3.6 添加LVS的负载均衡规则

以下操作过程,在LVS主和备上完全一样

ipvsadm -C

ipvsadm -A -t 192.168.200.240:80 -s rr

ipvsadm -a -t 192.168.200.240:80 -r 192.168.200.96:80 -g -w 1

ipvsadm -a -t 192.168.200.240:80 -r 192.168.200.97:80 -g -w 1

ipvsadm -Ln

image_1cvd5th9ig7n14h1a3rboe5p72q.png-46.2kB


image_1cvd5uh7acr71991jlv10vd1mfd37.png-45.8kB

 

3.7 启动LVS主和备的keepalived服务

 

在LVS主上

/etc/init.d/keepalived start

ifconfig

image_1cvd6197m9ra2tkihguo1ipo3k.png-109.9kB

 

在LVS副上

/etc/init.d/keepalived start

ifconfig

image_1cvd62bnq1d46snres31iip17ob41.png-96.5kB

 

特别提示

如果LVS副上没有VIP就对了。如果主副都有,那么请检查防火墙是否开启状态

 

手工在RS端绑定(工作环境需要写成脚本)

 

在Web01上操作

ifconfig lo:0 192.168.200.240/32 up #掩码必须设置32

image_1cvd6i6821qr6spae6e8l11tme4e.png-79.7kB

 

在Web02上操作

ifconfig lo:0 192.168.200.240/32 up #掩码必须设置32

image_1cvd6ief8h2nbnbve610jaa164r.png-81.5kB

 

3.8 内网客户端进行访问测试

curl 192.168.200.240

image_1cvd7s2vg1vhbghdq31inu1t3m9.png-41kB

 

在LVS主上进行访问连接查询

ipvsadm -Lnc

image_1cvd7smc41v3o1l6sajb1dkadnnm.png-56.8kB

 

在LVS主上停掉keepalived服务

/etc/init.d/keepalived stop

ifconfig | grep eth0:240

image_1cvd7tdbd5791ddqfgp1v9b16se13.png-18.2kB

 

在LVS副上查看VIP

ip a | grep eth0:240

image_1cvd7tuounmf1dnl1daqbfacm20.png-17.8kB

 

再次在内网客户端上进行访问测试

curl 192.168.200.240

image_1cvd7udsi1faj9hs2eu1uv81tmj2d.png-51.5kB

 

在LVS副上进行访问连接查询

ipvsadm -Lnc

image_1cvd7uqugm0jso51oj01qqh1hs32q.png-48.5kB

 

开启LVS主上的keepalived服务

/etc/init.d/keepalived start

ip a | grep eth0:240

image_1cvd7vfit1e4v7qh1jcodiqtd937.png-22.3kB

 

查看LVS副上VIP资源是否释放

ip a | grep eth0:240

ifconfig

image_1cvd805a31fvjm851knk1eu2eej3k.png-94.4kB

综上,至此基于LVS的keepalived高可用功能实验完毕

 

3.9 通过Keepalived对LVS进行管理的功能实现双实例

 

LVS负载均衡器主的keepalived配置文件内容如下

 
  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. 1123400300@qq.com
  5. }
  6. notification_email_from yunjisuan
  7. smtp_server 127.0.0.1
  8. smtp_connect_timeout 30
  9. router_id LVS_DEVEL
  10. }
  11. vrrp_instance VI_1 {
  12. state MASTER
  13. interface eth1
  14. virtual_router_id 55
  15. priority 150
  16. advert_int 1
  17. authentication {
  18. auth_type PASS
  19. auth_pass 1111
  20. }
  21. virtual_ipaddress {
  22. 192.168.200.240/24 dev eth0 label eth0:240
  23. }
  24. }
  25. vrrp_instance VI_2 {
  26. state BACKUP
  27. interface eth1
  28. virtual_router_id 56
  29. priority 100
  30. advert_int 1
  31. authentication {
  32. auth_type PASS
  33. auth_pass 1111
  34. }
  35. virtual_ipaddress {
  36. 192.168.200.250/24 dev eth0 label eth0:250
  37. }
  38. }
  39. virtual_server 192.168.200.240 80 {
  40. delay_loop 6
  41. lb_algo rr
  42. lb_kind DR
  43. nat_mask 255.255.255.0
  44. # persistence_timeout 50
  45. protocol TCP
  46. real_server 192.168.200.96 80 {
  47. weight 1
  48. TCP_CHECK {
  49. connect_timeout 3
  50. nb_get_retry 3
  51. delay_before_retry 3
  52. connetct_port 80
  53. }
  54. }
  55. real_server 192.168.200.97 80 {
  56. weight 1
  57. TCP_CHECK {
  58. connect_timeout 3
  59. nb_get_retry 3
  60. delay_before_retry 3
  61. connetct_port 80
  62. }
  63. }
  64. }
  65. virtual_server 192.168.200.250 80 {
  66. delay_loop 6
  67. lb_algo rr
  68. lb_kind DR
  69. nat_mask 255.255.255.0
  70. # persistence_timeout 50
  71. protocol TCP
  72. real_server 192.168.200.96 80 {
  73. weight 1
  74. TCP_CHECK {
  75. connect_timeout 3
  76. nb_get_retry 3
  77. delay_before_retry 3
  78. connetct_port 80
  79. }
  80. }
  81. real_server 192.168.200.97 80 {
  82. weight 1
  83. TCP_CHECK {
  84. connect_timeout 3
  85. nb_get_retry 3
  86. delay_before_retry 3
  87. connetct_port 80
  88. }
  89. }
  90. }
 

LVS负载均衡器备的keepalived配置文件内容如下

 
  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. 1123400300@qq.com
  5. }
  6. notification_email_from yunjisuan
  7. smtp_server 127.0.0.1
  8. smtp_connect_timeout 30
  9. router_id LVS_02
  10. }
  11. vrrp_instance VI_1 {
  12. state BACKUP
  13. interface eth1
  14. virtual_router_id 55
  15. priority 100
  16. advert_int 1
  17. authentication {
  18. auth_type PASS
  19. auth_pass 1111
  20. }
  21. virtual_ipaddress {
  22. 192.168.200.240/24 dev eth0 label eth0:240
  23. }
  24. }
  25. vrrp_instance VI_2 {
  26. state MASTER
  27. interface eth1
  28. virtual_router_id 56
  29. priority 150
  30. advert_int 1
  31. authentication {
  32. auth_type PASS
  33. auth_pass 1111
  34. }
  35. virtual_ipaddress {
  36. 192.168.200.250/24 dev eth0 label eth0:250
  37. }
  38. }
  39. virtual_server 192.168.200.240 80 {
  40. delay_loop 6
  41. lb_algo rr
  42. lb_kind DR
  43. nat_mask 255.255.255.0
  44. # persistence_timeout 50
  45. protocol TCP
  46. real_server 192.168.200.96 80 {
  47. weight 1
  48. TCP_CHECK {
  49. connect_timeout 3
  50. nb_get_retry 3
  51. delay_before_retry 3
  52. connetct_port 80
  53. }
  54. }
  55. real_server 192.168.200.97 80 {
  56. weight 1
  57. TCP_CHECK {
  58. connect_timeout 3
  59. nb_get_retry 3
  60. delay_before_retry 3
  61. connetct_port 80
  62. }
  63. }
  64. }
  65. virtual_server 192.168.200.250 80 {
  66. delay_loop 6
  67. lb_algo rr
  68. lb_kind DR
  69. nat_mask 255.255.255.0
  70. # persistence_timeout 50
  71. protocol TCP
  72. real_server 192.168.200.96 80 {
  73. weight 1
  74. TCP_CHECK {
  75. connect_timeout 3
  76. nb_get_retry 3
  77. delay_before_retry 3
  78. connetct_port 80
  79. }
  80. }
  81. real_server 192.168.200.97 80 {
  82. weight 1
  83. TCP_CHECK {
  84. connect_timeout 3
  85. nb_get_retry 3
  86. delay_before_retry 3
  87. connetct_port 80
  88. }
  89. }
  90. }
 

keepalived配置文件详解

 
  1. virtual_server 192.168.0.240 80 { #虚拟主机VIP
  2. delay_loop 6 #
  3. lb_algo rr #算法
  4. lb_kind DR #模式
  5. nat_mask 255.255.255.0 #掩码
  6. # persistence_timeout 50 #会话保持
  7. protocol TCP #协议
  8. real_server 192.168.0.223 80 { #RS节点
  9. weight 1 #权重
  10. TCP_CHECK { #节点健康检查
  11. connect_timeout 8 #延迟超时时间
  12. nb_get_retry 3 #重试次数
  13. delay_before_retry 3 #延迟重试次数
  14. connect_port 80 #利用80端口检查
  15. }
  16. }
  17. real_server 192.168.0.224 80 { #RS节点
 

特别提示

ipvsadm -C

以上keepalived配置文件在LVS主和备上都进行修改。 
然后在lvs服务器上通过ipvsadm -C清除之前设置的规则

image_1cvd8iagkq5312odqiv1l8i1nbd41.png-24.4kB


image_1cvd8imj883c1aklmav13tvn8l4e.png-24.7kB

 

重新启动Lvs主keepalived服务进行测试,操作过程如下

/etc/init.d/keepalived stop #关闭主LVS的keepalived服务

ipvsadm -Ln #没有ipvs规则

ip a | grep 240 #没有VIP

ip a | grep 250 #没有VIP

/etc/init.d/keepalived start #启动keepalived服务

ipvsadm -Ln #出现ipvs规则

ip a | grep 240 #出现VIP

ip a | grep 250 #出现VIP

image_1cvd8o3h7jpo15ponuretk1udm4r.png-82.7kB

 

重新启动Lvs备keepalived服务进行测试,操作过程如下

/etc/init.d/keepalived stop #关闭主LVS的keepalived服务

ipvsadm -Ln #没有ipvs规则

ip a | grep 240 #没有VIP

ip a | grep 250 #没有VIP

/etc/init.d/keepalived start #启动keepalived服务

ipvsadm -Ln #出现ipvs规则

ip a | grep 240 #没有240VIP证明双实例启动成功

ip a | grep 250 #出现VIP

image_1cvd8ujgqjnj11th1ie51v3771i6o.png-78.1kB

 

检测主备VIP情况

image_1cvd90e3p1gc1v845uf6kdgsg75.png-104kB


image_1cvd91ren12h11luhjhsg9715m7i.png-103.4kB

 

因为是双实例需要手工在RS端在绑定另一个VIP

 

在Web01上操作

ifconfig lo:1 192.168.200.250/32 up #掩码必须设置32

ifconfig lo:1

image_1cvd95gtkohk1jaguei1v5n24j8c.png-26kB

 

在Web02上操作

ifconfig lo:1 192.168.200.250/32 up #掩码必须设置32

ifconfig lo:1

image_1cvd959131dnv1d4a1i0i5b714qd7v.png-26.4kB

 

在内网客户端测试(因为之前已经测试过VIP漂移了这里就不演示了)

curl 192.168.200.240

curl 192.168.200.250

image_1cvd969aqnht12u41g141l2o1i8p99.png-51.8kB

 

附录:LVS集群分发请求RS不均衡生产环境实战解决

生产环境中ipvsadm -L -n 发现两台RS的负载不均衡,一台有很多请求,一台没有。并且没有请求的那台RS经测试服务正常,lo:VIP也有。但是就是没有请求

IP Virtual Server version 1.2.1 (size=4096) 
Prot LocalAddress:Port Scheduler Flags 
-> RemoteAddress:Port Forward Weight ActiveConn InActConn 
TCP 192.168.0.240:80 rr persistent 10 
-> 192.168.0.223:80 Route 1 0 0 
-> 192.168.0.224:80 Route 1 8 12758

问题原因:

persistent 10的原因,persistent会话保持,当clientA访问网站的时候,LVS把请求分发给了52,那么以后clientA再点击的其他操作其他请求,也会发送给52这台机器。

解决办法:

到keepalived中注释掉persistent 10 然后/etc/init.d/keepalived reload,然后可以看到以后负载均衡两边都均衡了。

其他导致负载不均衡的原因可能有:

    1. LVS自身的会话保持参数设置(-p 300,persistent 300)。优化:大公司尽量用cookies替代session
    2. LVS调度算法设置,例如:rr,wrr,wlc,lc算法
    3. 后端RS节点的会话保持参数,例如:apache的keepalive参数
    4. 访问量较少的情况,不均衡的现象更加明显
    5. 用户发送得请求时间长短,和请求资源多少大小。
posted @ 2019-07-24 15:13  L1n  阅读(983)  评论(0编辑  收藏  举报