对规模迅速增长的系统而言,容量和性能问题当然是首当其冲的

但随时间向前,增长除了性能与容量问题,还需要面对功能与模块数量上的增长带来的系统复杂性问题以及业务的变化带来的提供差异化服务问题

许多系统在架构设计时未充分考虑到这些问题,导致系统的重构成为常态,从而影响业务交付能力,还浪费人力财力!

《可扩展的艺术》提出了更加系统的可扩展模型——AKF可扩展立方(Scalability Cube)

X轴扩展 —— 关注水平的数据和服务克隆,“加机器解决问题” Y轴扩展 —— 关注应用中职责的划分,比如数据类型,交易执行类型的划分 Z轴扩展 —— 关注服务和数据的优先级划分,如分地域划分

中原点代表完全无扩展的状态

一、X轴扩展

通过绝对平等地复制服务与数据,解决容量和可用性的问题

汽车工厂举例:一个车间能完整生产一辆汽车,为了短时间内生产更多的汽车,建设更车间,新车间除了工作的效率可能不同之外,都是一个新的复制品,也能提供与原来车间相同的工作,生产出完整的汽车

给复制品分配工作就是一个X轴扩展的一个完美示例,把工作无偏向的分配给复制品,每个复制品在不考虑生产效率的情况下,谁来做这项工作是无偏向的,各个复制品之间不共享任何内容

工程技术上来讲,X轴扩展主要有以下两种技术方案:

1.负载均衡

将请求通过负载均衡器,均衡分配到由各个“复制品”组成的集群中去。当某个复制品出现故障,也能轻易地将相应“工作”转移给其它的复制品来“代为完成”

涉及到的工程技术点包括了反向代理,DNS轮询,哈希负载均衡算法(一致性哈希),动态节点负载均衡(如按CPU,I/O)等

难点在于要求集群中的“复制品”是不共享任何内容,也就是常说的无状态

2.数据复制

在数据存储层进行绝对平等地数据迁移,解决存储层I/O瓶颈以及可用性问题

由于存在多个复制品存储,为了使得每个复制品提供无差异的数据服务,我们需要在复制品之间同步或异步地复制数据

包括主从同步(常见的读/写分离),双主同步等

数据存储天生有状态,难点在于一致性的保证上,衍生很多复杂的技术,比如Paxos选举算法等

二、Y轴扩展

根据数据的类型或者交易执行的类型(或者两者都有)来划分工作职责

一般称面向服务或/资源的扩展

将制造工序按专业性分成不同车间和流水线,不再是一个车间负责完成100%的任务

分工益处,每个车间负责的任务更简单,更专业更高效的完成生产

降低系统复杂度,Y轴扩展会将庞大的整体应用拆分为一组服务,每个服务实现一组相关的功能,如订单管理、客户管理等

工程上常见方案是服务化架构(SOA)。如电子商务平台,可以拆分成不同的服务,组成下面这样的架构:

服务数量增多时,服务调用关系变得复杂。为系统添加一个新功能,要调用的服务数也变得不可控,引发服务管理上的混乱

所以一般要用服务注册机制形成服务网关来进行服务治理

同时,为提升单个服务的可用性和容量,对每一个服务进行X轴扩展划分

三、Z轴扩展

通常是指基于请求者或用户独特的需求,进行系统划分,并使得划分出来的子系统是相互隔离但又是完整的

例:为了发展在中国的业务,或者利用中国的廉价劳动力,在中国建立一个完整的子工厂,与美国工厂一样,负责完整的汽车生产。这就是一种Z轴扩展

对系统而言,Z轴扩展一般是为了满足差异性的需求或者是为了安全隔离而采取的扩展措施

如为了提供VIP用户服务,可以将系统完整地复制一份出来,与普通用户所使用的系统完全隔离开来

再如针对不同的地域用户,系统自动切换到对应地域的子系统,为用户提供服务,都可以认为是Z轴扩展

同时,在系统的灰度部署上,也通常使用Z轴扩展来完成

工程领域常见的Z轴扩展两种方案:

1.单元化架构

分布式服务设计领域,一个单元(Cell)就是满足某个分区所有业务操作的自包含闭环

如 Y轴扩展的SOA架构,客户端对服务端节点的选择一般是随机的,但如果在此加上Z轴扩展,那服务节点的选择将不再是随机的了,而是每个单元自成一体

2.数据分区

为性能、数据安全考虑,将完整的数据集按一定的维度划分出不同的子集

一个分区(Shard),就是是整体数据集的一个子集

数据分区为一般包括以下几种数据划分的方式:

数据类型(如:业务类型) 数据范围(如:时间段,用户ID) 数据热度(如:用户活跃度,商品热度) 按读写分(如:商品描述,商品库存)

数据分区代价,增加数据运维的难度,关联搜索的复杂度增加等

总结

X轴扩展处理的是平台或系统执行的交易量或工作量增长

但复杂度或用户数量大幅增加以及差异化服务需求出现,X轴扩展就难以应付了

通过Y轴扩展处理系统复杂度增长的问题以及Z轴扩展来处理差异性化需求的问题

而当采用的扩展坐标轴不止一条时,那么X轴扩展总是其它扩展方法的次级划分