LVS 负载均衡器从入门到精通

LVS 负载均衡器从入门到精通Linux虚拟服务器 是一个虚拟的服务器集群系统 可以在Unix/Linux平台实现负载均衡集群功能。调度器是服务器集群系统的唯一入口点,它可以

大家好,欢迎来到IT知识分享网。LVS

LVS(Linux Virtual Server简写)介绍

Linux虚拟服务器 是一个虚拟的服务器集群系统 可以在Unix/Linux平台实现负载均衡集群功能。该项目在1998年

由章文嵩博士组织成立的 是中国国内最早出现的自由软件项目之一。

LVS项目介绍 | http://www.linuxvirtualserver.org/zh/lvs1.html

LVS集群的体系结构 | http://www.linuxvirtualserver.org/zh/lvs2.html

LVS集群中的IP负载均衡技术|http://www.linuxvirtualserver.org/zh/lvs3.html

LVS集群的负载调度|http://www.linuxvirtualserver.org/zh/lvs4.html

调度器是服务器集群系统的唯一入口点(Single Entry Point),它可以采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。

在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当客户请求到达时,调度器只根据服务器负载情况和设定的调度算法从服务器池中选出一个服务器,

将该请求转发到选出的服务器,并记录这个调度;当这个请求的其 他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器可以提供不同的服务,

当客户请求到达时,调度器可根据请求的内容选择服务器 执行请求。因为所有的操作都是在Linux操作系统核心空间中将完成的,它的调度开销很小,所以它具有很高的吞吐率。

服务器池的结点数目是可变的。当整个系统收到的负载超过目前所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载。

对大多数 网络服务来说,请求间不存在很强的相关性,请求可以在不同的结点上并行执行,所以整个系统的性能基本上可以随着服务器池的结点数目增加而线性增长。

共享存储通常是数据库、网络文件系统或者分布式文件系统。服务器结点需要动态更新的数据一般存储在数据库系统中,同时数据库会保证并发 访问时数据的一致性。

静态的数据可以存储在网络文件系统(如NFS/CIFS)中,但网络文件系统的伸缩能力有限,一般来说,NFS/CIFS服务器只能 支持3~6个繁忙的服务器结点。

对于规模较大的集群系统,可以考虑用分布式文件系统,如AFS[1]、GFS[2.3]、Coda[4]和 Intermezzo[5]等。分布式文件系统可为各服务器提供共享的存储区,

它们访问分布式文件系统就像访问本地文件系统一样,同时分布式文件系统可提 供良好的伸缩性和可用性。此外,当不同服务器上的应用程序同时读写访问分布式文件系统上同一资源时,

应用程序的访问冲突需要消解才能使得资源处于一致状 态。这需要一个分布式锁管理器(Distributed Lock Manager),它可能是分布式文件系统内部提供的,也可能是外部的。

开发者在写应用程序时,可以使用分布式锁管理器来保证应用程序在不同结点上并发访 问的一致性。

IPVS(LVS)发展史

早在2.2内核时 IPVS就已经以内核补丁的形式出现

从2.4.23版本开始 IPvs软件就是合并到Linux内核的常用版本的内核补丁的集合

从2.4.24以后IPvs已经成为Linux官方标准内核的一部分。

我们使用该软件配置LVS时候 不能直接配置IPvs 需要使用IPvs管理工具ipvsadm

LVS负载均衡调度技术是在Linux内核中实现的 因此 被称之为Linux虚拟服务器。我们使用该软件配置LVS时候

不能直接配置内核的IPvs 而需要使用IPvs的管理工具IPvsadm进行管理 当然也可以同keepalive软件管理LVS

LVS体系结构和工作原理

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

也被称为LVS Director(简称Director)—10种调度算法。

一组服务器通过高速的局域网或者地理分布的广域网相互连接 在它们的前端有一个负载均衡器(Load Balancer).负载调度器能无缝地将网络

请求调度到真实服务器上,从而使得服务器集群的结构对客户端是透明的 客户端访问集群系统提供的网络服务就像访问一台高性能 高可用的服务器一样

客户端程序不受服务器集群的影响不需要做任何修改。系统的伸缩性通过在服务集群中透明地加入和删除一个节点来达到。通过检测节点或服务进程

故障和正确地重置系统达到高可用性 由于我们的负载均衡调度技术是在Linux内核中实现的 我们称之为Linux虚拟服务器

LVS术语:

虚拟IP地址(Virtual ip Address)|VIP| VIP为Director用于向客户端计算机提供服务的IP地址(即用户请求的IP)

如www.aa.com域名就要解析到VIP上提供服务(DNS上要做相应的解析)

真实IP地址(RealServerIpAddress)|RIP|在集群下面节点上使用的IP地址

Director的IP地址 |DIP|Director用于连接内外网络的IP地址,物理网卡上的IP地址(负载均衡器的IP地址);与Real Server相连的IP

客户端主机IP地址 |CIP|客户端PC请求集群服务器的IP地址 该地址用作发送给机器的请求的源IP地址

LVS集群内部的节点称为真实服务器(Real Server)也叫集群节点。请求集群服务的计算机称为客户端计算机-

与计算机通常在网上交换数据包的方式相同,客户端计算机 Director和真实服务器使用IP地址彼此进行通信。

LVS集群的3种工作模式和原理

IP虚拟服务器软件IPvs

在调度器的实现技术中 IP负载均衡技术是效率最高的 在已有的IP负载均衡技术中有通过网络地址转换,将一组服务器构成一个高性能

高可用的虚拟服务器,我们成为VS/NAT技术(Virtual Server via Network Address Translation),大多数商业化的IP负载均衡调度器产品都

是使用NAT的方法 如Cisco的localdirector F5的Big/ip和Alteon的aceDirector.

在分析VS/NAT的缺点和网络服务的非对称性的基础上,我们提出通过IP隧道实现虚拟服务器的方法VS/TUN(Virtual Server via IP Tunneling)

和通过直接路由实现虚拟服务器的方法VS/DR(Virtual Server via Direct Routing),它们可以极大地提供系统的伸缩性。(还有淘宝的FULLNAT模式开源的)

所有IPvs软件实现了这三种IP负载均衡技术 它们的大致原理如下:

NAT模式:

通过网络地址转换 调度器LB重写请求报文的目的地址,根据预设的调度算法,将请求分派给后端的真实服务器;真实服务器的响应报文处理后

返回时必须要通过调度器,经过调度器时报文的源地址被重写,再返回给客户端 完成整个负载调度过程。

结论:

1 NAT技术将请求的报文(DNAT)和响应的报文(SNAT)通过调度器地址重写然后在转发给内部的RS,报文返回时在改写成源地址。

2 只需要在LB上配置WANIP即可,也要有LAN IP和内部通信,内部RS只需配置LAN IP。

3 每台内部RS节点的网关 要配置成LB的LAN内物理网卡地址 这样才能确保数据返回任然经过LB。

4 由于请求与回传数据都经过负载均衡器 因此 访问量大时LB有较大瓶颈

5 支持对IP及端口进行转换 即用户请求10.0.0.1:80,可以转换到RS的10.0.0.2:8080上

6 所有NAT内部RS节点只需要配置私有LAN IP即可。

7 由于数据包来回都需要经过调度器 因此 要开启内核转发net.ipv4.ip_forward=1

过程如下:

客户端通过Virtual IP address 访问网络服务时 请求的报文到达调度器LB时,调度器根据连接调度算法从一组真实服务器中选出一台服务器,

将报文的目的地址VIP改写成选定的服务器的地址RIP1,请求报文的目标端口改写成选定服务器的相应端口(RS提供的服务端口),最后将修改后的报文

发送给选出的服务器RS1.同时,调度器LB在连接的HASH表中记录这个连接,当这个连接的下一个报文到达时,从连接的hash表中可以得到原选定服务器

的地址和端口,进行同样的改写操作,并将报文传给原选定的服务器RS1.当来自真实服务器RS1的响应报文返回调度器时 ,调度器将返回报文的源地址和

源端口改写成VIP和相应的端口,然后调度器再把报文发给请求的用户。

TUN隧道模式:

采用NAT技术时 由于请求和响应的报文都必须经过调度器地址重写 当客户端请求越来越多时 调度器的处理能力将成为瓶颈 为了解决这个问题

调度器把请求报文通过IP隧道(IPIP/ipsec)转发到真实服务器 而真实服务器将响应直接返回给客户端 这样调度器只处理请求的入站报文 由于一般网络服务

应答数据比请求报文大很多 采用VS/TUN技术后,集群系统的最大吞吐量可以提供10倍。

VS/TUN的工作流程:它的连接调度和管理与VS/NAT中的一样 只是它的报文转发方法不同。调度器根据各个服务器的负载情况,动态地选择一台服务器,

将请求报文封装在另一个IP报文中 再将封装后的IP报文转发给选出的真实服务器 服务器收到报文后 先将报文解封获得原来目标地址为VIP的报文 服务器发现VIP

地址被配置在本地的IP隧道设备上 所以就处理这个请求 然后根据路由表将响应报文直接返回给客户端。

总结:

1 负载均衡器通过把请求的报文通过IP隧道的方式,把请求的报文不经过原目的地址的改写,而是直接封装成另外的IP报文转发到真实服务器,

而真实服务器将响应处理后的报文直接返回给客户端用户,因此,最后RS又一个外网IP,这样效率才会更高

2 由于调度器LB只处理入站请求报文。因此集群系统的吞吐量可以提高很多,但是隧道模式也会带来一定的开销 Tun模式适合LAN/WAN

3 LAN环境不如DR模式效率高 有的系统还要考虑IP隧道的支持问题 另外 还需绑定VIP 配置复杂。

4 LAN 多采用DR WAN环境可以用TUN模式 但是在WAN环境更多的被DNS+haproxy/nginx等代理取代 因此 tun模式在国内公司实际应用很少。

DR模式-直接路由模式

Virtual Server via Direct Routing(VS/DR)

VS/DR模式是通过改写请求报文的目标Mac地址 将请求发给真实服务器的 而真实服务器将响应后的处理结果直接返回给客户端用户。

同VS/TUN技术一样 VS/DR技术可以极大地提高集群系统的伸缩性。而且,这种DR模式没有IP隧道的开销,对集群中的真实服务器也没有

必须支持IP隧道协议的要求 但是要求调度器LB与真实服务器RS都有一块网卡连在同一物理网段上,即必须在同一局域网环境下。

DR模式总结:

1 通过在调度器LB上修改数据包的目的Mac地址实现转发 注意,源地址仍然是CIP目的地址仍然是VIP地址。

2 请求的报文经过调度器而RS响应处理后的报文无需经过调度器LB 因此 访问量大时使用效果特别好(和NAT相比)

3 因此DR模式是通过Mac地址的改写机制实现的转发 因此 所有RS节点和调度器LB只能在一个LAN中。

4 需要注意RS节点的VIP的绑定(lo:vip,lo1:vip)和ARP抑制的问题

5 强调下:RS节点的默认网关不需要是调度器LB的DIP,而直接是IDC机房分配的上级路由器的IP(RS带有外网地址的情况下)

6 由于DR模式的调度器仅进行了目的Mac地址的改写 因此 调度器LB无法改变请求的报文的目的端口(和NAT要区别)

7 当前 调度器LB支持几乎所有的Unix Linux系统 但目前不支持Windows系统。真实服务器RS节点可以是Windows系统

8 总之DR模式效率很高 但是配置也较麻烦 因此 访问量不是特别大的公司可以用haproxy/nginx取代之 这符合运维的原则:简单 易用 高效

日2000WPV以下都可以考虑用haproxy/nginx

9 直接对外的访问业务 如web服务做RS节点 最后用公网IP地址 不直接对外的业务 如MySQL 存储系统RS节点 最好用内部IP地址

LVS调度算法:

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

当Director调度器收到来自客户端计算机访问它的VIP上的集群服务的入站请求时,Director调度器必须决定哪个集群节点应该处理请求。

Director调度器可用于做出该决定的调度方法分成两个基本类别:

固定调度方法:rr wrr dh sh

动态调度算法:wlc lc lblc lblcr sed nq(后两种官方站点没有,但是make过程可以看到rr wrr lc wlc lblc lblcr dh sh sed nq)

rr:轮循调度(Round-Robin),它将请求依次分配给不同的RS节点 也就是在RS中均摊请求。这种算法简单 但是只适合于RS处理性能相差不大的情况

wrr:加权轮循调度(weighted Round-Robin)它将依据不同RS节点的权值分配任务 权值较高的RS将优先获得任务 并且分配到的连接数将比权值较低的

RS节点更多。相同权值的RS节点得到相同数目的连接数

wlc:加权最小连接数调度(weighted least-connection) 假设各台的权值依次为Wi(I=1..n),当前的TCP连接数依次为Ti(I=1..n),依次选取Ti/Wi为最小的RS

作为下一个分配的RS。

….

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

1 一般的网络服务 如http mail mysql等 常用的LVS调度算法为

a 基本轮叫调度rr算法

b 加权最小连接调度wlc

c 加权轮叫调度wrr算法

2 基于局部性的最少链接LBLC和带复制的基于局部性最少链接LBLCR主要适用于Web Cache和DB Cache集群

3 源地址散列调度SH和目标地址散列调度DH可以结合使用在防火墙集群中 它们可以保证整个系统的唯一出入口。

4 最短预期延时调度SED和不排队调度NQ主要是对处理时间相对比较成的网络服务

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

安装LVS

下载IPvsadm

[root@Backup tools]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.24.tar.gz
[root@Backup tools]# wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz

查看ip_vs的内核模块

[root@Backup tools]# lsmod|grep ip_vs

查看系统相关信息

[root@Backup tools]# uname -rm
2.6.18-406.el5 x86_64
[root@Backup tools]# cat /etc/redhat-release
CentOS release 5.11 (Final)
[root@Backup tools]#

做内核软链接

提示:如果没有/usr/src/kernels/2.6.18-406.e15-x86_64,是因为缺少kernel-devel-2.6.18.406.e15软件包

可以通过yum install kernel-devel -y 安装

软链接也可以不做 在编译时指定内核参数即可

[root@Backup tools]# ln -s /usr/src/kernels/2.6.18-406.el5-x86_64 /usr/src/linux #此处的内核以uname -rm为主
[root@Backup tools]# ll /usr/src/
total 24
drwxr-xr-x 2 root root 4096 May 11 2011 debug
drwxr-xr-x 4 root root 4096 Sep 7 08:08 kernels
lrwxrwxrwx 1 root root 38 Feb 29 11:08 linux -> /usr/src/kernels/2.6.18-406.el5-x86_64
drwxr-xr-x 7 root root 4096 Dec 10 2014 redhat
[root@Backup tools]#

安装LVS命令

