单元化(SET)架构

什么是单元化

单元化是将一个系统的架构按照某种数据特征纬度进行垂直的划分。例如:有100万用户,按用户纬度进行划分,分为10个单元,每个单元存储10万个用户资料。
一个单元就是一个能完成所有业务操作的自包含集合,该集合中包含了业务所需的所有服务,以及分配到该单元的数据

单元化的好处

  1. 每个单元数据规模可控
  2. 计算离存储更近
  3. 提高资源利用率
  4. 动态可伸缩
  5. 异地多活
  6. 线蓝绿发和线上灰度
  7. 故障隔离

单元化的目标

  1. 业务,解决业务遇到的扩展性和容灾等需求,支持业务的高速发展
  2. 通用性,架构侧形成统一的解决方案,方便各业务线接入

单元化架构原则

  1. 对业务透明,对代码业务透明,业务代码不需要关心单元化规则,单元化的部署等问题
  2. 单元化划分的规则需要按照业务层面定制,建议优先选最大的业务纬度进行切分
  3. 部署规范

单元化架构设计

传统服务化架构(SOA),服务是分层的,每层节点数据不定,上层调用下层时随机选择节点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
         |1                2|  |3
| | |
----------------------------------------------------------------------
|1 2| |3
\|/ \|/\|/
------ ------ ------
| W1 | | W2 | | W3 | 接口层
------ ------ ------
| | |
----------------------------------------------------------------------
|1 2| |3
--------- | -------
\|/ | \|/
------ | ------
| S1 | ------>| S2 |-------- 业务层
------ ------ 2|
|1 3| |
----------------------------------------------------------------------
|1 | |
----------- | |
\|/ | \|/
------ -------- | ------
| C1 | | C2 | <-- | C3 | 核心层
------ -------- ------
1| |3 |2
----------------------------------------------------------------------
1| |3 |
\|/ \|/ |
---------- 2 |
| DB |<-------------- 数据层
----------

----------------------------------------------------------------------

单元化架构下,服务仍然分层,但每层的任意一个节点都属于且仅数据同一个单元,上层调用下层时仅选项本单元内的节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
                          |1       |2        |3
----------------------------------------------------------------
| 流量路由 |
----------------------------------------------------------------
|1 |2 |3
------------------| --------------------- -------------------
| |1 | | |2 | | |3 |
--|-----------------|-----|-------------------|------|-----------------|------------
| |1 | | |2 | | |3 |
| \|/ | | \|/ | | \|/ |
| ------ | | ------ | | ------ |
| | W1 | | | | W2 | | | | W3 | | 接口层
| ------ | | ------ | | ------ |
| | | | | | | | |
--|-----------------|-----|-------------------|------|-----------------|------------
| |1 | | |2 | | |3 |
| \|/ | | \|/ | | \|/ |
| ------ | | ------ | | ------ |
| | S1 | | | | S2 | | | | S3 | | 业务层
| ------ | | ------ | | ------ |
| |1 | | |2 | | |3 |
--|-----------------|-----|-------------------|------|-----------------|------------
| |1 | | |2 | | |3 |
| \|/ | | \|/ | | \|/ |
| ------ | | ------ | | ------ |
| | C1 | | | | C2 | | | | C3 | | 核心层
| ------ | | ------ | | ------ |
| |1 | | |2 | | |3 |
--|-----------------|-----|-------------------|------|-----------------|------------
| |1 | | |2 | | |3 |
| \|/ | | \|/ | | \|/ |
| ------ | | ------ | | ------ |
| | D1 | | | | D2 | | | | D3 | | 数据层
| ------ | | ------ | | ------ |
| | | | | |
--|-----------------|-----|-------------------|------|-----------------|------------
| SET 1 | | SET 2 | | SET 3 |
------------------- --------------------- -------------------

单元化的系统很容易部署在N个机房

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
                       | 100%
----------------------------------------
| 流量路由 |
----------------------------------------
|25% |25% |25% |25%
| | | |
------------------- -------------------
| \|/ \|/ | | \|/ \|/ |
| ------ ------ | | ------ ------ |
| | | | | | | | | | | |
| |SET1| |SET2| | | |SET3| |SET4| |
| | | | | | | | | | | |
| ------ ------ | | ------ ------ |
| | | |
| IDC 1 | | IDC 2 |
------------------- -------------------

单元化架构必须具备数据分区的能力,每个数据分区决定了各个单元可承担的业务流量比例。数据分区(Shard):把全局数据按照某个维度水平划分,每个分区的数据互不重叠,即数据库的水平拆分。
单元化结构的必要条件:所有业务数据分区所用的拆分维度和拆分规则必须一致
单元化结构的维度选择很重要,该维度应该粒度合适。
某个单元中数据分区占数据总量的比例即为该单元承担业务流量的比例。

单元化架构数据的划分

支付宝对于单元称为Zone,数据也分为三类

可分区数据(RZone,Region Zone)

按照选择好的维度可以真正被单元化的数据。可分区数据在系统链路中应该处于核心位置,单元化建设最重要的目标就是处理该类数据。

全局数据,不被关键链路业务频繁访问(GZone,Global Zone)

不能被分区的数据,全局只有一份,可能被关键链接访问,但访问频率低,例如:配置类数据。该类数据无法被分区,也就无法单元化。

全局数据,需要被关键链路业务频繁访问(CZone,City Zone)

不能被分区的数据,全局只有一份,频繁被关键链接访问。该类数据在同机房、同城的时候可以通过调用接口的方式获取,但在异地部署的情况下,从A地访问B地的服务,会有很高的延时,在高频率的情况下,系统性能将大大降低。对该类数据的处理,需要将数据本地化,每个城市的数据双向同步。问题在于异地数据同步的延迟问题。

RZone:最符合理论上单元定义的 zone,每个 RZone 都是自包含的,拥有自己的数据,能完成所有业务。
GZone:部署不可拆分的数据和服务,数据或服务可能会被RZone依赖。GZone在全局只有一组,数据仅有一份。GZone的数据或服务被RZone访问的频率低。
CZone:部署不可拆分的数据和服务,数据或服务可能会被RZone依赖。CZone中的数据或服务会被RZone频繁访问。

参考资料