LVS负载均衡(一) LVS详解

LVS负载均衡(一) LVS详解                     



1、LVS是什么

       LVSLinux Virtual ServerLinux虚拟服务器)是一个虚拟的服务器集群,与Nginx工作在网络体系第七层不同,LVS工作在网络体系第四层,采用IP负载均衡技术和基于内容请求分发技术。

2、LVS 集群分为三层结构

2-1、负载调度器(load balancer)

  它是整个LVS 集群对外的前端机器,负责将client请求发送到一组服务器[多台LB IP]上执行,而client端认为是返回来一个同一个IP(通常把这个IP称为虚拟IP/VIP)。

2-2、服务器池(server pool)

一组真正执行client请求的服务器,一般是我们的web服务器;除了web,还有FTPMAILDNS

2-3、共享存储(shared stored)

为所有Real Server提供共享存储空间和一致的数据内容。

下面我们简化结构,忽略共享存储,用Director表示负载调度器,Real Server表示实际后台服务器。


3、LVS的三种工作方式

3-1、NAT:地址转换

   客户通过VIPVirtual IP Address,虚拟服务的IP地址)访问网络服务时,请求报文到达调度器,调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址VIP改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。

   当来自真实服务器的响应报文经过调度器时,调度器将报文的源地址和源端口改为Virtual IP Address和相应的端口,再把报文发给用户。

3-2、DR: 直接路由

   在VS/DR中,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC地址改为选出服务器的MAC地址,再将修改后的数据帧在与服务器组的局域网上发送。因为数据帧的MAC地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该IP报文。

   当服务器发现报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。

3-3、TUN:隧道

      IP隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。

  利用IP隧道技术将请求报文封装转发给后端服务器,响应报文能从后端服务器直接返回给客户

3-4、三种方式对比

3-4-1、NAT

集群节点跟director必须在同一个IP网络中;

RIP通常是私有地址,仅用于各集群节点间的通信;

director位于clientreal server之间,并负责处理进出的所有通信;

realserver必须将网关指向DIP

支持端口映射;

realserver可以使用任意OS

较大规模应该场景中,director易成为系统瓶颈;

3-4-2、DR

集群节点跟director必须在同一个物理网络中;

RIP可以使用公网地址,实现便捷的远程管理和监控;

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

realserver不能将网关指向DIP

不支持端口映射;

3-4-3、TUN

集群节点可以跨越Internet

RIP必须是公网地址;

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

realserver网关不能指向director

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

不支持端口映射;


4、LVS调度策略

4-1、四种静态调度

无状态调度,不管realserver上实际的连接数和系统负载。

4-1-1、RR(Round-Robin Scheduling,轮询调度)

最简轮询,调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器。

4-1-2、WRR(Weighted Round-Robin Scheduling, 加权轮询调度)

加权轮调,它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS更多。    

4-1-3、DH(Destination Hashing Scheduling,目标地址散列调度)

调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器。

4-1-1、SH(Source Hashing Scheduling,源地址散列调度)

根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器。

4-2、动态调度方法

考虑各realserver上实际的连接数和系统负载。

4-2-1、LC(Least-Connection Scheduling,最小连接调度)

计算:active*256+inactive

请求会被分配到这台目前连接数最少的Real Server上面。

4-2-2、WLC(Weighted Least-Connection Scheduling,加权最小连接调度)

计算:(active*256+inactive)/weight

具有较高权值的服务器将承受较大比例的活动连接负载。

4-2-3、SED(Shortest Expected Delay Scheduling,最短预期延时调度)

计算:(active+1)*256/weight

4-2-4、NQ(Never Queue Scheduling,不排队调度)

4-2-5、LBLC(Locality-Based Least Connections Scheduling,基于局部性的最少链接)

   先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于其一半的工作负载,则用"最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。

4-2-6、LBLCR(Locality-Based Least Connections with Replication Scheduling,带复制的基于局部性最少链接)

   先根据请求的目标IP地址找出该目标IP地址对应的服务器组;按"最小连接"原则从该服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载;则按"最小连接"原则从整个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

默认方法:WLC;持久连接可以用SH来实现,不过ipvs实现不基于调度算法的持久连接方法,后面将会较为详细的了解;


5、其他关注点

5-1、ipvs与ipvsadm

5-1-1、ipvs(IP Virtual Server)

      ipvs是运行在linux内核空间的提供负载平衡功能的一种技术,2.4.2.3及其后版本内核内置ipvs,代码直接就可以在内核代码中找到;

5-1-2、ipvsadm

      ipvsadmipvs的用户层命令行管理工具,安装后才能使用其配置ipvs规则,命令如下:

管理集群服务

添加:-A -t|u|f service-address [-s scheduler]

         -t: TCP协议的集群

        -u: UDP协议的集群

            Service-address: IP:PORT

        -f: FWM: 防火墙标记

            service-address: Mark Number

修改:-E

删除:-D -t|u|f service-address

管理集群服务中的RS

添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]

        -t|u|f service-address:事先定义好的某集群服务

    -r server-address:RS的地址,在NAT模型中,可使用IPPORT实现端口映射;

        [-g|i|m]: LVS类型    

            -g: DR

            -i: TUN

            -m: NAT

        [-w weight]: 定义服务器权重

修改:-e

删除:-d -t|u|f service-address -r server-address

查看:

    -L|l

    -n: 数字格式显示主机地址和端口

    --stats:统计数据

    --rate: 速率

    --timeout: 显示tcptcpfinudp的会话超时时长

    -c: 显示当前的ipvs连接状况

删除所有集群服务

-C:清空ipvs规则

保存规则

-S

# ipvsadm -S > /path/to/somefile

载入此前的规则:

-R

ipvsadm -R < /path/form/somefile

5-1-3、两者关系

   两者关系相当于iptablesnetfilter的关系,工作在LVSDirector,以实现负载平衡功能。

5-2、ipvs与netfilter

5-2-1、netfilter

       netfilter的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK),而在每个检测点上登记了一些处理函数进行处理(如包过滤、NAT等,甚至可以是用户自定义的功能)。

5-2-2、ipvs

       ipvs的代码就挂载在/net/netfilter/ipvs中, Ipvs是基于Netfilter框架实现的内核模块。

5-2-3、两者关系


       如上图ipvs源码中,ipvs通过注册netfilter钩子和我们用ipvsadm工具创建的Ipvs规则表使得Director可以改变数据包命运的能力,这个能力使得Director可以分发集群服务请求给多个真实服务器(集群节点)。

  当数据包命中LOCAL_IN钩子后,运行在内核内的ipvs根据我们用ipvsadm配置的规则,可以判断出数据包是一个请求集群服务的数据包;如果是VIP地址的数据包,ipvs通知内核不应该将该数据包到传递给本地的守护进程,而应该传递给集群节点来实现,这样数据包就会发送到POST_ROUTING钩子,数据包从连接DIP网络的网卡发送出去。

 

下一篇将会分别配置NATDR方式的集群……

 

【参考资料】

  1. 官方参考资料: http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/
  2. 官方中文参考资料: http://www.linuxvirtualserver.org/zh/index.html
  3. 三种工作方式:《LVS 参考手册 可伸缩网络服务的设计与实现1.0版》
  4. Netfilter: http://baike.baidu.com/link?url=3gAwQegkjTiH_EfSgCYBgSrFiAbpdokbpdrVm0jHANt05LLizLwJy1BhR3U0kafjz01R7QPp6VeLutMdNUbpsa

猜你喜欢

转载自blog.csdn.net/shangyuanlang/article/details/80769078