【问题标题】:is there a better way to query system tables across a clickhouse cluster?有没有更好的方法来跨 clickhouse 集群查询系统表?
【发布时间】:2021-07-24 05:06:52
【问题描述】:

我们有一个适度的 clickhouse 集群,大约 30 个节点,并希望收集它的使用统计信息。我们希望使用针对系统表的预定查询来做到这一点,但使用普通查询只能获取您碰巧连接到的一个节点的信息,并且创建分布式表仅适用于 *log 系统表。我们可以遍历节点,但不想这样做。有没有办法在一个查询中获取系统表的所有实例,例如 system.parts?

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    可以使用remote or remoteSecure支持多地址的函数:

    SELECT
        hostName() AS host,
        any(partition),
        count()
    FROM remote('node{01..30}-west.contoso.com', system, parts)
    GROUP BY host
    
    /*
    ┌─host──────────┬─any(partition)─┬─count()─┐
    │ node01-west   │ 202012         │     733 │
    ..
    │ node30-west   │ 202012         │     687 │
    └───────────────┴────────────────┴─────────┘
    */
    

    【讨论】:

    • 有趣。我将不得不对此进行试验,看看它是否适用于 Superset。
    • 非常酷。我不知道这件事。谢谢分享。
    • @RichardRymer np,我很乐意提供帮助 ;)
    • 所以这最终成为我们最稳定的解决方案,尽管它需要对预定查询进行更多维护。
    【解决方案2】:

    分布式表适用于任何类型的表和 clusterAllReplicas。

    create table test on cluster replicated as system.processes Engine=Distributed(replicated, system, processes);
    
    
    SELECT
        FQDN(),
        elapsed
    FROM test
    
    ┌─FQDN()────────────────────┬────elapsed─┐
    │ hos.mycmdb.net            │ 0.00063795 │
    └───────────────────────────┴────────────┘
    
    
    SELECT
        FQDN(),
        elapsed
    FROM clusterAllReplicas(replicated, system, sessions);
    
    SELECT elapsed
    FROM clusterAllReplicas(replicated, system, processes)
    
    ┌─────elapsed─┐
    │ 0.005636027 │
    └─────────────┘
    ┌─────elapsed─┐
    │ 0.000228303 │
    └─────────────┘
    ┌─────elapsed─┐
    │ 0.000275745 │
    └─────────────┘
    ┌─────elapsed─┐
    │ 0.000311621 │
    └─────────────┘
    ┌─────elapsed─┐
    │ 0.000270791 │
    └─────────────┘
    ┌─────elapsed─┐
    │ 0.000288045 │
    └─────────────┘
    ┌─────elapsed─┐
    │ 0.001048277 │
    └─────────────┘
    ┌─────elapsed─┐
    │ 0.000256203 │
    └─────────────┘
    
    
    

    【讨论】:

    • 当我们尝试这个解决方案时,我们开始收到类似这样的错误: default.parts.DirectoryMonitor: Code: 48, e.displayText() = DB::Exception: Received from 。 DB::Exception:存储系统部件不支持方法写入。关于我们可能做错了什么有什么想法吗?
    • @RichardRymer 您无法创建 Mat.View 女巫插入或读取 system.parts。似乎您只需启用 system.part_log 即可实现您的目标
    【解决方案3】:

    为了记录,我们最终使用了物化视图:

    CREATE MATERIALIZED VIEW _tmp.parts on cluster main_cluster 
    engine = Distributed('main_cluster', 'system', 'parts', rand())
    AS select * from system.parts
    

    【讨论】:

    • 虽然这行得通,但我们很确定它会导致一系列性能问题,即插入延迟达到顶峰。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多