morningman opened a new issue #1723: 元数据支持存储计算分离
URL: https://github.com/apache/incubator-doris/issues/1723
 
 
   
在存储计算架构中,数据可能存储在本地、远端,或同时存储在本地和远端。当数据存储在远端时,本地存储将作为一个全量Cache存在。在这种架构,现有的以下流程需求进行重新设计:
   
   * Backend 的元数据管理
   * 建表或创建分区时数据分片的分布管理
   * 数据副本的修改,数据分片的修复和均衡
   * 数据导入控制
   * StorageMedium 分级存储
   * Backend 节点的上下线操作
   * 和现有元数据的兼容方案
   
   本文档针对以上问题进行说明。
   
   ## 目标
   
   基于新的设计,我们希望 Doris 获得以下新的特性:
   
   * 支持全部数据存储在远端存储
   
       当全部数据都塞远端存储后,本地节点可以非常灵活的添加或删除,而无需进行数据的重分布等操作。
       
   * 支持数据副本的存储位置
   
       通过将数据的副本存储在不同的节点,可以将对同一个表的在线、离线业务进行物理隔离。
   
   ## 概念解释
   
   在存储计算分离中,我们将引入几个新的概念来抽象统一不同存储系统。
   
   ### Storage
   
   Storage 指一个独立的数据存储资源。之前的 Backend 就是是一种 Storage。Storage 可以分为 
**LocalStorage(LS)** 和 **RemoteStorage(RS)**。其中 LS 值本地存储,对应现在的 Backend。RS 
代表远端存储,如 HDFS,BOS 等。
   
   ### StorageGroup
   
   多个 Storage 可以组成一个 StorageGroup(SG)。SG 的目的是可以将一个 Doris 
集群中的存储资源进行划分。不同的资源组可以应对不同的业务负载。
   
   一个表或分区的数据必须被指定分布在某一个 SG 内的 Storage 中。SG 也分 **LocalStorageGroup(LSG)** 和  
**RemoteStorageGroup(RSG)**。不同的 SG 只能包含对应类型 的 Storage。
   
   ## Storage 管理
   
   Storage 支持动态的创建,删除和修改属性。Storage 将取代现有的 Backend 概念,作为统一的存储资源的表示。
   
   ### 创建 Storage
   
   ```
   ALTER SYSTEM ADD LOCAL STORAGE  
   PROPERTIES (
       "endpoint" = "host1:port,host2:port", // required
       "storage_group" = "group1"  // optional
   )
   ```
   
   对于 LocalStorage,指定 host:port。如果指定了 `storage_group`, SG 不存在则创建,存在则加入。
   
   ```
   ALTER SYSTEM ADD REMOTE STORAGE 
   PROPERTIES (
       "type" = "bos", // required
       "bos_endpoint" = "bos://bj.bcebos.com", // optional
       "other_props" = "others",   // optional
       "storage_group" = "group2"  // optional
   )
   ```
   
   对于 RemoteStorage,指定 `type` 用于描述远端存储,其余属性用于描述连接信息。`storage_group` 的处理方式同 
LocalStorage。
   
   ### 删除 Storage
   
   ```
   ALTER SYSTEM DROP LOCAL[REMOTE] STORAGE id;
   ```
   
   Storage 添加后会被分配唯一 id。通过 id 来删除指定的 Storage。
   
   ### 下线 Storage
   
   ```
   ALTER SYSTEM DECOMMISSION LOCAL STORAGE id;
   ```
   
   下线操作仅支持 LocalStorage。流程和现有流程类似。RemoteStorage不支持下线。当一个 StorageGroup  中的所有 
Storage 都被删除后,StorageGroup会被自动删除。
   
   ### 修改 Storage
   
   ```
   ALTER SYSTEM MODIFY LOCAL[REMOTE] STORAGE id
   PROPERTIES (
       ....
   )
   ```
   
   通过 id 修改指定的 Storage 属性。可修改的属性待讨论。
   
   ## 创建表或分区
   
   在创建表或分区时,需要指定 storage group。
   
   ```
   CREATE TABLE tbl1 (k1 int) DISTRIBUTED BY HASH(k1) BUCKETS 4
   PROPERTIES (
       "local_storage_group" = "group1:2, group2:1",
       "remote_storage_group" = "group3"
   );
   
   ALTER TABLE ADD PARTITION p1 VALUES LESS THAN("200") ("storage_group" = 
"group1:2, group2:1");
   ```
   
   必须为一个表或分区指定至少一个 LocalStorageGroup。每个 group 存放至少1个副本。如上例中,表 tbl1 的2个副本存放在 
