零基础新手小白快速了解掌握服务集群与自动化运维(十六)集群部署模块——LVS负载均衡
一、概述
1、集群概述
1.1、集群介绍
集群是一组相互独立的、通过高速计算机网络互联的计算机,它们构成了一个组,并以单一系统的模式加以管理。一个客户与集群相互作用时,集群像是一个独立的服务器。
计算机集群简称集群是一种计算机系统, 它通过一组松散集成的计算机软件/硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多。
计算机集群Cluster,可以把多台计算机 连接在一起使用,平分资源或互为保障。其好处不言而喻,群集中的每个计算机被称为一个节点,节点可添加可减少,在这些节点之上虚拟出一台计算机供用户使用;从使用用户的角度看始终是使用一台计算机,无所谓多少节点。
特点:
1.高性能
一些国家重要的计算密集型应用(如天气预报,核试验模拟等),需要计算机有很强的运算处理能力
2.高性价比
通常一套系统集群架构,只需要几台或数十台服务器主机即可,与动则上百万的专用超级计算机相比具有更高的性价比
3.可扩展性
集群的性能不限于单一的服务实体,新的服务实体可以动态的加入到集群,从而增强集群的性能
4.高可用性
当一台节点服务器发生故障的时候,这台服务器上所运行的应用程序将在另一节点服务器上被自动接管。整个系统的服务可以是7*24小时可用的,消除单点故障对于增强数据可用性、可达性和可靠性是非常重要的
5.负载均衡
负载均衡能把任务比较均匀的分布到集群环境下的计算和网络资源,以便提高数据吞吐量
6.错误恢复
如果集群中的某一台服务器由于故障或者维护需要而无法使用,资源和应用程序将转移到可用的集群节点上
7.透明性
多个独立计算机组成的松耦合集群系统构成一个虚拟服务器。用户或客户端程序访问集群系统时,就像访问一台高性能,高可用的服务器一样,集群中一部分服务器的上线,下线不会中断整个系统服务,这对用户也是透明的
8.可管理性
整个系统可能在物理上很大,但是集群系统易管理,就像管理一个单一映像系统一样。在理想状况下,软硬件模块的插入能做到即插即用
9.可编程性
在集群系统上,容易开发及修改各类应用程序
1.2、集群类型
-  负载均衡集群(Load Balance Cluster) 
负载均衡系统:集群中所有的节点都处于活动状态,它们分摊系统的工作负载。一般Web服务器集群、数据库集群和应用服务器集群都属于这种类型。
负载均衡集群一般用于相应网络请求的网页服务器,数据库服务器。这种集群可以在接到请求时,检查接受请求较少,不繁忙的服务器,并把请求转到这些服务器上。从检查其他服务器状态这一点上看,负载均衡和容错集群很接近,不同之处是数量上更多。
Load Balancing负载均衡,不同节点之间相互独立,不共享任何资源;通过一定算法将客户端的访问请求平分到群集的各个节点上,充分利用每个节点的资源。负载均衡扩展了网络设备和服务器带宽,增加吞吐量,加强网络数据处理能。
每个节点的性能和配置可能不同,根据算法,可以分配不同的权重到不同节点上,以实现不同节点的资源利用。如下图所示网络访问通过负载均衡器,将请求分布到不同节点上。
-  高可用集群(High Availability Cluster) 
常见的就是2个节点做成的HA集群,有很多通俗的不科学的名称,比如”双机热备”, “双机互备”, “双机”。
高可用集群解决的是保障用户的应用程序持续对外提供服务的能力。 (请注意高可用集群既不是用来保护业务数据的,保护的是用户的业务程序对外不间断提供服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度)。
High availability Cluster高可用群集,简称HAC ;主要用于高可用解决方案的实现,节点间以主备形式,实现容灾;在大型故障(宕机,服务器故障)的情况下实现快速恢复,快速提供服务。如下图所示:当前节点在Node01,所有业务在Node01上运行,若发生故障服务和资源会转移到Node02上。高可用集群的另外一个特点是共享资源,多个节点服务器共享一个存储资源,该存储可在不同节点之间转移。
高可用群集可实现以下三种方式:
-  主从方式:主机工作,备机监控。此方式不能有效的利用服务器资源 
-  互为主从:两服务器同时在线,一台服务器故障可切换到另一台上。此 方式有效的利用服务器资源,但当服务器故障时候,将导致一台服务器上运行多个业务。 
-  多台服务器主从:大部分服务器在线使用,小部分监控;若有部分服务器故障,可切换到指定的小部分服务器上。此方式为前两种方式的综合。然后多台服务器群集,也增加了管理的复杂度  
-  科学计算集群(High Performance Computing Cluster) 
高性能计算(High Perfermance Computing)集群,简称HPC集群。这类集群致力于提供单个计算机所不能提供的强大的计算能力。
并行计算或称平行计算是相对于串行计算来说的。并行计算的能力的目的是提高计算速度。
并行计算分为时间计算和空间计算:
-  时间计算既是流水线技术,一个处理器分为多个单元,每个单元负责不同任务,这些单元可并行计算。 
-  空间计算利用多个处理器并发的执行计算。目前PC机的计算能力越来越强,将大量低廉的PC机互联起来,组成一个"大型计算机"以解决复杂的计算任务。Beowulf computers为最典型的空间并行计算。 
高性能计算集群采用将计算任务分配到集群的不同计算节点儿提高计算能力,因而主要应用在科学计算领域。比较流行的HPC采用Linux操作系统和其它一些免费软件来完成并行运算。这一集群配置通常被称为Beowulf集群。这类集群通常运行特定的程序以发挥HPCcluster的并行能力。这类程序一般应用特定的运行库, 比如专为科学计算设计的MPI库。
HPC集群特别适合于在计算中各计算节点之间发生大量数据通讯的计算作业,比如一个节点的中间结果会影响到其它节点计算结果的情况。

