LVS

 
参考:http://zh.linuxvirtualserver.org/
 
几个术语:
Director:也可以称为调度器,LVS前端设备;

realserver:也称为真实内部服务器,是真正在提供服务的;

VIP:对外公布的IP,即客户请求进来的IP地址;

DIP:调度器和realserver之间通信的地址;

 
 

LVS的三种工作方式

 
LVS实现服务器集群负载均衡有三种方式,NAT,DR和TUN,下面简单谈谈这三种方式的区别:
 

LVS-NAT:

这个方法的思路是实施网络层(IP层)数据欺骗,它把客户端发送到redirector数据IP包的目标地址进行了替换。

 
1、网络环境
一台director + N台realserver,director和realserver在同一个私有网段,director是realserver的默认网关。只有director拥有公共IP,可以暴露在广域网上。
 
2、客户端请求
客户端请求先到公用IP(director),请求报文中的IP包目标地址被替换成了一个director据负载均衡策略选择的一个realserver的IP。

3、realserver响应
realserver处理完请求生成了返回数据包,返回数据IP包的源地址是realserver的IP地址,目标地址是客户服务端IP地址。由于realserver的默认网关是redirector,因此尽管返回IP数据包的目标地址是客户端的ip地址,返回数据包仍然首先被发回到redirector上。redirector再次实施欺骗,把返回的IP 数据包的源地址改成自己的IP。然后再转发到交换机上返回给客户端。
整个过程redirector的任务是实施了2次IP层欺骗修改,一次是修改了请求数据包得目标地址,这次修改的目的是为了实现数据的负载均衡的分发。另一次是修改了响应数据包的源地址,目的是为了隐藏realserver,使用户感觉不到realserver的存在。
3、限制:整个集群的吞吐量受到redirector的带宽限制(主要是出口带宽)。

LVS-DR:

这个方法的思路是实施数据链路层数据欺骗,修改网络帧数据的Mac地址。
1、网络环境
一台director + N台realserver,director和realserver都拥有公共IP,都暴露在广域网上,此外realserver还有一个和director ip地址一样的ip别名。

也就是说realserver有2个ip,一个真实的ip地址,一个和direcotr地址一样的IP别名(即公用IP),公用IP就是开放给客户端访问的IP地址。
realserver还需要做一个配置,使它们忽略所有的针对公用IP的ARP广播,当系统arp广播询问哪个mac地址拥有公用IP时,就只有调度服务器会响应,外界发送的数据就不会发给实际服务器。

2、客户端请求
客户端请求先到公用IP(director),由于网络环境已配置为只有director响应过ARP广播,因此请求报文的mac地址会被改为realserver的mac地址。

也就是说redirector实施链路层欺骗,将帧数据的目标mac地址替换成根据负载均衡策略决定的某一realserver的mac地址。

3、realserver响应
realserver收到mac帧,然后将mac帧组装成ip包,发现ip包中的目标地址和自己的ip别名相同,没有问题,继续处理,(这就是要求ip别名相同的原因,如果不同,操作系统可能会直接忽略)生成响应数据,发送回去。这时候由于redirector不是默认网关,因此这些数据会直接发到广域网上,广域网会把数据送到客户端。

4、优点:返回数据包无需经过redirector,没有redirector带宽瓶颈。原则上集群的带宽是所有实际服务器带宽之和,当然他们不可能超过连接的广域网交换机的带宽。

5、限制:需要购买多个公共IP,director和realserver必须在同一个 WAN网段,也就是要在同一个交换机上。

为什么一定要在同一网段呢?很简单,如果realserver在另外一个网段,redirector把整个数据包和mac帧修改完之后再发送到交换机上,交换机发现自己的wan内找不到这个mac地址,无法进行转发。
 

LVS-TUN:

这个方法是为了突破LVS-DR同一网段内的限制所提出来的。它不做任何欺骗,而是光明正大的交流,在网络层进行了二次包装。

1、网络环境

一台director + N台realserver,director 和realserver都拥有公共IP,都暴露在广域网上。公共ip互不相同,没有别名限制,也无需在同一网段。

2、客户端请求
客户端发送数据到redirector,redirector把IP包作为有效负载放到一个新的IP包中去,并根据调度策略确定一个特定realserver的ip作为新的IP包得目的地址。这些新的IP包完全符合网络协议,也没有任何欺骗的勾当,因此这些ip包光明正大得穿过wan网段,达到指定的realserver。

3、realserver响应
realserver拿到数据后,它需要做一个事情,把ip包的有效载荷提取出来,然后把这些载荷再作为ip包组成TCP,再向上组成最后的请求数据。根据请求数据,realserver生成返回数据后,光明正大返回给客户端。

