lvs基础介绍及实验演示

LVS基础介绍

LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个开源的软件,可以基于软件的方法实现LINUX平台下的负载均衡,由章文嵩博士于1998年5月研发,是中国国内最早出现的自由软件项目之一。

LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。

LVS由两部分组成,分别是

ipvs:工作于内核空间的input或prerouting链

ipvsadm:在ipvs上写规则的工具,用于在ipvs上定义集群服务及该集群服务对应的后端可用主机;

二者结合使LVS可以根据指定的调度方法(算法)作出调度决策

在正式介绍lvs前,我们要先对其使用的术语有一个基本的了解。

Host

Director:调度器

Real Server:RS,后端提供服务的主机

IP

Client:CIP

Director Virtual IP:VIP

Director IP:DIP

Real IP:RIP

session会话保持

Session Sticky:会话绑定

实现方法:会话绑定,假设后端有3台RS,某客户端第一次访问时被调度到RS1,则以        后所有该客户端的访问全都调度到RS1,由此保持了该客户端的会话;

两种实现方法:基于IP绑定(粗糙),基于cookie绑定;

缺陷:一旦RS1宕机,客户端将无法得到响应,或被重新调度到其他RS时,会话丢失;

Session ReplicationCluster:会话复制集群

实现方法:将后端的RS构建成多播集群,某客户端第一次访问时被调度到RS1,其保        存在RS1上的会话会通过多播的方式在集群中的所有RS上各复制一份,从而达到客户        端下次访问时无论被调度到哪个RS,其会话均被保持;

缺陷:当集群中的RS数量过多时,每个RS均需保存大量的session,且整个服务器中        充斥着大量的会话复制广播,无意义的消耗资源,所以此种方式仅适用于集群中有较        小规模的RS;

Session Server:会话服务器

实现方法:会话不再存储于RS,而是在RS后端单独建立一个共享存储服务器专门用于        存储session;

缺陷:共享存储服务器成为整个系统的瓶颈和SPOF(单点故障),所以需要构建分布        式和高可用

LVS有四种类型,分别是lvs-nat、lvs-dr、lvs-tun和lvs-fullnat,下面我们将对其一一进行介绍。

lvs-nat

类似iptables的DNAT,但支持多目标转发

通过将请求报文的目标地址修改为根据调度算法所挑选出的某RS的RIP来转发

架构特性

(1)RS应该使用私有地址,即RIP应该为私有地址;各RS网关必须指向DIP;

(2)请求和响应报文都经由Director转发,所以高负载场景中,Director容易成为系统瓶颈;

(3)支持端口映射;

(4)RS支持使用任意类型的OS;

(5)RS的RIP必须与Director的DIP处于同一网段;

拓扑图

lvs-dr

直接路由

Director在实现转发时不修改请求报文的IP首部,而是通过直接封装帧首部(MAC首部)完成转发(源MAC为Director的MAC,目标MAC为算法选定的RS的MAC);

架构特性

(1)各RS要直接响应Client,因此各RS均需配置VIP;但仅允许Director上的VIP能够与本地末梢路由直接通信;

解决方案

静态绑定:在前端路由直接将VIP对应的目标MAC静态配置为Director的MAC地址;

arptables:在各RS上,通过arptables规则拒绝响应对VIP的ARP广播请求;

内核参数:在RS上修改内核参数,并结合地址的配置方式实现拒绝响应;

(2)RS的RIP可以使用私有地址和公网地址,使用公网地址时可通过互联网上的主机直接对此RS进行管理操作;

(3)请求报文必须经由Director调度,而响应报文必须不能经由Director;

(4)各RIP必须与DIP在同一物理网络中;

(5)不支持端口映射;

(6)RS支持使用大多数的OS;

(7)RS的网关一定不能指向Director;

拓扑图

(1)客户端的请求报文到达本地路由-->ARP地址解析(本地间通信基于MAC而非IP)-->?

