ClickHouse 更新操作导致不可写,应该选择哪种表引擎?

news2024/11/15 10:59:57

一个工作日下午,某大型通信运营商业务人员报告,一套 ClickHouse 集群在进行插入数据操作的时候,系统报错 too many mutations(1036),插入数据失败!

作者:张宇,爱可生DBA,负责数据库运维和故障分析。擅长 ClickHouse、MySQL、Oracle,爱好骑行、AI、动漫和技术分享。

爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

本文约 1500 字,预计阅读需要 5 分钟。

回到现场

一个工作日下午,某大型通信运营商业务人员报告,一套 ClickHouse 集群在进行插入数据操作的时候,系统报错 too many mutations(1036),插入数据失败!

排查过程中发现,系统表 system.mutations 里(is_done=0)存在大量的未处理的更新(mutations)操作,且都是 alter table xxx update xxx 语句。

与业务沟通之后得知,业务每天有 50 次左右的数据更新操作,若更新失败则会重试直至成功。每个节点会因数据不同,对应数量不等的 mutations 操作。

先说故障原因。系统设置的 mutations 最大值为 1000,超过会导致插入操作失败(业务数据无法新增)。

基本信息

先了解一下这套 ClickHouse 集群的情况。

  • ClickHouse 版本:23.9.1
  • 集群架构:2 副本,11 分片
  • 数据量:约 4 TB(11×362GB)
  • 部署规划:

副本交叉部署,高可用业务无感知。

恢复思路

在 ClickHouse 数据库当中,mutations 操作语句 alter table xxx update/delete 操作会对表产生非常大的工作负载。

再确认业务操作流程无法修改后,只能选择适配这类操作,计划将表引擎改造为更适合覆盖更新的类型,如:

  1. ReplacingMergeTree
  2. CollapsingMergeTree
  3. VersionedCollapsingMergeTree

这几种类型的引擎,可以通过复制功能(Replicated)来控制更新。这样既能保证快速查询能力,也不会让系统耗费大量的资源,保证系统的健壮性。

三种类型的使用方式本文不做介绍,可以在官方文档查询。

现在,需要尽快回复业务。经业务沟通后,将按照以下流程恢复服务:

  1. 清理 mutations
  2. 更新表引擎
  3. 启动服务
  4. 验证解决

1. 清理 mutations

我们选择整个集群 23805 个 mutations 通过 kill mutation 的方式“杀掉”。然后尽快修改表引擎类型,回复业务使用。

-- kill 掉未完成的 mutation
KILL MUTATION WHERE database = 'default' AND table = 'table'

2. 更新表引擎

三种表引擎有多种优化方式,这里演示 ReplacingMergeTree 的一种。

准备数据库
--  创建 ReplacingMergeTree 表
CREATE TABLE hackernews_rmt (
    id UInt32,
    author String,
    comment String,
    views UInt64
)
ENGINE = ReplacingMergeTree
PRIMARY KEY (author, id)

-- 插入两行数据
INSERT INTO hackernews_rmt VALUES
   (1, 'ricardo', 'This is post #1', 0),
   (2, 'ch_fan', 'This is post #2', 0)

-- 在插入两行数据
INSERT INTO hackernews_rmt VALUES
   (1, 'ricardo', 'This is post #1', 100),
   (2, 'ch_fan', 'This is post #2', 200)

经过查询,表里面存在 4 行数据。建表的时候主键是authorid,当没有指定 ORDER BY 的时候,和主键一致。

现在使用 final 查询,如果排序键相同(在这里是 id,author)会自动选择最新的插入的数据。

然后当我们使用 optimize 进行分区合并的时候,会直接删除旧数据保留新数据。合并是 ClickHouse 系统自动判断,无需手工处理,这里是为了演示手工执行了 optimize 的效果。

我们使用以上方式进行表引擎更改优化,优化后查询判断是否产生新的 mutations。