1.3、负载均衡技术类型
四层负载均衡器: 也称为 4 层交换机,主要通过分析 IP 层及 TCP/UDP 层的流量实现基于 IP 加端口的负载均衡,如常见的 LVS、F5 等;
七层负载均衡器 :也称为 7 层交换机,位于 OSI 的最高层,即应用层,此负载均衡器支持多种协议,如HTTP、FTP、SMTP 等。7 层负载均衡器可根据报文内容,配合一定的负载均衡算法来选择后端服务器,即“内容交换器”。如常见的 HAProxy、Nginx。
1.4、负载均衡实现方式
硬件负载均衡产品:F5 、深信服 、Radware
软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx、Ats(apache traffic server)
2、LVS介绍
LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。在linux内存2.6中,它已经成为内核的一部分,在此之前的内核版本则需要重新编译内核。
为什么要用 LVS?
为了克服服务器的过载压力问题,有两种解决方案:
-  单服务器解决方案,即将服务器升级到性能更高的服务器,但是当请求增加时,将很快过载,因此必须再次对其进行升级,升级过程复杂且成本高; 
-  多服务器解决方案,即在服务器集群上构建可扩展的网络服务系统。当负载增加时,可以简单地在群集中添加新服务器或更多服务器以满足不断增长的需求,而商用服务器具有最高的性能/成本比。因此,构建用于网络服务的服务器群集系统更具可伸缩性,并且更具成本效益。 
3、LVS和nginx区别
-  LVS比nginx具有更强的抗负载能力,性能更高,对内存和cpu资源消耗低。 
-  LVS工作在网络层,具体流量由操作系统内核进行处理,nginx工作在应用层,可针对http应用实施一些分流策略。 
-  LVS安装配置比较复杂点,网络依赖性较大,稳定性高,lvs不支持正则表达式,不能实现动静分离操作。 
-  LVS使用的协议范围广, Nginx 仅支持 HTTP、HTTPS、Email 协议,适用范围小。 
4、LVS相关术语
-  DS:Director Server。指的是前端负载均衡器节点。 
-  RS:Real Server。后端真实的工作服务器。 
-  VIP:Virtual IP 向外部直接面向用户请求,作为用户请求的目标的IP地址。 
-  DIP:Director Server IP,主要用于和内部主机通讯的IP地址。 
-  RIP:Real Server IP,后端服务器的IP地址。 
-  CIP:Client IP,访问客户端的IP地址。 
-   
5、LVS负载均衡算法
5.1、静态负载均衡
-  rr(round robin,轮询 ) 
轮询是最简单的负载均衡方法,按照预定的顺序,轮流将请求分配给后端服务器。
-  wrr(weight round robin,加权轮询) 
类似于轮询,但是每个后端服务器可以设置一个权重,表示其处理能力。权重高的服务器将接收更多的请求。
-  sh(source hashing,源地址散列算法(HASH)) 
根据请求的源IP地址,通过散列函数计算出一个槽位,将请求分发到对应的服务器。
-  dh(destination hashing,目标地址 HASH) 
与源地址散列算法相反,是根据请求的目标IP地址来进行散列分发的。
5.2、动态负载均衡
-  lc(leash-connection,最少连接 ) 
简单算法:active * 256 + inactive (谁的小选谁)
哪个服务器当前的活跃连接数最少,就将新的请求分配给它。
-  wlc(加权最少连接) 
简单算法:(active * 256 + inactive) / weight(谁的小选谁)
谁的结果最小,就分配给谁。
-  sed(最少期望延迟) 
简单算法:(active + 1) * 256 / weight (谁的小选谁)
-  nq(never queue,永不排队) 
当没有服务器处于过载状态时,请求直接发送到空闲服务器。一旦服务器达到其容量限制,新的请求将被拒绝。
-  LBLC(基于局部性的最少连接 ) 
不仅考虑全局的服务器负载,还考虑服务器所在局部的负载情况,从而实现更细致的负载均衡。
-  LBLCR(基于局部性的带复制功能的最少连接) 
在LBLC的基础上,当某个服务器过载时,可以选择复制流量到其他服务器,以平衡负载。
二、三种LVS工作模式详解
1、基于NAT的LVS模式负载均衡
NAT(network address translation) 网络地址转换,其主要原理是修改数据报头,使得位于企业内部的私有ip地址可以访问外网,以及外部用户可以访问位于公司内部的私有的ip主机。
LVS调度器中有一个连接Hash表,该表会记录连接请求及其转发信息,当同一个连接下一个数据包发送给调度器时,该Hash表可以直接找到之前连接的记录,并根据记录信息选出相同真实服务器及其端口信息。
1.1、工作原理
-  当用户的请求到达调度器时,请求报文会先到内核空间的PREROUTING链上。此时报文的源IP为CIP,目标IP为VIP 
-  PREROUTING检查发现数据包的目标IP是本机,就将数据包送至INPUT链。 
-  IPVS工作在INPUT链上,当数据包抵达INPUT链后,IPVS会检查数据包所请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器RIP,然后将数据包送往 POSTROUTING链。此时报文的源IP为CIP,目标IP为RIP。 
-  POSTROUTING链通过选路,将数据包转发给Real Server 
-  Real Server对比发现目标IP是自己,就会接受这个请求报文,开始构建响应报文发回给调度器。源IP为RIP,目标IP为CIP 
-  调度器在响应客户端前,会将报文的源IP地址修改为自己的VIP,然后响应给客户端。此时报文的源IP为VIP,目标IP为CIP 
1.2、LVS-NAT模型的特性
-  RS应该使用私有地址,RS的网关必须指向DIP 
-  DIP和RIP必须要在同一网段中 
-  请求报文和响应报文都需要经过调度器,高负载场景中,调度器容易成为性能瓶颈。 
-  支持端口映射 
-  RS可以使用任意操作系统 
1.3、NAT的优点
集群中的物理服务器可以使用任何支持TCP/IP操作系统它只需要一个 IP 地址配置在调度器上,服务器组可以用私有的 IP 地址。
1.4、NAT的缺点
伸缩能力有限,当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢。
2、基于TUN的LVS负载均衡
IP 隧道:IP Tunnel,简称:TUN 模式,采用开放式的网络结构,负载调度器作为客户机的访问入口,各节点通过各自的 Internet 连接直接回应给客户机,而不经过负载调度器,服务器节点分散在互联网中的不同位置,有独立的公网 IP 地址,通过专用 IP 隧道与负载调度器相互通信。
2.1、实现原理
-  在原有的ip报文外在封装多一层的ip首部,内部ip首部(原地址为cip,目标ip为vip),外层ip首部原地址为dip,.目标地址为rip 
-  客户端发送数据包经过网络后到 LVS 网卡,数据包源 IP 为 CIP,目的 IP 为 VIP。 
-  进入 PREROUTING 链后,会根据目的 IP 去查找路由,确定是否为本机 IP,数据包将转发至 INPUT 链中,到 LVS,源 IP 和 目的 IP 不变。 
-  到 LVS 后,通过目的 IP 和目的 PORT 查找是否为 IPVS 服务,如是 IPVS 服务,将会选择一个 RS 后端服务器, 源 IP 为 DIP,目标 IP 为 RIP,数据包将会转发至 OUTPUT 链中。 
-  数据包根据路由信息到达 LVS 网卡,发送至路由器网关,最终到达后端服务器。 
-  后端服务器收到数据包后,会拆掉最外层的 IP 地址后,会发现还有一层 IP 首部,源 IP 为 CIP,目的 IP 为 VIP,TUNL0 上配置 VIP,查找路由后判断为本机 IP 地址,将会发给用户空间层的应用程序响应后 VIP 为源 IP,CIP 为目的 IP 数据包发送至网卡,最终返回至客户端用户。 
2.2、TUN 模式的优点
-  单臂模式,LVS 负载压力小。 
-  数据包修改小,信息完整性高。 
-  可跨机房。 
2.3、TUN 模式的缺点
-  不支持端口映射。 
-  需在 RS 后端服务器安装模块(ipip)及配置 VIP。 
-  隧道头部 IP 地址固定,RS 后端服务器网卡可能会不均匀。 
-  隧道头部的加入可能会导致分片,最终会影响服务器性能。 
2.4、TUN 模式的使用场景
如对转发性要求较高且具有跨机房需求的,可选择 TUN 模式。
3、LVS(DR)负载均衡
直接路由:Direct Routing,简称 DR 模式,采用半开放式的网络结构,与 TUN 模式的结构类似,但各节点并不是分散在各个地方,而是与调度器位于同一个物理网络,负载调度器与各节点服务器通过本地网络连接,不需要建立专用的 IP 隧道。它是最常用的工作模式,因为它的功能性强大。
3.1、DR 实现原理
-  当客户端用户发送请求给 www.baidu.com 网站时,首先经过 DNS 解析到 IP 后并向百度服务器发送请求,数据包经过网络到百度 LVS 负载均衡服务器。 
-  这时到达 LVS 网卡时的数据包包括:源 IP 地址(客户端地址)、目的 IP 地址(百度对外服务器 IP 地址,也就是 VIP)、源 MAC 地址(CMAC / LVS 连接路由器的 MAC 地址)、目标 MAC 地址(VMAC / VIP 对应的 MAC 地址)。 
-  数据包到达网卡后,经过链路层到达 PREROUTING 链,进行查找路由,发现目的 IP 是 LVS 的 VIP,这时就会发送至 INPUT 链中并且数据包的 IP 地址、MAC 地址、Port 都未经过修改。 
-  数据包到达 INPUT 链中,LVS 会根据目的 IP 和 Port(端口)确认是否为 LVS 定义的服务。 
-  如是定义过的 VIP 服务,会根据配置的服务信息,从 RealServer 中选择一个后端服务器 RS1,然后 RS1 作为目标出方向的路由,确定下一跳信息及数据包通过具体的哪个网卡发出,最好将数据包通过 INET_HOOK 到 OUTPUT 链中。 
-  数据包通过 POSTROUTING 链后,目的 MAC 地址将会修改为 RealServer 服务器 MAC 地址(RMAC)源 MAC 地址修改为 LVS 与 RS 同网段的 IP 地址的 MAC 地址(DMAC)此时,数据包将会发至 RealServer 服务器。 
-  数据包到达 RealServer 服务器后,发现请求报文的 MAC 地址是自己的网卡 MAC 地址,将会接受此报文,待处理完成之后,将响应报文通过 lo 接口传送给 eth0 网卡然后向外发出。 
-  此时的源 IP 地址为 VIP,目标 IP 为 CIP,源 MAC 地址为 RS1 的 RMAC,目的 MAC 地址为下一跳路由器的 MAC 地址(CMAC),最终数据包通过 RS 相连的路由器转发给客户端。 
3.2、DR 模式的优点
-  响应数据不经过 LVS,性能高。 
-  对数据包修改小,信息完整性好。 
3.3、DR 模式的缺点
-  LVS 与 RS 必须在同一个物理网络。 
-  RS 上必须配置 lo 和其他内核参数。 
-  不支持端口映射。 
3.4、DR 模式的使用场景
对性能要求高的,可首选 DR 模式,还可透传客户端源 IP 地址。
三、IPVS模块概述
1、IPVS的介绍
IPVS基本上是一种高效的Layer-4交换机,它提供负载平衡的功能。当一个TCP连接的初始SYN报文到达时,IPVS就选择一台服务器,将报文转发给它。此后通过查看报文的IP和TCP报文头地址,保证此连接的后继报文被转发到相同的服务器。这样,IPVS不用检查到请求的内容再选择服务器,这就要求后端的服务器组是提供相同的服务,不管请求被送到哪一台服务器,返回结果都应该是一样的。但是在有一些应用中后端的服务器可能功能不一,有的是提供HTML文档的Web服务器,有的是提供图片的Web服务器,有的是提供CGI的Web服务器。这时,就需要基于内容请求分发 (Content-Based Request Distribution),同时基于内容请求分发可以提高后端服务器上访问的局部性。
2、IPVS的工作原理
IPVS是LVS的关键,因为LVS的IP负载平衡技术就是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件,它的主要作用是:安装在Director Server上,同时在Director Server上虚拟出一个IP地址,用户必须通过这个虚拟的IP地址访问服务。这个虚拟IP一般称为LVS的VIP,即Virtual IP。访问的请求首先经过VIP到达负载调度器,然后由负载调度器从Real Server列表中选取一个服务节点响应用户的请求。
LVS的本身分成了两个部分,第一部分是工作在内核空间的一个IPVS的模块(工作在Netfilter框架的input链上),其实LVS的功能都是IPVS模块实现的,第二部分是工作在用户空间的一个用来定义集群服务的一个工具ipvsadm, 这个工具的主要作用是将管理员定义的集群服务列表传送给工作在内核空间中的IPVS模块。
3、ipvsadm命令
ipvsadm -A|E -t|u|f service-address:port [-s scheduler] [-p [timeout]] [-M netmask]
ipvsadm -D -t|u|f service-address
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]
ipvsadm -d -t|u|f service-address -r server-address
ipvsadm -L|l [options]
ipvsadm -Z [-t|u|f service-address]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface]
ipvsadm --stop-daemon
ipvsadm -h
#集群服务相关选项:
ipvsadm -A -t|u|f service-address:port [-s scheduler] [-p [timeout]] [-M netmask]    ###添加一个集群服务-t :tcp-u:udp-f :firewall make  #防火墙标记(通常应用于将两个或以上的服务绑定为一个服务进行处理时使用)service-address     #集群服务的ip地址,Vip-s  :                        #调度算法,默认为wlc-p                          #持久连接ipvsadm -E -t|u|f service-address:port  [-s scheduler] [-p [timeout]] [-M netmask]    ###修改定义过的集群
ipvsadm -D -t|u|f service-address            ###删除指定的集群服务
#RS相关选项:
ipvsadm -a  -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]  ###添加RS-t :tcp-u:udp-f :firewall make  #防火墙标记(通常应用于将两个或以上的服务绑定为一个服务进行处理时使用)service-address     #集群服务的ip地址Vip,向那个集群里添加RS-r  :                        #RS的Rip,在支持端口映射的模型里可以使用额外端口-g                          #使用LVS-DR模型-i                           #使用LVS-TUN模型-m                        #使用LVS-NAT模型-w:                        #指定RS的权重ipvsadm -a  -t|u|f service-address:port -r real-server-address:port [-g|i|m] [-w weight]  ###修改定义过的RS
ipvsadm -d -t|u|f service-address -r server-address   ###在指定的集群服务中删除一个指定的RS
#其他相关选项:
ipvsadm -C         ###清空所有的集群服务
ipvsadm -R   |   ipvsadmin-restore        ###载入默认文件里的规则或使用输入重定向载入任意规则文件
ipvsadm -S   |    ipvsadm-save  >  #保持规则到默认文件或使用输出重定向至任意文件中
ipvsadm -Z [-t|u|f service-address]       ###虚拟服务表计数器清零(清空当前的连接数量等)
ipvsadm --set tcp tcpfin udp                ###设置连接超时值
ipvsadm --start-daemon state [--mcast-interface interface]    ###启动同步守护进程,它后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能
ipvsadm --stop-daemon      ###停止同步守护进程
ipvsadm -h                          ###显示帮助信息
#查看ipvs规则的相关选项:
ipvsadm -L|l [options][options]:-n            ###使用数字格式显示IP地址,不反解-c            ###查看连接数相关信息--stats     ###显示统计数据--rate      ###数据传输速率--timeout   ###显示tcp,udp会话超时时长--daemon   ###显示同步守护进程的信息--sort      ###对虚拟服务进行排序,默认为升序--exact    ###精确显示,不做单位换算3.1、常见选项
| 选项 | 作用 | 
|---|---|
| -A | 添加虚拟服务节点 | 
| -D | 删除虚拟服务节点 | 
| -L | 查看虚拟服务节点列表 | 
| -n | 以数字形式显示查看内容 | 
| -a | 添加真实服务节点 | 
| -d | 删除真实服务节点 | 
| -l | 查看真实服务节点列表 | 
| -t | 指定虚拟服务器IP地址 | 
| -s | 指定调度算法 | 
| -r | 指定真实服务器节点IP地址 | 
| -w | 指定权重值 | 
| -g | 直接路由模式(默认) | 
| -m | NAT模式 | 
| -i | 隧道模式 | 
3.2、配置案例
ipvsadm -A -t 207.175.44.110:80 -s rr
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1:80 -m
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.2:80 -m
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.3:80 -m
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.4:80 -m
ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.5:80 -m   