此时出现问题:请求报文的目标IP是VIP,而Director和RS1、RS2均配有VIP,当路由器做ARP地址广播请求拥有VIP地址的主机将其MAC发送过来时,三台主机均可响应,则无法保证报文是经由Director调度后发送至选定的RS,所以需要设置RS使其拒绝响应路由器的ARP广播或响应报文不予放行;

(2)此时请求报文只能由源MAC(路由器)发送至目标MAC(Director);请求报文到达Director后,通过调度算法选定某RS,由Director再做ARP地址广播获得RS的MAC,将请求报文的源MAC改为Director,目标MAC改为选定的RS,调度至此完成;

(3)请求报文到达RS后,通过解封,RS发现源IP是CIP,目标IP是VIP且本机具备,所以当RIP的网关指向本地路由器时,就可直接将响应报文发送给客户端而无需经过Director;

(4)此时出现另一个问题:因为VIP配置在lo上,而lo无法与外部通信,所以响应报文只能经由物理网卡RIP流出,则响应报文的源IP变为了RIP,目标IP为CIP;但是客户端请求的是VIP而非RIP,所以必须让第(2)步的请求报文到达RS后经由lo接口进入(由此保证了响应报文的源IP是VIP),然后经由forward链转发至物理网卡响应给客户端;

上文提到的第三种解决方案需要修改内核参数,此参数是Linux2.4.26和2.6.4版本后

入的,位于/proc/sys/net/ipv4/conf/INTERFACE

以下图为例加以说明

arp_announce:

定义arp通告级别;有0~2三个级别,默认0级,当ARP广播到达后,会把自己拥有的3个IP地址都做响应;1级,尽量避免将与ARP广播来源不在同一网络的网卡上配置的IP地址作出响应;2级只允许和广播来源处于同一网络的IP作出响应;

以上图为例,0级1.1、2.1、3.1均会响应1.2的广播;1级尽量只让1.1响应1.2的广播,但是并不禁止2.1和3.1响应;而2级则只允许1.1响应1.2的广播;

arp_ignore:

定义arp忽略arp请求或arp通告的级别;有0~8九个级别

以上图为例,当2.6请求与2.1通信的广播到达1.1时:默认0级,虽然1.1本身和2.6不在同一网络,但2.1和2.6却在同一网络,依据Linux特性,内核认为自己拥有2.1地址,所以会通过1.1接口对该广播作出响应;1级,只有广播请求流入的接口本身就是广播请求的地址时才予以响应,否则不予响应(即当2.6请求与2.1通信的广播从1.1网卡流入时,主机将不予响应;只有当广播从2.1接口流入时才会响应)

lvs-tun

不修改请求报文的IP首部,而是通过IP隧道机制在原有IP报文之外再封装IP首部,经由互联网把请求报文转交给选定的RS

架构特性

(1)RIP,DIP,VIP都是公网地址;

(2)RS的网关无法指向DIP;

(3)请求报文经由Director分发,但响应报文直接由RS响应给Client;

(4)不支持端口映射;

(5)RS的OS必须支持IP隧道;

lvs-fullnat

通过修改请求报文的源地址为DIP,目标地址为RIP来实现转发;对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发

架构特性

(1)RIP,DIP可以使用私有地址;

(2)RIP和DIP可以不在同一网络中,且RS的网关无须指向DIP;

(3)支持端口映射;

(4)RS的OS可以使用任意类型;

(5)请求报文和响应报文都必须经由Director;

LVS的调度算法分为静态方法和动态方法,共有10种,详细介绍如下:

静态调度

仅根据算法实现调度

RR:

round-robin,轮询、轮调、轮流、轮叫;

WRR:

weighted round-robin,加权轮询;算法公式:Overhead=conn/weight;

DH:

Destination ip Hashing,目标地址哈希;把访问同一目标地址的访问定向至此前选定的RS;

