目录
LVS群集详解
群集(集群)的称呼来自英文单词“Cluster”,表示一群、一串的意思,用在服务器领域则表示大量服务器的集合体,以区分于单个服务器。
LVS(Linux Virtual Server)Linux虚拟服务器,将多台虚拟主机组织起来满足同一个需求。由国人章文嵩博士开发,通过LVS提供的负载均衡可实现一个高性能、高可用的服务器群集,从而以低成本实现最优的服务性能。
LVS 官网:http://www.linuxvirtualserver.org/
阿里SLB和LVS:
https://yq.aliyun.com/articles/1803
https://github.com/alibaba/LVS
为什么要用lvs
随着 Internet 的爆炸性增长以及日常生活中的日益重要的作用,Internet 上的流量速度增长,以每年 100% 以上的速度增长。服务器上的工作负载压力也迅速增加,因此服务器在短时间内将会过载,尤其是对于受欢迎的网站而言。为了克服服务器的过载压力问题,有两种解决方案。
一种是:单服务器解决方案,即将服务器升级到性能更高的服务器,但是当请求增加时,将很快过载,因此必须再次对其进行升级,升级过程复杂且成本高;
另一个是:多服务器解决方案,即在服务器集群上构建可扩展的网络服务系统。当负载增加时,可以简单地在群集中添加新服务器或更多服务器以满足不断增长的需求,而商用服务器具有最高的性能/成本比。因此,构建用于网络服务的服务器群集系统更具可伸缩性,并且更具成本效益。
随着计算机的性能增长,其价格也随着上涨
系统性能扩展方式:
Scale UP:垂直扩展,向上扩展,增强,性能更强的计算机运行同样的服务
Scale Out:水平扩展,向外扩展,增加设备,并行地运行多个服务调度分配问题,Cluster垂直扩展不再提及
lvs群集的类型
无论是哪种群集,都至少包括两台节点服务器,而对外表现为一个整体,只提供一个访问入口(域名或IP地址),相当于一台大型计算机。根据群集所针对的目标差异,可以分为三个类型
⚫ LB(Load Balance Cluster):负载均衡器,以提高应用系统的响应能力、尽可能处理更让多的访问请求、减少延迟为目标,获得高并发、高负载的整体性能。
⚫HA(High Availability Cluster):高可用群集,以提高应用系统的可靠性、尽可能地减少中断时间为目标,确保服务的连续性,达到高可用的容错效果
⚫HPC(High Perfo'rmance Computer Cluster):高性能运算群集,以提高应用系统的cpu运算速度、扩展硬件资源和分析能力为目标,获得相当于大型、超级计算机的高性能运算能力
分布式系统
分布式存储:Ceph,GlusterFS,FastDFS,MogileFS
分布式计算:hadoop,Spark
分布式常见应用
分布式应用-服务按照功能拆分,使用微服务(单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值服务)
分布式静态资源--静态资源放在不同的存储集群上
分布式数据和存储--使用key-value缓存系统
分布式计算--对特殊业务使用分布式计算,比如Hadoop集群
分布式和群集的区别
集群:同一个业务系统,部署在多台服务器上。集群中,每一台服务器实现的功能没有差别,数据和代码都是一样的。
分布式:一个业务被拆成多个子业务,或者本身就是不同的业务,部署在多台服务器上。分布式中,每一台服务器实现的功能是有差别的,数据和代码也是不一样的,分布式每台服务器功能加起来,才是完整的业务。
分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。
对于大型网站,访问用户很多,实现一个群集,在前面部署一个负载均衡服务器,后面几台服务器完成同一业务。如果有用户进行相应业务访问时,负载均衡器根据后端哪台服务器的负载情况,决定由给哪一台去完成响应,并且一台服务器垮了,其它的服务器可以顶上来。分布式的每一个节点,都完成不同的业务,如果一个节点垮了,那这个业务可能就会失败
lvs的组成和作用
LVS 由两部分程序组成,包括 ipvs 和 ipvsadm。
ipvs(ip virtual server):LVS 是基于内核态的 netfilter 框架实现的 IPVS 功能,工作在内核态。用户配置 VIP 等相关信息并传递到 IPVS 就需要用到 ipvsadm 工具。
ipvsadm:ipvsadm 是 LVS 用户态的配套工具,可以实现 VIP 和 RS 的增删改查功能,是基于 netlink 或 raw socket 方式与内核 LVS 进行通信的,如果 LVS 类比于 netfilter,那 ipvsadm 就是类似 iptables 工具的地位。
作用:
- 主要用于多服务器的负载均衡;
- 工作在网络层,可实现高性能,高可用的服务器集群技术;
- 廉价,可把许多低性能的服务器组合在一起形成一个超级服务器;
- 易用,配置简单,有多种负载均衡的方法;
- 稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果;
- 可扩展性好;
LVS集群体系架构
负载均衡的应用场景为高访问量的业务,提高应用程序的可用性和可靠性。
应用于高访问量的业务
如果应用访问量很高,可以通过配置监听规则将流量分发到不同的云服务器 ECS(Elastic
Compute Service 弹性计算服务)实例上。此外,可以使用会话保持功能将同一客户端的请求转发到同一台后端ECS
扩展应用程序
可以根据业务发展的需要,随时添加和移除ECS实例来扩展应用系统的服务能力,适用于各种Web服务器和App服务器。
消除单点故障
可以在负载均衡实例下添加多台ECS实例。当其中一部分ECS实例发生故障后,负载均衡会自动屏蔽故障的ECS实例,将请求分发给正常运行的ECS实例,保证应用系统仍能正常工作
同城容灾 (多可用区容灾)
为了提供更加稳定可靠的负载均衡服务,阿里云负载均衡已在各地域部署了多可用区以实现同地域容灾。当主可用区出现机房故障或不可用时,负载均衡仍然有能力在非常短的时间内(如:大约30s中断)切换到另外一个备可用区恢复服务能力;当主可用区恢复时,负载均衡同样会自动切换到主可用区提供服务。使用负载均衡时,您可以将负载均衡实例部署在支持多可用区的地域以实现同城容灾。此外,建议结合自身的应用需要,综合考虑后端服务器的部署。如果您的每个可用区均至少添加了一台ECS实例,那么此种部署模式下的负载均衡服务的效率是最高的。
lvs负载均衡
负载均衡的由来及所带来的好处
在业务刚起步时,一般先使用单台服务器对外进行提供服务。随着后期的业务增长,流量也越来越大。当这单台服务器的访问量越大时,服务器所承受的压力也就越大,性能也将无法满足业务需求,超出自身所指定的访问压力就会崩掉,避免发生此类事情的发生。
我们将采取其他方案,将多台服务器组成集群系统从而来提高整体服务器的处理性能,使用统一入口(流量调度器)的方式通过均衡的算法进行对外提供服务,将用户大量的请求均衡地分发到后端集群不同的服务器上。因此也就有了负载均衡来分担服务器的压力。
使用负载均衡给我们所带来的好处:提高系统的整体性能、提高系统的扩展性、提高系统的高可用性
负载均衡的分层结构
在典型的负载均衡群集中,包括三个层次的组件。前端至少有一个负载调度器(Load Balancer)负责响应并分发来自客户机的访问请求;后端由大量真实服务器(Real Server)构成服务器池(Server Pool),提供实际的应用服务,整个群集的伸缩性通过增加、删除服务器节点来完成,而这些过程对客户机是透明的;为了保持服务的一致性,所有节点使用共享存储设备。
第一层,负载调度器:这是访问整个群集系统的唯一入口,对外使用所有服务器共有的VIP(Virtual IP,虚拟ip)地址,也称为群集IP地址。通常会配置主、备两台调度器实现热备份,当主调度器失效以后平滑替换至备用调度器,确保高可用性。
负载调度器,它可以采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当 客户请求到达时,调度器只根据服务器负载情况和设定的调度算法从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度;当这个请求的其 他报文到达,也会被转发到前面选出的服务器。在基于内容请求分发技术中,服务器可以提供不同的服务,当客户请求到达时,调度器可根据请求的内容选择服务器 执行请求。因为所有的操作都是在Linux操作系统核心空间中将完成的,它的调度开销很小,所以它具有很高的吞吐率。
第二层,服务器池:群集所提供的应用服务(如HTTP、FTP)由服务器池承担,其中的每个节点具有独立的RIP(Real IP,真实IP)地址,只处理调度器分发过来的客户机请求。当某个节点暂时失效时,负载调度器的容错机制会将其隔离,等待错误排除以后再重新纳入服务器池。
服务器池的结点数目是可变的。当整个系统收到的负载超过目前所有结点的处理能力时,可以在服务器池中增加服务器来满足不断增长的请求负载。对大多数 网络服务来说,请求间不存在很强的相关性,请求可以在不同的结点上并行执行,所以整个系统的性能基本上可以随着服务器池的结点数目增加而线性增长。
服务器群集的节点可根据系统所承受的负载进行分担。当所有服务器过载时,可添加多台服务器来处理不断增加的工作负载。对于大多数 Internet 服务(例如Web),请求通常没有高度关联,并且可以在不同服务器上并行运行。因此,随着服务器群集的节点数增加,整体性能几乎可以线性扩展。
第三层,共享存储:为服务器池中的所有节点提供稳定 、一致的文件存取服务,确保整个群集的统一性。在Linux/UNIX环境中,共享存储可以使用NAS设备,或者提供NFS(Network File System,网络文件系统)共享服务的专用服务器。
共享存储:可以是数据库系统,网络文件系统或分布式文件系统。服务器节点需要动态更新的数据应存储在基于数据的系统中,当服务器节点并行在数据库系统中读写数据时,数据库系统可以保证并发数据访问的一致性。静态数据通常保存在网络文件系统(例如 NFS 和 CIFS)中,以便可以由所有服务器节点共享数据。但是,单个网络文件系统的可伸缩性受到限制,例如,单个 NFS / CIFS 只能支持 4 到 8 个服务器的数据访问。对于大型集群系统,分布式/集群文件系统可以用于共享存储,例如 GPFS,Coda 和 GFS,然后共享存储也可以根据系统需求进行扩展。
lvs术语
1. DS:Director Server。指的是前端负载均衡器。
2. RS:Real Server。后端真实的工作服务器。
3. VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
4. DIP:Director Server IP,主要用于和内部主机通讯的IP地址。
5. RIP:Real Server IP,后端服务器的IP地址。
6. CIP:Client IP,访问客户端的IP地址。
7.CMAC: 客户端 MAC 地址,LVS 连接的路由器的 MAC 地址。
8.VMAC: 负载均衡 LVS 的 VIP 对应的 MAC 地址。
9.DMAC: 负载均衡 LVS 的 DIP 对应的 MAC 地址。
10.RMAC: 后端真实服务器的 RIP 地址对应的 MAC 地址。
lvs负载均衡的基本原理
netfilter 的基本原理
LVS 是基于 Linux 内核中 netfilter 框架实现的负载均衡系统,netfilter 其实很复杂也很重要,平时说的 Linux 防火墙就是 netfilter,不过我们操作的还是 iptables,iptables 和 netfilter 是 Linux 防火墙组合工具,是一起来完成系统防护工作的。
iptables 是位于用户空间,而 Netfilter 是位于内核空间。iptables 只是用户空间编写和传递规则的工具而已,真正工作的还是 netfilter。
两者间的区别:
Netfilter 是内核态的 Linux 防火墙机制,它作为一个通用、抽象的框架,提供了一整套的 hook 函数管理机制,提供数据包过滤、网络地址转换、基于协议类型的连接跟踪的功能,可在数据包流经过程中,根据规则设置若干个关卡(hook 函数)来执行相关操作,共设置了 5 个点,包括:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING。
- prerouting: 在对数据包做路由选择之前,将应用此链中的规则;
- input: 当收到访问防火墙本机地址的数据包时,将应用此链中的规则;
- forward: 当收到需要通过防火中转发给其他地址的数据包时,将应用此链中的规则;
- output: 当防火墙本机向外发送数据包时,将应用此链中的规则;
- postrouting: 在对数据包做路由选择之后,将应用此链中的规则;
iptable 是用户层的工具,提供命令行接口,能够向 Netfilter 中添加规则策略,从而实现报文过滤,修改等功能。
当数据包通过网络接口进入时,经过链路层之后进入网络层到达PREROUTING,然后根据目标 IP 地址进行查找路由。
如目标 IP 是本机,数据包会传到INPUT上,经过协议栈后根据端口将数据送到相应的应用程序;应用程序将请求处理后把响应数据包发送至OUTPUT里,最终通过POSTROUTING后发送出网络接口。
如目标 IP 不是本机,并且服务器开启了FORWARD参数,这时会将数据包递送给 FORWARD,最后通过POSTROUTING后发送出网络接口。
LVS 的基本原理
LVS 基于 netfilter 框架,工作在 INPUT 链上,在 INPUT 链上注册 ip_vs_in HOOK 函数,进行 IPVS 相关主流程,详细原理概述如下:
1、 当客户端用户访问 www.baidu.com 网站时,用户访问请求通过层层网络,最终通过交换机进入 LVS 服务器网卡进入内核空间层。
2、 进入PREROUTING
后通过查找路由,确定访问目的 VIP 是本机 IP 地址的话,数据包将进入INPUT
链中。
3、 因为 IPVS 工作在 INPUT 链上,会根据访问的VIP和端口判断请求是否为 IPVS 服务,是的情况下,则调用注册的IPVS HOOK函数,进行IPVS相关流程,并强制修改数据包的相关数据,并将数据包发往POSTROUTING链中。
4、 POSTROUTING链收到数据包后,将根据目标 IP 地址服务器,通过路由选路,将数据包最终发送至后端真实服务器中。
lvs负载均衡的工作模式
关于群集的负载调度技术,可以基于IP、端口、内容等进行分发,其中基于IP的负载调度是效率最高的。基于IP的负载均衡模式中,常见的有地址池转换、IP隧道和直接路由三种工作模式
NAT模式
地址转换:Network Address Translation,简称:NAT 模式,类似于防火墙的私有网络结构,负载调度器作为所有服务器节点的网关,作为客户机的访问入口,也是各节点回应客户机的访问出口,服务器节点使用私有 IP 地址,与负载调度器位于同一个物理网络,安全性要优于其他两种方式。
NAT 实现原理过程
1、 客户端发出的请求数据包经过网络到达 LVS 网卡,数据包源 IP 为 CIP,目的 IP 为 VIP。
2、然后进入 PREROUTING 链中,根据目的 IP 查找路由,确定是否为本机 IP 地址,随后将数据包转发至 INPUT 链中,源 IP 和 目的 IP 不变。
3、 到达 LVS 后,通过目的 IP 和目的 PORT 查找是否为 IPVS 服务,如是 IPVS 服务,将会选择一个 RS 来作为后端服务器,数据包的目的 IP 地址将会修改为 RIP,这时并以 RIP 为目的 IP 去查找路由,确定下一跳及 PORT 信息后,数据包将会转发至 OUTPUT 链中。
4、 被修改过的数据包经过 POSTROUTING 链后,到达 RS 服务器,数据包源 IP 为 CIP,目的 IP 为 RIP。
5、 RS 服务器经过处理后,将会把数据包发送至用户空间的应用程序,待处理完成后,发送响应数据包,RS 服务器的默认网关为 LVS 的 IP,应用程序将会把数据包转发至下一跳 LVS 服务器,数据包源 IP 为 RIP,目的 IP 为 CIP。
6、 LVS 服务器收到 RS 服务器响应的数据包后,查找路由,目的 IP 不是本机 IP并且 LVS 服务器开启了 FORWARD 模式,会将数据包转发给它,数据包不变。
7、 LVS 服务器收到响应数据包后,根据目的 IP 和 目的 PORT 查找相应的服务,这时,源 IP 为 VIP,通过查找路由,确定下一跳信息并将数据包发送至网关,最终回应给客户端用户。
说明
lvs-nat:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某处的RS的RIP和
PORT实现转发
(1)RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
(2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS必须是Linux系统,RS可以是任意OS系统
NAT 模式的优缺点:
优点:
- 支持 Windows 操作系统;
- 支持端口映射,如 RS 服务器 PORT 与 VPORT 不一致的话,LVS 会修改目的 IP 地址和 DPORT 以支持端口映射;
缺点:
- RS 服务器需配置网关;
- 双向流量对 LVS 会产生较大的负载压力;
NAT 模式的使用场景:
- 对 windows 操作系统的用户比较友好,使用 LVS ,必须选择 NAT 模式。
IP隧道模式
IP 隧道:(IP Tunnel),简称:TUN 模式,采用开放式的网络结构,负载调度器作为客户机的访问入口,各节点通过各自的 Internet 连接直接回应给客户机,而不经过负载调度器,服务器节点分散在互联网中的不同位置,有独立的公网 IP 地址,通过专用 IP 隧道与负载调度器相互通信。
TUN 实现原理过程
1、 客户端发送数据包经过网络后到 LVS 网卡,数据包源 IP 为 CIP,目的 IP 为 VIP。
2、 进入 PREROUTING 链后,会根据目的 IP 去查找路由,确定是否为本机 IP,数据包将转发至 INPUT 链中,到 LVS,源 IP 和 目的 IP 不变。
3、 到 LVS 后,通过目的 IP 和目的 PORT 查找是否为 IPVS 服务,如是 IPVS 服务,将会选择一个 RS 后端服务器, 源 IP 为 DIP,目标 IP 为 RIP,数据包将会转发至 OUTPUT 链中。
4、 数据包根据路由信息到达 LVS 网卡,发送至路由器网关,最终到达后端服务器。
5、 后端服务器收到数据包后,会拆掉最外层的 IP 地址后,会发现还有一层 IP 首部,源 IP 为 CIP,目的 IP 为 VIP,TUNL0 上配置 VIP,查找路由后判断为本机 IP 地址,将会发给用户空间层的应用程序响应后 VIP 为源 IP,CIP 为目的 IP 数据包发送至网卡,最终返回至客户端用户。
说明
RIP和DIP可以不处于同一物理网络中,RS的网关一般不能指向DIP,且RIP可以和公网通信。也就是
说集群节点可以跨互联网实现。DIP, VIP, RIP可以是公网地址。
RealServer的通道接口上需要配置VIP地址,以便接收DIP转发过来的数据包,以及作为响应的
报文源IP。
DIP转发给RealServer时需要借助隧道,隧道外层的IP头部的源IP是DIP,目标IP是RIP,而
RealServer响应给客户端的IP头部是根据隧道内层的IP头分析得到的,源IP是VIP,目标IP是CIP
请求报文要经由Director,但响应不经由Director,响应由RealServer自己完成
不支持端口映射
RS的OS须支持隧道功能
一般来说,隧道模式常会用来负载调度缓存服务器组,这些缓存服务器一般放置在不同的网络环境,可以就近折返给客户端。在请求对象不在Cache服务器本地命中的情况下,Cache服务器要向源服务器发送请求,将结果取回,最后将结果返回给用户。
TUN 模式的优缺点:
优点:
- 单臂模式,LVS 负载压力小;
- 数据包修改小,信息完整性高;
- 可跨机房;
缺点:
- 不支持端口映射;
- 需在 RS 后端服务器安装模块及配置 VIP;
- 隧道头部 IP 地址固定,RS 后端服务器网卡可能会不均匀;
- 隧道头部的加入可能会导致分片,最终会影响服务器性能;
TUN 模式的使用场景:
- 如对转发性要求较高且具有跨机房需求的,可选择 TUN 模式。
直接路由
直接路由:Direct Routing,简称 DR 模式,采用半开放式的网络结构,与 TUN 模式的结构类似,但各节点并不是分散在各个地方,而是与调度器位于同一个物理网络,负载调度器与各节点服务器通过本地网络连接,不需要建立专用的 IP 隧道。它是最常用的工作模式,因为它的功能性强大。
DR 实现原理过程
第一次访问完整(不考虑实际问题)
客户端---->外网地址12.0.0.100 12.0.0.100---->客户端
#12.0.0.18-----客户端 客户端会直接丢弃
对每台真实服务器配置外网地址 12.0.0.100
12.0.0.100------>客户端问题1
IP 地址冲突的
路由器发送ARP请求(广播)
ARP---->广播去找ip地址解析成mac地址
默认使用调度服务器上的外网地址(vip地址)响应,
在真实服务器上修改内核参数
使真实服务器只对自己服务器上的真实IP地址响应ARP解析。第二次再有访问请求
问题2
路由器上绑定了 真实服务器1的mac信息,
#请求到达真实服务器
在真实服务器上修改内核参数
只对所有服务器真实网卡上的地址进行反馈,解析
DS 模式的优缺点:
优点:
- 响应数据不经过 LVS,性能高;
- 对数据包修改小,信息完整性好;
缺点:
- LVS 与 RS 必须在同一个物理网络;
- RS 上必须配置 lo 和其他内核参数;
- 不支持端口映射;
DS 模式的使用场景:
- 对性能要求高的,可首选 DR 模式,还可透传客户端源 IP 地址。
LVS工作模式总结和比较
NAT | TUN | DR | |
---|---|---|---|
优点 | 端口转换 | WAN | 性能最好 |
缺点 | 性能瓶颈 | 服务器支持隧道模式 | 不支持跨网段 |
真实服务器要求 | any | Tunneling | Non-arp device |
支持网络 | private(私网) | LAN/WAN(私网/公网) | LAN(私网) |
真实服务器数量 | low (10~20) | High (100) | High (100) |
真实服务器网关 | lvs内网地址 | Own router(网工定义) | Own router(网工定义) |
lvs的负载调度算法
针对不同的网络服务和配置需要,lvs调度器提供多种不同的负载调度算法。
轮询:(Round Robin),将收到的访问请求按顺序轮流分配给群集中的各节点(真实服务器)中,均等的对待每一台服务器,不管服务器实际的连接数和系统负载。
加权轮询:(Weighted Round Robin),根据真实服务器的处理能力轮流分配收到的访问请求,调度器可自动查询各节点的负载情况,并动态跳转其权重,保证处理能力强的服务器承担更多的访问量。
最少连接:(Least Connections),根据真实服务器已建立的连接数进行分配,将收到的访问请求优先分配给连接数少的节点,如所有服务器节点性能都均衡,可采用这种方式更好的均衡负载。
加权最少连接:(Weighted Least Connections),服务器节点的性能差异较大的情况下,可以为真实服务器自动调整权重,权重较高的节点将承担更大的活动连接负载。
基于局部性的最少连接:(LBLC),基于局部性的最少连接调度算法用于目标 IP 负载平衡,通常在高速缓存群集中使用。如服务器处于活动状态且处于负载状态,此算法通常会将发往 IP 地址的数据包定向到其服务器。如果服务器超载(其活动连接数大于其权重),并且服务器处于半负载状态,则将加权最少连接服务器分配给该 IP 地址。
复杂的基于局部性的最少连接:(LBLCR),具有复杂调度算法的基于位置的最少连接也用于目标IP负载平衡,通常在高速缓存群集中使用。与 LBLC 调度有以下不同:负载平衡器维护从目标到可以为目标提供服务的一组服务器节点的映射。对目标的请求将分配给目标服务器集中的最少连接节点。如果服务器集中的所有节点都超载,则它将拾取群集中的最少连接节点,并将其添加到目标服务器群中。如果在指定时间内未修改服务器集群,则从服务器集群中删除负载最大的节点,以避免高度负载。
目标地址散列调度算法:(DH),该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
源地址散列调度算法:(SH),与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
最短延迟调度:(SED),最短的预期延迟调度算法将网络连接分配给具有最短的预期延迟的服务器。如果将请求发送到第 i 个服务器,则预期的延迟时间为(Ci +1)/ Ui,其中 Ci 是第 i 个服务器上的连接数,而 Ui 是第 i 个服务器的固定服务速率(权重) 。
永不排队调度:(NQ),从不队列调度算法采用两速模型。当有空闲服务器可用时,请求会发送到空闲服务器,而不是等待快速响应的服务器。如果没有可用的空闲服务器,则请求将被发送到服务器,以使其预期延迟最小化(最短预期延迟调度算法)。
使用ipvsadm管理工具
ipvsadm是在负载调度器上使用的lvs群集管理工具,通过调用ip_vs模块来添加、删除服务器节点,以及查看群集的运行状态。在Centos6以上版本需要手动安装ipvsadm软件包
[root@localhost ~]# yum install ipvsadm
[root@localhost ~]# ipvsadm -v
ipvsadm v1.27 2008/5/15 (compiled with popt and IPVS v1.2.1)
lvs群集的管理工作主要包括创建虚拟服务器、添加服务器节点、查看群集节点状态、删除服务器节点和保存负载分配策略。
ipvsadm选项说明
-A: | 添加虚拟服务器 |
-D | 删除整个虚拟服务器 |
-s | 指定负载调度算法(轮询: rr、加权轮询: wrr、最少连接: lc、加权最少连接: wlc) |
-a | 添加真实服务器(节点服务器) |
-d: | 删除某一个节点 |
-t | 指定VIP地址及TCP端口 |
-r | 指定RIP地址及TCP端口 |
-m | 表示使用NAT群集模式 |
-g | 表示使用DR模式 |
-i | 表示使用TUN模式 |
一w | 设置权重(权重为0时表示暂停节点) |
-p 60 | 表示保持长连接60秒 |
-l | 列表查看 LVS虚拟服务器(默认为查看所有) |
-n | 以数字形式显示地址、端口等信息,常与"-l“选项组合使用。ipvsadm -ln |
构建LVS负载均衡群集
地址转换模式(LVS-NAT)
在NAT模式的群集中,LVS负载调度器是所有节点访问Internet的网关服务器,其外网地址12.0.0.100同时也能作为整个群集的VIP地址。LVS调度器具有俩块网卡,分别连接内外网
对于LVS负载调度来说,需使用iptables为出站响应配置SNAT转发规则,以便节点服务器能够访问Internet。所有的节点服务器、共享存储均位于私有网络内,其默认网关设为LVS负载调度器的内外地址(192.168.37.100)
部署共享存储(NFS服务器:192.168.37.106)
NFS 是一种基于 TCP/IP 传输的网络文件系统协议,最初由 Sun 公司开发。通过使用 NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。对于大多数负载均衡群集来说,使用 NFS 协议来共享数据存储是比较常见的做法,NFS 也是 NAS 存储设备必然支持的一种协议。
NFS 服务的实现依赖于 RPC(Remote Process Call,远端过程调用)机制,以完成远程到本地的映射过程。在 CentOS 7 系统中,需要安装 nfs-utils、rpcbind 软件包来提供 NFS共享服务,前者用于 NFS 共享发布和访问,后者用于 RPC 支持
安装nfs服务
我已经安过了,如果没安装就yum install nfs-utils rpcbind -y
[root@localhost ~]# rpm -q nfs-utils rpcbind
nfs-utils-1.3.0-0.48.el7.x86_64
rpcbind-0.2.0-42.el7.x86_64
开启服务
[root@localhost ~]# systemctl start nfs
[root@localhost ~]# systemctl start rpcbind
新建目录,并创建站点文件
[root@localhost ~]# mkdir /opt/xb /opt/xbin
[root@localhost ~]# echo "This is xb ! " > /opt/xb/index.html
[root@localhost ~]# echo "This is xbin ! " > /opt/xbin/index.html
[root@localhost ~]# chown 777 /opt/xb /opt/xbin/
设置共享策略
[root@localhost ~]# vim /etc/exports
/opt/xb 192.168.37.0/24(rw,sync)
/opt/xbin 192.168.37.0/24(rw,sync)
发布服务
[root@localhost ~]# exportfs -rv
exporting 192.168.37.0/24:/opt/xbin
exporting 192.168.37.0/24:/opt/xb
重启nfs服务
[root@localhost ~]# systemctl restart nfs
节点服务器的配置
安装httpd服务和安装nfs共享服务
[root@localhost ~]# yum install httpd* -y
[root@localhost ~]# rpm -q nfs-utils
nfs-utils-1.3.0-0.48.el7.x86_64
查看nfs服务
[root@localhost ~]# showmount -e 192.168.37.106
挂载站点(可永久挂载或临时挂载)
我的是永久挂载
[root@localhost ~]# vim /etc/fstab
刷新mount -a,df查看
已经挂载上去了
配置第二台节点服务器
步骤都一样,不在多赘述,就永久挂载记得改另一个站点文件
调度服务器配置
首先添加一块网卡
查看网卡是否安装上去
配置ens38网卡
[root@localhost /etc/sysconfig/network-scripts]# cp ifcfg-ens33 ifcfg-ens38
ens33网卡
重启服务
[root@localhost /etc/sysconfig/network-scripts]# systemctl restart network
打开路由转发功能
[root@localhost /etc/sysconfig/network-scripts]# vim /etc/sysctl.conf
[root@localhost /etc/sysconfig/network-scripts]# sysctl -p
net.ipv4.ip_forward = 1
防火墙
查看策略
[root@localhost /etc/sysconfig/network-scripts]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
清空策略
[root@localhost /etc/sysconfig/network-scripts]# iptables -F
添加策略
[root@localhost /etc/sysconfig/network-scripts]# iptables -t nat -A POSTROUTING -s 192.168.37.0/24 -o ens37 -j SNAT --to 12.0.0.1
查看策略
[root@localhost /etc/sysconfig/network-scripts]# iptables -nL -t nat
加载内核模块
[root@localhost /etc/sysconfig/network-scripts]# modprobe ip_vs
[root@localhost /etc/sysconfig/network-scripts]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
安装ipvsadm软件
保存配置文件
[root@localhost ~]# ipvsadm-save >/etc/sysconfig/ipvsadm
开启ipvsadm服务
[root@localhost ~]# systemctl start ipvsadm.service
必须先保存配置,再开启,不然会报错
清空策略
[root@localhost ~]# ipvsadm -C
指定IP地址 外网的入口 -s rr 轮询
[root@localhost ~]# ipvsadm -A -t 12.0.0.1:80 -s rr
先指定虚拟服务器再添加真实服务器地址,-r:真实服务器地址 -m指定nat模式
[root@localhost ~]# ipvsadm -a -t 12.0.0.1:80 -r 192.168.37.101:80 -m
[root@localhost ~]# ipvsadm -a -t 12.0.0.1:80 -r 192.168.37.102:80 -m
在俩台节点服务器,设置网关为负载调度服务器IP地址
在客户机分配地址
去测试机测试都能ping通
测试
稍微等1、2分钟刷新
DR模式部署
在DR模式的群集中,LVS负载调度器,作为群集的访问入口,但不作为网关使用;服务器池中的所有节点都各自接入Internet,发送给客户机的Web响应数据包不需要经过LVS负载调度器
这种方式入站、出站访问数据被分别处理,因此LVS负载调度器和所有的节点服务器都需要配置由VIP地址,以便响应应对整个群集的访问。考虑到数据存储的安全性,共享存储设备会放在内部的专用网络中
配置负载调度器
配置虚拟IP地址(VIP)
[root@localhost /etc/sysconfig/network-scripts]# cp ifcfg-ens33 ifcfg-ens33:0
[root@localhost /etc/sysconfig/network-scripts]# vim ifcfg-ens33:0
重启服务
[root@localhost /etc/sysconfig/network-scripts]# systemctl restart network
安装ipvsadm软件
[root@localhost /etc/sysconfig/network-scripts]# yum install ipvsadm.x86_64 -y
调整/proc响应参数
[root@localhost ~]# vim /etc/sysctl.conf
刷新
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
配置负载分配策略
[root@localhost ~]# modprobe ip_vs
[root@localhost ~]# cat /proc/net/ip_vs
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
加载模块
[root@localhost ~]# ipvsadm-save >/etc/sysconfig/ipvsadm
[root@localhost ~]# systemctl start ipvsadm.service
[root@localhost ~]# ipvsadm -C #清空策略
添加真实服务器-a 指定VIP地址及TCP端口-t 指定RIP地址及TCP端口 -r 指定DR模式-g
[root@localhost ~]# ipvsadm -A -t 192.168.37.188:80 -s rr [root@localhost ~]# ipvsadm -a -t 192.168.37.188:80 -r 192.168.37.101:80 -g [root@localhost ~]# ipvsadm -a -t 192.168.37.188:80 -r 192.168.37.102:80 -g [root@localhost ~]# ipvsadm IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP localhost.localdomain:http rr -> 192.168.37.101:http Route 1 0 0 -> 192.168.37.102:http Route 1 0 0 TCP 192.168.91.188:http rr
配置节点服务器
安装HTTp服务
[root@localhost ~]#yum install httpd -y
#设置站点文件
[root@localhost ~]#vim /var/www/html/index.html
<h1>This is xb web</h1>
[root@localhost ~]#systemctl start httpd.service #开启http服务
设置回环虚拟网卡
[root@localhost network-scripts]#cp ifcfg-lo ifcfg-lo:0
[root@localhost ~]#ifconfig lo:0 192.168.37.188 netmask 255.255.255.255
修改回环网卡名,IP地址,子网掩码
[root@localhost ~]#vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.37.188
NETMASK=255.255.255.255
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
#BROADCAST=127.255.255.255
ONBOOT=yes
#NAME=loopback
设置路由
[root@localhost network-scripts]#route add -host 192.168.37.188 dev lo:0
[root@localhost network-scripts]#route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.37.2 0.0.0.0 UG 100 0 0 ens33
192.168.37.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.37.188 0.0.0.0 255.255.255.255 UH 0 0 0 lo
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
设置开机自启
[root@localhost ~]#vim /etc/rc.d/rc.local
权限
[root@localhost network-scripts]#chmod +x /etc/rc.d/rc.local
[root@localhost network-scripts]#ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 524 11月 18 16:17 /etc/rc.d/rc.local
添加系统只响应目的IP为本地IP的ARP请求
系统不使用原地址来设置ARP请求的源地址,而是物理mac地址上的IP
[root@localhost ~]#vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
[root@localhost network-scripts]#sysctl -p
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
节点服务器二
安装httpd
[root@localhost ~]# yum install httpd -y
[root@localhost ~]# vim /var/www/html/index.html
<h1> This is xbin web ! <h1>
[root@localhost ~]# systemctl start httpd.service
设置回环虚拟网卡
[root@localhost /etc/sysconfig/network-scripts]# cp ifcfg-lo ifcfg-lo:0
[root@localhost /etc/sysconfig/network-scripts]# vim ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.37.188
NETMASK=255.255.255.255
NETWORK=127.0.0.0
# If you're having problems with gated making 127.0.0.0/8 a martian,
# you can change this to something else (255.255.255.255, for example)
#BROADCAST=127.255.255.255
ONBOOT=yes
#NAME=loopback
设置路由
[root@localhost /etc/sysconfig/network-scripts]# route add -host 192.168.37.188 dev lo:0
[root@localhost /etc/sysconfig/network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.37.2 0.0.0.0 UG 100 0 0 ens33
192.168.37.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.37.188 0.0.0.0 255.255.255.255 UH 0 0 0 lo
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
开机执行命令,或者写入 /etc/profile 文件
[root@localhost ~]# vim /etc/rc.d/rc.local
权限
[root@localhost /etc/sysconfig/network-scripts]# chmod +x /etc/rc.d/rc.local
[root@localhost /etc/sysconfig/network-scripts]# ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 524 Nov 18 03:24 /etc/rc.d/rc.local
添加系统只响应目的IP为本地IP的ARP请求
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost /etc/sysconfig/network-scripts]# sysctl -p net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.default.arp_ignore = 1 net.ipv4.conf.default.arp_announce = 2 net.ipv4.conf.lo.arp_ignore = 1 net.ipv4.conf.lo.arp_announce = 2
重启网卡
[root@localhost /etc/sysconfig/network-scripts]# systemctl restart network
测试
ping一下
等几分钟刷新
总结
常见的群集类型包括负载均衡群集、高可用群集和高性能运算群集
负载均衡群集的工作模式:地址转换(NAT)模式、IP隧道(TUN)模式和直接路由(DR)模式。lvs负载均衡群集的常用调度算法:轮询(rr)、加权轮询(wrr)、最少连接(lc)和加权最少连接(wlc)
ipvsadm工具 可用来配置lvs负载调度器和管理群集节点。
NAT模式的群集采用单一出入口,一个公网IP地址;而DR模式的群集采用单一入口+多路出口,需要多个公网IP地址。