可扩展架构设计的三个维度

业界对于可扩展的系统架构设计有一个朴素的理念,就是:算法

经过加机器就能够解决容量和可用性问题安全

这一理念在“云计算”概念疯狂流行的今天,获得了普遍的承认!对于一个规模迅速增加的系统而言,容量和性能问题固然是首当其冲的。可是随着时间的向前,系统规模的增加,除了面对性能与容量的问题外,还须要面对功能与模块数量上的增加带来的系统复杂性问题以及业务的变化带来的提供差别化服务问题。而许多系统,在架构设计时并未充分考虑到这些问题,致使系统的重构成为常态,从而影响业务交付能力,还浪费人力财力!性能优化

对此,《可扩展的艺术》一书提出了一个更加系统的可扩展模型—— AKF可扩展立方 (Scalability Cube)。这个立方体中沿着三个坐标轴设置分别为:X、Y、Z。架构

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

整个扩展模型,用下图来表示,其中原点表明彻底无扩展的状态。负载均衡

一.X轴扩展运维

X轴扩展与咱们前面朴素理念是一致的,经过绝对平等地复制服务与数据,以解决容量和可用性的问题。咱们以生产汽车的工厂来举例:假设一个车间能完整的生产一辆汽车,为了短期内生产更多的汽车,咱们能够建设更多的车间,任何新增车间除了工做的效率可能不一样以外,都是一个新的复制品,也能提供与原来车间相同的工做,生产出完整的汽车。给复制品分配工做就是一个X轴扩展的一个完美示例,说明了X轴扩展的思路,即把工做无偏向的分配给复制品,每一个复制品在不考虑生产效率的状况下,谁来作这项工做是无偏向的, 各个复制品之间不共享任何内容 。异步

而在工程技术上来说,X轴扩展主要有如下两种技术方案:分布式

1.负载均衡性能

故名思议,负载均衡就是将用户的访问请求经过负载均衡器,均衡分配到由各个“复制品”组成的集群中去。当某个复制品出现故障,也能轻易地将相应“工做”转移给其它的复制品来“代为完成”。这中间涉及到的工程技术点包括了反向代理,DNS轮询,哈希负载均衡算法(一致性哈希),动态节点负载均衡(如按CPU,I/O)等。它的难点在于要求集群中的“复制品”是不共享任何内容,也就是咱们常说的 无状态 。优化

2.数据复制

数据复制是指在数据存储层进行绝对平等地数据迁移,用于解决存储层I/O瓶颈以及可用性上的问题。因为存在多个复制品存储,为了使得每一个复制品提供无差别的数据服务,咱们须要在复制品之间同步或异步地复制数据。数据复制的方式包括了主从同步(常见的读/写分离),双主同步等。由于数据存储天生就是有状态的,数据复制的难点在于 一致性 的保证上,为了一致性的保证,从而也衍生了不少复杂的技术,好比Paxos选举算法等。

二.Y轴扩展

Y轴扩展表示的是根据数据的类型或者交易执行的类型(或者二者都有)来划分工做职责。通常称为面向服务或面向资源的扩展。咱们再以生产汽车的工厂来举例:如亨利.福特所作的同样,将汽车制造的工序按专业性分红不一样车间和流水线,再也不是一个车间负责完成100%的任务,制造一辆完整的汽车,而是让这每一个车间都执行一些子任务,如安装发动机,喷漆,安装玻璃等等。这样的分工,益处是明显的,每一个车间负责的 任务更简单 ,从而能更专业更高效的完成生产。

与汽车工厂的分工相似,为了下降系统复杂度,Y轴扩展会将庞大的总体应用拆分为一组服务。每一个服务实现一组相关的功能,如订单管理、客户管理等。在工程上常见的方案是 服务化架构(SOA) 。好比对于一个电子商务平台,咱们能够拆分红不一样的服务,组成下面这样的架构:

但经过观察上图容易发现,当服务数量增多时,服务调用关系变得复杂。为系统添加一个新功能,要调用的服务数也变得不可控,由此引起了服务管理上的混乱。因此,通常状况下,须要采用服务注册的机制造成服务网关来进行服务治理。系统的架构将变成下图所示:

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

三.Z轴扩展

Z轴扩展一般是指基于请求者或用户独特的需求,进行系统划分,并使得划分出来的子系统是相互隔离但又是完整的。继续以生产汽车的工厂来举例:福特公司为了发展在中国的业务,或者利用中国的廉价劳动力,在中国创建一个完整的子工厂,与美国工厂同样,负责完整的汽车生产。这就是一种Z轴扩展。

对于系统而言,Z轴扩展通常是为了知足差别性的需求或者是为了安全隔离而采起的扩展措施。好比为了提供VIP用户服务,能够将系统完整地复制一份出来,与普通用户所使用的系统彻底隔离开来;再如,针对不一样的地域用户,系统自动切换到对应地域的子系统,为用户提供服务,均可以认为是Z轴扩展。同时,在系统的灰度部署上,咱们也一般使用Z轴扩展来完成。

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

1.单元化架构

在分布式服务设计领域,一个单元(Cell)就是知足某个分区全部业务操做的自包含闭环。如上面咱们说到的Y轴扩展的SOA架构,客户端对服务端节点的选择通常是随机的,可是,若是在此加上Z轴扩展,那服务节点的选择将再也不是随机的了,而是每一个单元自成一体。以下图:

2.数据分区

为了性能数据安全上的考虑,咱们将一个完整的数据集按必定的维度划分出不一样的子集。 一个分区(Shard),就是是总体数据集的一个子集。好比用尾号来划分用户,那一样尾号的那部分用户就能够认为是一个分区。数据分区为通常包括如下几种数据划分的方式:

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

固然,数据分区也是有代价的,它将增长数据运维的难度,关联搜索的复杂度增长等。

总结:

一个在可扩展性上设计良好的系统,会充分考虑三个维度上的可扩展性。X轴上扩展处理的是平台或系统执行的交易量或工做量增加,虽然X轴扩展可以很好处理交易量的增加,但当系统复杂度的大幅度增长,或用户数量增长以及差别化服务需求出现,X轴扩展就难以应付了,如是咱们能够经过Y轴扩展来处理系统复杂度增加的问题以及Z轴扩展来处理差别性化需求的问题。而当采用的扩展坐标轴不止一条时,那么 X轴扩展老是其它扩展方法的次级划分 。同时,这三个维度扩展性,使得系统性能上改善有了更多的方向,对于系统性能优化,也是相当重要。

相关文章
相关标签/搜索