应用场景:当某网络的出口网关有多个时,例如本公司有两个出口网关,而公司内有众多客户端,(1)当第一次访问某网站时,请求报文从FW1出去,返回时有可能从FW2返回,而FW2上的iptables设置了状态链接追踪规则,只允许ESTABLISHED状态的响应报文放行,此时会导致客户端无法得到响应;(2)客户端A通过FW1访问了某网站,有了缓存,而客户端B却通过FW2访问了同一网站,此时A访问是产生的缓存未生效;此时DH算法可将所有访问该网站的请求全都调度到FW1上以提升缓存命中率;但是当公司的所有客户都访问该网站时,所有的请求都被调度到FW1,而FW2却无需响应请求,反均衡;此时LBLC算法可解决此问题,但是却降低了缓存命中率,此时LBLCR可进一步解决此问题。

SH:

Source ip Hashing,源地址哈希;把来自同一地址的请求定向至此前选定的RS;

基于IP的哈希是反均衡的(例如通过SNAT的IP,一个IP可能有来自众多私网IP的请求,而SH却把众多的请求视作一个IP请求直接调度给了同一个RS),可通过应用层基于cookie的哈希解决此问题,但是lvs无法工作于应用层

动态调度

根据算法及后端RS当前负载状况实现调度

LC

least connection,最小连接

算法公式:Overhead=Active*256+Inactive

WLC

weighted least connection,加权最小连接;lvs默认调度方法

算法公式:Overhead=(Active*256+Inactive)/weight

lvs的默认调度算法

SED

Shorted Expectation Delay,最短期望延迟

算法公式:Overhead=(Active+1)*256/weight

NQ

Never Queue,永不排队

按照SED算法按顺序先保证每个RS至少处理一个请求,然后再按照SED算法进行调度

LBLC

Local-Based Least Connection,基于本地的最少连接,动态方式的DH算法

LBLCR

Replicated LBLC,可复制的LBLC

名词解释:

overhead:

衡量当前RS负载情况的指标,值越小,越被优先调度

在对LVS有了基本的了解后,现在我们来介绍下ipvsadm构建集群服务的具体使用方法。

(1)管理集群服务

创建或修改

ipvsadm-A|E -t|u|f service-address [-s scheduler]

-A:创建

-E:修改

-t:

承载的应用层协议基于tcp协议,其service-address的格式为“VIP:PORT”,如“172.16.14.1:80”;

-u:

承载的应用层协议基于udp协议,其service-address的格式为“VIP:PORT”,如“172.16.14.1:53”;

-f:

承载的应用层协议基于TCP或UDP协议,但此类报文会经由iptables/netfilter打标记(即防火墙标记,0~99之间的整数);其service-address的格式为“FWM”,例如“10”;

作用是将基于不同端口的服务归为同一类集群服务

-s scheduler:

指明调度方法,省略时默认使用WLC;

删除

ipvsadm-D -t|u|f service-address

(2)管理集群上的RS

添加或修改

ipvsadm-a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

-r server-address:

指明RS,server-address格式一般为“IP[:PORT]”;注意,只有支持端口映射的lvs类型中才应该显式定义此处端口

[-g|i|m]:指明lvs类型

-g:gateway,意为dr类型;

-i:ipip,意为tun类型;

-m:masquerade,意为nat类型;

省略时默认为dr类型

[-w weight]:

指明当前RS的权重,只对支持加权调度的scheduler才有意义;

删除

ipvsadm-d -t|u|f service-address -r server-address

(3)查看规则

pvsadm
-L|l [options]

-c: 列出当前所有connection;

--stats:
列出统计数据

--rate:
列出速率

-n, --numeric: 数字格式显示IP及端口;

--exact:
精确值;

(4)保存及回复规则

ipvsadm -S > /etc/sysconfig/ipvsadm

ipvsadm-save
> /etc/sysconfig/ipvsadm

service
ipvsadm save

ipvsadm
-R < /etc/sysconfig/ipvsadm

ipvsadm-restore
< /etc/sysconfig/ipvsadm

service
ipvsadm restart

LVS的实验演示

有了以上的基础,下面我们以lvs-nat和lvs-dr两种类型为演示,进一步加深对LVS的理解

lvs-nat类型的web服务器集群构建演示

1、安装ipvsadm,并查看ipvs在当前系统是否启用