group1 中,1 个副本存放在 group2 中。我们后续会支持在查询时指定查询某个 group 内的副本,以分离不同的业务需求。
   
   RemoteStorageGroup 至多一个。如果不指定,则相当于一个 **LocalMode** 
表。如果指定,则这是一个**RemoteMode** 的表。
   
   通过在建表时设置 LocalStorageGroup 和 RemoteStorageGroup,确定了一个表是 local mode 还是 remote 
mode。这个属性后续不可修改。但是可以修改 LocalStorageGroup 和 RemoteStorageGroup。比如为不同的分区指定不同的 
Group 等。
   
   当指定 `local_storage_group` 属性后,`replication_num` 将失效。
   
   ## 修改副本和数据分片管理
   
   ```
   ALTER TABLE MODIFY PARTITION SET ("local_storage_group" : "xxx");
   ```
   
   对于 LocalMode 或 RemoteMode 的表,都可以通过这个方式更换本地副本的 LocalStorageGroup,以及每个 
LocalStorageGroup 中副本的数量。副本检查模块会检查并开始迁移副本。RemoteMode 的副本会直接从远端存储下载数据。
   
   RemoteStorageGroup 暂不支持修改。
   
   对于 **LocalMode** 的表。数据分片的管理方式和现在相同,区别在于需要按照 SG 粒度进行数据分片的修复和均衡。
   
   对于 **RemoteMode** 的表。数据分片在本地的管理方式和 LocalMode 相同。但 RemoteMode 允许用户删除所有 
LocalStorageGroup(类似关闭集群),此时集群将处于冻结状态(TODO:当需要删除所有 
LocalStorage时,需要将表先进入一个“冻结“状态,用于同步还没有同步到 RemoteStorage 的数据)。
   
   ## 导入控制
   
   对于 **LocalMode** 的表,导入和之前流程一样。
   对于 **RemoteMode** 的表。我们会在建表时,指定一个本地副本作为 PrimaryReplica。导入请求会尽量发给 
PrimaryReplica,由 PrimaryReplica 完成导入并通知其他副本同步数据。如果 PrimaryReplica 
不可用(比如节点宕机,PrimaryReplica多次导入失败等),也可以将导入发给其他节点。
   
   FE 根据一定得策略来判断是否需要更换 PrimaryReplica。当 PrimaryReplica 在一段时间内不可用后,会切换一个新的副本作为 
PrimaryReplica。尽量不切换 PrimaryReplica,防止频繁切换导致的冷数据问题。
   
   ## Storage Medium 分级存储
   
   本期我们先不支持 RemoteMode 的分级存储功能。在存储计算分离框架下,这个功能可能被其他方案取代(比如新的缓存策略)
   
   ## Cluster
   
   本次设计是对原有 Cluster 方案的替代。因此原有 Cluster 不再支持。升级时会检查如果用户使用了除 default_cluster 
外的其他cluster,则不支持升级。
   
   ## 查询
   
   用户可以在查询某个表时,通过 hint 的方式,来指定查询表的某个 LocalStorageGroup 中的副本。
   
   可以通过 `SET PROPERTY` 语句将一个或多个 LocalStorageGroup 赋予某个用户,则该用户可以查询其有权限访问的表的这些 
StorageGroup 上副本。当一个用户没有任何 StorageGroup 时,即使有表的 SELECT 权限,也无法执行查询。
   
   对于 LocalMode 的表,当修改了表的 LocalStorageGroup 后,可能因为新的 Storage 中数据还没有 ready 
而无法查询。因此我们建议先增加新的 Group,再删除旧的 Group。RemoteMode 
不存在这个问题,查询会直接从远端存储拉取数据,不过第一次查询会较慢。
   
   ## 兼容方案
   
   本次我们用 Storage 完全取代 Backend。Backend 即 LocalStorage。Doris 内部会默认创建一个 
DefaultLocalStorageGroup: `__default_local_storage_group`,用于包含所有当前已存在的 
Backend,并将它们转换为 LocalStorage。
   
   所有用户默认有 DefaultLocalStorageGroup 的权限。查询时如果用户不指定 LocalStorageGroup,默认为 
DefaultLocalStorageGroup。
   
   为了兼容之前的语法,需要在内部对旧的语法进行转换。
   
   ```
   ALTER SYSTEM ADD BACKEND "host1:port", "host2:port";
   -->
   ALTER SYSTEM ADD LOCAL STORAGE  
   PROPERTIES (
       "endpoint" = "host1:port,host2:port",
       "storage_group" = "__default_local_storage_group"
   );
   ```
   
   ```
   ALTER SYSTEM DROP BACKEND "host1:port";
   -->
   通过 host:port 找到 LocalStorage 的 id
   ALTER SYSTEM DROP LOCAL STORAGE id;
   ```

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to