表分片和副本
ClickHouse 中的表分片是什么?
在传统的 共享无架构 ClickHouse 集群中,当 ① 数据对于单个服务器来说太大或 ② 单个服务器处理数据速度太慢时,会使用分片。下图说明了情况 ①,其中 uk_price_paid_simple 表超过了单个机器的容量
在这种情况下,数据可以拆分到多个 ClickHouse 服务器上,形成表分片
每个 分片数据的子集。ClickHouse 始终至少为您的数据提供一个分片。如果您不跨多个服务器拆分数据,您的数据将存储在一个分片中。跨多个服务器分片数据可用于在超出单个服务器容量时划分负载。 包含数据的子集,并充当可以独立查询的常规 ClickHouse 表。但是,查询只会处理该子集,这取决于数据分布,可能是一种有效的使用情况。通常,一个 分布式表(通常每个服务器一个)提供对完整数据集的统一视图。它本身不存储数据,而是将 SELECT 查询转发到所有分片,汇集结果,并将 INSERT 路由以均匀地分配数据。
分布式表创建
为了说明 SELECT 查询转发和 INSERT 路由,我们考虑在两个 ClickHouse 服务器上的两个分片上拆分的 What are table parts 示例表。首先,我们展示创建相应 分布式表ClickHouse 中的分布式表是一种特殊类型的表,它本身不存储数据,而是为跨集群中的多个服务器进行分布式查询处理提供统一的视图。 的 DDL 语句
ON CLUSTER 子句使 DDL 语句成为一个 分布式 DDL 语句,指示 ClickHouse 在 test_cluster 集群定义 中列出的所有服务器上创建表。分布式 DDL 需要 Keeper 组件在 集群架构 中。
对于 分布式引擎参数,我们指定 集群一组协同工作以存储和处理数据的节点(服务器)。 名称(test_cluster)、数据库名称(uk)用于分片目标表、分片目标表的名称(uk_price_paid_simple)以及用于 INSERT 路由的 分片键。在本例中,我们使用 rand 函数将行随机分配到分片。但是,根据用例,可以使用任何表达式——甚至复杂的表达式——作为分片键。下一节说明了 INSERT 路由的工作方式。
INSERT 路由
下图说明了 ClickHouse 中 分布式表ClickHouse 中的分布式表是一种特殊类型的表,它本身不存储数据,而是为跨集群中的多个服务器进行分布式查询处理提供统一的视图。 的 INSERT 的处理方式
① 针对 分布式表ClickHouse 中的分布式表是一种特殊类型的表,它本身不存储数据,而是为跨集群中的多个服务器进行分布式查询处理提供统一的视图。 的 INSERT(包含一行)被发送到托管该表的 ClickHouse 服务器,直接或通过负载均衡器。
② 对于 INSERT 中的每一行(在我们的示例中只有一行),ClickHouse 评估分片键(此处为 rand()),对分片服务器的数量取模,并将其用作目标服务器 ID(ID 从 0 开始,递增 1)。然后,该行被转发并 ③ 插入到相应服务器表的 分片数据的子集。ClickHouse 始终至少为您的数据提供一个分片。如果您不跨多个服务器拆分数据,您的数据将存储在一个分片中。跨多个服务器分片数据可用于在超出单个服务器容量时划分负载。 中。
下一节将解释 SELECT 转发的工作方式。
SELECT 转发
此图显示了带有 分布式表ClickHouse 中的分布式表是一种特殊类型的表,它本身不存储数据,而是为跨集群中的多个服务器进行分布式查询处理提供统一的视图。 的 SELECT 查询在 ClickHouse 中的处理方式
① 针对 分布式表ClickHouse 中的分布式表是一种特殊类型的表,它本身不存储数据,而是为跨集群中的多个服务器进行分布式查询处理提供统一的视图。 的 SELECT 聚合查询被发送到相应的 ClickHouse 服务器,直接或通过负载均衡器。
② 分布式表ClickHouse 中的分布式表是一种特殊类型的表,它本身不存储数据,而是为跨集群中的多个服务器进行分布式查询处理提供统一的视图。 将查询转发到托管目标表分片的所有服务器,每个 ClickHouse 服务器 并行 计算其本地聚合结果。
然后,托管最初针对的 分布式表ClickHouse 中的分布式表是一种特殊类型的表,它本身不存储数据,而是为跨集群中的多个服务器进行分布式查询处理提供统一的视图。 的 ClickHouse 服务器 ③ 收集所有本地结果,④ 将它们合并到最终的全局结果中,并 ⑤ 将其返回给查询发送者。
ClickHouse 中的表副本是什么?
ClickHouse 中的复制通过在多个服务器上维护 分片数据的子集。ClickHouse 始终至少为您的数据提供一个分片。如果您不跨多个服务器拆分数据,您的数据将存储在一个分片中。跨多个服务器分片数据可用于在超出单个服务器容量时划分负载。 数据的 副本 来确保 数据完整性 和 故障转移。由于硬件故障是不可避免的,因此复制通过确保每个 分片数据的子集。ClickHouse 始终至少为您的数据提供一个分片。如果您不跨多个服务器拆分数据,您的数据将存储在一个分片中。跨多个服务器分片数据可用于在超出单个服务器容量时划分负载。 都有多个副本来防止数据丢失。写入可以被直接或通过 分布式表 路由到任何 副本存储在 ClickHouse 数据库中的数据的副本。您可以拥有相同数据的任意数量的副本以实现冗余和可靠性。副本与 ReplicatedMergeTree 表引擎结合使用,使 ClickHouse 能够在不同的服务器上保持数据的同步。,后者选择一个 副本存储在 ClickHouse 数据库中的数据的副本。您可以拥有相同数据的任意数量的副本以实现冗余和可靠性。副本与 ReplicatedMergeTree 表引擎结合使用,使 ClickHouse 能够在不同的服务器上保持数据的同步。 进行操作。更改会自动传播到其他副本。如果发生故障或维护,数据仍然可以在其他副本上可用,并且一旦故障主机恢复,它就会自动同步以保持最新状态。
请注意,复制需要集群架构中的 Keeper 组件。
下图说明了一个具有六个服务器的 ClickHouse 集群一组协同工作以存储和处理数据的节点(服务器)。,其中前面介绍的两个表分片 Shard-1 和 Shard-2 各有三个副本。查询会发送到这个 集群一组协同工作以存储和处理数据的节点(服务器)。
查询处理方式与没有副本的设置类似,每个 分片数据的子集。ClickHouse 始终至少有一个分片用于您的数据。如果您不跨多个服务器拆分数据,您的数据将存储在一个分片中。跨多个服务器分片数据可用于在超出单个服务器的容量时划分负载。 仅执行一个 副本ClickHouse 数据库中存储的数据的副本。为了冗余和可靠性,您可以拥有相同数据的任意数量的副本。副本与 ReplicatedMergeTree 表引擎结合使用,使 ClickHouse 能够在不同的服务器上保持数据的同步。 的查询。
副本不仅确保数据完整性和故障转移,还通过允许在不同的副本上并行运行多个查询来提高查询处理吞吐量。
① 针对 分布式表ClickHouse 中的分布式表是一种特殊类型的表,它本身不存储数据,但为集群中多个服务器上的分布式查询处理提供统一视图。 的查询会发送到相应的 ClickHouse 服务器,直接发送或通过负载均衡器发送。
② 分布式表ClickHouse 中的分布式表是一种特殊类型的表,它本身不存储数据,但为集群中多个服务器上的分布式查询处理提供统一视图。 将查询转发到每个 分片数据的子集。ClickHouse 始终至少有一个分片用于您的数据。如果您不跨多个服务器拆分数据,您的数据将存储在一个分片中。跨多个服务器分片数据可用于在超出单个服务器的容量时划分负载。 的一个 副本ClickHouse 数据库中存储的数据的副本。为了冗余和可靠性,您可以拥有相同数据的任意数量的副本。副本与 ReplicatedMergeTree 表引擎结合使用,使 ClickHouse 能够在不同的服务器上保持数据的同步。,其中每个托管所选 副本ClickHouse 数据库中存储的数据的副本。为了冗余和可靠性,您可以拥有相同数据的任意数量的副本。副本与 ReplicatedMergeTree 表引擎结合使用,使 ClickHouse 能够在不同的服务器上保持数据的同步。 的 ClickHouse 服务器并行计算其本地查询结果。
其余部分的工作方式与没有副本的设置中的 相同,未在上面的图中显示。托管最初针对的 分布式表ClickHouse 中的分布式表是一种特殊类型的表,它本身不存储数据,但为集群中多个服务器上的分布式查询处理提供统一视图。 的 ClickHouse 服务器收集所有本地结果,将它们合并到最终的全局结果中,并将其返回给查询发送者。
请注意,ClickHouse 允许配置 ② 的查询转发策略。默认情况下——与上图不同——分布式表ClickHouse 中的分布式表是一种特殊类型的表,它本身不存储数据,但为集群中多个服务器上的分布式查询处理提供统一视图。 优先 使用本地 副本ClickHouse 数据库中存储的数据的副本。为了冗余和可靠性,您可以拥有相同数据的任意数量的副本。副本与 ReplicatedMergeTree 表引擎结合使用,使 ClickHouse 能够在不同的服务器上保持数据的同步。(如果可用),但可以使用其他负载均衡 策略。
在哪里可以找到更多信息
有关表分片和副本的超出此高级介绍的更多详细信息,请查看我们的 部署和扩展指南。
我们还强烈建议观看此教程视频,以深入了解 ClickHouse 分片和副本