CK02# ClickHouse分布式表读写原理梳理

2022-06-23 13:45:06 浏览数 (1)

引言

本文主要梳理了ClickHouse分布式表,也就是是Distributed表引擎基本工作原理。主要内容有:

  • 分布式表分片算法规则
  • 分布式表写入基本流程
  • 分布式表读出数据流程
  • 非分布式表写入本地表

一、分布式表分片算法规则

使用分布式表时,数据应该落到哪个分片节点上呢?ClickHouse有一套自己的分片算法,下面从概念开始就一探究竟。

分片键(sharding_key): 要求返回一个整数类型的取值,下面语法中sharding_key需整数类型

代码语言:javascript复制
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = Distributed(cluster, database, table[, sharding_key[, policy_name]])
[SETTINGS name=value, ...]

权重(Weight) :ClickHouse中一个节点一个分片,可以给分片配置权重,权重越大数据分配越多,默认权重为1

槽(Slot): 槽的数量为集群中所有分片的权重之和

小结:通过权重与槽联合使用的一种简单分片算法。

二、分布式表写入基本流程

在使用ClickHouse分布式表写入数据时,大体流程是这样的。

@1 数据先写入一个分片(例如:分片1)

@2 属于本分片的数据写入本地表,属于其他分片的数据先写入本分片的临时目录

例如:其他分片的数据先写入分片1的临时目录

@3 该分片与集群中其他分片建立连接

例如:分片1与分片2、分片1与分片3建立连接

@4 将写入本地临时文件的数据异步发送到其他分片

例如:分片1将临时目录数据发送到分片2与分片3

小结:使用分布式表直接写入数据时,集群中各个节点彼此会建立连接,彼此之间传输数据;性能低于直接写入本地表。

三、分布式表读出数据流程

使用ClickHouse的分布式表查询,大体流程如下:

  • 集群多副本时根据负载均衡选择一个副本,也就是说副本是可以承担查询功能的
  • 将分布式查询语句转换为本地查询语句
  • 将本地插叙语句发送到各个分片节点执行查询
  • 再将返回的结果执行合并

小结:分布式表的查询类似于分库分表中间件,逻辑也很类似。

四、非分布式表写入本地表

写入时通过分布式表,由于先写入本地临时目录,集群节点之间会有数据传输。那如果再写入时直接写入本地表,性能要高于通过分布式表。

小结:负载均衡的方式:

  • 分片节点前挂载SLB等负载均衡,注意带宽限制
  • 客户端写入时轮训与各个分片建立连接,在客户端进行负载均衡选择分片

0 人点赞