-- default 是集群名称,不是用户名称
SELECT count(*)
FROM clusterAllReplicas('default', system.mutations)
WHERE is_done = 0;

选择替换数据库引擎替换成 ReplacingMergeTree 后业务恢复正常,本次故障共造成业务暂停 30 分钟。

总结

  1. 及时监控,分析 mutations 的原因并根据业务需求进行分析和处理。
  2. 如果业务存在频繁的 UPDATE 或 DELETE 操作产生大量 mutations,建议更换表引擎。
  3. 如果 mutations 是由于增加字段或列等操作产生的,可忽略第 2 条。

优化数据更新和删除策略: 设计数据更新和删除策略时,应考虑系统的承载能力和潜在的风险。优化业务逻辑来减少不必要的数据更新和删除操作,并在操作失败时采取更合理的重试策略,如果是少量或者偶尔的删除可以使用 ClickHouse 轻量级删除(Lightweight Deletes)。

后记:经过该解决方案处理后,至今已稳定运行 4 个月。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

✨ Github:https://github.com/actiontech/sqle

📚 文档:https://actiontech.github.io/sqle-docs/

💻 官网:https://opensource.actionsky.com/sqle/

👥 微信群:请添加小助手加入 ActionOpenSource

🔗 商业支持:https://www.actionsky.com/sqle

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1910824.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【问题记录】VsCode中以管理员权限运行Powershell

问题展示 今天在尝试运行nodemon命令的时候出问题,显示没法识别,经过分析发现是管理员权限的问题,由于是在vscode里面进行开发,因此特此进行配置。 方法一 直接在vscode命令行中输入如下命令: Start-Process powers…

MySQL--视图和用户管理

视图 这里的视图跟之前事务里面的read view没有任何关系。 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会影响到视图。 创建视图 create view 视…

最新盘点!2024年最好用的十大仓储管理系统(WMS)

深度盘点2024年十大仓鼠管理系统管理系统:简道云、伙伴云、百数、吉客云、旺店通、通天晓、富勒、万里牛、鼎捷、Arpa。 WMS系统(Warehouse Management System),指的是仓库管理系统,是一种用于优化仓库运营、提高存储…

智能猫砂盆不好用?三款热门智能猫砂盆推荐!

为什么现在那么多人会淘汰掉普通的猫砂盆,转而去购买智能猫砂盆呢?因为智能猫砂盆的自动铲屎功能是真的香啊,有智能猫砂盆在,就不用每天都自己去铲屎了,我只需要隔三四天去清理一下集便仓就好了,对于我们这…

优质可视化大屏模板+动态图表+科技感原件等

优质可视化大屏模板动态图表科技感原件等 软件版本:Axure RP 9 作品类型:高保真 作品内容: 1、大屏可视化模版(100套):包含智慧城市、智慧社区、智慧园区、智慧农业、智慧水务、智慧警务、城市交通、电…

SpringBoot日常:@Scheduled实现服务启动时执行一次

文章目录 一、Scheduled详解二、逻辑实现1、创建定时任务逻辑方法2、新建一个启动执行类 三、测试结果 说到定时任务,我们应该会想起Scheduled,Quartz以及XXL-JOB,但是有的单体服务或者小项目,为了方便快捷,可能会直接…

充电宝哪个牌子公认质量好?哪家充电宝好用?4款口碑好充电宝

在如今这个电子设备不离手的时代,充电宝成为了我们生活中的必备品。然而,面对市场上琳琅满目的充电宝品牌和型号,选择一款质量可靠、性能出色的充电宝并非易事。大家都在问:充电宝哪个牌子公认质量好?哪家充电宝好用&a…

Java面试八股之MySQL索引B+树、全文索引、哈希索引

MySQL索引B树、全文索引、哈希索引 注意:B树中B不是代表二叉树(binary),而是代表平衡(balance),因为B树是从最早的平衡二叉树演化而来,但是B树不是一个二叉树。 B树的高度一般在2~…

uniapp——银行卡号脱敏

