码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • clickhouse停止和避免mutations操作


    问题描述

    在使用clickhouse时,使用了alter查询的delete和update操作进行数据的删除和更新,当大量使用这类操作时,造成clickhouse服务无法连接,观察日志发现,出现了大量mutation的操作,严重占用clickhouse资源。
    日志如下:

    2022.10.14 15:43:01.896327 [ 1978 ] {} <Debug> ads.dw_wxt_means_download_statistics_day (ee73b1ab-dbe7-4ba2-b30f-027803650f2a): Loading mutation: mutation_285350.txt entry, commands size: 1
    2022.10.14 15:43:01.905333 [ 1978 ] {} <Debug> ads.dw_wxt_means_download_statistics_day (ee73b1ab-dbe7-4ba2-b30f-027803650f2a): Loading mutation: mutation_309364.txt entry, commands size: 1
    ......
    
    • 1
    • 2
    • 3

    经过研究,发现ALTER DELETE和UPDATE表数据的实现机制是mutations。
    对于MergeTree表,mutations机制的操作会重写整个数据块(rewriting whole data parts),所以是一个重操作,会严重占用服务资源。尤其是 ALTER TABLE … DELETE 和 ALTER TABLE … UPDATE。
    所以为了保证clickhouse服务的可靠性和可用性,应该尽量避免使用mutations机制的操作。

    问题处理

    在大量执行mutations操作时,会影响clickhouse服务的正常连接,此时可以先停止未完成的mutations操作,保证服务可用性。
    正常的停止方法:

    -- Cancel and remove all mutations of the single table:
    KILL MUTATION WHERE database = 'default' AND table = 'table'
    
    -- Cancel the specific mutation:
    KILL MUTATION WHERE database = 'default' AND table = 'table' AND mutation_id = 'mutation_3.txt'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    当mutations操作非常多,导致无法连接clickhouse执行上述sql时,可以通过手动删除mutation文件的方式,停止未完成的mutations操作。
    mutation文件存在于clickhouse表目录下,文件名类似 mutation_3.txt,只是数字不同。
    clickhosue数据存储目录可以从配置文件中找到,这里以参数 $CLICKHOUSE_PATH 代替。
    假设,bi数据库下的表t1存在mutation文件,删除方法如下:

    建议先备份mutatiuon文件,方便故障恢复。

    systemctl stop clickhouse-server
    cd $CLICKHOUSE_PATH/data/bi/t1
    rm -rf mutation*
    systemctl start clickhouse-server
    
    • 1
    • 2
    • 3
    • 4

    优雅删除和更新数据

    但是在日常使用中,不可避免的要进行大量数据删除和更新,如何优雅的执行数据删除和更新,是一个问题。
    经过研究clikhouse相关资料,发现可以使用 ReplacingMergeTree。
    ReplacingMergeTree类似Hbase,拥有列版本号,当执行merges时,相同sort key的行,只留下一行:

    • 当没有设置列版本号时,默认留下最后插入的行。
    • 当设置列版本号时,会留下版本号最大的行,如果版本号相同,按照未设置版本号的规则执行,例如留下最后插入的行。

    使用ReplacingMergeTree,对于新增数据和更新数据,统一执行 INSERT INTO 即可,在merge时,会自动删除旧数据。
    在查询时,为了保证使用最新数据,需要在执行查询时,使用 FINAL。
    考虑到每次查询都需要注意加上 FINAL 不太易用,可以通过创建view的方式解决,view中使用 FINAL 查询物理表,查询时使用view进行查询。

    https://clickhouse.com/docs/en/sql-reference/statements/alter/#mutations
    https://clickhouse.com/docs/en/operations/system-tables/mutations/#system_tables-mutations
    https://clickhouse.com/docs/en/sql-reference/statements/kill/#kill-mutation
    https://clickhouse.com/docs/en/manage/tuning-for-cloud-cost-efficiency/#avoid-mutations
    https://clickhouse.com/docs/zh/engines/table-engines/mergetree-family/replacingmergetree
    https://blog.csdn.net/yunqiinsight/article/details/106532398

  • 相关阅读:
    9.OpenFeign服务接口调用
    集成MCU的OTP-2.4G合封芯片XL2401D,收发一体 上手简单
    【C#】Stopwatch计时器
    红日靶场vulnstack1 内网渗透学习
    华为OD机试 - ABR 车路协同场景 - (Java 2023 B卷 100分)
    1.绘制一个点
    Curve 文件系统的重要特点之一就是适用于海量文件存储
    java-net-php-python-04海信集团售后管理系统计算机毕业设计程序
    【java8】Optional的使用
    MacOS/OSX docker修改已运行容器参数的方法
  • 原文地址:https://blog.csdn.net/xwd127429/article/details/127419673
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号