HAProxy

HAProxy是一个特别适用于高可用环境的TCP/HTTP开源的反向代理和负载均衡软件。在7层负载均衡方面的功能
很强大(支持cookie track,header rewrite等),支持双机热备,支持虚拟主机,支持健康检查(通过patch可以
支持ECV),同时还提供直观的监控页面,可以清晰实时的监控服务集群的运行状况。同时支持Linux 2.6内核中
System Epoll,通过简化系统调用,大幅的提高了网络I/O性能。

%title插图%num

Haproxy包括以下一些特性:
根据静态分配的cookie,分配HTTP请求。
分配负载到各个服务器,同时保证服务器通过使用HTTP Cookie实现连接保持。
当主服务器宕机时切换到备份服务器。
允许特殊端口的服务监控。
做维护时通过热配置可以保证业务的连续性,更加人性化。
添加/修改/删除HTTP Request和Response头。
通过特定表达式Block HTTP请求。
根据应用的cookie做连接保持。
带有用户验证的详细的HTML监控报告。
新的1.3版本引入了frontend,backend配置段,frontend根据任意HTTP请求头内容做规则匹配,然后把请求
定向到相关的backend,通过ACL可以实现类似与F5的irules的功能。功能非常强大。目前HAProxy支持以下

5种负载均衡算法,同时也支持通过weight来实现负载比率的调整和通过cookie来实现连接保持。
1. 轮询 roundrobin
2. *少连接数 Leastconn
3. 根据原IP source
4. 根据URI uri
5. 根据URL里的参数 url_param

LVS

LVS(Linux Virtual Server)是一个开源的软件,由毕业于国防科技大学的张文嵩博士于1998年5月创立,
可以实现Linux下的简单负载均衡。
在企业的IT集群应用中,*常用的架构除了高可用集群外,还有负载均衡集群(Load Balancing)。负载均衡

集群可实现多台服务器或应用的流量均衡分配。服务器集群对外部应用及客户表现为一个虚拟的服务器,集群
内部各服务器平均地处理由外部应用及客户端所提交的业务,实现服务器之间的负载均衡处理并提供灵活的可
扩展性,当业务压力增大时,可随时加入新的服务器以提高集群的整体性能。负载均衡集群特别适用于高并发
的网络应用,如网站、文件服务器、各种要求高并发的Socket处理等。通常负载均衡集群方案大多通过专用的
硬件——负载均衡器来实现,但此类硬件产品往往价格昂贵。目前在服务器领域千兆网络已经非常普及,但是
当前中档的百兆负载均衡器依然动辄近十万元的高价,使得不少企业望而却步。
随着LVS功能的逐渐完善及性能的不断提高,当前不少硬件负载均衡器就是通过Linux内核结合LVS来实现的。

1. 技术简介

LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡的转移到不同的服
务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。
整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的
透明性、可伸缩性、高可用性和易管理性。

2. 集群采用三层结构

负载调度器(load balancer):它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而
客户认为服务器是来自一个IP地址(称之为虚拟IP地址)。
Load Balancer是整个集群系统的前端,负责把客户端请求转发到Real Server上。
Backup是备份的Load Balancer,当Load Balancer不可用时接替他,成为实际的Load Balancer。
Load Balancer通过Ldirectord监测个Real Server的健康状况,在Real Server不可用时把它从集群中剔除,恢复
时重新加入。

服务器池(server pool):是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。

共享存储(shared storage):为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,
提供相同的服务。

3. LVS的IP负载均衡

可伸缩网络服务的几种结构,它们都需要一个前端的负载调度器(或者多个进行主从备份)。IP负载均衡技术
在负载均衡调度器的实现技术中效率*高。LVS集群中实现的三种IP负载均衡技术,分别是:

VS/NAT(Virtual Server via Network Address Translation):端口映射NAT,其目标是将一组服务器构成一个
高性能的、高可用的虚拟服务器。因为这种技术容易形成单点故障,从而造成网络无法访问,并且存在带宽瓶
颈。所以LVS又提供了下面两种实现。

VS/TUN(Virtual Server via IP Tunneling):通过IP隧道实现虚拟服务。

VS/DR(Virtual Server via Direct Routing):直接路由实现虚拟服务器的方法,负载能力*强,要求真实服务
器直接将结果返回到客户端。

下面是一个采用VS/DR的拓扑图。

%title插图%num

4. 调度器

调度器是服务器集群系统的唯一入口点,它可以采用IP负载均衡技术、基于内容请求分发技术或者两者相结合。
在IP负载均衡技术中,需要服务器池拥有相同的内容提供相同的服务。当客户端请求到达时,调度器只根据服务
器负载情况和设定的调度算法从服务器池中选出一个服务器,将该请求转发到选出的服务器,并记录这个调度。
当这个请求的其它报文到达时,也会被转发到前面选出的服务器。

