物联网平台的多租户实现

一个开放的物联网平台,对多个客户实行租户隔离是十分必要的。不论是从数据安全,还是资源分配上来说,实行租户隔离都能够更好的实现逻辑数据隔离,提升数据安全性。

从理论上来说,实现多租户隔离有3种形式:

  1. 完全隔离:独立数据库
    • 独立数据库是安全性,隔离性最高的方式
    • 成本高,需要为每个租户架设一个独立数据库
  2. 半隔离:公用数据库,独立schema
    • 一定程度的逻辑数据隔离
    • 成本合理
  3. 伪隔离:共享数据表
    • 仅采用TenantID标注数据所属租户

出于成本综合考虑,平台采用了第二种方式。

结构

在平台的架构上,我们选择了Postgresql作为主数据库。这个数据库承担了用户模块的相关内容,例如租户表,权限表,用户表。同时,还承担了物模型、设备状态的存储工作。

但是由于目前租户数量有限,量级较小,但是出于数据安全隔离角度考虑,我们选择了相对折中的独立Schema架构。

根据需求,我们的数据库架构大体如下:

以用户模块为例:

为了保证性能与可用性,我们针对Postgressql,采用了三节点集群,所有的集群之间数据完全同步。在数据库中,我们设立了 iot-sys-user DB, 这个db在所有高可用节点都是通过定期任务进行同步的。在数据库中,我们采用schema进行租户隔离。我们设计了以租户代码为编号的schema,每个schema下都具有完全相同的数据表结构:

t_sys_usr: 用户表 -> 负责存储用户ID,邮箱,salt,SHA256或国密加密后的密码,验证符,创建时间,所属租户
t_sys_usrinfo: 用户信息表,存储了用户个性化的详细信息,例如年龄,头像url,description等内容
t_sys_role: 用户权限表,本张表详细记录了用户所具有的权限。
t_sys_agreement:记录用户阅读的agreement信息,版本,以确定是否在用户登录时要求用户阅读新的用户协议