LVS简介
LVS全称Linux Virtual Server(linux虚拟服务器)是一个由章文嵩博士发起的自由软件项目,现在已经是 Linux标准内核的一部分。
IPVS模块是LVS集群的核心软件模块,它安装在LVS集群作为负载均衡的主节点上,虚拟出一个IP地址和端口对外提供服务。用户通过访问这个虚拟服务(VS),然后访问请求由负载均衡器(LB)调度到后端真实服务器(RS)中,由RS实际处理用户的请求给返回响应。
简单的说IPVS主要功能是转发和调度(转发到哪个节点)。
几种转发模式
1、DR模式(Direct Routing直接路由模式)
DR模式下,客户端的请求包到达负载均衡器的虚拟服务IP端口后,负载均衡器不会改写请求包的IP和端口,但是会改写请求包的MAC地址为后端RS的MAC地址,然后将数据包转发;真实服务器处理请求后,响应包直接回给客户端,不再经过负载均衡器。
下面是网上找的图,因为RS上的回环io网卡绑定了VIP,所以请求包不会被丢弃,如果没有绑定,RS会认为VIP不是本机IP,将包丢弃
这种模式下,真实服务器需要将VIP添加到回环网卡,这样返回的请求包的源ip才会是VIP,才不会被客户端丢弃。
特点:
1.1、数据包在LB转发过程中,源/目的IP端口都不会变化
这个很容易理解,因为只改mac地址
1.2、每台RS上都必须在环回网卡上绑定LB的虚拟服务IP
如果RS不绑定VIP的话,相应包的源IP就是真实IP,会被客户端丢弃。因为客户端希望得到的源ip是VIP虚拟IP。
1.3、RS上的业务进程必须监听在环回网卡的虚拟服务IP上,且端口必须和LB上的虚拟服务端口一致
因为不改端口号,所以端口必须一致
1.4、RS处理完请求后,响应直接回给客户端,不再经过LB
因为RS直接绑定了VIP,所以需要LB做任何修改了。
1.5、LB和RS须位于同一个子网
因为LB要修改MAC地址,所以需要知道RS的MAC地址,只有在同个子网才能知道。
2、NAT模式
NAT模式下,LB会对客户端的请求包做DNAT,将目的IP改为RIP,对真实服务器的响应包做SNAT,将源IP改为VIP。
下面是网上找的图,2-3的过程就是DNAT,5-6的过程就是SNAT
特点
2.1、LB会修改数据包的地址
因为要做SNAT和DNAT
2.2、LB会透传客户端IP到RS(DR模式也会透传)
不会修改客户端的IP,之后修改VIP和RIP
2.3、需要将RS的默认网关地址配置为LB的浮动IP地址
因为RS的请求包要做SNAT,需要经过LB,所以需要配置LB为默认网关。
2.4、LB和RS须位于同一个子网,并且客户端不能和LB/RS位于同一子网
LB是RS默认网关,需要在同个子网,客户端如果也在同个子网,那么RS的请求响应包就不会走给默认网关,会直接发给客户端,然后因为源IP不是期望的IP,包被丢弃。
3、TUN模式(tunnel隧道模式)
将请求包多封装一层,写入源IP:VIP和端口号,目的IP:RIP和端口号。转发给RS,RS通过隧道将请求包拆包。得到真正的数据包。然后按正常流程走。
下面是网上找的图。RS需要实现对请求的拆包。把外层DIP和RIP给拆开。
特点:
3.1、RIP、VIP、DIP全是公网地址
3.2、RS的网关不会也不可能指向DIP
3.3、所有的请求报文经由Director Server,但响应报文必须不能进过Director Server
3.4、不支持端口映射
3.5、RS的系统必须支持隧道
4、FULLNAT模式
即对请求包做SNAT和DNAT,对响应包也做SNAT和DNAT
特点:
4.1、LB完全作为一个代理服务器
4.2、LB和RS对于组网结构没有要求
但是转发效率低
转发效率 DR>TUN>NAT>FULLNAT
调度算法
固定调度算法:rr,wrr,dh,sh
动态调度算法:wlc,lc,lblc,lblcr
固定调度算法:即调度器不会去判断后端服务器的繁忙与否,一如既往得将请求派发下去。
动态调度算法:调度器会去判断后端服务器的繁忙程度,然后依据调度算法动态得派发请求。
6.1、rr:轮询(round robin)
这种算法是最简单的,就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是简单。轮询算法假设所有的服务器处理请求的能力都是一样的,调度器会将所有的请求平均分配给每个真实服务器,不管后端 RS 配置和处理能力,非常均衡地分发下去。这个调度的缺点是,不管后端服务器的繁忙程度是怎样的,调度器都会讲请求依次发下去。如果A服务器上的请求很快请求完了,而B服务器的请求一直持续着,将会导致B服务器一直很忙,而A很闲,这样便没起到均衡的左右。
6.2、wrr:加权轮询(weight round robin)
这种算法比 rr 的算法多了一个权重的概念,可以给 RS 设置权重,权重越高,那么分发的请求数越多,权重的取值范围 0 – 100。主要是对rr算法的一种优化和补充, LVS 会考虑每台服务器的性能,并给每台服务器添加要给权值,如果服务器A的权值为1,服务器B的权值为2,则调度到服务器B的请求会是服务器A的2倍。权值越高的服务器,处理的请求越多。
6.3、dh:目标地址散列调度算法 (destination hash)
简单的说,即将同一类型的请求分配给同一个后端服务器,例如将以 .jgp、.png等结尾的请求转发到同一个节点。这种算法其实不是为了真正意义的负载均衡,而是为了资源的分类管理。这种调度算法主要应用在使用了缓存节点的系统中,提高缓存的命中率。
6.4、sh:源地址散列调度算法(source hash)
即将来自同一个ip的请求发给后端的同一个服务器,如果后端服务器工作正常没有超负荷的话。这可以解决session共享的问题,但是这里有个问题,很多企业、社区、学校都是共用的一个IP,这将导致请求分配的不均衡。
6.5、lc:最少连接数(least-connection)
这个算法会根据后端 RS 的连接数来决定把请求分发给谁,比如 RS1 连接数比 RS2 连接数少,那么请求就优先发给 RS1。这里问题是无法做到会话保持,即session共享。
6.6、wlc:加权最少连接数(weight least-connection)
这个比最少连接数多了一个加权的概念,即在最少连接数的基础上加一个权重值,当连接数相近,权重值越大,越优先被分派请求。
6.7、lblc:基于局部性的最少连接调度算法(locality-based least-connection)
将来自同一目的地址的请求分配给同一台RS如果这台服务器尚未满负荷,否则分配给连接数最小的RS,并以它为下一次分配的首先考虑。
6.8、lblcr:基于地址的带重复最小连接数调度 (Locality-Based Least-Connection with Replication)
这个用得少,可以略过。
参考自:
https://www.jianshu.com/p/36880b085265