我们的业务系统,不管是企业内部系统还是互联网应用系统,都需要可扩展,高可用性的系统。可扩展性和高可用性不是孤立的,只有结合起来,才能达到理想的效果。
可扩展性是系统、网络或进程的可选属性之一,它表达的含义是可以以一种优雅的方式来处理不断增长的工作,或者以一种很明白的方式进行扩充。例如:它可以用来表示系统具备随着资源(典型的有硬件)的增加提升吞吐量的能力。 垂直扩展的意思是给系统中的单节点增加资源,典型的是给机器增加CPU或内存,垂直扩展为操作系统和应用模块提供了更多可共用的资源,因此它使得虚拟化的技术(应该是指在一台机器上运行多个虚拟机)能够运行的更加有效。 水平扩展的意思是指给系统增加更多的节点,例如为一个分布式的软件系统增加新的机器,一个更清晰的例子是将一台web服务器增加为三台。随着计算机价格的不断降低以及性能的不断提升,以往需要依靠超级计算机来进行的高性能计算的应用(例如:地震分析、生物计算等)现在可以采用这种多个低成本的应用来完成。由上百台普通机器构成的集群可以达到传统的基于RISC处理器的科学计算机所具备的计算能力。
可扩展性更加强调的是水平扩展性,在用户访问数量快速增长的情况下,不终止现有服务来扩展系统的容量。比如web服务器目前已经不能接受更多的用户访问,可以在不停止服务的情况下增加第2台服务器,甚至更多的服务器,而且新增服务器对已有的服务器不会造成负面影响。
没有办法保证系统7*24不发生故障,但用户却要求任何时候都可以正常访问系统,这就是系统高可靠性的需求。一般来说,一个服务是运行在一个系统/机器上,一旦系统/机器出现故障,用户就不能再正常访问这个服务;如果把同一个服务分开放在2个不同的系统/机器,那么即使是一个系统出故障,服务依然是可以访问的。另外一个好处是恢复故障的压力减轻了。现在业界更倾向用 N 个9 来量化可用性, 最常说的就是类似 "4个9(也就是99.99%)" 的可用性。看一下表 1 能更为直观一些。
描述 | 通俗叫法 | 可用性级别 | 年度停机时间 |
---|---|---|---|
基本可用性 | 2个9 | 99% | 87.6小时 |
较高可用性 | 3个9 | 99.9% | 8.8小时 |
具有故障自动恢复能力的可用性 | 4个9 | 99.99% | 53分钟 |
极高可用性 | 5个9 | 99.999% | 5分钟 |
根据墨菲定律(Murphy's Law)[“有可能出错的事情,就会出错(Anything that can go wrong will go wrong)”]的推论,世界上没有 100% 可靠的 Web站点(除非不运行)。
可能的解决方案有2种:一种是针对单服务的升级,但是升级过程复杂、成本高、且针对的往往是单一故障点;另一种是针对服务器集群的升级,也即架设网络服务的有效结构,这样做的好处在于:通过增强集群系统的冗余性从而实现高可用性、通过分而治之实现高性能和高吞吐率、通过对结点数目的动态调整实现高可扩展性和高性能/价格比等。
这里最常用到的一个技术就是集群。集群技术中常用的是负载均衡,负载均衡技术在Windows 上有群集、NLB,在Linux上有LVS,还有第三方提供的解决方案,例如F5负载均衡器。
我们开发的应用系统都运行在Windows平台上,可靠性和稳定性方面都比较差,尽管windows占据了绝大部分的桌面市场,但在服务器领域,其份额还是很少的:象google、yahoo、tencent、baidu等拥有上万台服务器应用的机构都不约而同的选择linux做为运营平台来支撑巨大的业务访问。每个业务都运行在一个系统/机器上,一旦系统/机器发生故障,业务将不可避免的停止服务。任何一个服务器出故障,运行在上面的业务将不再问用户提供有效服务。
Windows上比较廉价的集群方案式采用NLB,曾经使用过NLB搭建集群,实现方式可参考Windows Server 2003网络负载均衡的实现。Linux的廉价集群方案就是LVS,LVS和NLB比较起来有很多的优势,LVS可以使得这项工作(组建高可扩展的网络服务)变得容易起来,而且LVS已经被证明非常稳定,也正在被越来越多站点和系统所部署。LVS的相关资料可以参考LVS项目有关中文文档。
1.在Linux内核中实现,2.6内核已经集成IPVS内核补丁了,所以不再需要重新编译内核.;
2.三种IP负载均衡技术(通过网络地址转换实现虚拟服务器、通过IP隧道实现虚拟服务器、通过直接路由实现虚拟服务器);
3.十种负载调度算法;
4.支持IPv4和IPv6。
对于系统的高可用性而言,可组建的集群可以是WEB集群、Cache集群、邮件集群、Media集群、DNS集群、MySql集群等。此外,LVS的硬件平台方面:
传统模式下,用户的访问请求通过DNS服务器解析后,把服务请求转发给web服务器,取得数据后返回给用户。这种模式有2个麻烦:同时访问的用户增加到某个程度后,服务器不能提供所需的正常访问;遇到故障,所有的访问请求都将失败。要解决这样一个难题,LVS是上上之选。当我们采用LVS方案之后,更改dns服务器的记录,这样用户的访问将首先到达LVS控制器所在的服务器,LVS把请求按照某种算法转发给后面真正的服务器。那么数据的返还是怎样的一个过程呢?在采用DR方式的集群形式下,真实服务器直接把数据返还给用户而不再经过LVS控制器。这样设计使得结构更简单一些,LVS控制器的压力也小很多。
LVS/DR主要由控制器和真实服务器2部分构成,需要在控制器和真实服务器上做好配置才能提供正常的服务。实现LVS/DR最重要的两个东西是ipvs内核模块和ipvsadm工具包,幸运的是,当前的发行版已经包含ipvs内核模块,不必再像旧的内核版本需要打这个补丁,ipvsadm需要从网上下载安装。
LVS可以把服务请求转发到各种各样的操作系统,Windows下设置子网掩码为255.255.255.255比linux设置要麻烦些。要想在网上邻居本地连接的tcp/ip属性设置4个255掩码是不能得逞的,唯一的办法是修改注册表。默认状况下,windows并没有环回接口存在,配置之前得先安装这个“设备”。