前面提到SaaS作租户之间处于对等状态,租户分配通过租户路由实现租户之间的数据逻辑隔离,而单个租户之间的数据在逻辑上是相同的,所以在实际开发和运维管理上,一般使用统一的脚本重复执行,例如对所有租户执行运维脚本,通过工具自动化登陆到每一个实例上逐一执行相关脚本,最后实现数据库整体变更,当然也会存在灰度升级场景。
元数据模版(MetaData Template)
当一个新的租户创建的时,需要从一个指定的数据库获取关于租户的一套元数据,一般这套元数据与应用程序一般需要一一对应,而保存元数据的数据库一般称为模版库(Template DB),模版库中的脚本和SQL一般会带有租户ID信息,在模版实例化带上租户ID信息,实例后的表结构等与租户强绑定,租户之间实际数据形成了命名隔离从而实现逻辑隔离,这样不仅可以避免当前库内命名冲突,还可以为防止数据库合库后的名称冲突。
租户创建
当一个新的租户创建时,通过模版库获取对应的版本的数据库结构,执行相应的脚本和SQL,即完成租户模版对应数据的实例化,在不同的租户隔离模式下,对应的执行方式也不完全一样:
1、库隔离模式:在目标实例上完整执行模版SQL和脚本执行,一般在数据库DB名称上带上租户ID信息;
2、表隔离模式:在表隔离模式下部分表存在共用,存在共用的部分需要防止错误的初始化;在非共用的部分,按照模版创建表即可,一般表名上会带上租户信息;
3、行隔离模式:按照前文描述,如果需要改变基表个数,则需要创建新的表,否则一般不需要创建新的表;
租户迁移和租户创建的过程一般类似,在实际过程中,在模版数据实例化后进行对应的数据迁移即可,当然为了保证服务的持续性,需要进行数据实时同步。
数据库变更
随着业务发展,应用和数据库会进行同步修改,数据库和应用不同步的方案,可以参见DDIA中向后兼容 (backward compatibility)和向前兼容 (forward compatibility)的介绍和处理方式。
在处理变更时,在SaaS场景下配合应用会进行灰度发布,数据库方面一般使用一个新的变更脚本,在目标租户所在的实例上进行运行,同时会将变更脚本在template DB中进行管理。在数据库版本管理上,开源的有flyway、Bytebase等,同时阿里云数据库也提供DMS版本管理工具,但是工具仍是偏向DBA管理,在SaaS场景下需要结合业务进行一定的二次开发。
数据分布
在SaaS场景下,业务流水表会存在大表的情况,尤其是存在超大租户情况下,例如在电商SaaS场景下,头部主播在双十一日单量可能达到上千万规模,在这种场景下,大表带来的各种问题, 例如DCL、DDL,会影响对于客户的SLA,而且一定程度上存在资源的浪费,所以一般会对数据进行二次分表。
二次分表
在行隔离模式下一般通过增加基表的数目来扩充防止大表情况,在DB隔离和表隔离情况下,一般通过增加租户所属的表来扩充业务流水类数据的存储上限,通常情况下,会根据时间字段来进行切分表,通常切分表模式包含年、月、周、日,切表的依据一般根据业务租户的业务数据量预估和对应的软件服务等级等预先知识。
二次分表模式,通过也可以在模版库中定义,通过合适的切表模式可以很大程度来解决大表的问题,但会带来相应的数据查询问题以及数据查询问题,数据查询需要多个数据表的union all,而对应的数据管理需要在多个表上重复执行。
冷热数据分离
冷热数据和二次分表在减少大表上面存在一定意义上相同的作用,但是冷热数据分离一般更多是从数据时间时间价值和存储成本方面去考虑,通过设置合理的分级存储来降低存储成本的同时,保证数据访问的性能。
在冷热数据分离场景下,会根据不同的业务设置冷热数据的阈值,这部分一般也可以在模版库中定义。从当前实践来看,采用不同的存储模型或引擎,带来的问题是可能是采用不同的访问地址,或不同的访问语言,这部分对于开发来说可能需要学习一套新的技术栈或开发语言或框架。
逻辑视图(表)/库(Logic View(table)/DataBase)
SaaS租户之间建模模型一般是一致,部署一般也是对等的,通过统一的逻辑视图(表)/库可以降低运维成本,减少运维复杂度,减少误操作可能,通过建立以租户为中心的管理方式,主要包含以下几个方面:
1、新增租户:在模版库中寻找相应的模版进行实例化,自动加入到统一视图管理;
2、二次分表:自动合并成逻辑业务表,尤其是新增新的分表时,自动加入到数据管理中;
3、冷热数据分离:自动管理新的分表,在切表模型不变的情况下,归档逻辑不用修改;
4、数据库变更:在数据变更时,减少漏操作的可能;
5、租户迁移:租户迁移时以租户为中心的数据实时同步;
6、监控:建立租户使用画像;
7、...
逻辑视图库/表可以建立为租户为核心的运维和开发模式,需要以租户之间不同业务表之间逻辑对齐,后续新增同一类逻辑表,需要维护新的逻辑表,这部分成本需要SaaS厂商根据自己实际情况来评估。
以租户为中心的数据管理(Data Mangament base on Tenant)
在SaaS应用中,除了交易型的业务,同时也存在越来越多的数据分析业务,例如一个月店铺的GMV? 此类查询更多的是OLAP查询,从 OLTP 数据库中提取数据(使用定期的数据转储或连续的更新流),转换成适合分析的模式,清理并加载到数据仓库中。将数据存入仓库的过程称为 “抽取 - 转换 - 加载(ETL)”,如上图所示。
以上面的例子为例,在SaaS场景下,需要针对同类租户实施相同的ETL过程,通常的做法,以具体的表\视图作为数据抽取源,然后根据具体的抽取&转化过程(后成为处理流程)。在SaaS场景下,DBA更关心以租户视角去管理流程,例如某个租户的处理流程是否成功,以物理资源(表、视图)为对象构建的处理流程对比,主要有如下几个问题:
1、新增租户:需要将已有处理流程模版复制一份,对该新增租户应用;
2、单个租户新增切表:已应用的流程中进行修改,加入对新增切表的处理;
3、禁用某些处理流程:需要对每一个租户逐一进行禁止操作;
4、...
在这个情况下,可以看到前文中的逻辑视图(表)/库可以构建统一的逻辑视图,在此基础上,建立以租户为中心的数据管理流程,同时由于模版库以及租户路由会自动关联具体的物理实体,在构建处理流程时,更多的以业务逻辑为核心,减少复制粘贴流程带来的重复工作,降低数据管理复杂度。