码迷,mamicode.com
首页 > 编程语言 > 详细

LVS类型的介绍,调度算法和不同类型的实现

时间:2015-10-14 01:40:46      阅读:422      评论:0      收藏:0      [点我收藏+]

标签:lvs类型   lvs的调度算法   lvs_nat的实现   lvs_dr的实现(vip和rip 在同一网段和不同网段)   

LVS类型介绍,调度算法和不同类型的实现

LVS集群的组成与特点

Linux虚拟服务器(Linux Virtual ServerLVS),是一个由章文嵩开发的一款自由软件。利用LVS可以实现高可用的、可伸缩的WebMailCacheMedia等网络服务,并在此基础上开发支持庞大用户数的、可伸缩的、高可用的电子商务应用。LVS1998年发展到现在,已经变得比较成熟,目前广应用在各种网络服务和电子商务应用中。LVS具有很好的可伸缩性、可靠性和可管理性,通过LVS要实现的最终目标是:利用Liunx操作系统和LVS集群软件可以实现一个高可用、高性能、低成本的服务器应用集群。

LVS集群的组成

    利用LVS架设的服务器集群系统由3个部分组成:最前端的负载均衡(这里用Load Balancer表示)中间是服务器组层(Server Array表示),底端是数据共享存储层(用Shared Storage表示)。在用户看来,整个LVS集群系统的所有内部应用结构都是透明的,最终用户只是在使用一个虚拟服务器提供的高性能服务。

LVS的各个组成部分进行详细介绍。

负载均衡层:位于整个集群系统的最前端,由一台或多台负载调度器(Director Server)组成,LVS核心模版IPVS就安装在Director Server上,而Director的主要作用类似于一个路由器,它含有为完成LVS功能所设定的路由表,通过这些路由表把用户的请求分发给服务器群组的应用服务器(Real Server)。同时在Director Server上还要安装对Real Server的监控模块Ldirectord,此模块用于监测各个Real Server服务的健康状况。在Real Server不可用时可以将其从LVS路由表剔除,在恢复时重新加入。

服务器群组层:由一组实际运行应用服务的机器组成,Real Server可以是Web服务器、Mail服务器、DNS服务器、视频服务器中的一个或多个,每个Real Server之间通过高速的LAN或分布在各地的WAN相连接,在实际的应用中,Director Server也可以同时兼任Real Server的角色。 

共享存储层:是为了所有的Real Server提供共享存储空间和内容一致性的存储区域,一般由磁盘阵列设备组成,为了提供内容的一致性,一般可以通过NFS网络文件系统共享数据,但是NFS在繁忙的业务系统中,性能并不是很好,此时可采用集群文件系统,例如Red Hat

GFS文件系统,Oracle提供的OCFS2文件系统等。

从整个LVS结构可以看出,Diredtor Server是整个LVS的核心,目前,用于Director Server的操作系统只有LinuxFreeBSDLinux2.6内核内置了LVS的各个模块,不用任何设置就可以支持LVS功能。

对于Real Server,几乎所有的系统平台,如LinuxWindowsSolarisAIXBSD系统等都能很好的支持它。

LVS

工作在用户空间的ipvsadm ,是一个命令行工具,用于管理集群服务

工作在内核空间的ipvs:工作在netfilter中 INPUT链上,根据ipvsadm编写的规则强行从INPUT链上将数据包转发到后续的real Server

对应的IP

Client IP: CIP

Director Virutal IP: VIP

Director IP: DIP

Real Server IP: RIP

LVS集群的特点:

1IP负载均衡与负载调度算法

1IP负载均衡技术

负载均衡技术有很多实现方案,有基于DNS域名轮流解析的方法,有基于客户端调度访问的方法,有基于应用层系统负载的调度方法,还有基于IP地址的调度方法,在这些负载调度算法中,执行效率最高的IP负载均衡技术。

LVSIP负载均衡技术是通过IPVS模块来实现的,IPVSLVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟IP地址来服务器,这个虚拟IP一般称为LVSVIP,即Virtual IP,访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务器节点响应的请求。 

在用户的请求到达负载调度器后,调度器如何将请求发送到提供服务的Real Server节点,而Real Server节点如何中返回数据给用户,是IPVS实现的重点技术,IPVS实现负载均衡的方式有以下几种,分别是NATDR TUNFULLNAT,下面进行详细介绍。 

