集群,lvs负载均衡的四种工作模式
集群
集群的三种分类以及用途
- 负载均衡: 分配流量(调度器),提升速度
- 高可用: 关键性业务
- 高性能: 开发算法,天气预报,国家安全
负载均衡的集群
- lvs(适用于大规模)
- haproxy(适用于中型)
- nginx(适用于中小型)
- slb(云主机) 内网免费,公网收费
- F5硬件设备 (金融公司,政府机构)
LVS
lvs:Linux Virtual Server (linux虚拟服务器)
lv4:四层交换,四层路由
根据请求报文的目标IP个PORT(端口)将其转发至后端主机集群的其中一台主机(根据挑选算法)
netfilter:
- PREROUTING --> INPUT
- PREROUTING --> FORWARD --> POSTROUTING
- OUTPUT --> PREROUTING
ipvsadm/ipvs
- ipvsadm: 用户空间的命令行工具,用于管理集群服务
- ipvs: 工作与内核中netfilter INPUT钩子上
支持 TCP,UDP,AH,EST,AH_EST,SCTP等协议
//查看系统对ipvs的支持情况,包括算法
grep -i -A 2 'ipvs' /boot/config-2.6.32-504.el6.x86_ 64
lvs arch
调度器:director,dispatcher,balancer
RS:Real Server:(真实服务器:真正处理服务的服务器)
Client IP:CIP -- (发起服务请求主机的IP)
Director Virutal IP:VIP -- (对外IP)
Director IP:DIP -- (对内IP)
Real Server IP:RIP -- (真实服务器的IP)
lvs的四种模式
- nat
- dr
- tun
- fullnat
lvs-nat
lvs-nat模式工作原理:
①.客户端将请求发往调度器,请求报文源地址是CIP(客户端IP,后面统称为CIP),目标地址为VIP(调度器前端地址,后面统称为VIP)。
②.调度器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的目标地址改为了RS(后端服务器)的RIP地址并通过自己的DIP发送出去。
③.报文送到RS后,由于报文的目标地址是自己,所以会响应该请求,并将响应报文返还给LVS的DIP地址。
④.然后lvs将此报文的源地址修改为本机并通过自己的VIP发送给客户端。
注意:
在NAT模式中,Real Server的网关必须指向LVS,否则报文无法送达客户端
特点:
- RS和DIP应该使用私网地址,且RS的网关要指向DIP
- 请求和响应报文都要经由director转发,所以配置时需要将director的转发功能开启,极高负载的场景中,director可能会成为系统性能瓶颈
- 支持端口映射
- RS可以使用任意OS
- RS的RIP和Director的DIP必须在同一IP网络
优点:
集群中的物理服务器可以使用任何支持TCP/IP操作系统,只有负载均衡器需要一个合法的IP地址。
缺点:
扩展性有限。当服务器节点(普通PC服务器)增长过多时,负载均衡器将成为整个系统的瓶颈,因为所有的请求包和应答包的流向都经过负载均衡器。当服务器节点过多时,大量的数据包都交汇在负载均衡器那,速度就会变慢!
lvs-dr
lvs的默认模式,gateway
lvs-dr模式通过修改请求报文的目标MAC地址进行转发
Director:调度器需要配置VIP,DIP
RSs: 所有的RS都需要配置RIP,VIP
lvs-dr的工作原理:
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。
③.RS发现请求报文中的目的MAC是自己,就会将报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给客户端。
注意:
- 需要设置lo接口的VIP不能响应本地网络内的arp请求
- 保证客户端CIP发送的请求只能被调度器的VIP响应
- 静态绑定
- arptables (arp防火墙)
- 修改RS主机内核的两个参数
arp_announce:是否接收并记录别人的通告以及是否通告自己的MAC地址给别人
0(默认值)-- 允许使用任一网络接口配置的IP地址(即任一本地地址),通常就是待发送的IP数据包的源IP地址。
1 -- 尽量避免使用不属于该网络接口(即发送数据包的网络接口)子网的本地地址作为发送方IP地址。根据我对官方原文的理解,就是说如果主机包含多个子网,而IP数据包的源IP地址属于其中一个子网,虽然该IP地址不属于本网口的子网,但是也可以作为ARP请求数据包的发送方IP地址,否则就会按照取值为2的方式选择发送方IP地址。
2 -- 忽略IP数据包的源IP地址,总是选择网口所配置的最合适的IP地址作为ARP请求数据包的发送方IP地址(一个网口可能会配置多个IP地址)。
总结:
1、通过在调度器 LB 上修改数据包的目的 MAC 地址实现转发。注意源地址仍然是 CIP,目的地址仍然是 VIP 地址。
2、请求的报文经过调度器,而 RS 响应处理后的报文无需经过调度器 LB,因此并发访问量大时使用效率很高(和 NAT 模式比)
3、因为 DR 模式是通过 MAC 地址改写机制实现转发,因此所有 RS 节点和调度器 LB 只能在一个局域网里面
4、RS 主机需要绑定 VIP 地址在 LO 接口(掩码32 位)上,并且需要配置 ARP 抑制。
5、RS 节点的默认网关不需要配置成 LB,而是直接配置为上级路由的网关,能让 RS 直接出网就可以。
6、由于 DR 模式的调度器仅做 MAC 地址的改写,所以调度器 LB 就不能改写目标端口,那么 RS 服务器就得使用和 VIP 相同的端口提供服务。
7、直接对外的业务比如WEB等,RS 的IP最好是使用公网IP。对外的服务,比如数据库等最好使用内网IP。
优点:
和TUN(隧道模式)一样,负载均衡器也只是分发请求,应答包通过单独的路由方法返回给客户端。与VS-TUN相比,VS-DR这种实现方式不需要隧道结构,因此可以使用大多数操作系统做为物理服务器。
DR模式的效率很高,但是配置稍微复杂一点,因此对于访问量不是特别大的公司可以用haproxy/nginx取代。日1000-2000W PV或者并发请求1万一下都可以考虑用haproxy/nginx。
缺点:
所有 RS 节点和调度器 LB 只能在一个局域网里面
lvs-tun
①.客户端将请求发往前端的负载均衡器,请求报文源地址是CIP,目标地址为VIP。
②.负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将在客户端请求报文的首部再封装一层IP报文,将源地址改为DIP,目标地址改为RIP,并将此包发送给RS。
③.RS收到请求报文后,会首先拆开第一层封装,然后发现里面还有一层IP首部的目标地址是自己lo接口上的VIP,所以会处理次请求报文,并将响应报文通过lo接口送给eth0网卡直接发送给客户端。
注意:
需要设置lo接口的VIP不能在共网上出现。
总结:
1.TUNNEL 模式必须在所有的 realserver 机器上面绑定 VIP 的 IP 地址
2.TUNNEL 模式的 vip ------>realserver 的包通信通过 TUNNEL 模式,不管是内网和外网都能通信,所以不需要 lvs vip 跟 realserver 在同一个网段内
3.TUNNEL 模式 realserver 会把 packet 直接发给 client 不会给 lvs 了
4.TUNNEL 模式走的隧道模式,所以运维起来比较难,所以一般不用。
优点:
负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,就能处理很巨大的请求量,这种方式,一台负载均衡器能够为很多RS进行分发。而且跑在公网上就能进行不同地域的分发。
缺点:
隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持”IP Tunneling”(IP Encapsulation)协议,服务器可能只局限在部分Linux系统上。
FULLNAT模式
无论是 DR 还是 NAT 模式,不可避免的都有一个问题:LVS 和 RS 必须在同一个 VLAN 下,否则 LVS 无法作为 RS 的网关。
这引发的两个问题是:
1、同一个 VLAN 的限制导致运维不方便,跨 VLAN 的 RS 无法接入。
2、LVS 的水平扩展受到制约。当 RS 水平扩容时,总有一天其上的单点 LVS 会成为瓶颈。
Full-NAT 由此而生,解决的是 LVS 和 RS 跨 VLAN 的问题,而跨 VLAN 问题解决后,LVS 和 RS 不再存在 VLAN 上的从属关系,可以做到多个 LVS 对应多个 RS,解决水平扩容的问题。
Full-NAT 相比 NAT 的主要改进是,在 SNAT/DNAT 的基础上,加上另一种转换,转换过程如下
在包从 LVS 转到 RS 的过程中,源地址从客户端 IP 被替换成了 LVS 的内网 IP。
内网 IP 之间可以通过多个交换机跨 VLAN 通信。
当 RS 处理完接受到的包,返回时,会将这个包返回给 LVS 的内网 IP,这一步也不受限于 VLAN。
LVS 收到包后,在 NAT 模式修改源地址的基础上,再把 RS 发来的包中的目标地址从 LVS 内网 IP 改为客户端的 IP。
Full-NAT 主要的思想是把网关和其下机器的通信,改为了普通的网络通信,从而解决了跨 VLAN 的问题。采用这种方式,LVS 和 RS 的部署在 VLAN 上将不再有任何限制,大大提高了运维部署的便利性。
总结
1.FULL NAT 模式也不需要 LBIP 和 realserver ip 在同一个网段; full nat 跟 nat 相比的优点是:保证 RS 回包一定能够回到 LVS;因为源地址就是 LVS--> 不确定
2.full nat 因为要更新 sorce ip 所以性能正常比 nat 模式下降 10%
三种工作模式比较
LVS调度算法
(1). 轮循调度 rr
均等地对待每一台服务器,不管服务器上的实际连接数和系统负载
(2). 加权轮调 wrr
调度器可以自动问询真实服务器的负载情况,并动态调整权值
(3). 最少链接 lc
动态地将网络请求调度到已建立的连接数最少的服务器上
如果集群真实的服务器具有相近的系统性能,采用该算法可以较好的实现负载均衡
(4). 加权最少链接 wlc
调度器可以自动问询真实服务器的负载情况,并动态调整权值
带权重的谁不干活就给谁分配,机器配置好的权重高
(5). 基于局部性的最少连接调度算法 lblc
这个算法是请求数据包的目标 IP 地址的一种调度算法,该算法先根据请求的目标 IP 地址寻找最近的该目标 IP 地址所有使用的服务器,如果这台服务器依然可用,并且有能力处理该请求,调度器会尽量选择相同的服务器,否则会继续选择其它可行的服务器
(6). 复杂的基于局部性最少的连接算法 lblcr
记录的不是要给目标 IP 与一台服务器之间的连接记录,它会维护一个目标 IP 到一组服务器之间的映射关系,防止单点服务器负载过高。
(7). 目标地址散列调度算法 dh
该算法是根据目标 IP 地址通过散列函数将目标 IP 与服务器建立映射关系,出现服务器不可用或负载过高的情况下,发往该目标 IP 的请求会固定发给该服务器。
(8). 源地址散列调度算法 sh
与目标地址散列调度算法类似,但它是根据源地址散列算法进行静态分配固定的服务器资源。
(9). 最少期望延迟 sed
不考虑非活动链接,谁的权重大,优先选择权重大的服务器来接收请求,但权重大的机器会比较忙
(10). 永不排队 nq
无需队列,如果有realserver的连接数为0就直接分配过去