计算机系统有两种扩展的方式:一种是垂直扩展,即对现有的系统进行硬件升级,如增加内存、增加存储容量或网络带宽等;另一种是水平扩展,即通过增加机器数量来进行扩展。很显然,垂直扩展对现有系统的冲击很小,几乎不需要对现有系统进行修改或仅需很少量的修改即可。而水平扩展则不然,要么需要大幅修改现有系统的架构,要么推翻现有系统重新进行设计,因此,其代价及工作量远远超过了前者。当然,后者的收益也远非前者所能比。单机的性能是有极限的,而且,越高端的硬件,其价格越昂贵。之所以昂贵,原因很简单,就是用户量太少。普通硬件设备之所以便宜,不就是用户量巨大而摊薄了成本吗?在这一点上,淘宝有深刻的体会。据《淘宝技术这十年》一书介绍,淘宝的数据库一度使用了当时最高端的单机系统(Oracle数据库+IBM小型机+EMC存储),但还是扛不住流量的激增。可以说,淘宝系统的垂直扩展已经走到了极限。万般无奈之下,淘宝只好重新设计其系统架构,走水平扩展的道路,于是就有了分库分表、服务化、异步化,也催生了淘宝内部的“去IOE运动”(即去除IBM的小型机、Oracle数据库和EMC存储)。
淘宝的故事想必在其他各大互联网公司也都发生过,这也是为什么各大公司开源出来的分布式系统在这一点上(即水平扩展而非垂直扩展)如此一致的原因。毕竟,大家能够使用的硬件基本上是一样的,为了解决大数据量、高并发的问题,在一定的预算内,除了水平扩展,还能有别的办法吗?
对于数据,水平扩展的方法主要是数据分片或分区,分片的方法有下面几种。
1.按照某个字段值的范围分片根据某个字段(一般为主键),按照其值的范围进行分片。例如,ID值在1~1000的数据存储在节点1上,ID值在1001~2000的数据存储在节点2上等。这种方式的优点是能高效地支持查找值在某个范围内的记录,例如,要查询ID值在500~1000的所有数据,只需要在节点1上查找即可。这种方式有以下两个缺点。
(1)当有新节点加入集群或有节点退出集群时,需要重新划分数据分片范围,并引起大规模的数据迁移。
(2)需要在某个地方存储数据分片的方式,即哪个节点上存储什么范围的数据,而如何解决存储这些元数据节点的单点故障又会引入新的复杂性。
2.按照某个字段的哈希值进行分片根据某个字段(一般为主键key),设计一个哈希函数H,根据H(key)%N[3]的结果进行分片。这种方式的优点是不需要存储数据的分片方式。这种方式有以下两个缺点。
(1)不能高效地支持查找值在某个范围内的数据这样的操作。
(2)当集群节点数变化时,也需要大量的数据迁移。
3.采用一致性哈希算法进行分片一致性哈希方式最主要的优点是当集群节点数变化时,不需要进行数据迁移。这种方式的缺点是实现起来比较复杂。
第一个采用一致性哈希算法进行数据分片的分布式存储系统是亚马逊的Dynamo。
摘自 李庆旭《分布式系统设计实践》




