一、LVS的概述

LVS是Linux Virtual Server的首字母缩写,可以解释成linux虚拟服务器,又由于LVS是工作在四层结构上,有时候称为四层交换机设备或四层路由器设备,能够根据用户所请求的IP地址或端口号,来将用户的请求分发至后端的不同主机;LVS本身工作在内核的tcp/ip协议栈中,其实现目标是创建一个具有良好的扩展性、高可靠性、高性能和高可用性的体系。许多商业的集群产品,比如RedHat的Piranha、Turbo Linux公司的Turbo Cluster等,都是基于LVS的核心代码的。

二、LVS的体系结构

使用LVS架构的服务器集群系统从体系结构上看是透明的,最终用户只感觉到一个虚拟服务器。物理服务器之间可以通过高速的LAN或分布在各地的WAN相连。最前端的是负载均衡器,它负责将各种服务请求分发给后面的物理服务器,让整个集群表现得像一个服务于同一个IP地址的虚拟服务器。

三、LVS集群的模式类型

(1)Virtual Server via NAT(VS-NAT):用地址翻译实现虚拟服务器。地址转换器有能被外界访问到的合法IP地址,它修改来自专有网络的流出包的地址。外界看起来包是来自地址转化器本身,当外界包送到转换器时,它能判断出应该将包送到内部网的哪个节点。

(2)Virtual Server via IP Tunneling(VS-TUN):用IP隧道技术实现虚拟服务器。这种方式是在集群的节点不在同一个网段时可用的转发机制,是将IP包封装在其他网络流量中的方法。为了安全的考虑,应该使用隧道技术中的×××,也可使用租用专线。

(3)Virtual Server via Direct Routing(VS-DR):用直接路由技术实现虚拟服务器。当参与集群的计算机和作为控制管理的计算机在同一个网段时可以使用这种方法,控制管理的计算机接收到请求包时直接送到参与集群的节点。

四、LVS的十种调度方法

Ⅰ固定调度,也可以称为静态调度,由于不考虑当前服务器的连接情况,只根据服务器的方法调度,才会被称为静态方法

 rr:轮叫,轮询,论调

 wrr:以权重为比例作为轮询标准;在做轮询之前先计算一下各服务器之间的比例,而后按照这个比例实现在各比例之间进行调度

 sh(source hash):称为源地址hash,简单来讲,只要是同一个客户端的用户请求都会发至同一个realserver;但在一定程度来说,这种调度方法破坏了负载均衡的效果;

主要实现会话绑定,能够将此前建立的session信息保留下来继续使用(session信息是借助于cookie)在某些场景下有可能要对session做session共享

dh(destination hash):称为目标地址hash,以目标地址为标准进行挑选;主要目的是将同一个IP请求发送给同一个server

Ⅱ动态调度:是根据活动连接数和非活动连接实现

 lc:最少连接(通过计算当前每一个realserver的活动连接数和非活动连接数各总和进行比较,哪一个数目小就会挑选谁)

计算方法:活动连接数*256+非活动连接数

wlc:加权最少连接,是根据权重进行比较(谁的小,就会挑选谁)

计算方法:(活动连接数*256+非活动连接数)/权重

这种算法在某些方面还是有缺陷的

 sed:最短期望延迟,是wlc算法改进的一种算法,不再考虑非活动连接

计算方法:(活动连接数+1)*256/权重

nq(never queue):从不排队,每一个服务都会分配一次,是sed改进后的算法

LBLC:基于本地的最少连接,主要目标与dh一样,而dh是静态算法,不需要考虑cache连接数,LBLC需要考虑cache连接数;坏处:有可能破坏命中率

 LBLCR:基于本地的带复制功能的最少连接,只要用户发出一个新请求都会交给连接数最少的realserver,由于这种是带有复制功能的算法,相邻的两个cacheserver会实现cache共享,这两个cacheserver有时被称为兄弟server

五、LVS的几种模型实例分析

基于LVS的nat模型实现:

133519597.png

分析nat模型:

用户请求服务,请求报文必须经过director的VIP地址流入,由director内部的ipvs查看流入的请求报文是要请求谁,拆开报文之后发现是向运行后端的real server发出请求,而后端的real server一般都会超过2台之上,再根据director内部的调度算法分发给适合的real server来响应用户报文请求,real server再由经director的DIP端口来响应用户请求,所以要为director配置两块网卡分配两个不同网段的IP地址,即VIP和DIP;需要把VIP配置成公网地址,把DIP配置成私有地址,而realserver需要与director服务器通信,也要把两个realserver的RIP配置成私有地址,此处的用户可以使用物理机代替,物理机的IP地址需要与VIP地址在同一个网段内

NAT模型遵循的基本法则小结:

1、集群节点跟director必须工作在同一个IP网络中

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

3、director位于client和real server之间,并负责处理进出的所有通信

4、realserver必须将网关指向DIP

5、director支持端口映射

6、realserver可以使用任意操作系统

7、较大规模应用场景中,director易成为系统瓶颈

配置过程:

要想实现把一个服务器作为一个director首先必须安装好ipvs和ipvsadmipvs(是工作在内核空间中,并监控在input链上);ipvsadm(是工作在用户空间的管理集群服务的命令行工具)。

1、配置director的IP

133605470.png

配置director的VIP地址

133622181.png

配置director的DIP地址

2、重启director的网络服务

133640741.png

配置好director的IP地址后,连接到director的两块网卡中的任何一块的虚拟终端上,查看ipvs和ipvsadm是否安装,并查看我们内核中是否有ipvs功能

133656176.png

3、下载yum

#wget ftp://172.16.0.1/pub/gls/server.repo -O /etc/yum/repos.d/server.repo

#vim /etc/yum.repos.d/server.repo

需要注意的是:在server.repo文件中一定把yum源指向cluster,因为ipvsadm本身就是集群

安装ipvsadm管理工具

#yum install ipvsadm –y

4、配置RS1、RS2的IP地址

133715472.png

配置RS1的IP地址,如图所示

133729553.png

配置RS2的IP地址,如图所示

5、分别重新启动RS服务器的网络服务

133744106.png133800691.png

6、调整虚拟主机的连接方式

确保让用户的请求报文由经director内的调度算法分发给工作在后端的服务集群,需要将director的DIP地址与real server的RIP地址分配同一网段内的地址,director还可以转发公网的地址段连接请求,所以要把director的VIP与公网中的用户地址在同一网段中

133823837.png

设置director的VIP地址连接方式

133844180.png

设置director的DIP地址连接方式

133901998.png

设置RS1的RIP地址连接方式

133916323.png

设置RS2的RIP地址连接方式

133933661.png

配置物理机的地址

7、安装http服务

#yum install httpd –y

8、同步时间

一定要把director与realserver服务的时间调整为一样,否则会导致在以后的配置中出现意想不到的情况,这里使用ntpdate命令从时间服务器上同步时间,默认时间服务器时开启的,在同步时间时要关闭

#service ntpd stop

#ntpdate 172.16.0.1//在director和realserver上进行相同的操作

9、为RS1、RS2虚拟主机提供测试页面

134042732.png134056514.png

10、打开director的转发功能

由于director的两块网卡是不属于同一网段中,用户请求报文又必须要经过VIP从DIP流出,为了实现这两个网段能够互相通信,所以要打开director的转发功能

#vim /etc/sysctl.conf

et.ipv4.ip_forward = 1

###只需要在配置文件中把“0改为“1即可

11、定义ipvsadm规则

134120570.png

定义ipvsadm规则,是不是很快想到定义iptables规则,需要提醒的是:iptables规则与ipvsadm规则不能同时出现,如果之前有定义iptables规则,这里需要清空iptables规则

134139414.png

12、查看各IP地址的测试结果

134156689.png

13、在物理机上测试添加的页面

134213458.png134226398.png

14、再次查看定义过的ipvsadm规则,可以看到两个realserver被连接的数目几乎是相同的,正好验证rr调度方法的实现效果

134243229.png

15、修改ipvsadm规则,使用wlc调度方法实现

134304608.png

16、删除、恢复ipvsadm定义的规则,使用方法和iptables相似

134407698.png

17、查看工作在后端的realserver连接数

134431739.png

基于LVS的DR模型实现:

134447570.png

分析DR模型:

客户端发出请求报文,中间一定会经过路由器和交换机设备进行通信转发,报文从交换机流出时一定会交给VIP,同时路由设备会向director发出广播寻求realserver的MAC地址,这时director服务器只能看到客户端报文的帧首部,并不能看到封装后面的tcp首部、ip首部,DIP拆开帧首部发现假如是请求端口为80的web服务,会通过director内部定义的规则和调度算法挑选出能够响应报文的realserver集群,之后通过ARP解析把能够响应报文的realserver的MAC地址再次封装成首部放在客户端请求报文的头部,响应报文的realserver拆开首部之后看到就是自己的MAC地址,这时候会接收请求,接着会看到请求报文的内容是请求的哪个资源等,realserver响应客户端请求,由于客户端是向VIP发出请求,这时候realserver的响应也要通过VIP返回给客户端,所以在realserver也要配置VIP,直接响应给客户端,不会经由director响应,这样大大减少director的使用力度,在配置时要把VIP、DIP、RIP配置在同一网段内,同时路由设备端口(可以作为网关)一定与realserver的进行响应的地址在同一网段内

注意:响应网关时一定是eth0上的RIP,但实际应该是VIP进行响应,这时候要在当前每一个realserver上添加一个独特的路由条目,路由条目保证用户请求的报文地址一定是通过这个接口的响应报文作为其源地址

DR模型中如何实现使用隐藏VIP响应客户端请求:(我们可以使用引进的两个内核参数)

arp_ignore:定义当接收到ARP请求时的响应级别,默认级别为0;对于arp_ignore而言,我们经常使用1级别

      0表示只要本地配置的有相应地址,就给予响应

      1表示仅仅在请求的目标地址配置请求到达的接口上的时候,才给予响应

