morningman opened a new issue #1723: 元数据支持存储计算分离 URL: https://github.com/apache/incubator-doris/issues/1723 # 元数据支持存储计算分离 在存储计算架构中,数据可能存储在本地、远端,或同时存储在本地和远端。当数据存储在远端时,本地存储将作为一个全量Cache存在。在这种架构,现有的以下流程需求进行重新设计: * Backend 的元数据管理 * 建表或创建分区时数据分片的分布管理 * 数据副本的修改,数据分片的修复和均衡 * 数据导入控制 * StorageMedium 分级存储 * Backend 节点的上下线操作 * 和现有元数据的兼容方案 本文档针对以上问题进行说明。 ## 目标 基于新的设计,我们希望 Doris 获得以下新的特性: * 支持全部数据存储在远端存储 当全部数据都塞远端存储后,本地节点可以非常灵活的添加或删除,而无需进行数据的重分布等操作。 * 支持数据副本的存储位置 通过将数据的副本存储在不同的节点,可以将对同一个表的在线、离线业务进行物理隔离。 ## 概念解释 在存储计算分离中,我们将引入几个新的概念。 ### Resource 资源。可以为 Doris 提供某种服务的实体。比如 Backend 是一种资源,Broker 也是一种资源。资源需要先通过命令加入到 Doris 集群中才能被使用。 ### Resource Tag 资源标签。一个资源可以被赋予一个或多个标签。标签可以让用户自定义的描述一个资源,如资源的功能、属性等等。标签可以通过 `.` 进行组合,比如 `asia.rack1`,表示同时拥有 `asia` 和 `rack1` 两个标签的资源。 ## 资源类型和资源标签 ### 资源类型 Resource 是所有资源的总称。我们具体定义以下几种Resource * Frontend FE 节点。和先用 FE 功能保持一致(请求接入、元数据管理、查询计划生成等) * Backend BE 节点。当前 BE 节点提供存储和计算属性。后续可能会加入仅存储、仅计算、仅导入等属性。 * Broker Broker 节点。和现有功能保持一致(为远端存储提供文件系统读写接口) * RemoteStorage 远端储存。用于在计算存储分离架构下,提供远端存储属性。 ### 资源标签 除了用户可以自定义标签外,Doris 也为内置的不同资源,提供了一些必须或可选的保留标签: * __frontend Frontend 的默认标签。 * __backend Backend 的默认标签 * __broker Broker 的默认标签 * __remote_storage 远端存储的默认标签 * __computation 提供计算能力的资源的标签 * __store 提供存储能力的资源的标签 ## 资源管理 资源可以被添加或删除。资源可以添加、删除或修改资源标签。 ### 添加资源 对 Doris 中已有的资源(FE、BE、BROKER),为保证兼容性,我们沿用现有的操作命令。同时,新增增加 Remote Storage 的命令。 ``` ALTER SYSTEM ADD FOLLOWER xxx; ALTER SYSTEM ADD BACKEND xxx; ALTER SYSTEM ADD BROKER xxx; ALTER SYSTEM ADD REMOTE STORAGE xxx; ``` 上述为默认的资源添加语句。在添加语句中,也支持自定义资源标签。举例如下: ``` ALTER SYSTEM ADD BACKNED "host:ip" PROPERTIES( "resource_tag" = "__computation,__store,rack1,asia" ); ALTER SYSTEM ADD REMOTE STORAGE WITH BROKER broker_name PROPERTIES( "username" = "user", "password" = "pass", "resource_tag" = "___store,zone1,asia" ); ``` 为保证兼容性。当没有指定资源标签时,Doris 会自动设置资源属性和资源组。 * Frontend: __frontend * Backend: __backend * Broker: __broker * RemoteStorage: __remote_storage ### 删除资源 资源可以被删除,对于现有资源,删除方式和现在保持一致。 ``` ALTER SYSTEM DROP BACKEND xxx; ALTER SYSTEM DROP FOLLOWER xxx; ALTER SYSTEM DROP BROKER xxx; ALTER SYSTEM DROP REMOTE STORAGE xxx; ``` ### 修改资源 资源可以被修改,如增加或删除资源属性、修改资源组等。示例如下: ``` ALTER SYSTEM MODIFY BACKEND "host:ip" PROPERTIES ( "resource_tag" = "xxx" ) ``` 对 `__store` 属性的修改可能会导致数据迁移,需要配合副本修复流程一起修改。 ### 资源选择 统一通过标签来选择资源。比如选择 tag 为 asia 和 rack1 Backend,则可以通过以下卞倩倩组合来选择: `__backend.asia.rack1` ## 资源使用 资源创建并正常加入集群后,才能被使用。这里主要介绍有改动的一些操作的使用方式。 ### 创建表和分区 创建表和分区时,可以指定资源组。Doris 会在资源组中寻找拥有 Store 属性的资源,进行数据分片副本的分布。同时我们示例如下: ``` CREATE TABLE tbl1 (k1 int) DISTRIBUTED BY HASH(k1) BUCKETS 4 PROPERTIES ( "backend_tag" = "rack1:2, rack2:1,", // required "remote_storage_tag" = "zone1" // optional ); ``` 其中 `backend_tag` 指定了副本在本地存储中的分布,必选。如上表示在标签为 rack1 的 Backend 中部署2副本,在标签为 rack2 中 Backend 中部署1副本。`remote_storage_tag` 表示使用的远端存储的标签,可选。 ``` ALTER TABLE tbl2 ADD PARTITION p2 VALUES LESS THAN("200") ( "backend_tag" = "rack1:2, rack2:1,", // required "remote_storage_tag" = "zone1" // optional); ``` **LocalMode 和 RemoteMode** 必须为一个表或分区指定至少一个 `backend_tag`。每个 Backend 存放至少1个副本。 `remote_storage_tag` 至多一个。如果不指定,则相当于一个 **LocalMode** 表。如果指定,则这是一个**RemoteMode** 的表。 通过在建表时设置 `backend_tag` 和 `remote_storage_tag`,确定了一个表是 LocalMode 还是 RemoteMode。这个属性后续不可修改。但是可以修改 `backend_tag` 和 `remote_storage_tag`。比如为不同的分区指定不同的 Tag 等。 为保持兼容,当用户指定 `"replication_num" = "3"` 时,等同于: `"backend_tag" = "__backend:3"` 如果指定 `backend_tag` 属性,`replication_num` 将失效。 ### 修改副本和数据分片管理 ``` ALTER TABLE MODIFY PARTITION p1 SET ("backend_tag" : "xxx"); ``` 对于 LocalMode 或 RemoteMode 的表,都可以通过这个方式更换本地副本的 `backend_tag`,以及每个 `backend_tag` 中副本的数量。副本检查模块会检查并开始迁移副本。RemoteMode 的副本会直接从远端存储下载数据。 `remote_storage_tag` 暂不支持修改。 对于 **LocalMode** 的表。数据分片的管理方式和现在相同,区别在于需要按照 tag 粒度进行数据分片的修复和均衡。 对于 **RemoteMode** 的表。数据分片在本地的管理方式和 LocalMode 相同。但 RemoteMode 允许用户删除所有 `backend_tag`(类似关闭集群),此时集群将处于冻结状态(TODO:当需要删除所有 `backend_tag` 时,需要将表先进入一个“冻结“状态,用于同步还没有同步到 `remote_storage_tag` 的数据)。 ### 导入控制 对于 **LocalMode** 的表,导入和之前流程一样。 对于 **RemoteMode** 的表。我们会在建表时,指定一个本地副本作为 PrimaryReplica。导入请求会尽量发给 PrimaryReplica,由 PrimaryReplica 完成导入并通知其他副本同步数据。如果 PrimaryReplica 不可用(比如节点宕机,PrimaryReplica多次导入失败等),也可以将导入发给其他节点。 FE 根据一定得策略来判断是否需要更换 PrimaryReplica。当 PrimaryReplica 在一段时间内不可用后,会切换一个新的副本作为 PrimaryReplica。尽量不切换 PrimaryReplica,防止频繁切换导致的冷数据问题。 ### Storage Medium 分级存储 本期我们先不支持 RemoteMode 表的分级存储功能。在存储计算分离框架下,这个功能可能被其他方案取代(比如新的缓存策略) ### Cluster 本次设计是对原有 Cluster 方案的替代。因此原有 Cluster 不再支持。升级时会检查如果用户使用了除 `default_cluster` 外的其他cluster,则不支持升级。 ### 查询 用户可以在查询某个表时,通过 hint 的方式,来指定使用满足某些标签的资源进行查询 ``` SELECT * FROM TBALE /* resource_tag:tag1,tag2,... */ ``` ### 权限控制 可以通过 `SET PROPERTY` 语句将一个或多个资源标签赋予某个用户,则该用户可以查询其有权限访问的表的在这些标签所属资源上的副本。当一个用户没有任何标签时,即使有表的 SELECT 权限,也无法执行查询。为保证兼容,默认所有用户拥有 `__backend` 标签的权限。 对于 LocalMode 的表,当修改了表的 `storage_tag` 后,可能因为新的 Storage 中数据还没有 ready 而无法查询。因此我们建议先增加新的 tag,再删除旧的 tag。RemoteMode 不存在这个问题,查询会直接从远端存储拉取数据,不过第一次查询会较慢。 ## 兼容方案 前面已经介绍了一些现有的操作的兼容方式。这里主要列举下现有概念映射到新的概念上的默认值。 * Backend - Resource - ResourceTag: `__backend.__store.__computation` * Frontend - Resource - ResourceTag: `__frontend` * Broker - Resource - ResourceTag: `__broker` * Broker - Resource - ResourceTag: `__broker` * Cluster 仅支持 `default_cluster`
---------------------------------------------------------------- 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]
