租户路由(SaaS Tenant Catalog)
在SaaS多租户场景下,需要将不同租户路由到不同数据库instance以及具体的DB上,上层的APP应用根据租户ID获取到相应的的数据库地址,然后进行后续业务CRUD。一般而言,SaaS厂商将这部分映射关系维护在一个单独的数据库中,这部分数据库称为公共配置库,研发和DBA共同使用和维护,租户路由一般包含以下信息:
1、租户基本信息:租户名称、租户ID、等级、服务状态;
2、地址信息:租户所在的数据库instance ID以及对应的数据库DBName;
公共配置库的作用和书的目录相似,让应用找到正确的数据库,实现租户逻辑隔离和权限基本手段之一。
上层应用在获取到相应的数据库instance ID以及对应的数据库DBName后,需要进行一步定位具体表或者行,针对不同隔离模式下的租户路由,表隔离一般在表上会在表名上带有租户ID,通过业务动态拼接其他信息即可找到相应的业务表。在行隔离模式下,业务上会根据订单+租户ID来计算出相应表名,在业务操作时将tenantID作为过滤条件进行CRUD操作。
对于DBA来说,日常运维操作第一步,一般事通过关键字搜索找到租户ID以及对应的数据库地址,然后连上数据库的数据库进行具体运维操作。
新租户路由
当创建一个新的SaaS租户时,一般会同时结合客户的等级,可能选择创建新的实例或者从当前实例池中寻找最合适的空闲实例进行分配,并且在catalog表中添加新的记录。
租户转移
当租户转移前,将添加相应catalog记录,并置为不生效状态,等正式切换后启用,同时将旧的catalog记录进行删除或者逻辑删除。
统一访问(Uniform Access)
多实例的地址管理,看上去是很简单的问题,但是实际情况下,很多SaaS由于在地址管理方面缺少经验,部分情况更换地址甚至要停止业务,在对接客户过程中发现,客户希望产品提供迁移数据库实例带原实例地址迁移功能,这个方面来说,提供统一地址会是对运维更便捷的解决方案。
数据层统一路由
数据层提供统一访问代理,可以降低地址管理成本,对外屏蔽底层数据结构,尤其在多租户架构设计不同隔离模式下提供了一致性能力。在统一访问方面,业界有开源的MariaDB MaxScale,MariaDB MaxScale是一种数据库代理,具有可伸缩性和安全性,同时通过将其与基础数据库基础架构分离来简化应用程序开发,提供的Schema-based sharding路由为数据访问提供了DB隔离级别的访问代理。
数据库层统一路由需要感知业务,在DB隔离模式下,由于只需要具体的Instance和DB即可定位到具体租户,但是在表隔离和行隔离模式下,需要配置相对复杂的路由规则,这部分需要根据业务进行定制开发。
在SaaS多租户场景如何确定一个租户所在的数据源,作为SaaS数据存储和CRUD的基础,对后期开发和运维具有较大的影响。