亮点
- 多租户在Phoenix中工作通过结合多租户表和租户指定连接(详情查看下文)。
- 租户可以打开租户指定的连接进行连接Phoenix。这些连接只能访问到该租户下的数据。
- 租户只能看到它们自己的数据在多租户表中,可以看到全部数据在正常表中。
- 为了实现添加自己的列,租户创建租户指定视图在租户表之上,在视图上创建列。
多租户表
多租户表是使用MULTI_TENANT=true DDL属性声明的常规表。它们与租户特定的连接协同工作(下文详细说明)去确保租户智能看到自己的数据。多租户表的第一主键列就是标识租户,例如:
CREATE TABLE base.event (tenant_id VARCHAR, event_type CHAR(1), created_date DATE, event_id BIGINT)
MULTI_TENANT=true;
标识租户列可以给予任意名称,但必须是VARCHAR或者CHAR类型。常规的Phoenix连接可以不受约束处理表,包括工作在租户边界的数据。
指定租户连接
租户是通过JDBC连接时TenantID是否存在或者缺失所确定的。一个非空租户信息的连接被认为是指定租户连接。一个连接未指定租户ID或者无租户ID就认为是常规的连接。指定于租户的连接只能查询数据:
- 所有数据在非租户表中,这是使用常规连接创建的表,没有MULTI_TENANT=true声明。
- 所有的数据都在多租户表中。
- 它们有自己的schema,也就是说,它只看到租户创建的特定于租户的视图(详细信息见下面)。
例如,一个租户特定的连接是这样建立的:
Properties props = new Properties();
props.setProperty("TenantId", "Acme");
Connection conn = DriverManager.getConnection("localhost", props);
指定租户视图
特定于租户的视图只能使用特定于租户的连接创建。它们与视图以相同的方式创建,但是基表必须是多租户表或最终指向一个多租户表的另一个视图。特定于租户的视图通常在需要特定于该租户的新列和/或筛选条件时使用。否则,可以通过如上所述的与租户相关的连接直接使用基表。
例如,特定于租户的视图可以定义如下:
CREATE VIEW acme.login_event(acme_user_id CHAR(15)) AS
SELECT * FROM base.event
WHERE event_type='L';
tenant_id列对于特定于租户的视图既不可见也不可访问。对它的任何引用都会导致ColumnNotFoundException。与其他Phoenix视图一样,这个视图是否可更新取决于这里解释的规则。此外,可以将索引添加到特定于租户的视图中,就像添加到常规表和视图中一样(有这些限制)。
租户数据隔离
使用特定于租户的连接在多租户表上执行的任何DML或查询都会自动限制为只操作租户的数据。对于upsert操作,这意味着Phoenix将自动使用在连接时指定的租户id填充tenantId列。对于查询和删除,透明地添加了一个where子句,以约束操作只查看属于当前租户的数据。
网友评论