4、优点:和LVS-DR一样,没有redirector出口带宽瓶颈。
5、缺点:需要额外的打包和解包,有一定的开销。

 
 

LVS配置

ipvsadm安装

yum -y install ipvsadm

LVS-NAT的配置

1、realserver配置要求:

配置内部私网地址,默认网关指向调度服务器

2、Directer配置要求 基本配置:

调度服务器需要2块网卡(一块网卡对外,一块网卡对内。1块也可以,配置子接口,对外的VIP和DIP都配置在同一网卡上,不过这样会更加的降低调度器的性能,建议还是双网卡)

关闭selinux和iptables,并打开包转发功能:

setenforce
service iptables stop
echo "1" > /proc/sys/net/ipv4/ip_forward

(为了避免不必要的麻烦,在每台服务器上都关闭这2个服务)

ipvsadm -A –t $VIP:$Port -s rr

解释:-A表示添加一个集群服务(可以添加多个,比如添加一个web的80和一个https的443);

-t表示是tcp协议;

-s表示调度算法是轮询(一共有10种调度算法,可以按照自己实际需要选择)

ipvsadm -a –t $VIP:$Port -r $DIP:$Port -m

解释:-a表示添加一个realserver,后面跟上之前定义的集群服务的地址端口,-r表示增加具体realserver的地址,-m表示模式为NAT模式

 

LVS-DR的配置

1、Realserver配置要求 基本配置

首先先配置限制arp,不然等配置好地址后就产生地址冲突了,通过修改内核参数来实现。

在linux中 ,默认在接口上通告所有接口上IP的arp广播,在接口上应答所有接口上IP的arp请求

arp_announce 限制arp通告

限制等级

0:在接口上通告所有接口上IP的arp广播

1:对于其它设备的arp请求,在接口上尽量限制广播通告应答(不够严格)

2:只通告本接口上IP的arp广播

arp_ignore 限制arp应答

限制等级

0:对于其它设备 的arp请求,应答所有其它接口的上IP的arp应答

1:对于其它设备的arp请求,只应答本接口上IP的arp应答

echo "" > /proc/sys/net/ipv4/conf/lo/arp_ignore

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

echo "" > /proc/sys/net/ipv4/conf/all/arp_ignore

echo "" > /proc/sys/net/ipv4/conf/all/arp_announce

在realserver上的lo口配置VIP,这样配置就限制了VIP不会在物理交换机上产生MAC地址表,从而避免IP冲突

ifconfig lo: $VIP broadcast $VIP netmask 255.255.255.255

ifconfig eth0 $DIP up

注意此VIP的接口的广播地址仍然为VIP,限制其广播,子网掩码是32位,下面调度器上的配置也注意此项

配置特殊路由,使目标为VIP的包的以源地址为VIP的lo口出去

route add –host $VIP dev lo:

Directer配置要求

配置VIP和DIP,VIP配置在物理网卡的子接口上

ifconfig eth0 $DIP broadcast $VIP netmask 255.255.255.0 up

ifconfig eth0: $VIP broadcast $VIP netmask 255.255.255.255 up

配置特殊路由,目标是VIP的包从配置了VIP的物理子接口上出去

route add –host $VIP dev eth0:

集群配置

ipvsadm -A –t $VIP:$Port-s rr

解释:-A表示添加一个集群服务(这里和NAT中的配置一样)

ipvsadm -a –t $VIP:$Port -r $DIP:$Port-g

解释:其它和NAT也差不多,在最后的模式改为-g,即DR模式

 
 

LVS调度算法

-s 指定服务采用的算法,常用的算法参数如下:
rr 轮叫(Round Robin)
调度器通过”轮叫”调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务 器,而不管服务器上实际的连接数和系统负载。

wrr 加权轮叫(Weighted Round Robin)
调度器通过”加权轮叫”调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

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

wlc 加权最少链接(Weighted Least Connections)
在集群系统中的服务器性能差异较大的情况下,调度器采用”加权最少链接”调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

lblc 基于局部性的最少链接(Locality-Based Least Connections)
“基于局部性的最少链接”调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用”最少链接” 的原则选出一个可用的服务器,将请求发送到该服务器。

lblcr 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)
”带复制的基于局部性最少链接”调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按”最小连接”原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按”最小连接”原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

dh 目标地址散列(Destination Hashing)
“目标地址散列”调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

sh 源地址散列(Source Hashing)
“源地址散列”调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

