前言:
今天咱们对“操作系统roundrobin算法”大致比较讲究,咱们都需要分析一些“操作系统roundrobin算法”的相关文章。那么小编在网络上网罗了一些关于“操作系统roundrobin算法””的相关资讯,希望看官们能喜欢,大家一起来学习一下吧!1. 场景
2012年春节,小明通过12306抢火车票的时候,每当整点放票时,他感觉整个APP处于无响应状态,甚至刷不出票?如何在高QPS请求下,用户能很平滑的订购火车票。
基于上述需求,我们要使用统一的流量入口来对外提供服务,本质上就是需要一个流量调度器,通过均衡的算法,将用户大量的请求流量均衡地分发到集群中不同的服务器上。这就需要再用户和服务直接实现一个桥接模块,这个模块就是网关模块,它提供的一大功能就是负载均衡(Load Balancer)策略。从这个设计来看,负载均衡模块可以保障系统的高可用,提供系统的吞吐能力,更好地做服务升级以及扩缩容。
2. 负载均衡类型
广义上的负载均衡器按软硬件可以分为2 类,包括:硬件负载均衡、软件负载均衡。
2.1. 硬件负载均衡
硬件负载均衡是通过专门的硬件设备来实现负载均衡的功能,是专用的负载均衡设备。目前业界典型的硬件负载均衡设备有F5、A10、Citrix Netscaler等。比如用Citrix NetScaler硬件负载设备。这种专门为流量负载均衡而设计的硬件提供了强大和高效的L4/L7流量管理,但是也有两个比较明显的缺点:一个是贵,这决定了硬件负载均衡设备数目不会太多,尤其是在测试环境。另外一个缺点是不够弹性化,负载均衡设备带宽是固定的,比如有的是30GB,而随着流量的增加容易导致LB流量过高,尤其是在购物季的时候,通常就会需要LB运维的同事们做很多LB VIP的迁移,将一些流量过高的VIP拆分迁移到流量相对较少的LB上。
这类设备性能强劲、功能强大,但价格非常昂贵,一般只有土豪公司才会使用此类设备,中小公司一般负担不起,业务量没那么大,用这些设备也是挺浪费的。
硬件负载均衡的优点:
功能强大:全面支持各层级的负载均衡,支持全面的负载均衡算法。性能强大:性能远超常见的软件负载均衡器。稳定性高:商用硬件负载均衡,经过了良好的严格测试,经过大规模使用,稳定性高。安全防护:还具备防火墙、防 DDoS 攻击等安全功能,以及支持 SNAT 功能。
硬件负载均衡的缺点也很明显:
价格贵;扩展性差,无法进行扩展和定制;调试和维护比较麻烦,需要专业人员;2.2. 软件负载均衡
软件负载均衡,可以在普通的服务器上运行负载均衡软件,实现负载均衡功能。目前常见的有 Nginx、HAproxy、LVS。其中的区别:
Nginx:七层负载均衡,支持 HTTP、E-mail 协议,同时也支持 4 层负载均衡;HAproxy:支持七层规则的,性能也很不错。OpenStack 默认使用的负载均衡软件就是 HAproxy;LVS:运行在内核态,性能是软件负载均衡中最高的,严格来说工作在三层,所以更通用一些,适用各种应用服务。
软件负载均衡的优点:
易操作:无论是部署还是维护都相对比较简单;便宜:只需要服务器的成本,软件是免费的;灵活:4 层和 7 层负载均衡可以根据业务特点进行选择,方便进行扩展和定制功能。2.2. 按照实现技术
根据实现技术不同,可分为DNS负载均衡,HTTP负载均衡,IP负载均衡,链路层负载均衡等。
DNS负载均衡
最早的负载均衡技术,利用域名解析实现负载均衡,在DNS服务器,配置多个A记录,这些A记录对应的服务器构成集群。大型网站总是部分使用DNS解析,作为第一级负载均衡。
优点:
使用简单:负载均衡工作交给DNS服务器处理,不需要专门的服务器维护;提高性能:可以支持基于地址的域名解析,解析成距离用户最近的服务器地址,可以加快访问速度。
缺点:
可用性差:新增/修改DNS后,解析时间较长;扩展性低:DNS负载均衡的控制权在域名商,扩展性有限。
实践建议:将DNS作为第一级负载均衡。
IP负载均衡
IP负载均衡,在网络层通过修改请求目标地址进行负载均衡。
优点:在内核进程完成数据分发,比在应用层分发性能更好。
缺点:所有请求响应都需要经过负载均衡服务器,集群最大吞吐量受限于负载均衡服务器网卡带宽。
链路层负载均衡
在通信协议的数据链路层修改mac地址,进行负载均衡。
数据分发时,不修改ip地址,指修改目标mac地址,配置真实物理服务器集群所有机器虚拟ip和负载均衡服务器ip地址一致,达到不修改数据包的源地址和目标地址,进行数据分发的目的。
优点:性能好。
缺点:配置复杂。
实践建议:直接路由(DR)模式最常用。
混合型负载均衡
2.3. 按照OSI层次
由于多个服务器群内硬件设备、规模、提供服务等差异,可以考虑给每个服务器群采用最合适的负载均衡方式,然后又在这多个服务器群间再一次负载均衡或群集起来以一个整体向外界提供服务,从而达到最佳的性能,将这种方式称之为混合型负载均衡。
四层负载均衡( L4 load balancing )
主要工作于处于OSI模型中间位置的传输层( transport layer ),这一层的主要协议就是TCP/UDP,负载均衡器在这一层能够看到数据包里面的源端口地址以及目的端口地址,并且基于这些信息通过一定的负载均衡算法将数据包转发到后端真实服务器。它主要处理消息的传递,而不管消息的内容。在互联网上,TCP就是HTTP传输方式的四层协议( Layer 4 Protocol )。四层负载均衡只针对由上游服务发送和接收的网络包,而并不检查包内的具体内容是什么。四层负载均衡可以通过检查TCP流中的前几个包,从而决定是否限制路由。常用方案:LVS、DPVS。
七层负载均衡( L7 load balancing )
主要工作于处于OSI模型顶层位置的应用层( application layer ),它主要处理每条消息中的真正内容。在互联网上,HTTP是网络通讯中占据主导地位的七层协议( Layer 7 Protocol )。七层负载均衡在路由网络传输时比四层负载均衡更加复杂和巧妙,特别适合像HTTP这种基于TCP传输的方式。 一个七层负载均衡器终止网络传输并读取消息中的内容。它可以基于消息中内容( 比如URL或者cookie中的信息 )来做出负载均衡的决定。之后,七层负载均衡器建立一个新的TCP连接来选择上游服务( 或者再利用一个已经存在的TCP连接,通过 HTTP keepalives 的方式。常用方案:NGINX。会终结TCP、TLS协议,分析HTTP请求,会对每个请求进行负载均衡。
3. 负载均衡算法
负载均衡服务器在决定将请求转发到具体哪台真实服务器时,是通过负载均衡算法来实现的。负载均衡算法可以分为两类:静态负载均衡算法和动态负载均衡算法。
静态负载均衡算法包括:轮询、比率、优先权。
动态负载均衡算法包括:最少连接数、最快响应速度、观察方法、预测法、动态性能分配、动态服务器补充、服务质量、服务类型、规则模式。
3.1 轮询
轮询(Round Robin):顺序循环将请求一次顺序循环地连接每个服务器。以轮询的方式依次请求调度不同的服务器;实现时,一般为服务器带上权重。
优点:服务器请求数目相同;实现简单、高效;易水平扩展。
缺点:服务器压力不一样,不适合服务器配置不同的情况;请求到目的结点的不确定,造成其无法适用于有写操作的场景。
应用场景:数据库或应用服务层中只有读的场景。
3.2 比率(Ratio)
给每个服务器分配一个加权值为比例,根椐这个比例,把用户的请求分配到每个服务器。
3.3 优先权(Priority)
给所有服务器分组,给每个组定义优先权。当最高优先级中所有服务器出现故障,将请求送给次优先级的服务器组。这种方式,实际为用户提供一种热备份的方式。
3.4 最少连接
将请求分配到连接数最少的服务器(目前处理请求最少的服务器)。
优点:根据服务器当前的请求处理情况,动态分配;
缺点:算法实现相对复杂,需要监控服务器请求连接数;
3.5 最快模式(Fastest)
传递连接给那些响应最快的服务器。
3.6 观察模式(Observed)
连接数目和响应时间这两项的最佳平衡为依据为新的请求选择服务器。
3.7 预测模式(Predictive)
利用收集到的服务器当前的性能指标,进行预测分析,选择一台服务器在下一个时间片内,其性能将达到最佳的服务器相应用户的请求。
3.8 动态性能分配(Dynamic Ratio-APM)
根据收集到的应用程序和应用服务器的各项性能参数,动态调整流量分配。
3.9 动态服务器补充(Dynamic Server Act)
当主服务器群中因故障导致数量减少时,动态地将备份服务器补充至主服务器群。
3.10 服务质量(QoS)
按不同的优先级对数据流进行分配。
3.11 服务类型(ToS)
按不同的服务类型(在 Type of Field 中标识)负载均衡对数据流进行分配。
3.12 规则模式
针对不同的数据流设置导向规则,用户可自行设置。
4. 网络分层负载均衡架构
互联网领域对于负载均衡的架构是随着网站规模提升不断演进的,大致分为如下几个阶段:
第一阶段:利用Nginx或HAProxy进行单点的负载均衡,该阶段服务器刚从单机向集群转变,需要在七层做转发。
第二阶段:随着网络规模扩大,Nginx单点瓶颈突出,这时使用LVS或者商用Array就是首要选择,Nginx此时就作为LVS或者Array的节点来使用,具体LVS或Array的是选择是根据公司规模和预算来选择。
第三阶段:这时网络服务已经成为主流产品,此时随着公司知名度也进一步扩展,相关人才的能力以及数量也随之提升,这时无论从开发适合自身产品的定制,以及降低成本来讲开源的LVS,已经成为首选,这时LVS会成为主流。
常见互联网分布式架构可分为用户层、反向代理层、Web站点层、业务服务层、数据存储层。互联网分层架构:
每层之间交互都有相应的负载均衡方案:
客户端层->反向代理层:DNS轮询。
反向代理层->Web站点层:Ngnix(均衡策略:请求轮询/最少连接路由/IP哈希)。
Web站点层->业务服务层:连接池。
业务服务层->数据存储层:数据分片,读写分离。
4. 负载均衡软件实现4.1 LVS(Linux Virtual Server 虚拟服务器)
一个虚拟的四层路由交换器集群系统,根据目标地址和目标端口实现用户请求转发。LVS由两段代码组成。
一个是ipvsadm,工作在用户空间,负责为ipvs内核框架编写规则,定义谁是集群服务,谁是后端真实的服务器。另一个是IPVS,工作在内核空间,是真正生效实现调度的代码。
软件负载均衡基于IPVS,它实现了传输层负载均衡,也就是我们常说的4层LAN交换。作为 Linux 内核的一部分,IPVS运行在主机上,在真实服务器集群前充当负载均衡器。IPVS可以将基于TCP和UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。在内核2.4.22之后,IPVS直接被收录进内核源码树了,只要启用了相关功能就可以直接拿来使用。IPVS相当于工作在netfilter中的INPUT链,它挂接在IP报文遍历的LOCAL_IN链和IP_FORWARD链两处,用于截取/改写IP报文,然后再转发出去,如图所示:
IPVS工作原理如下:
客户端向负载均衡调度器(Director Server)发起请求,调度器将用户请求发送到内核空间。PREROUTING收到用户请求后,先判断目的IP是否为本机IP,如果是就将报文发到INPUT链。由于IPVS工作在INPUT链上,当用户请求到达INPUT时,IPVS会将用户请求的目的和已经定义好的IPVS规则进行对比,如果请求目的地为VIP地址,IPVS调度器会选择一个后端真实服务器然后修改数据包里的目标IP地址,并将新的数据包发往POSTROUTING链。POSTROUTING链接收数据包后发现目标IP地址是自己的后端服务器,那么此时通过路由决策,将数据包发送给后端的服务器。
IPVS+IPTables的报文处理流程如图所示:
4.2. IPVS调度算法
IPVS在内核中的负载均衡调度是基于连接进行操作的,每个客户端请求与服务器端都需要建立一个TCP连接,调度算法负责将不同用户的连接均匀分配到后端的真实服务器上,这样可以避免单个服务器创建过多的连接而导致服务器之间的负载不平衡。
在内核中的连接调度算法上,IPVS已实现多种调度算法,下面是最常见的几种:
轮询调度Round-Robin Scheduling这种算法通过轮询的方式依次将请求调度到后端真实的服务器。假设有n台真实服务器,每次执行i = (i + 1) mod n,并选出第i台服务器。这种算法不需要记录连接的状态,所以它是一种无状态的调度,由于它假设集群中的服务处理性能是一样的,当用户请求时间变化比较快的时候,可能导致服务器之间负载不平衡。
加权轮询调度Weighted Round-Robin Scheduling在轮询算法的基础上引入一个权重,按权重的比例来调度真实的服务器。
最小连接调度Least-Connection Scheduling这种算法会把新的连接请求发送给当前连接数最少的后端服务器。调度器会记录每个服务器当前的连接数,当一个请求被调度到一个服务器时,连接计数器加一,反之当连接断开时,计数器减一。内核中每种调度算法均被实现为一个内核模块,在需要时加载。其中ip_vs_tbl是我们使用的自定义的调度器,会在后文介绍。
4.3. IPTables/Netfilter
IPTables是一个配置Linux内核防火墙的命令行工具,它基于内核的Netfilter机制。Netfilter是Linux内核的包过滤框架,它提供了一系列的钩子(Hook)供其它模块控制数据包的流动,这中间涉及到“四表五链”,即在两个维度(规则功能以及规则所处链路)对规则进行分组,“四表”存放着功能一致的规则,“五链”存放着数据包所处链路一致的规则,具体如下:四表:Filter表:过滤数据包。NAT表:用于网络地址转换(IP、端口)。Mangle表:修改数据包的服务类型、TTL,并且可以配置路由实现QOS。Raw表:决定数据包是否被状态跟踪机制处理。
五链:INPUT链:经过路由查找后,送往本机(目的地址在本地)数据包应用此规则链中的规则。OUTPUT链:本地生成的发往其他机器的数据包应用此规则链中的规则。FORWARD链:非本地产生的并且目的地不是本地的包(转发数据包)应用此规则链中的规则。PREROUTING链:刚通过数据链路层解包进入网络层的数据包,在做出路由选择前应用此链中的规则。POSTROUTING链:数据包离开本机之前以及作路由选择后应用此链中的规则。IPTables的表和链的流程如图所示:
其中PREROUTING和POSTROUTING是最重要的两个链:
1)PREROUTING负责处理刚从网卡进入的数据包,在此之前还没有做路由决策,所以还不确认这个数据包是应该交给本机处理,还是要转发到连接着另外一个网卡的计算机。数据包通过PREROUTING链后,将做出路由决策。如果数据包是发往本地计算机,则该数据包将被转发到相应的进程。如果目的地址不是在本地,那么就会将数据包转发到相应的接口,或者通过默认网关转发出去。
2)在数据包离开机器之前,它通过POSTROUTING链,然后通过网络接口离开本机。对于本地生成的数据包,这里有一点差别:数据包不会经过PREROUTING链,而是通过OUTPUT链,然后转移到POSTROUTING链。因此,只有本地应用程序生成的数据包才会经过OUTPUT链,而所有数据包(包括从其他地方路由的数据包)都会经过POSTROUTING链。
标签: #操作系统roundrobin算法