每每和别人提及可扩展性的含义时,很多人开始讨论提高性能,实施高可用性,甚至谈论特定的技术或协议。显然这些并不是可扩展性。不要误会,您当然需要了解关于速度,性能,可用性,应用平台,网络等相关的一切,但这并非可扩展性的定义。
简单地说,可扩展性就是关于如何处理更大规模的业务。比如,Web应用程序就是允许更多的人使用你的服务。如果你不能弄清楚如何提高性能的同时向外扩展,没关系。只要你能处理更大规模的用户,即使是存在多个单点故障也没有问题。
在今天实践中有两个关键的缩放Web应用程序的方式:垂直扩展和水平扩展(垂直增加容量-硬盘;水平增加服务器-分布式)。
“垂直扩展“ -在同一个逻辑单位添加资源以增加容量。这样的例子比比皆是,比如升级服务器的CPU,比如在RAID/ SAN存储设备上增加硬盘。
“横向扩展“- 增加多个逻辑单元资源并且使他们作为一个整体在工作。大多数的集群解决方案,比如分布式文件系统,负载均衡都是通过横向扩展技术来进行的。
每一个部件,无论它是处理器,服务器,存储驱动器或负载均衡有一定的管理上或者操作上的开销。当您尝试进行扩展时,很重要的一点是要了解实际的资源利用率,这种测量方法被称为“可扩展性因子“法。如果每添加一个CPU到系统,都会失去5%的处理器功率,那么您的可扩展性系数为0.95。当可扩展系数为0.9时,意味着你将只能使用90%的资源。
以“可扩展性因子“为基础,可扩展性可以进一步细化分类。
如果你的可扩展性系数保持不变,这就是所谓的“线性的可扩展性“。
但某些组件有可能无法像别人一样可以扩展,该系数低于1.0的就是所谓“分线性可扩展性。“
虽然数量很少,但是加入更多的组件确实可能会获得更好的性能(或者可伸缩性因子)(跨越多个磁盘的RAID I / O性能确实会更好)。这就是所谓的“超线性的可扩展性。“
如果应用程序没有可扩展性,当对其进行扩展时,得到了更加糟糕的结果。这就是所谓的“负可扩展性“。
如果您迫切需要可扩展性,垂直扩展可能是最容易的(只要你有足够的银行存款余额)。在大多数情况下,只要能砸一个超级昂贵的64个来自Sun或HP CPU服务器和来自EMC,NetApp和日立的存储设备,不用改变一行代码,一切都OK,至少可以抗一段时间。不幸的是伴随您的成长,垂直扩展会变得越来越贵。
另一方面,横向扩展并不要求你购买更多昂贵的服务器,这意味着应用普通的存储和服务器作为解决方案。但是,横向扩展也不便宜,因为它需要应用程序进行重新设计,以运行在多个服务器之上,但是对外要表现为一个单一的应用程序。这其中不得不思考两个有趣的问题:“脑裂“和”硬件故障“。
虽然无限的水平线性可扩展性是难以实现的,无限的垂直扩展性也是不可能的。如果你正在构建一个基本预先可以确定用户数量的系统,调查和应用垂直扩扩展可能是明智的选择。但是,如果你正在建设一个可用于数百万用户的Web应用程序,垂直扩展可能要付出昂贵的代价。
可扩展性不仅是和CPU处理能力有关,对于一个成功的具备可扩展性的Web应用程序而言,所有层都是一样的,这包括存储层(集群文件系统和S3等),数据库层(分区,联邦),应用层(memcached,横向扩展,TC,Tomcat集群等),网络层,负载平衡器,防火墙等等。例如如果没有办法实现多个负载平衡器来处理您未来的网络流量负载,这和您花多少钱和精力以使你的web层具备横向扩展能力毫无关系,您的流量将限于负载平衡器的能力。
选择合适的可扩展方法取决于你想要的规模和预算。事实上如果有人说有一个“放之四海而皆准“的解决办法,请不要相信他们。如果下次您参加聚会讨论时,有人开始“可扩展性“这个话题,请首先问他们可扩展性的含义。
参考文章
http://www.jroller.com/cpurdy/entry/my_linear_scalability_is_bigger