NAT:即 Network Address Translation,也就是网络地址翻译技术实现虚拟服务器,当用户请求到达调度器时,调度器将请求的报文目标地址(即虚拟IP地址)改写成选定的Real Server地址,同时将报文的目标端口也改写成Real Server的相应端口,最后将报文请求发送到选定的Real Server。在服务器端得到数据后,Real Server将数据返回给用户时,需要再次经过负载调度器,将报文件的源地址和源端口改成虚拟IP地址和相应端口,然后把数据发送给用户,完成整个负载调度过程。

可以看出NAT方式下,用户的请求和响应报文件都必须经过Director Server地址重写,当用户请求越来越多时,调度器的处理能为将成为瓶颈。

NAT:

1RSDIP应该使用私有地址,且RS的网关指向DIP

2)请求和响应报文都要经由Director转发;在极高负载的场景中,Director可能成为系统瓶颈。

3)支持端口映射

4RS可以使用任意的OS

5RSRIPDirectorDIP必须在同一IP网络。

NAT实现模型如下:

技术分享

DR:即 Director Routing,也就是用直接路由技术实现虚拟服务器,这种方式的连接调度与前两种一样,但它的报文转发方法又有不同,VS/DR通过改写请求报文件的目标MAC地址,将请求发送到Real Server,则Real Server将响应直接返回给客户,要求Director ServerReal Server必须是一块网卡连在同一个物理网段上。

DR: 

(1)保保证前端路由器将目标IPVIP的请求报文发送给director

解决方法:

静态绑定

arpiptables

修改RS主机内核的参数(这样RS只能使用Linux操作系统)

(2)RSRIP可以为私有地址;但也可以使用公网地址

(3)RSDirector必须在同一个物理网络中

(4)请求报文经由Director调度,但响应报文一定不能经由Director

(5)不支持端口映射

        (6)RS的网关不能指向DIP

DR的实现模型:

技术分享

DR实现过程:

1.在客户端发送请求报文,源IPCIP,目标IPVIP,经过层层路由,最终到达本地路由,当报文到达路由器时,路由器查看目标IPVIP,就开始在本地发送arp广播,来查询本地VIPMAC地址。但是由于在同一物理网络中,Real ServerDirector都一个VIP,所以为了实现LVS的负载均衡就必须保证前端路由器将目标IPVIP的请求报文发送给director。实现方法有:

静态绑定:就是在前端路由上进行arpMAC绑定,将Director上的VIP对应的MAC地址写到前端路由上的路由表上。

使用arptablesarptables的用法和iptables类似,就是编写对arp的限制规则。

修改RS主机的内核参数:

2.当数据报根据MAC地址到达Director调度器后,DR类型的LVS会修改请求报的目标MAC地址。源MAC地址为DIR网卡对应的MAC地址,目标MAC地址为Real Server上的RIP对应的MAC地址。

3.请求报文最终到达Real Server 上。在刚进入Real Server时经过数据报的拆解,发现数据包的IP地址为VIP,就会将数据报文交给VIP ,经过VIP和端口对应的套接字,找到对应的程序,最终将数据报交给应用程序。

关键的一步来了,realserver怎么将数据包回复给客户端?

1.当VIPRIPDIP位于同一网段中:

首先,在realserver上定义一条特殊路由,目标为VIP的数据包都从loopback口发出去,于是源地址还是为VIP,数据包的源和目的地址都没有变化。但是由于限制了arp的广播和应答方式,外界并不知道realserver上有VIP的存在,realserver也不知道VIP这个网段中的其它主机,所以数据包就卡在realserver这里了。但是由于VIPRIP,DIP位于同一网络中,数据包可以从Realserver直接发往它们的网关,于是路由器接收到数据包后就直接路由转发给客户了。

2.当VIPRIPDIP不在同一网段中

首先,在realserver上定义一条特殊路由,目标为VIP的数据包都从loopback口发出去,于是源地址还是为VIP,数据包的源和目的地址都没有变化。但是由于限制了arp的广播和应答方式,外界并不知道realserver上有VIP的存在,realserver也不知道VIP这个网段中的其它主机,所以数据包就卡在realserver这里了。解决方法就是,在realserver上添加一条默认路由,不知道的包都发往上私网地址的网关,于是路由器接收到数据包后就直接路由转发给客户了,在这个拓扑图中,路由器链接交换机的接口要有2个地址,一个是私网的网关地址,一个是公网的网关地址。