四层负载均衡——LVS的更多相关文章

  1. MGW——美团点评高性能四层负载均衡

    转自美团点评技术博客:https://tech.meituan.com/MGW.html 前言 在高速发展的移动互联网时代,负载均衡有着举足轻重的地位,它是应用流量的入口,对应用的可靠性和性能起着决定 ...

  2. LVS 原理(调度算法、四种模式、四层负载均衡和七层 的区别)

    参考文档:http://blog.csdn.net/ioy84737634/article/details/44916241 目录 lvs的调度算法 lvs的四种模式 四层均衡负载和七层的区别 1.l ...

  3. Nginx基于TCP/UDP端口的四层负载均衡(stream模块)配置梳理

    通过我们会用Nginx的upstream做基于http/https端口的7层负载均衡,由于Nginx老版本不支持tcp协议,所以基于tcp/udp端口的四层负载均衡一般用LVS或Haproxy来做.至 ...

  4. Nginx四层负载均衡概述

    目录 Nginx四层负载均衡概述 什么是负载均衡 负载均衡应用场景 四层,七层集群架构 四层负载均衡总结 Nginx如何配置四层负载均衡 nginx四层负载均衡端口转发 Nginx四层负载均衡概述 什 ...

  5. 14、Nginx四层负载均衡

    1.Nginx四层负载均衡基本概述 1.1.什么是四层负载均衡 四层负载均衡基于传输层协议包来封装的(如:TCP/IP),那我们前面使用到的七层是指的应用层,它的组装在四层基础之上,无论四层还是七层都 ...

  6. Nginx四层负载均衡

    目录 Nginx四层负载均衡概述 Nginx如何配置四层负载均衡 使用nginx四层负载均衡实现tcp的转发 Nginx四层负载均衡概述 什么是四层负载均衡 四层负载均衡是基于传输层协议包来封装的(如 ...

  7. nginx四层负载均衡配置

    nginx四层负载均衡配置代理Mysql集群 环境如下: ip 192.168.6.203 Nginx ip 192.168.6.*(多台) Mysql 步骤一 查看Nginx是否安装stream模块 ...

  8. 安装Nginx四层负载均衡

    Nginx1.9开始支持tcp层的转发,通过stream实现的,而socket也是基于tcp通信. stream模块默认不安装的,需要手动添加参数:–with-stream,官方下载地址:downlo ...

  9. 服务器负载均衡lvs(Linux Virtual Server)

    服务器负载均衡lvs(Linux Virtual Server) 一.总结 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统. 三.Linu ...

随机推荐

  1. SRTM数据介绍与说明

    一.SRTM 的背景引言 美国利用航天飞机搭载成像雷达对地进行观测始于20 世纪80 年代初.1982 年11 月和1985 年10 月, 美国分别进行了两次称为S IR2A 与S IR2B 的航天飞 ...

  2. 给C#的treeview控件的部分节点添加checkbox

    一.先初始化treeview this.treeView1.CheckBoxes = true; this.treeView1.ShowLines = false; this.treeView1.Dr ...

  3. 微信开放平台,微信登陆第三方网站 提示redirect_uri 参数错误

    在微信开放平台上我填写的回调域是:bbs.qiaoshisui.com/LoginApi/WeiXinCallBack,我构造的链接是:https://open.weixin.qq.com/conne ...

  4. Android RotateAnimation详解

    RotateAnimation旋转坐标系为以旋转点为坐标系(0,0)点.x轴为0度,顺时针方向旋转一定的角度.1.RotateAnimation(fromDegrees, toDegrees) [默认 ...

  5. 自己写的一个关于Linq to Entity 动态查询的例子

    这两天一直想写一个动态查询的方式,先是晚上查询了一下,发现大家写的差不多都是一样的[如:http://www.cnblogs.com/ASPNET2008/archive/2012/10/28/274 ...

  6. threejs构建web三维视图入门教程

    本文是一篇简单的webGL+threejs构建web三维视图的入门教程,你可以了解到利用threejs创建简单的三维图形,并且控制图形运动.若有不足,欢迎指出. 本文使用的框架是three.js gi ...

  7. php并发请求

    一般在php进行请求url的时候,直接用 fopen 函数就可以搞定了,比如像这样: $file=fopen("http://www.cnblogs.com","r&qu ...

  8. jquery面试需要看的基本东西

    1. offset() 方法的学习offset().left offset().top 表示离document的距离.(浏览器可以看到的地方的距离)2. position与offset的区别:a.使用 ...

  9. [BZOJ1951][SDOI2005]古代猪文(数论好题)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1951 分析: 练习数论知识的好题,涉及到费马小定理.lucas定理.求逆元

  10. UITableViewdataSourse的协议所有方法

    UITableViewDataSource @required- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection ...