这几年来,我经常跟一些程序员、数据库管理员、系统管理员讨论一个问题:想要获得更好的可伸缩性(scalability),我们到底是应该把硬件升级为一台性能更强大的服务器还是应该买多台性能差一些但是可以组装起来协同工作的服务器集群。
系统的可伸缩性(scalability)可以定义为:当系统硬件升级之后,系统的吞吐量按比例增长的能力。比如,单台服务器可以对100个用户进行服务,那么升级为两台服务器之后,系统至少应该可以对200个用户进行服务。
垂直可伸缩性(Vertical scalability)就是对单个一台服务器添加更多的内存和CPU,也叫做纵向扩容(scale up)。纵向扩容适用在数据库层,因为数据库服务器需要:更大的共享内存空间、很多相互依赖的线程、紧耦合的内部互连接(Tightly-coupled internal interconnect)。
水平可伸缩性(Horizontal scalability)就是添加多台内存和CPU差不多的服务器,也叫横向扩容(scale out)。横向扩容更适合于web层,因为web层具有以下特点:不需要太大的共享内存空间、线程之间通常依赖性不大、多是松耦合的外部互连接(Loosely-coupled external interconnect,这是很重要的一点)、可能需要不同的操作系统做不同类型的服务器。
Scale Out 按字面意思是超过尺寸范围,而Scale Up则是按比例增高。即使用靠增加处理器来提升运算能力和增加独立服务器来增加运算能力。
对于服务器体系来说必须要考虑的一点就是可扩展性(Scalability)。除非业务永不增长,否则随着使用人数不断增多,服务器就一定会很快达到性能和并发极限。解决这个问题,通常只有两个办法:即 代表分布式计算的Scale out和以主机或机箱式为主的Scale up。
Scale Out(向外扩展):就是指企业可以根据需求增加不同的服务器应用,依靠多部服务器协同运算,借负载平衡及容错等功能来提高运算能力及可靠度。
Scale Up(向上扩展):指企业后端大型服务器以增加处理器等运算资源进行升级以获得对应用性能的要求。
在现今这两种技术已经没有明显的区别,各个提供商不仅提供用于分布式计算的Unix和Windows平台,还提供用于集中式计算的Unix和Windows平台。甚至传统的集中式计算大型机也正具有分布式计算的性质——如在IBM zSeries服务器上使用Linux和z/VM的虚拟性能,就是其中的证明。
但是更大更强的服务器同时也是更昂贵的,往往成本会大于部署大量相对便宜的服务器来实现性能的提升。而且服务器性能所能提高的程度也有一定的上限(分布式的部署相对来说性能提高的上限更高些)。所以一种呼声是应该使用向外扩展(Scale Out)来实现可扩展性,同时可以让使用者得以保留通过增加服务器以提升系统能力的后路。
但是在实现中也有很多困难需要解决:
首先,要想成功地实现向外扩展架构必须解决复杂的分布式计算问题(相对来说Scale Up方案不需要考虑这个问题),而这个问题的解决往往需要很复杂的技术和相对多的资金.大型站点如Google、Yahoo和Amazon.com,都自行研发大量相关技术。其次,Scale Out方案还需要对原先是用的软件进行大量的重写工作,以保证系统能在分布式服务器上运行(Scale Up方案则对现有软件几乎没有改动要求)。这一步往往是每个公司的开发人员的噩梦。一个不好会使开发人员的所有工作白费。再者,Scale Out方案始终面临着数据集中的问题,即拆分过的数据在服务器逻辑体系中仍然是各自相对集中的而非无限随意拆分。如果大量的逻辑放在数据库服务器一端,数据库服务器将会使得系统失去Scale out的能力和可能。因此,要保证Scale out的能力就必须保证数据库只处理实质性的数据提交和不可避免的数据查询,对于能够避免的数据查询和非实质性数据提交都应该想办法予以避免。而具体的策略和方案相对没有最优的方法。
网友评论