# yum
install -y ipvsadm

# grep -i -A 5"ipvs" /boot/config-2.6.32-504.el6.x86_64

显示下列结果可知,当前系统已启用了ipvs

2、构建实验拓扑机构

将两台RS的默认网关指向DIP

# route add default gw 192.168.14.3

编辑两台RS的测试页

# vim
/var/www/html/index.html

测试RIP与VIP及DIP的连通性

# ping 192.168.14.3

# ping 172.16.14.2

在DIP上测试两台RS

# curl http://192.168.14.1

# curl http://192.168.14.2

3、使用ipvsadm构建集群服务

#
ipvsadm -A -t 172.16.14.2:80 -s rr

#
ipvsadm -a -t 172.16.14.2:80 -r 192.168.14.1 -m -w1

#
ipvsadm -a -t 172.16.14.2:80 -r 192.168.14.2 -m -w5

#
ipvsadm -ln

4、确保Director的网络间转发功能处于开启状态

# cat
/proc/sys/net/ipv4/ip_forward

若结果为0,则

#
echo 1 > /proc/sys/net/ipv4/ip_forward

或者

# vim
/etc/sysctl.conf

#
sysctl -p

5、在浏览器上访问172.16.14.2后查看结果

#
ipvsadm -ln --stats

因为采用的scheduler是rr,所以权重无意义,因此调度结果是1:1的

6、修改调度方法后再做测试

#
ipvsadm -E -t 172.16.14.2:80 -s wrr

# ab
-n 10000 -c 100 http://172.16.14.2/index.html

#
ipvsadm -ln --stats

此时调度结果接近1:5

7、再次修改调度方法做测试

#
ipvsadm -E -t 172.16.14.2:80 -s sh

计数清零

#
ipvsadm -Z

# ab
-n 10000 -c 100 http://172.16.14.2/index.html

#
ipvsadm -ln --stats

此时所有请求全都被调度到RS2上

8、抓包分析

tcpdump -i eth0 -nn host 172.16.250.65(本机物理IP)

lvs-dr类型的web服务器集群构建演示

1.设计实验拓扑结构

2、配置Director:

(1)VIP配置在物理接口的别名上

ifconfigINTERFACE:ALIAS $vip broadcast $vip netmask 255.255.255.255

# ifconfig eth0:0 172.16.14.2 broadcast172.16.14.2 netmask 255.255.255.255

(2) 配置路由信息

routeadd -host $vip dev INTEFACE:ALIAS

# route add -host 172.16.14.2 dev eth0:0

3、配置RS:

(1)先修改内核参数

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/all/arp_announce

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

(2) VIP配置在lo的别名上

ifconfiglo:0 $vip broadcast $vip netmask 255.255.255.255 up

(3)配置路由信息

routeadd -host $vip dev lo:0

# route add -host 172.16.14.2 dev lo:0

此步配置确保响应报文必须从lo:0流出,从而保证了RS直接响应给客户端的报文源IP是VIP

4、使用ipvsadm构建集群服务

#ipvsadm -A -t 172.16.14.2:80 -s rr

# ipvsadm -a -t 172.16.14.2:80 -r 192.168.0.1 -g -w1

# ipvsadm -a -t 172.16.14.2:80 -r 192.168.0.2 -g -w5

5、补充说明:

(1)因为lvs-dr模型的VIP仅用于目标地址标记而不用于通信,所以VIP掩码一般设置为32位(形如“netmask255.255.255.255”);虽然这是子网掩码但是在这里已经不是用来分子网用的,而是用来作为受限广播地址的(表示广播时全匹配,这时候的子网掩码和ip地址完全相同,只能匹配到自己)。

四个特殊地址:

直接广播地址:X.X.X.255(ip最后一位为255)

受限广播地址:255.255.255.255(全四位为255)

这个网络上的特定主机:0.0.0.X(X表示在1—254之间随意取)

回送地址:127.0.0.0(属于A类ip地址)

(2)为确保VIP不会主动对外做广播,可设置“broadcast $vip”,表示广播域仅是自己本身;

