主流负载均衡器

HAProxy特性

  • 支持两种代理模式:TCP(OSI四层)HTTP(OSI七层),且HAProxy支持虚拟主机。
  • HAProxy做七层代理的话,一般需要和stunnel结合起来使用,stunnel把接收的HTTPS请求转发到HAProxy,然后再由HAProxy转发到后端服务器。
  • HAProxy可以隐藏后端服务器信息。
  • 支持url检测后端的服务器是否故障。
  • 与LVS一样,本身仅仅就只是一款负载均衡软件,单纯从效率上来讲HAProxy比Nginx有更出色的负载均衡速度,在并发处理上也优于Nginx。
  • HAProxy可以对MySQL读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,但在后端的MySQL slaves数量超过10台时性能不如LVS。
  • HAProxy 负载均衡策略非常多:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)。

HAProxy工作原理

HAProxy是一个单线程/多线程(v1.8支持)、事件驱动,给予优先级调度非阻塞的I/O的程序,设计理念源自于数据转发,可以快速移动数据并减少数据的操作时间。因此它实现了分层模式,在每个级别提供旁路机制,从而确保数据不会去往更高层。HAProxy大多数情况下是在内核中完成处理。当haproxy启动后,它只做三件事情:

0.客户端发送请求 -> 1.HAProxy开始处理传入的链接 -> 2.定期检查后端服务的状态 -> 3.与其它HAProxy节点交换信息

  • 接受来自于前端(frontend)实体链接,实体链接引用了一个或者多个的监听地址;
  • ACL规则判断这些链接是否被拦截,规则可以修改这些链接标题或拦截他们执行内部小程序,比如:页面统计;
  • 过滤规则完成后,将这些链接传递给后端实体(backend),后端服务器中包含负载均衡的策略(比如:roundrobin策略);
  • 将后端特定的处理规则应用于这些连接;
  • 根据负载均衡的策略来转发链接给backend;
  • 将后端特定的处理规则应用于响应数据;
  • 将前端特定的处理规则应用于响应数据;
  • 返回一个日志来报告发生的细节;
  • 在HTTP中,循环回到第二步,等待新的请求,否则关闭连接;

前端和后端有时被认为是半代理,因为它们只有看到一端 端对端 的连接;前端只关心客户端,而后端只关心服务器。 HAProxy也支持完全代理,正是前端和后端的联合。当HTTP 期望处理,该配置通常将被分割成前端和后端,因为任何一个前端都可能通过连接到任何后端。

LVS(Linux Virtual Server)特性

  • 抗负载能力强、是工作在 OSI4层(传输层) 之上仅作分发之用,没有流量的产生,此特点也决定了它在负载均衡软件里的性能最强的。
  • 配置性比较低,是缺点同时也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率。
  • 工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat,目前使用比较多的还是LVS/DR+Keepalived。
  • 无流量,保证了均衡器IO的性能不会收到大流量的影响。
  • 应用范围比较广,可以对所有应用做负载均衡。
  • 软件本身不支持正则处理,不能做动静分离;在这方面有需求的,还是Nginx/HAProxy+Keepalived的优势所在。
  • 如果是网站应用比较庞大的话,实施、维护LVS/DR+Keepalived起来就比较复杂,特别后端有Windows Server应用。

Nginx(engine x)特性

  • 工作在 OSI7层(应用层) 之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活。
  • Nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能,是它的优势所在。
  • Nginx安装和配置比较简单,测试起来比较方便。
  • 也可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量。
  • Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测。
  • Nginx仅能支持http和Email,这样就在适用范围上面小很多,是弱势。
  • Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP现在也是非常流行的web架构,和以前最流行的LAMP架构分庭抗争之势,在高流量的环境中也有很好的效果。
  • Nginx现在作为Web反向加速缓存越来越成熟,速度比传统的Squid服务器更快,可以考虑用其作为反向代理加速器。

负载均衡高可用 - Keepalived

Keepalived是基于VRRP协议的高级应用,作用于网络层、传输层和应用层交换机制的处理高可用的软件。主要根据TCP/IP五层模型中的3, 4, 5层交换机制检查RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。后来又加入了VRRP的功能,VRRP是Virtual Router Redundancy Protocol(虚拟路由器冗余协议)的缩写,目的是为了解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断地、稳定地运行。因此,Keepalived一方面具有服务器状态检测和故障隔离功能,另一方面也具有HA cluster功能。keepalived可以实现轻量级的高可用,一般用于前端高可用,且不需要共享存储,一般常用于两个节点的高可用(常见的前端高可用组合有LVS+Keepalived、Nginx+Keepalived、HAproxy+Keepalived)。

工作原理

在网络层,运行着四个重要的协议:互连网协议IP、互连网控制报文协议ICMP、地址转换协议ARP以及反向地址转换协议RARP。

Keepalived在网络层采用的最常见的工作方式是通过ICMP协议向服务器集群中的每个节点发送一个ICMP的数据包(类似于ping实现的功能),如果某个节点没有返回响应数据包,那么就认为此节点发生了故障,Keepalived将报告此节点失效,并从服务器集群中剔除故障节点。

在传输层,提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP。传输控制协议TCP可以提供可靠的数据传输服务,IP地址和端口,代表一个TCP连接的一个连接端。要获得TCP服务,须在发送机的一个端口上和接收机的一个端口上建立连接,而Keepalived在传输层就是利用TCP协议的端口连接和扫描技术来判断集群节点是否正常的。比如,对于常见的Web服务默认的80端口、SSH服务默认的22端口等,Keepalived一旦在传输层探测到这些端口没有响应数据返回,就认为这些端口发生异常,然后强制将此端口对应的节点从服务器集群组中移除。

在应用层,可以运行FTP、TELNET、SMTP、DNS等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived的工作方式,例如用户可以通过编写程序来运行Keepalived,而Keepalived将根据用户的设定检测各种程序或服务是否正常,如果Keepalived的检测结果与用户设定不一致时,Keepalived将把对应的服务从服务器中移除。