Citus查询处理
查询处理
Citus群集由协调器实例和多个Work实例组成。协调器存储分布式表的分片的元数据,数据在Worker上进行分片和复制。发送到集群的所有查询都通过协调器执行。协调器将查询分成为较小的查询片段,其中每个查询片段可以在分片上独立运行。然后,协调器将查询片段分配给Worker,监督其执行,合并其结果,并将最终结果返回给用户。
Citus的查询处理涉及组件:
1. 分布式查询计划程序
2. 分布式查询执行程序
3. PostgreSQL Planner和Executor
分布式查询计划
Citus分布式执行计划,处理SQL并生产分布式执行计划给分布式执行器。
对于SELECT查询,查询计划器首先创建输入查询的计划树,并将其转换为其可交换和关联形式,以便可以并行化。它还应用了多种优化,以确保以可伸缩的方式执行查询,并最大限度地减少网络I / O.
接下来,规划器将查询分为两部分:
1. 在协调器上运行的协调器查询计划
2. 在Worker的各个分片上运行的上的查询计划
然后,规划器将这些查询片段分配给Worker,以便有效地使用它们的所有资源。在此步骤之后,将分布式查询计划传递给分布式执行器以供执行
对于分发列或修改操作查询规划过程略有不同,因为它们只针对一个分片。查询计划程序处理SQL时,需要确定应将查询路由到哪个分片上。为此,它将提取传入的分发列,并查找元数据以确定查询的正确分片。然后,规划器重写该命令的SQL以引用分片表而不是原始表的形式。然后将此重写的计划传递给分布式执行程序。
分布式执行器
Citus的分布式执行器运行分布式查询计划并处理执行期间发生的故障。执行器连接到Worker,将分配的任务发送给它们并监督它们的执行。如果执行器无法将任务分配给指定的Worker,或者任务执行失败,则执行程序会动态地将任务分配给Worker上的其他副本。执行程序在处理故障时仅处理失败的查询子树,而不处理整个查询。
Citus有三种基本的执行器类型:实时执行器,路由执行器和任务跟踪执行器。Citus根据每个查询的结构动态选择使用哪个,并且可以一次使用多个查询,根据需要为不同的子查询/ CTE分配不同的执行程序以支持SQL功能的实现。
实时执行器:处理简单的键值查找以及INSERT,UPDATE和DELETE查询非常有用
任务跟踪器:适合较大的SELECT查询
路由执行器:适合共址表,并且数据存储在单个work节点
可以通过explain命令查看执行计划。
实时执行器
实时执行器是Citus使用的默认执行程序。它非常适合快速响应的场景,例如涉及过滤器,聚合和共址join的查询。实时执行程序为每个分片打开一个与Worker的连接,并将所有分片查询发送给它们。然后,它从每个片段查询中获取结果,合并它们,并将最终结果返回给用户。
由于实时执行器为其查询的每个分片维护一个连接,因此它可能在处理多分片时达到文件描述符/连接限制。在这种情况下,实时执行器会限制建立更多的连接防止宕机。通常可以增加操作系统上的文件描述符限制以避免限制连接数。但是,在运行复杂查询时,这可能不是理想的有效资源管理。对于触及数千个分片或需要大型表连接的查询,您可以使用任务跟踪器执行程序。
此外,当实时执行程序检测到简单的INSERT,UPDATE或DELETE查询时,它会将传入的查询分配给具有目标分片的worker。然后由Worker上的PostgreSQL处理该查询,并将结果返回给用户。如果修改在分片副本上失败,则执行程序会将相应的分片副本标记为无效,以保持数据一致性。
路由执行器
当查询所需的所有数据都存储在单个节点上时,Citus可以将整个查询路由到该节点并在那里运行。然后,结果集通过协调器节点中继回客户端。
虽然Citus支持大部分SQL功能,即使是跨节点查询,但路由器执行的优势在于100%的SQL覆盖率。路由器执行的缺点是仅使用一台计算机执行查询的并行性降低。
任务追踪执行器
任务跟踪器非常适合长时间运行的复杂数据仓库查询。此执行程序仅为每个worker打开一个连接,并将所有分片的查询分配给worker上的任务跟踪器守护进程。然后,任务跟踪器守护程序会定期安排新任务并查看完成情况。协调器的执行器定期检查这些任务跟踪器,看看他们的任务是否完成。
worker上的每个任务跟踪器守护程序也确保同时执行最多citus.max_running_tasks_per_node个任务。此限制不是因为内存,而是因为磁盘I/O的争用。任务跟踪器执行器旨在有效地处理复杂的查询,如repartition重新分区,worker节点的数据交互。
子查询/CTE推拉执行器
如有必要,Citus可以将子查询和CTE的结果收集到协调器节点中,然后将它们推送回Worker以供外部查询使用。这允许Citus支持更多种类的SQL功能。
PostgreSQL Planner和Executor
一旦分布式执行器将查询片段发送给Worker,它们就像常规的PostgreSQL查询一样被处理。该worker上的PostgreSQL规划器会选择最佳的计划,以便在相应的shard表上执行该查询。然后,PostgreSQL执行器运行该查询并将查询结果返回给分布式执行器。
[CitusDB中国]站主,PostgreSQL粉丝,现从事Citus研发工作
愿Citus在中国发展的越来越好
评论 (2)
levi| 2019年8月16日
实时执行器里 对于触及数千个分片或需要大型表连接的查询,您可以使用任务跟踪器执行程序。数千个分表 这个结论是怎么得到的?
levi| 2019年8月19日
实时执行器 任务追踪执行器 在登录验证上还有什么区别吗 为什么我设置成任务追踪执行器后登录的验证过不去了? LOG: could not connect to Ident server at address “127.0.0.1”, port 113: Connection refused
FATAL: Ident authentication failed for user “easd”
DETAIL: Connection matched pg_hba.conf line 82: “host all all 127.0.0.1/32 ident”
2019-08-19 10:59:39.181 CST [58706] WARNING: connection error: localhost:5432