clickhouse DML 语句Sync 解决大部分元数据处理不及时的问题

 
Clickhouse sync 解析

作用:

可以更及时清理Atomic 数据库内部的表元数据信息。

无 cluster 模式

以 Drop table table_map sync; 此处是本地表。

结论

Sync 语法无法改变 BackgroundSchedulePool 使用线程异步执行的本质,只能是让这个任务被执行的优先级变高。整体仍然是生产/消费模型。
详细描述
生产:
    sync 会让Drop任务放在list头部,然后schedule线程执行。

消费:
    schedule执行时,会从唤醒后端可以消费Drop 任务的线程执行。因为find_if函数是从list头部开始查找任务执行。这样越靠近头部的Drop任务会被先被执行。

void DatabaseCatalog::dropTableDataTask(){
    ...
    auto it = std::find_if(tables_marked_dropped.begin(), tables_marked_dropped.end(), [&](const auto & elem)
    ...
}

后面会针对这个table对应的IStorage类型,执行对应的Drop table语句。
# 比较关心的有Zookeeper参与的ReplicatedMergeTree

  

 
后面会针对这个table对应的IStorage类型,执行对应的Drop table语句。
# 比较关心的有Zookeeper参与的ReplicatedMergeTree

总结:

在绝大部分情况下,执行DDL语句最后加上Sync 关键字,是可以对zookeeper的元数据以及本地的数据目录进行清理的。特殊情况下除外,比如zookeeper执行超时异常,会导致元数据无法删除,会导致后续建表出现zk路径重复问题。

  

 

Storage 架构图

每一张表都对应一个IStorage。

 

 

 

Cluster 模式

因为on cluster 模式,sql在 DDLWorker中被处理成 一个执行语句,会在zookeeper上创建结点。由监听此结点的任务执行,监听此结点的任务执行时,就变成 上面的模式执行。

结论

正常情况下,on cluster 模式,会让元数据信息清理更及时。
posted @ 2021-12-29 19:26  博客记  阅读(1185)  评论(0编辑  收藏  举报