样式 代码 {{bankNumber.replace(/(\d{4})(?\d)/g, "●●●● ").replace(/(\d{2})(?\d{2}$)/, " $1")}} 将银行卡号按照每四位一组的方式进行处理,前面的变成 剩下的正常显示

JustAuth实现多个钉钉扫码登录

需求: 实现多个钉钉组织的用户绑定和扫码登录。 JustAuth框架实现钉钉扫码登录用到的dingTalk接口: https://oapi.dingtalk.com/connect/qrconnecthttps://oapi.dingtalk.com/connect/oauth2/sns_authorize根据sns临时授权码获取用户信息 https://oap…

websockt初始化,创建一个webSocket示例

写文思路: 以下主要从几个方面着手写websocket相关,包括以下:什么是webSocket,webSocket的优点和劣势,webSocket工作原理,webSocket握手示例,如何使用webSocket(使用webSocket的一个示例)&#…

进度条提示-在python程序中使用避免我误以为挂掉了

使用库tqdm 你还可以手写一点,反正只要是输出点什么东西都可以; Demo from chatgpt import time from tqdm import tqdm# 示例函数,模拟长时间运行的任务 def long_running_task():total_steps 100for step in tqdm(range(total_steps), …

平安养老险安徽分公司“7·8保险宣传”走进企业

近日,平安养老保险股份有限公司(以下简称“平安养老险”)安徽分公司以“78全国公众宣传日”“保险,让每一步前行更有底气”为主题,走进某大型企业开展消费者权益保护专题教育宣传活动。 本次活动旨在向企业员工普及金…

【AI技术的未来之路】从模型到应用,跨越超级应用陷阱,迈向个性化智能体

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《热点时事》 期待您的关注 ​ 目录 引言 一、AI技术应用场景探索: 二、避免超级应用陷阱的策略: 三、个…

windows驱动开发基础-环境篇

前言 Windows上无论是用户模式下还是内核模式下,有关驱动的开发都有可能影响系统稳定性,所以我们首先要准备一个专用的测试环境,可以使用VM等虚拟机方便环境修复和还原 测试模式 开启测试模式:cmd 命令 bcdedit /set testsign…

Websocket 替代方案:如何使用 Firestore 监听实时事件

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 ​在现代 Web 开发中,实时更新功能对于许多应用程序(如聊天应用、协作工具和在线游戏)都是必不可少的。虽然 WebSocket 是一种常用的实时通信技术,但 Google 的 Firestore 也提供了一种强大的替代方案,使得实时监听变得…

苍穹外卖前后端搭建

文章目录 参考开发环境搭建前端环境搭建1、 前端工程基于 nginx2、启动nginx,访问测试后端环境搭建1、从资料中找到后端初始工程:2、用 IDEA 打开初始工程,了解项目的整体结构:数据库环境搭建前后端联调nginx反向代理和负载均衡1、nginx反向代理2、nginx 负载均衡完善登录功…

线程交互现象

线程交互现象 小明对自家的狗子有个规定,就是在狗狗还没吃完的时候,可以继续给他加饭 不好的解决方式 狗狗感觉一千年没吃饭了,狼吞虎咽起来,最后饭只剩下最后一点点,吃饭线程中使用while循环判断是否是1,…

数字人直播时代来了!数字人直播系统搭建,AI虚拟数字人直播系统源码部署

数字人直播系统这是一种利用人工智能技术,实现自动化生成真实人物直播销售商品的综合性解决方案。 一、目前数字人直播支持的平台: 抖音、快手、视频号、小红书、淘宝、支付宝生活号、TikTok、阿里国际站等。 技术栈 数据库:mysql5.7 技术搭…

第一个ffmpeg程序

在进行使用ffmpeg进行编写程序时,首先要记得进行注册设备(avdevice_register_all ),程序运行时,只需要注册一次就可以 avdevice_register_all 是 FFmpeg 多媒体处理库中的一个函数,其作用是注册所有可用的音…