ClickHouse的分布式查询流程涉及多个步骤和组件,以下是其主要流程和相关概念的详细说明:
副本选择:
ClickHouse通过load_balancing
参数控制副本的选择策略,主要有以下几种方式:- random:默认值,选择错误次数最少的副本,如果多个副本错误次数相同,则随机选择一个。
- nearest_hostname:选择错误次数最少的副本,如果多个副本错误次数相同,则选择与客户端主机名差异最小的副本。
- in_order:选择错误次数最少的副本,如果多个副本错误次数相同,则按照配置文件中定义的副本顺序选择。
- first_or_random:选择错误次数最少的副本,如果多个副本错误次数相同,则首先选择配置文件中定义的第一个副本,如果第一个不可用,则随机选择一个。
多分片查询流程:
当在ClickHouse集群中执行分布式查询时,查询语句会被发送到各个分片节点。每个分片节点会执行本地查询,并将结果返回给发起查询的节点,最后由发起节点进行结果合并。例如:SELECT * FROM distribute_test_all;
这条查询语句会在各个分片节点上执行
SELECT * FROM distribute_test_local
,然后将结果合并返回。global in:
global in
是一种特殊的查询操作,它允许在分布式表中进行跨分片的子查询。例如:SELECT * FROM distribute_test_all WHERE name = '一' AND id GLOBAL IN (SELECT id FROM distribute_test_all WHERE name = 'yi');
这条查询语句首先在各个分片节点上执行子查询,获取满足条件的
id
,然后将这些id
在所有分片节点上进行查询,最后合并结果。global join:
global join
是另一种跨分片的查询操作,它允许在分布式表中进行跨分片的连接操作。例如:SELECT * FROM distribute_test_all a GLOBAL JOIN distribute_score_all b ON a.id = b.id;
这条查询语句首先在各个分片节点上执行连接操作,然后将结果合并返回。具体的查询流程包括:
- 在各个分片节点上执行连接操作。
- 将连接结果在所有分片节点上进行合并。
分布式表的写入流程:
分布式表的写入流程包括以下步骤:- 数据先写入一个分片(例如:分片1)。
- 属于本分片的数据写入本地表,属于其他分片的数据先写入本分片的临时目录。
- 该分片与集群中其他分片建立连接。
- 将写入本地临时文件的数据异步发送到其他分片。
分布式表的读取流程:
分布式表的读取流程包括以下步骤:- 集群多副本时根据负载均衡选择一个副本。
- 将分布式查询语句转换为本地查询语句。
- 将本地查询语句发送到各个分片节点执行查询。
- 再将返回的结果执行合并。
分布式表的数据写入方案:
- 直接写入:直接对ClickHouse的分布式表执行写入操作,ClickHouse会按照分片键和权重通过网络向各个分片写入数据。
- 自行决定数据分布并直接将数据写入本地表:用户可以按照自己的业务需求自行决定数据如何分布,并直接对本地表执行写入操作。
分布式表中副本的处理方式:
- 底层表为普通表:由分布式表负责将数据复制到所有的副本上。
- 底层表为复制表:由复制表负责将数据同步到副本上,分布式表会忽略副本的数据复制过程。
通过以上步骤和机制,ClickHouse能够实现高效的分布式查询和数据管理。