TUN:即IP Tunneling,也就是通过IP隧道技术实现虚拟服务器,这种方式的连接调度和管理与VS/NAT

方式一样,只是报文转发方法不同,在VS/TUN方式中,调度器采用IP隧道技术,将用户请求转发到某个Real Server,而这个RealServer将直接响应用户的请求,不再经过请端调度度,此外,对Real Server的地域位置没有要求,可以和Director Server位于同一网段,也可以独立的一个网络中,因此,在TUN方式中,调度器将只处理用户的报文请求,从而使集群系统的吞吐量大大提高。 

TUN:不修改请求报文的ip首部,而是通过在原有的ip首部(cip<-->vip)之外,再封装一个ip首部(dip<-->rip)

TUN

集群节点可以跨越Internet

RIP必须是公网地址;

director仅负责处理入站请求,响应报文则由realserver直接发往客户端;

realserver网关不能指向director

只有支持隧道功能的OS才能用于realserver

不支持端口映射;

实现模型:

技术分享

FULLNATdirector通过同时修改请求报文的目标地址和源地址进行转发;

            (1) VIP是公网地址;RIPDIP是私网地址,二者无须在同一网络中;

            (2) RS接收到的请求报文的源地址为DIP,因此要响应给DIP

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

            (4) 支持端口映射机制;

            (5) RS可以使用任意OS

FullNat实现模型:

技术分享

2)负载调度算法: 

前面介绍过,负载调度器是根据各个服务器的负载情况,动态地选择一台RealServer响应用户请求,那么动态选择是如何实现的呢,其实就是通过这里说的负载调度算法,根据不同的网络服务需求和服务配置,IPVS实现了8种负载调度算法,这里细述常用的4种调度算法。 

轮叫算法:(Round Robin) “轮叫”调度也叫11调度,调度器通过“轮叫”调度算法将外部用户请求按顺序号11地分配到集群中每个Real Server上,这种算法平均地对待每一台Real Server,而不管服务器上实际的负载状况和连接状态。 

加权轮叫调度(Weighted Round Robin) “加权轮叫“调度算法根据Real Server的不同处理能力来调度访问请求,可以对每台Real Server设置不同的调度权值,对性能相对较好的Real Server可以设置较高的权值,而对能力较弱的Real Server,可以设置较低的权值,这样保证了处理能力强的服务器处理更多的访关问流量,充分合理地利用了服务器资源,同时,调度器还可以自动查询Real Server的负载情况,并动态地调整其权值。

最少连接调度(least Connection)“最少连接“调度算法动态将网络请求调度到已建立的连接数最少的服务器,如果集群系统的真实服务器具有相近的系统性能,采用“最少连接”调度算法可以较好地均衡负载。

活动连接数*256+inactive  谁小,挑谁。

 加权最少连接(Weighted Least Connections) “加权最少连接调度“是”最少连接调度的超集,每个服务节点可以用相应的权值表示其处理能力,而系统管理员可以动态地设置相应的权值,默认值为1,加权最小连接调度在分配新连接请求时尽可能使服务节点的已建立连接数和其权值成正比。 

活动连接数*256+inactive  /WEITH

Shsource hashing(源地址散列)当一个客户端发送请求时,Director Serve会把请求发送到real server上进行处理,并且会生成一张哈希表(源地址),来记录此过程请求和应答的IP。当此客户端在此请求时,Director server利用此调度算法把请求交给上次处理该请求的reals erver

Dh:distination hashing (目标地址散列)

Sed;最短期望延迟  (active+1)*256/weight

nq: never queue

LBLC: 基于本地的最少连接

LBLCR: 基于本地的带复制功能的最少连接

默认方法:wlc

LVS集群的优缺点

