LVS、Nginx、HAProxy 是目前使用最广泛的三种软件负载均衡软件。
选型:一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术。
中小型的 Web 应用,比如日 PV 小于1000万,用 Nginx 就完全可以了;如果中大型应用,机器不少,可以用 DNS 轮询;大型网站或重要的服务,且服务器比较多时,可以考虑用 LVS。
流行的架构方案 :
WEB前端采用nginx/HAProxy+Keepalived作为负载均衡
后端mysql数据库一主多从和读写分离,采用lvs+keepalived的架构
LVS负载均衡
LVS 是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器。现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的性能。
LVS 负载均衡机制
LVS是四层负载均衡,也就是传输层上,传输层有TCP/UDP,LVS 支持 TCP/UDP 的负载均衡。因此它相对于其它负载均衡的解决办法,比如 DNS 域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。
所谓四层负载均衡 ,也就是主要通过报文中的目标地址和端口。
LVS 的转发主要通过修改 IP 地址(NAT 模式,分为源地址修改 SNAT 和目标地址修改 DNAT)、修改目标 MAC(DR 模式)来实现。
LVS负载三种模式
1 NAT 模式:网络地址转换
NAT是一种外网和内网地址映射的技术。NAT 模式下,网络数据报的进出都要经过 LVS 的处理。LVS 需要作为 RS(真实服务器)的网关。
2 DR 模式:直接路由
DR 模式下需要 LVS 和 RS 集群绑定同一个 VIP(RS 通过将 VIP 绑定在 loopback 实现),但与 NAT 的不同点在于:请求由 LVS 接受,由真实提供服务的服务器(RealServer,RS)直接返回给用户,返回的时候不经过 LVS。
详细来看,一个请求过来时,LVS 只需要将网络帧的 MAC 地址修改为某一台 RS 的 MAC,该包就会被转发到相应的 RS 处理,注意此时的源 IP 和目标 IP 都没变,LVS 只是做了一下移花接木。RS 收到 LVS 转发来的包时,链路层发现 MAC 是自己的,到上面的网络层,发现 IP 也是自己的,于是这个包被合法地接受,RS 感知不到前面有 LVS 的存在。而当 RS 返回响应时,只要直接向源 IP(即用户的 IP)返回即可,不再经过 LVS。
注:DR 负载均衡模式数据分发过程中不修改 IP 地址,只修改 mac 地址,由于实际处理请求的真实物理 IP 地址和数据请求目的 IP 地址一致
3 IP隧道模式
隧道模式,在从客户端发来的数据包的基础上,封装一个新的IP头标记(不完整的IP头,只有目的IP部)发给RS,RS收到后,先把DR发过来的数据包的头给解开,还原其数据包原样,处理后,直接返回给客户端,而不需要再经过DR。
八种调度算法
- 1.轮询调度
调度器通过"轮询"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。 - 2.加权轮询调度
调度器通过"加权轮询"调度算法根据真实服务器的不同处理能力来调度访问请求。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。 - 3.最小连接调度
调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。 - 4.加权最小连接调度
在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值 - 5.基于局部性的最少链接
基于局部性的最少链接"调度算法是针对目标IP地址的负载均衡,该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器 - 6.带复制的基于局部性最少链接
- 7.目标地址散列调度
目标地址散列"调度算法根据请求的目标IP地址,作为散列键(HashKey)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空 - 8.源地址散列调度
LVS特点
- 抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低
- 工作在网络4层(传输层),通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。
- 稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)
- 应用范围比较广,可以对所有应用做负载均衡;
- 不支持正则处理,不能做动静分离。
- 支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)
- 配置 复杂,对网络依赖比较大,稳定性很高。