(3)辅助命令

查看内核参数

#sysctl -a

显示ping命令发起主机和响应主机的对应网卡MAC地址

# arp-a

lvs定义集群服务的“-f”方式

定义格式

-f FWM,防火墙打标

在ipvs生效之前的netfilter的某hook function上定义iptables规则,实现给报文打上防火墙标记;

定义方法

(1) 打标:在Director上mangle表的PREROUTING链上实现

# iptables -t mangle -A PREROUTING -d $vip -p $protocol --dport$port -j MARK --set-mark FWM([1-99])

(2) 基于FWM定义集群服务

#ipvsadm -A -f FWM -s SCHEDULER

#ipvsadm -a -f FWM -r server-address -g|-i|-m -w #

lvs的persistence:lvs持久连接

无论使用哪一种调度方法,持久连接功能都能保证在指定时间和范围之内,来自于同一个IP的请求将始终被定向至同一个RS;

persistencetemplate:持久连接模板

PPC:

每端口持久,持久连接的生效范围仅为单个集群服务;如果有多个集群服务,每服务被单独持久调度;

PCC:

每客户端持久,持久连接的生效范围为所有集群服务;定义集群服务时,其tcp或udp协议的目标端口要使用0;

PFWM:

每防火墙标记持久,持久连接的生效范围为定义为同一个FWM下的所有服务;

