增加或删除加密 Zone 
=================================

OceanBase 数据库提供了 Zone 级别的日志传输和保存加密功能，您可以在集群中添加 Zone 时，指定 Zone 的加密属性，后续在向该加密 Zone 发送日志时，系统会对 Clog 进行加密，并且该 Zone 在持久化 Clog 时也会加密。

添加加密 Zone 
------------------------------

本节以下述集群为例，提供加密 Zone 的添加方法。

假设集群中已有 2个 Zone： `z1` 和 `z2`，需要添加一个Zone `z3`。其中，`z1` 和 `z2` 是常规读写 Zone，`z3` 是加密 Zone，`z3` 只包含加密的事务日志数据。

添加加密 Zone 的步骤如下：

1. 使用 root 用户登录数据库的 sys 租户。

   

2. 依次执行以下语句，生成主密钥。

   ```sql
   obclient> ALTER SYSTEM set tde_method = 'internal';
   
   obclient>ALTER INSTANCE ROTATE INNODB MASTER KEY;
   ```

   

3. 执行以下语句，检查上一步中生成的主密钥是否生效。

   ```sql
   obclient> SELECT min(max_active_version) FROM oceanbase.__all_virtual_master_key_version_info WHERE tenant_id = 1;
   ```

   

   当查询结果中 `min(max_active_version) `大于 `0` 时，则表示主密钥已生效，否则主密钥没有生效。

   虚拟表 `__all_virtual_master_key_version_info` 用于记录每个 OBServer 上主密钥的版本信息，其表结构如下：

   ```unknow
   table_name    = '__all_virtual_master_key_version_info',
   
   rowkey_columns = [
     ('svr_ip', 'varchar:MAX_IP_ADDR_LENGTH'),
     ('svr_port', 'int'),
     ('tenant_id', 'int'),
   ],
   normal_columns = [
     ('max_active_version', 'int'),
     ('max_stored_version', 'int'),
     ('expect_version', 'int'),
   ]
   ```

   

   每个 OBServer 上的每一个租户的主密钥信息占据该虚拟表中的一行。其中：
   * `expect_version` 表示集群中该租户当前已生成的主密钥的最大版本。

     
   
   * `max_stored_version` 表示对应 OBServer 在其本地持久化中，该租户的主密钥的最大版本。

     
   
   * `max_active_version` 表示对应 OBServer 在进行加密时，该租户可以使用的主密钥的最大版本，`max_active_version` 等于 `0` 表示没有已经生效的主密钥。

     
   

   

4. 执行以下命令，添加加密 Zone。

   **注意**

   

   在添加加密 Zone 前，系统租户必须要有一个已生效的主密钥，如果系统租户没有一个生效的主密钥，则执行添加加密 zone 的语句会失败。

   ```sql
   obclient> ALTER SYSTEM ADD Zone 'z3' zone_type = 'encryption';
   ```

   

5. 分别执行以下命令，调整系统租户的 Locality。

   由于集群之前为 2 副本，为保证系统租户的高可用，在添加完加密 Zone 后，需要将系统租户补充为 3 副本。

   ```sql
   obclient> CREATE RESOURCE POOL sys_pool2 unit_num = 1, resource_pool_list=('z3'), unit='sys_unit_config';
   
   obclient> ALTER TENANT sys resource_pool_list = ('sys_pool','sys_pool2');
   
   obclient> ALTER TENANT sys LOCALITY = 'F@z1,F@z2,E@z3';
   ```

   




轮转主密钥 
--------------------------

当用户希望更换主密钥时，管理员可以为加密 Zone 轮转主密钥。

1. 使用 root 用户登录数据库的 sys 租户。

   

2. 执行以下语句，为加密 Zone 轮转主密钥。

   




```sql
obclient> ALTER INSTANCE ROTATE INNODB MASTER KEY;
```


**说明**



在轮转主密钥时，如果出现了 OBServer 宕机，加密 Zone 上的 OBServer 宕机不会对主密钥生效产生影响，但常规 Zone 上的 OBServer 宕机对主密钥的生效可能产生影响，可能会导致轮转生成的新主密钥不能立即生效。

删除加密 Zone 
------------------------------

加密 Zone 添加成功后，如果需要删除加密 Zone，其操作与常规读写 Zone 的删除操作相同，您可以使用以下语句删除该加密 Zone：

```sql
obclient> ALTER SYSTEM DELETE ZONE 'z3';
```



加密 Zone 使用限制 
---------------------------------

加密 Zone 和加密投票型副本的使用有一定限制，具体限制如下：

* 加密 Zone 上仅支持部署加密投票型副本，不支持部署其他类型的副本，例如全功能副本、只读副本、普通日志副本等均不能部署在加密 Zone 上。

  

* 加密投票型副本仅支持部署在加密 Zone 上，不支持部署在常规读写 Zone上。

  