在基于内容请求分发技术中,服务器可以提供不同的服务。当客户端请求到达时,调度器可以根据请求的内容
选择服务器执行请求。因为所有的操作都是在Linux内核空间中完成的,它的调度开销很小,所以它具有很高的
吞吐率。服务池的节点数是可变的。当整个系统收到的负载超过目前所有节点的处理能力时,可以在服务器池
中增加服务器来满足不断增长的请求负载。
对大多数网络服务来说,请求间不存在很强的相关性,请求可以在不同的节点上并行执行,所以整个系统的性
能基本上可以随着服务器池的节点数目增加而线性增长。共享存储通常是数据库、网络文件系统或者分布式文
件系统。服务器节点需要动态更新的数据一般存储在数据库系统中,同时数据库会保证并发访问时数据的一致
性。静态的数据可以存储在网络文件系统中(如NFS/CIFS),但网络文件系统的伸缩能力有限,一般来说,
NFS/CIFS服务器只能支持3~6个繁忙的服务器节点。对于规模较大的集群系统,可以考虑用分布式文件系统,
如AFS、GFS、Coda和Intermezzo等。分布式文件系统可以为服务器提供共享的存储区,它们访问分布式文件
系统就像访问本地文件系统一样,同时分布式文件系统可以提供良好的伸缩性和可用性。

5. 分布式锁管理器

当不同服务器上的应用程序同时读写访问分布式文件系统上同一资源时,应用程序的访问冲突需要消解才能使
资源处于一致状态。这需要一个分布式锁管理器(Distributed Lock Manager),它可能是分布式文件系统内
部提供的,也可能是外部的。开发者在写应用程序时,可以使用分布式锁管理器来保证应用程序在不同节点上
并发访问的一致性。
负载调度器、服务池和共享存储系统通过高速网络相连接,如100Mbps交换网络、Myrinet和Gigabit网络等。
使用高速的网络,主要为避免当系统规模扩大时互联网络成为整个系统的瓶颈。

6. 监视器

Graphic Monitor是系统管理员提供整个集群系统的监视器,它可以监视系统的状态。Graphic Monitor是基于
浏览器的,所以无论管理员在本地还是在异地都可以监视系统的状况。为了安全的原因,浏览器要通过HTTPS
(Secure HTTP)协议和身份认证后,才能进行系统监测,并进行系统的配置和管理。

7. heartbeat

高可用集群是指一组通过硬件和软件连接起来的独立计算机,它们在用户面前表现为一个单一的系统,这样的
一组计算机系统内部的一个或者多个节点停止工作,服务会从故障节点切换到正常工作的节点上运行,不会引
起服务中断。从这个定义可以看出,集群必须检测节点和服务何时失效,何时恢复为可用。这个任务通常由一
组被称为“心跳”的代码完成。在Linux-HA里这个功能由一个叫做heartbeat的程序完成。
可用于Load Balancer主机和Backup之间failover的实现。

8. keepalived

keepalived是一个类似于layer3/4/5交换机机制的软件,也就是我们平时说的第3层、第4层和第5层交换。它的
作用是检测web服务器的状态,如果有一台web服务器死机,或者工作出现故障,keepalived将检测到,并将
有故障的web服务器从系统中剔除,当web服务器工作正常后keepalived自动将web服务器加入到服务器集群
中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
主要用于Real Server健康状态监测以及Load Balancer主机和Backup之间failover的实现。

10. IPVS

IPVS是LVS集群系统的核心软件,安装在Load Balancer上,把发往Virtual IP的请求转发到Real Server上。
IPVS的负载均衡机制有三种,就是上文提到的:
VS/NAT(Virtual Server via NAT)
VS/TUN(Virtual Server via IP Tunneling)
VS/DR(Virtual Server via Direct Routing)
IPVS的负载调度算法有十种。
IPVS(IP Virtual Server)是一种高效的Layer-4交换机,它提供负载均衡的功能。当一个连接的初始SYN报文
到达时,IPVS就选择一台服务器,将报文转发给它。此后通过检查发报文的IP和TCP报文头地址,保证此连接
的后继报文被转发到相同的服务器。这样,IPVS无法检查到请求的内容在选择服务器,这就要求后端的服务器
组提供相同的服务,不管请求被发送到哪一个服务器,返回的结果应该是一样的。但是在有一些应用中后端的
服务器可能功能不一,就要基于内容请求分发,同时基于内容请求分发可以提高后端服务器上访问的局部性。
IPVS的具体实现由ipvsadm这个程序来完成,因此判断一个系统是否具备ipvs,只需查看ipvsadm是否被安装。

9. 配置

如果LVS负载均衡器只是单台的,只需要安装LVS即可。如果LVS服务器是多台一般需要LVS+keepalived或
LVS+ldirectord+heartbeat来实现LVS负载均衡器的热备和监控应用服务器的状态。

Nginx

Nginx(engine x)是一个高性能的HTTP服务器和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Nginx因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。
在高连接并发的情况下,Nginx是Apache服务器不错的代替品。Nginx在美国是做虚拟主机常用的软件平台之
一。能够支持高达50,000个并发连接数的响应,它选择了epoll and kqueue作为开发模型。
Nginx采用C进行编写,它*大的优势在于高负载情况下内存和CPU的低消耗。
Nginx安装简单,配置文件非常简洁,Bugs很少,启动很容易,并且几乎可以做到7*24不间断运行,即使运行
数个月也不需要重新启动。能够在不间断服务的情况下进行软件版本的升级。
目前Nginx使用简单的轮询算法,无法做到基本连接数计数的负载均衡。
目前中国大陆使用Nginx网站用户有:新浪、网易、腾讯。
Nginx可以和Apache结合使用,使用Nginx处理静态请求,并将动态请求反向代理给Apache处理。