arp_announce:定义将自己地址及MAC地址向外通告时的通告级别,默认级别为0;对于arp_announce而言,我们经常使用2级别

      0表示将本机任何接口上的任何地址向外通告

      1表示试图仅向目标网络通告与其网络匹配的接口地址

      2表示仅向与本地接口上地址匹配的网络进行通告

对于DR模型遵循基本法则小结:

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

2、RIP地址可以不是私有地址,可以使用公网地址,实现便捷的远程管理好监控

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

4、realserver不能将网关指向DIP

5、不支持端口映射

6、大多数操作系统都能用在realserver

7、director能够处理更多的realserver

配置过程:

注意:由于VIP、DIP、RIP都设置在同一网段内,需要把director和realserver的连接方式都设置为“桥接”方式,工作在同一个网段内;在配置realserver时先不要配置realserver的VIP,可以先配置好RS1、RS2的RIP,之后关闭realserver上的arp_ignore、arp_announce才可以配置realserver上的VIP 

1、修改虚拟主机的连接方式(director只需要一块网卡即可)

134511871.png

设置director的连接方式

134526158.png

设置RS1的连接方式

134542514.png

设置RS2的连接方式

2、设置虚拟主机的IP地址(设置完成之后不要忘记重启网络服务)

134603116.png

设置director的DIP

134624882.png

设置RS1的RIP

134640496.png

设置RS2的RIP

3、安装http服务,并为realserver提供两个测试页面

#yum install httpd –y

#echo “RS1 magedu.com” > /var/www/html/index.html

#echo “RS2 magedu.com” > /var/www/html/index.html

4、同步时间

一定要把director与realserver服务的时间调整为一样,否则会导致在以后的配置中出现意想不到的情况,这里使用ntpdate命令从时间服务器上同步时间,默认时间服务器时开启的,在同步时间时要关闭

#service ntpd stop

#ntpdate 172.16.0.1//在director和realserver上进行相同的操作

5、保证网络之间可以通信

134715941.png

6、在RS1上关闭arp_ignore、arp_announce功能

#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore//定义全局

#echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore//针对于固定接口定义

#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

#echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

#ifconfig lo:0 192.168.52.1 broadcast 192.168.52.1 netmask 255.255.255.255 up//添加一个环回接口别名

#route add –host 192.168.52.1 dev lo:0//添加一个特殊路由

7、在RS2上关闭arp_ignore、arp_announce功能

#echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore//定义全局

#echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore//针对于固定接口定义

#echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

#echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce

#ifconfig lo:0 192.168.52.1 broadcast 192.168.52.1 netmask 255.255.255.255 up//添加一个环回接口别名,子网掩码设置为255.255.255.255明确说明此地址只跟自己在同一网段内不和其他地址在同一网段内

#route add –host 192.168.52.1 dev lo:0//添加一个特殊路由

8、配置director

#ifconfig eh0:0 192.168.52.1/24

#ifconfig eth1 down

#route add -host 192.168.52.1 dev eth0:0

9、在director上访问RS1、RS2的web服务是否正常

134732257.png

10、在director上添加规则

134749963.png

11、在物理机上测试被调度的服务器

134806124.png134820136.png

12、在director上再次查看定义的规则

134838421.png

现在很多用户都喜欢不出门然后在淘宝网站中淘点自己喜欢的东西,这些用户有可能是外网网络中的用户,运行起整个淘宝网站后端一定工作在某个淘宝公司内部,那么外网用户如何与淘宝网站之间建立连接呢?下面博主对这种情况做了大概的分析

134926895.png

分析过程:

1、外网用户通过互联网网络假设向一家公司发出连接服务请求,中间会经过公司内部的路由设备,公司内部人员也可以通过公司的路由访问互联网

2、用户的连接请求必须通过路由设备的公网网关流入到公司内部

3、外网用户主要是想VIP发出请求,所以VIP要与用户在同一个网段内,需要配置成外网地址,director服务会拆开用户请求的首部发现是请求后端集群服务,于是director会根据ARP进行解析后端realserver的MAC地址,通过调度算法挑选出最佳符合的realserver与之响应

4、DIP会把再次封装好的数据包发送给挑选出的realserver的RIP,realserver打开一看是自己的MAC地址,就会相信是请求自己的数据包,DIP与RIP之间能够通信,所以要把DIP与RIP配置成一个网段内

5、realserver不能通过自己的RIP网卡发出响应报文,如果使用RIP发出响应报文,用户也不会接收响应过来的报文,于是还要通过realserver的VIP发出响应报文,但VIP是隐藏的;这时候就需要在realserver内配置响应级别和请求级别,让VIP的报文通过RIP发出响应报文,实际还是VIP作为源地址进行响应报文

6、RIP直接通过交换机的某个接口向公司的路由设备发出报文给予外网用户响应,但RIP是私有地址不能直接与外网通信,还需要在路由设备上配置一个私有网关流出报文,在路由设备再配置一个流向外网的网关

7、响应报文从网关流出经过外网网络到达外网用户