tar zxf ipvsadm-1.24.tar.gz
cd ipvsadm-1.24
make
make install
lsmod|grep ip_vs
[root@Backup tools]# ls ipvsadm-1.24.tar.gz
ipvsadm-1.24.tar.gz
[root@Backup tools]# tar vxf ipvsadm-1.24.tar.gz
ipvsadm-1.24/config_stream.c
ipvsadm-1.24/config_stream.h
...
[root@Backup tools]# cd ipvsadm-1.24
[root@Backup ipvsadm-1.24]# ls
config_stream.c debian ipvsadm.8 ipvsadm-restore.8 ipvsadm.sh libipvs SCHEDULERS
config_stream.h dynamic_array.c ipvsadm.c ipvsadm-save ipvsadm.spec Makefile TAGS
contrib dynamic_array.h ipvsadm-restore ipvsadm-save.8 ipvsadm.spec.in README VERSION
[root@Backup ipvsadm-1.24]#
[root@Backup ipvsadm-1.24]# make
make -C libipvs
make[1]: Entering directory `/home/tools/ipvsadm-1.24/libipvs'
gcc -Wall -Wunused -Wstrict-prototypes -g -O2 -I/usr/src/linux/include -DHAVE_NET_IP_VS_H -c -o libipvs.o libipvs.c
ar rv libipvs.a libipvs.o
ar: creating libipvs.a
a - libipvs.o
make[1]: Leaving directory `/home/tools/ipvsadm-1.24/libipvs'
gcc -Wall -Wunused -Wstrict-prototypes -g -O2 -I/usr/src/linux/include -I.. -I. -DVERSION=\"1.24\" -DSCHEDULERS=\""rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq"\" -DHAVE_POPT -DHAVE_NET_IP_VS_H -c -o ipvsadm.o ipvsadm.c
ipvsadm.c: In function ‘print_largenum’:
ipvsadm.c:1564: warning: field width should have type ‘int’, but argument 2 has type ‘size_t’
gcc -Wall -Wunused -Wstrict-prototypes -g -O2 -I/usr/src/linux/include -I.. -I. -DVERSION=\"1.24\" -DSCHEDULERS=\""rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq"\" -DHAVE_POPT -DHAVE_NET_IP_VS_H -c -o config_stream.o config_stream.c
gcc -Wall -Wunused -Wstrict-prototypes -g -O2 -I/usr/src/linux/include -I.. -I. -DVERSION=\"1.24\" -DSCHEDULERS=\""rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq"\" -DHAVE_POPT -DHAVE_NET_IP_VS_H -c -o dynamic_array.o dynamic_array.c
gcc -Wall -Wunused -Wstrict-prototypes -g -O2 -o ipvsadm ipvsadm.o config_stream.o dynamic_array.o libipvs/libipvs.a -L/usr/lib -lpopt
/usr/bin/ld: skipping incompatible /usr/lib/libpopt.so when searching for -lpopt
/usr/bin/ld: skipping incompatible /usr/lib/libpopt.a when searching for -lpopt
/usr/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc
[root@Backup ipvsadm-1.24]# make install
make -C libipvs
make[1]: Entering directory `/home/tools/ipvsadm-1.24/libipvs'
make[1]: Nothing to be done for `all'.
make[1]: Leaving directory `/home/tools/ipvsadm-1.24/libipvs'
if [ ! -d /sbin ]; then mkdir -p /sbin; fi
install -m 0755 -s ipvsadm /sbin
install -m 0755 ipvsadm-save /sbin
install -m 0755 ipvsadm-restore /sbin
[ -d /usr/man/man8 ] || mkdir -p /usr/man/man8
install -m 0644 ipvsadm.8 /usr/man/man8
install -m 0644 ipvsadm-save.8 /usr/man/man8
install -m 0644 ipvsadm-restore.8 /usr/man/man8
if [ -d /etc/rc.d/init.d ]; then \
install -m 0755 ipvsadm.sh /etc/rc.d/init.d/ipvsadm; \
fi
[root@Backup ipvsadm-1.24]#
[root@Backup ipvsadm-1.24]# echo $?
0

成功啦!

[root@Backup ipvsadm-1.24]# lsmod|grep ip_vs #此时IPvs模块没有被加载 执行ipvsadm命令就会把ip_vs加载到系统内核或者执行命令modprobe ip_vs也行

[root@Backup ipvsadm-1.24]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@Backup ipvsadm-1.24]# lsmod|grep ip_vs
ip_vs 122241 0
[root@Backup ipvsadm-1.24]#
[root@Backup ipvsadm-1.24]# which ipvsadm
/sbin/ipvsadm

#提示:ipvsadm-1.26.tar.gz使用于kernel 2.6.28及之后的内核版本 不适合5.8环境

如何符合系统环境后 同样需要先安装依赖包yum install libnl* popt* -y

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

手工添加LVS转发

1用户访问:www.nicegirl.com–>VIP 192.168.157.135这个步骤是在DNS配置nicegirl域的DNS记录设置的

www IN A 192.168.157.135

如果未自建DNS 需要在DNS管理界面增加类似上面的DNS记录一条(域名提供商)。这里的ip地址一定是外网地址

才能正式使用

A132———>(VIP160)LB(DIP142)————>RS1(135)

配置LVS虚拟IP(vip)

[root@LVS-1-1 ~]# ifconfig eth0:0 192.168.157.160 netmask 255.255.255.0 up
[root@LVS-1-1 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:04:E8:7F
inet addr:192.168.157.142 Bcast:192.168.157.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:859652 errors:0 dropped:0 overruns:0 frame:0
TX packets:159511 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:623949333 (595.0 MiB) TX bytes:19517130 (18.6 MiB)
eth0:0 Link encap:Ethernet HWaddr 00:0C:29:04:E8:7F
inet addr:192.168.157.160 Bcast:192.168.157.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:117 errors:0 dropped:0 overruns:0 frame:0
TX packets:117 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6698 (6.5 KiB) TX bytes:6698 (6.5 KiB)
[root@LVS-1-1 ~]#

添加主机路由 也可以不添加

[root@LVS-1-1 ~]# route add -host 192.168.157.160 dev eth0
[root@LVS-1-1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.157.160 0.0.0.0 255.255.255.255 UH 0 0 0 eth0
192.168.157.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.157.2 0.0.0.0 UG 0 0 0 eth0
[root@LVS-1-1 ~]#

清空表中的原有记录

[root@LVS-1-1 ~]# ipvsadm -C #clear the whole table
[root@LVS-1-1 ~]#
[root@LVS-1-1 ~]# ipvsadm --set 30 5 60 #设置 --set tcp tcpfin udp超时参数
[root@LVS-1-1 ~]#

添加虚拟服务

[root@LVS-1-1 ~]# ipvsadm -A -t 192.168.157.160:80 -s wrr -p 20
[root@LVS-1-1 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.157.160:80 wrr persistent 20

添加real server

[root@LVS-1-1 ~]# ipvsadm -a -t 192.168.157.160:80 -r 192.168.157.135:80 -g -w 1
[root@LVS-1-1 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.157.160:80 wrr persistent 20
-> 192.168.157.135:80 Route 1 0 0
[root@LVS-1-1 ~]#
[root@LVS-1-1 ~]# ipvsadm -a -t 192.168.157.160:80 -r 192.168.157.136:9000 -g -w 1
[root@LVS-1-1 ~]# ipvsadm -a -t 192.168.157.160:80 -r 192.168.157.141:80 -g -w 1
[root@LVS-1-1 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.157.160:80 wrr persistent 20
-> 192.168.157.141:80 Route 1 0 0
-> 192.168.157.136:80 Route 1 0 0
-> 192.168.157.135:80 Route 1 0 0
[root@LVS-1-1 ~]#

删除测试

[root@LVS-1-1 ~]# ipvsadm -d -t 192.168.157.160:80 -r 192.168.157.136:80
[root@LVS-1-1 ~]# ipvsadm -L -n
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.157.160:80 wrr persistent 20
-> 192.168.157.141:80 Route 1 0 0
-> 192.168.157.135:80 Route 1 0 0
[root@LVS-1-1 ~]#

RS 端绑定VIP 抑制ARP

每个集群节点上的回环接口(lo)设备上绑定VIP地址(其广播地址是其本身,子网掩码是4个255

采取可变长掩码方式把网段划分成只含一个主机地址的目的是避免ip地址冲突) 允许LVS-DR集群中的集群节点接受发向该VIP

地址的数据包 这会有一个非常严重的问题发生 集群内部的真实服务器将尝试回复来自正在请求VIP客户端的ARP广播 这样所有的真实

服务器都将声称自己拥有该VIP地址 这时客户端将直接发送请求数据包到真实服务器上 从而破坏了DR集群的方法 因此 必须抑制真实服务器的

ARP广播。

[root@RS1 ~]# ifconfig lo:135 192.168.157.160 netmask 255.255.255.255 up
[root@RS1 ~]# route add -host 192.168.157.160 dev lo
[root@RS1 ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:18:8F:41
inet addr:192.168.157.135 Bcast:192.168.157.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:549058 errors:0 dropped:0 overruns:0 frame:0
TX packets:341684 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:217735147 (207.6 MiB) TX bytes:426122467 (406.3 MiB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:133 errors:0 dropped:0 overruns:0 frame:0
TX packets:133 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:144841 (141.4 KiB) TX bytes:144841 (141.4 KiB)
lo:135 Link encap:Local Loopback
inet addr:192.168.157.160 Mask:255.255.255.255
UP LOOPBACK RUNNING MTU:16436 Metric:1
[root@RS1 ~]#
[root@RS1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.157.160 0.0.0.0 255.255.255.255 UH 0 0 0 lo
192.168.157.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.157.2 0.0.0.0 UG 0 0 0 eth0
[root@RS1 ~]#

抑制ARP

[root@RS1 conf]# pwd
/proc/sys/net/ipv4/conf
[root@RS1 conf]# echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
[root@RS1 conf]# echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
[root@RS1 conf]# echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
[root@RS1 conf]# echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
[root@RS1 conf]#

分别在RS2 RS3上执行相同的操作–>绑定VIP 抑制ARP

LVS安装小结:

1 CentOS5.X安装lvs 使用ipvsadm-1.24.tar.gz版本 不用1.26

2 CentOS6.4安装lvs 使用ipvsadm-1.24.tar.gz版本 并且需要先安装yum install libnl* popt* -y

3 安装lvs后 要执行IPvsadm把ip_vs模块加载到内核

4 本地网卡子接口添加VIP,ifconfig eth0:0 vip/24 up

5 清空原有的VIP转发表 ipvsadm -C #clear the whole table

6 ipvsadm –set 30 5 60 #设置 –set tcp tcpfin udp超时参数

7 添加VIP服务 ipvsadm -A -t 192.168.157.160:80 -s wrr -p 20

8 添加RS ipvsadm -a -t 192.168.157.160:80 -r 192.168.157.135:80 -g -w 1

[root@LVS-1-1 ~]# watch --interval=1 ipvsadm -Ln
Every 1.0s: ipvsadm -Ln Mon Feb 29 22:34:12 2016
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.157.160:80 wrr persistent 20
-> 192.168.157.140:80 Route 1 0 0
-> 192.168.157.141:80 Route 1 2 0
-> 192.168.157.135:80 Route 1 0 0

测试LVS服务的转发:

首先客户端浏览器访问RS成功了,然后访问DR的VIP http://192.168.157.160, 如果经过

多次测试能分别出现RS135 ,RS140,RS141的不同内容说明配置成功了

由于有浏览器缓存及LVS会话保持等影响 个人简单的测试切换RS的几率要很多次才行,并且要关闭浏览器

换不同的客户端ip来测试,效果更明显一些。单机测试是有这种情况的(负载均衡的算法倾向于一个客户端ip定向到一个后端服务器,以保持会话连贯性)

如果用两三台机器去测试也许就不一样

ARP抑制参数说明

arp_ignore-INTEGER

定义对目标地址为本地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

地址作为优先的网络接口。

抓包

[root@lamp scripts]# tcpdump -i eth1 tcp port 80 -s 1000
#tcpdump -i eth1 tcp port 80 -x -vv -X -s 1000
[root@lamp scripts]# tcpdump -i eth1 tcp port 80 -s 1000
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 1000 bytes
14:27:34.582880 IP 192.168.157.132.63548 > blog.aa.com.http: Flags [S], seq 3948779029, win 8192, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
14:27:34.582995 IP blog.aa.com.http > 192.168.157.132.63548: Flags [S.], seq 2127625605, ack 3948779030, win 14600, options [mss 1460,nop,nop,sackOK,nop,wscale 5], length 0
。。。。。
VS/NAT
ifconfig eth0:29 $vip/24 up
route add -host $vip dev eth0
ipvsadm -C
ipvsadm --set 30 5 60
ipvsadm -A -t $vip:80 -s wrr -p 20 #-p表示连接的会话保持

#添加rs

ipvsadm -a -t $vip:80 -r $rip:80 -m -w 1 #参数m是nat模式的意思

RS端改网关–>指向DIP

route add default gw DIP

LB开启内核转发 net.ipv4.ip_forward = 1 #意思是让Linux系统能像路由器/交换机那样具有转发功能

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

sysctl -p

VS/TUN

LB端添加VIP RS和以上相同 只要把参数m改成i即可

主要是客户端RS

RS端执行以下脚本

—–ipvs_tun.sh—————-

#!/bin/sh
#description:start realserver
VIP=192.168.157.166
. /etc/rc.d/init.d/functions
case "$1" in
start)
/sbin/modprobe ipip #开启隧道支持
/sbin/ifconfig tun10 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev tun10
echo "1" >/proc/sys/net/ipv4/conf/tun10/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/tun10/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/tun10/rp_filter
echo "1" >/proc/sys/net/ipv4/conf/tun10/forwarding
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null 2>&1
echo "RealServer Start OK"
;;
stop)
echo "0" >/proc/sys/net/ipv4/conf/tun10/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/tun10/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/tun10/rp_filter
echo "0" >/proc/sys/net/ipv4/conf/tun10/forwarding
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
/sbin/route del $VIP
/sbin/ifconfig tun0 down
sysctl -p >/dev/null 2>&1
echo "RealServer Stop OK"
;;
*)
echo "Usage:$0 {start | stop}"
;;
esac
exit 0

调度器上实现对后端集群节点的健康监控

check_rs.sh

主备LB的实现及防止裂脑的一些方案

主备的LB配置相同(auto_install_lvs.sh/ipvs_dr_config.sh)通过在备LB端用check_lb.sh进行监控主LB

当主出现故障时check_lb.sh执行,然后接管主LB任务,当主LB恢复时,check_lb.sh会调用stop函数清掉VIP,否则会出现裂脑问题

主LB正常的情况下,备节点如下:

Every 2.0s: ipvsadm -Ln Thu Mar 3 23:25:39 2016

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

#当主节点异常时:备节点接管任务

Every 2.0s: ipvsadm -Ln Thu Mar 3 23:29:07 2016

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP 192.168.157.160:80 wrr persistent 20

-> 192.168.157.142:80 Route 1 0 0

-> 192.168.157.140:80 Route 1 0 0

主节点恢复时,备节点还原

导致裂脑发生的原因

1 高可用服务器之间心跳线链路故障 导致无法相互检查心跳

2 高可用服务器上开启了防火墙 阻挡了心跳检测

3 高可用服务器上网卡地址等信息配置不正常 导致发送心跳失败

4 其它服务配置不当等原因 如心跳方式不同 心跳广播冲突 软件BUG等

防止裂脑的一些方案

1 加冗余链路

2 检测到裂脑时 强行关闭心跳检测(远程关闭主节点 控制电源的电路fence)

3 做好裂脑的监控报警

4 报警后 备节点在接管时设置比较长的时间去接管 给运维人员足够的时间去处理

5 启动磁盘锁 正在服务的一方锁住磁盘 裂脑发生时 让对方完全抢不走”共享磁盘资源”

高可用方案:

1 heartbeat(负责VIP切换)+LVS+ldirector(ldirector负责RS节点的健康检查)

复杂 不易控制

2 piranha方案(利用红帽的Piranha方案实现web负载均衡)

3 UltraMonkey

4 heartbeat+mon+code/+ldirectord

5 keeplived+LVS

此法简单 易用 高效

http://www.linuxvirtualserver.org/docs/ha/keepalived.html

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

生产环境中ipvsadm -Ln 发现两台RS的负载不均衡 一台有很多请求,一台没有。

并且没有请求的那台RS经测试服务正常,lo:VIP也有 但是就是没有请求。

TCP 172.168.1.50:3307 wrr persistent 10

->172.168.1.51:3307 Route 1 0 0

->172.168.1.52:3307 Route 1 0 12389

问题原因:

persistent 10的原因,persistent会话保持 当clientA访问网站的时候,LVS把请求

分发给了52,那么以后clientA再点击的其它操作,其它请求,也会发送给52这台机器。

解决办法:

到keepalive中注释掉persistent 10 然后/etc/init.d/keepalived reload,然后可以看到

以后负载均衡两边都请求 都均衡了。

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

1 LVS自身的会话保持参数设置(-p 300,persistent 300)优化:大公司尽量用cookie代替session

2 LVS调度算法设置,例如rr wrr wlc算法

3 后端RS节点的会话保持参数 例如 Apache的keepalive参数

4 访问量较少的情况,不均衡的现象更加明显

5 请求时间长短 请求资源的多少 大小等

LVS故障排错理论及实战讲解

排查的思路是要熟悉LVS的工作原理 然后根据原理过程来排查

例如:

1 调度器上LVS调度规则及IP的正确性

2 RS节点上VIP绑定和抑制的检查

对绑定的VIP做实时监控 出问题报警或者自动处理后报警

把绑定的VIP做成配置文件 如/etc/sysconfig/network-scripts/lo:0

ARP抑制的配置思路

1 、如果的单个VIP 那么可以用stop传参设置0

2、 如果rs端有多个VIP绑定,此时,即使是停止VIP绑定也一定不要置0

3 、RS节点上自身提供服务的检查

4 、辅助排查工具有tcpdump ping等

5、三角形排查理论

用户到LB之间链路通不通

用户直接到RS端链路通不通

LB与RS之间链路通不通

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/40531.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信