ipvsadm-A -t|-u|-f service-address -s SCHEDULER [-p [#]]

无-p选项:不启用持久连接

-p #:指定持久时长,省略时长,默认为300seconds

RS宕机问题解决方案

lvs本身不支持对RS的健康状态作检测

(1)自写程序

(2)keepalived程序(可解决单点故障和健康状态检测);

健康状态检测应该是一种周期性检查机制,并在状态发生变化时作出相应处理

当状态up-->down,建议至少检查3次再做相应处理;

当状态down-->up,建议至少检查1次再做相应处理;

下线处理机制:

(1)设置权重为0;

(2)将相应的RS 从ipvs的可用RS列表中移除;

上线处理机制:

(1)设置为正常权重;

(2)将相应的RS添加到ipvs的可用RS列表中;

健康状态检测方法

(1)IP层:ping等主机在线状态探查工具;

(2)传输层:端口扫描工具探查服务在线状态;

(3)应用层:请求专用于健康状态检查的资源或者某正常资源;

备用服务器

当后端所有RS都宕机时,启用此服务器

sorry server,backupserver

可以在Director上直接实现,即配置Director称为web服务器,仅提供有限资源,在所有RS都出现故障时才启用此server

时间: 2024-07-29 02:36:29

lvs基础介绍及实验演示的相关文章

Erlang基础 -- 介绍 -- Wordcount示例演示

在前两个blog中,已经说了Erlang的历史.应用场景.特点,这次主要演示一个Wordcount的示例,就是给定一个文本文件,统计这个文本文件中的单词以及该单词出现的次数. 今天和群友们讨论了一个问题,突然一下子就上升到哲学角度上了,装逼装大发了. PS:图片中有错别字,%s/财务和其他9个月/财务和其他9个人/g 不过真心想说的一点是,把Erlang系统,映射到现实中,很多奇葩问题,就能迎刃而解了.所以,在下面的简要设计中,我就尽可能的代入一下现实世界吧. 环境安装 mac 的话,用brew

第三十三天 LVS基础原理、调度算法、NAT和DR的实现 、LXC虚拟化

大规模站点构建框架 LVS的基础原理 LVS调度方法及NAT模型的实现 LVS  dr模型及lxc虚拟化 一.大规模站点架构框架 http: stateless keep-alive cookie: session 系统的:可扩展性.高可用性:99%, 99.9%, 99.999% .性能: 可扩展性: 容量:在一定时间内能完成的工作量 scale up: 向上扩展 scale out: 向外扩展 Cluster: 集群 构建高可扩展性系统的重要原则:在系统内部尽量避免串行化和交互 调度器:di

Web3D编程入门总结——WebGL与Three.js基础介绍

1 /*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识以后有机会再总结.*/ 2 /*第一部分,webgl与three.js基础介绍,要求读者掌握JavaScript入门知识*/ 3 //webgl原理:通过JavaScript语言在浏览器端生成glsl代码,把glsl代码送入显卡执行,把执行结果显示在浏览器中 4 //简单例程: 5 //根据To

关于Java中类名.class的基础介绍

声明:文章的总结,来自许多网友的优秀博客 关于通过类名访问class属性,我朋友过好几次了,一直没明白这个东西到底是什么?对此,我参照网友们的博客,总结了一些小知识,如发现错误,希望纠正,谢谢 其实任何一个类,都会有一个Class对象于这个类对应,在这个Class对象中,保存着实例化该类时所需要的基本信息,A.class  其实返回的是一个类A的Class对象,贴一个小代码演示一下: public class Test { /** * @param args */ public static v

LVS基础及LVS+Keepalived实现双主高可用负载均衡

LVS基础及LVS+Keepalived实现双主高可用负载均衡 LB集群: (Load  Balancing)即负载均衡集群,其目的是为了提高访问的并发量及提升服务器的性能,其    实现方式分为硬件方式和软件方式. 硬件实现方式: 常用的有 F5公司的BIG-IP系列.A10公司的AX系列.Citrix公司的 NetScaler系列等 软件实现方式: LVS工作于传输层.nginx工作于应用层.haproxy工作于传输层和应用层 本文主要讲解LVS. 一.什么是LVS ? 1. LVS:(Li

GDI基础介绍之几何绘图

使用GDI的一些AIP函数我们可以轻易的绘制出简单的几何图形,上一章提到过HDC是设备环境句柄,通过GetDC函数,我们可以获得在电脑上画画的画布,现在有了画布,我们想要画几何图形,还缺少什么呢?对,你没有听错,我们还缺少画画的工具,在GDI里面我们想要画几何图形一般用两种工具,一个是画笔,一个是画刷,下面分开介绍这两种工具. 1.绘制线条的利器-画笔    正如我们的标题所说的那样,画笔是绘制线条用的,也就是说如果我们想要从一个点到另一个点之间画一条线段,那么我们就要选择画笔工具,我们在Win

LVS详细介绍以及遇到的坑

LVS详细介绍以及遇到的坑 一,概述 本文介绍了我搭建LVS集群的步骤,并且在使用LVS(Linux Virtual Server)过程中遇到的问题和坑, 二,LVS简单介绍 大家都知道,LVS中文意思就是linux虚拟服务器,是一个虚拟的服务器集群系统,可以在Unix/Linux平台下实现负载均衡集群功能,  该项目是章文嵩博士组织成立,是中国国内最早出现的自由软件项目之一. LVS项目的特点:有实现三种IP负载均衡技术和八种连接调度算法的IPVS软件.在IPVS内部实现上,采用了高效的Has

【简译】jQuery对象的奥秘:基础介绍

本文翻译自此文章 你有没有遇到过类似$(".cta").click(function(){})这样的JavaScript代码并且在想“$('#x')是什么”?如果这些对你想天书一样,请往下读.如果你认为这些代码不可能是真的,请浏览一些jQuery例子,他们都是这种结构. 这篇文章覆盖了像下面一样吓人的代码片段中涉及的关键概念.我们以一个长例子开始,这个长例子是基于一个让一个正方形运动的简单例子(a simple example of animating a square).你可能不需要

Zabbix 3.0 基础介绍 [一]

Zabbix 3.0 基础介绍 [一] zabbix 一.Zabbix介绍 zabbix 简介   Zabbix 是一个高度集成的网络监控解决方案,可以提供企业级的开源分布式监控解决方案,由一个国外的团队持续维护更新,软件可以自由下载使用,运作团队靠提供收费的技术支持赢利   zabbix是一个基于Web界面的,提供分布式系统监控以及网络监视功能的企业级的开源解决方案.   zabbix能监视各种网络参数,保证服务器系统的安全运营,并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题