LVS是一款自由软件,任何人都可以免费获取并使用它,而且Linux也是一个开源操作系统,这二者的组合大大节约了企业的应用成本,同时LVS具有高稳定性和可靠性,在高并发高吞叶量下,具有高负荷处理能力,当某个服务节点出现故障时,并不影响整个系统服务在正常运行,这些优点使LVS已经广泛在企业、教育行业以及很多知道名网站。 细心的讯都可能发现了,LVS具有上述优点的同时,还将存在一个致命的缺点,从上图可以清楚的看出,所有的用户请求都经过Director Server将任务分发到各个服务器节点,那么,当只有一Direcotr Server时,将会出现单点故障点,如果这个Director Server出现故障时,整个LVS系统将陷入瘫痪状态。

虽然Director Server仅完成用户请求的分发处理,负载并不是很大,但是对于一个健状的集群系统来说,单点故障是绝对不允许的,要避免这种单点故障,最实用、最简单的办法就是对Director Server进行高可以集群,最常见的方案就是为Director Server做一个双机热备:正常状态下主Director Server 工作,备用Director Server监控主Director Server的状态,当主Director Server出现异常或者故障时,备用Director Server马上接过主Director Server的工作,负责对用户请求进行分发处理,这样就避免了台Director Server的单点故障问题,保证了负载均衡端持续地提供服务。

ipvsadm的用法:

ipvsadm的用法很简单,类似于iptables的使用方法,在这简单的介绍一下:

管理集群服务

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

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

service-address:

tcp: -t ip:port

udp: -u ip:port

fwm: -f mark

-s scheculer:

默认为wlc

管理集群服务中的RS

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

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

server-address: 

    ip[:port]

lvs-type:

    -g: gateway, dr

    -i: ipip, tun

    -m: masquerade, nat

清空和查看:

ipvsadm -C

ipvsadm -L|l [options]

    -n: numeric,基于数字格式显示地址和端口;

    -c: connection,显示ipvs连接;

    --stats:统计数据

    --rate: 速率

    --exact: 精确值

保存和重载:

   ipvsadm -R

   ipvsadm -S [-n]

置零计数器:

   ipvsadm -Z [-t|u|f service-address]


LVS_NAT类型的实现:

实验环境:(本实验是基于对Web服务的负载均衡)

实验拓扑图:

技术分享

搭建实验环境:

        1.在CentOS6虚拟机上实现Director,其中VIPeth0172.16.99.1(桥接模式DIPeth1192.168.20.1(自定义模式)。在Director安装ipvsadm命令工具。开启路由转发功能。

    技术分享

安装ipvsadm ]# yum install ipvsadm

查看内核是否支持LVS

]# grep -i "IPVS" /boot/config-2.6.32-504.el6.x86_64 

# IPVS transport protocol load balancing support

# IPVS scheduler

# IPVS application helper

开启路由转发:

1.通过修改配置文件;(永久有效)

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1

2.临时配置:

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

2.在两台CentOS6虚拟机上安装web服务,充当Read Server。其中RS1RIP1eth0192.168.20.2(自定义)Gateway为:192.168.20.1RS2RIP2eth0192.168.20.3(eth0)Gateway为:192.168.20.1

RS1:

技术分享

RS2:

技术分享

在搭建完实验环境之后,就可以在Director上执行ipvsadm命令,添加ipvsadm规则,并在两个RS上开启Web服务,由于为了显示实验效果,在两个Web服务器上显示的页面内容是不相同的。

ipvsadm规则:

    技术分享

开启web服务,进行测试:

        技术分享

        技术分享

LVS_DR类型的实现:

lvs_dr类型的实现:VIP DIPRIP在同一网段内

实验环境:

技术分享

实验环境搭建:

Real Server上的配置:

在配置VIP之前要保证前端路由器将目标IPVIP的请求报文发送给director

解决方法:

静态绑定

arpiptables

修改RS主机内核的参数(这样RS只能使用Linux操作系统)

linux主机中,IP地址不属于网卡而是属于内核,就是说无论一个linux主机有多少个IP地址,它在接入的各个网络中都会公布它拥有的所有地址,这就给ARP广播的响应制造了困难,所以就需要修改内核参数来保证router发出ARP广播时,DR会响应RS不予响应,这里所说的内核参数分别为:

#arp_announce:定义arp通知级别;

0:默认级别,在各个网络中通告本机所含有的所有地址

1:尽量不在各个网络中通告本机中含有的不属于该网络的地址

2:不在各个网络中通告本机中含有的不属于该网络的地址

#arp_ignore:定义arp忽略arp请求或arp通告的级别;

0(默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 

1:只回答目标IP地址是来访网络接口本地地址的ARP查询请求 

2:只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 

3:不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应 

4-7:保留未使用 

8:不回应所有(本地地址)的arp查询

real server配置VIP之前先进行内核参数的修改,保证real server 中的VIP不给予ARP响应,也不让其发送ARP请求广播。

/proc/sysy/net/ipv4/conf目录下有以下几个目录:all  default  eth0  lo

在每个目录中都有:arp_ignore arp_announce这两个文件。更改相对应的值:(修改完之后自己的真实机可能无法访问realserver)

real server上进行更改:更改之后lo上在配置VIP

    ~]# sysctl -w net.ipv4.conf.eth0.arp_announce=2    
    ~]# sysctl -w net.ipv4.conf.eth0.arp_ignore=1
    ~]# sysctl -w net.ipv4.conf.all.arp_announce=2
    ~]# sysctl -w net.ipv4.conf.all.arp_ignore=1

配置VIP

ifconfig lo:0 172.16.99.20/32 broadcast 172.16.99.20 up

route add -host 172.16.99.20 dev lo:0

技术分享

Director上进行设置:

VIP

    [root@www ~]# ifconfig eth0:0 172.16.99.20/32 broadcast 172.16.99.20 up    
    [root@www ~]# route add -host 172.16.99.20 dev eth0:0

配置好实验环境之后,在Director上添加ipvsadm规则,在两台RS上开启Web服务进行测试:

        ipvsadm -A -t 172.16.99.20:80 -s rr    
        ipvsadm -a -t 172.16.99.20:80 -r 172.16.99.2 -g
        ipvsadm -a -t 172.16.99.20:80 -r 172.16.99.3 -g

技术分享

 

LVS_DR 的实现:VIPDIPRIP不在同一个网段内:

实验环境:

技术分享

实验环境介绍:

在此实验中使用了一台转发主机,充当路由。各个网段的设置如上图,其中黑色尖头表示客户端的请求报文的流向,而绿色尖头是响应客户端请求的流向。

每台RS中都要配置VIP地址,在lo中定义的VIP地址处封装报文之后,再由RIP上的网卡接口出去,其中RIP的网关必须指向转发主机的eth1上的IP

实验总共准备了5台虚拟机,其中客户端Client是测试端,CIP的网关指向转发主机的eth2上的IP

 

实验配置:

1.转发主机/转发路由的网络配置和路由:

开启路由转发功能:

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

2.两台web服务器RS上的配置:

RS1上的配置:

a.配置RIP172.16.99.3,其中网关指向172.16.0.1

技术分享

b.配置web服务器:为了实验结果加以区别,网页内容不一样。

网页内容为:

技术分享

c.配置VIP

编写一脚本实现web服务器的VIP相关的设置:

    #!/bin/bash    
    echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
    echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
    echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
    echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
    echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
    sleep 3
    ifconfig lo:0 192.168.0.100 netmask 255.255.255.255  broadcast 192.168.0.100 up
    route add -host 192.168.0.100 dev lo:0

RS2上配置:

a.配置RIP2:172.16.99.4网关为172.16.0.1

技术分享

b.网页内容:

技术分享

c.配置VIP

技术分享

1.Director上配置:

配置VIP

技术分享

编写ipvsadm规则:

    # ipvsadm -A -t 192.168.0.100:80 -s wlc    
    #ipvsadm -a -t 192.168.0.100:80 -r 172.16.99.3 -g -w 2
    #ipvsadm -a -t 192.168.0.100:80 -r 172.16.99.4 -g -w 4

技术分享

4、测试:

192.168.1.200上进行测试:

        技术分享

        技术分享



 





本文出自 “片刻” 博客,请务必保留此出处http://zkchang.blog.51cto.com/10574636/1702695

LVS类型的介绍,调度算法和不同类型的实现

标签:lvs类型   lvs的调度算法   lvs_nat的实现   lvs_dr的实现(vip和rip 在同一网段和不同网段)   

原文地址:http://zkchang.blog.51cto.com/10574636/1702695

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!