一个 Clickhouse 集群磁盘损坏恢复数据的案例

news2024/11/19 9:26:36

通过一个故障案例,理解 ClickHouse 分布式机制。

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

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

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

业务场景

在日常运维的某个系统下,有一套 4 分片 3 副本的高可用分布式的 ClickHouse 集群。当前分片的每个节点的数据量为 5.6TB。

故障背景

监控发现其中的一个节点无法使用,后续排查发现 5 块磁盘已经损坏,Raid10 也无法保证数据完整,导致数据目录全部重新换成新的磁盘,而且使用的是传统机械盘,速度慢。现在联系厂商更换磁盘,需要停用此节点,等厂商更换完毕之后,需要配合恢复数据。

恢复思路

ClickHouse 的集群是一个分布式的集群,每个分片的数据不同,所有分片的数据加起来才是一份完整的数据,每个分片副本的数据是相同的,这就是 ClickHouse 数据的高可用。

本次也是非常典型的故障,硬件做了 Raid10,但是 Raid10 磁盘基本上全部坏掉了,导致 Raid10 离线也无法使用,最后更换了所有的磁盘,导致整个数据目录变成了空的。

因为此副本为一个分片中的其中一个副本,还有其他两个副本在线,所以业务使用无影响,而且我们可以通过其他副本里面的数据开始恢复此副本的数据。

恢复的基本原理: 同一个分片里面 Zookeeper 路径相同的表,但是副本名不同。数据是会自动验证同步的,所以我们只需要重建表,并且保证 Zookeeper 地址一致,副本名不一致,就会自动开始同步数据,直到两个副本数据完全一致。

副本之间是如何同步数据的呢?

Zookeeper 里面存放了副本数据文件 parts 的路径。如果当前副本没有这些 parts 就会通过 Zookeeper 得到其他副本的 parts 路径,然后通过 9009 端口进行数据文件的传输,然后恢复数据。

如下是官方的原理图:

查看节点是否存在残留数据

  • clickhouse-1:同一个分片正常副本
  • clickhouse-2:坏掉的副本
shell> clickhouse-client --password
clickhouse-2> show databases;

经过确认无残留数据。

查看当前节点的副本

clickhouse-2>select * from system.clusters;

is_local 为 1 就是当前登录的节点。

恢复数据

因为旧节点磁盘损坏,所以需要在它的其他副本得到这些信息,然后到损坏的节点执行:

shell> clickhouse-client --password --host=xxx.xxx.77.30 --port=9000
clickhouse-1>select database,table,replica_is_active from system.replicas;

第三副本的表全部都无法访问。

导出清理 Zookeeper 元数据的 SQL 语句。

因为只是磁盘坏了,本地数据没有了,但是 Zookeeper 里面的数据还存在,如果不清理,重建表的时候会导致元数据冲突无法创建表。

创建清理 Zookeeper 元数据的 SQL 文件。

shell> vim clear_zk.sql

清理 Zookeeper 的元数据。

shell>  clickhouse-client --password --port 9000 --multiquery < clear_zk.sql 2&>1 clear.log7

导出表结构。

clickhouse-1>select   zookeeper_path ,create_table_query from  system.tables a right join system.replicas b on a.name=b.table where a.database  in ('xxx','xxx','xxx') ;

创建所有数据库。

clickhouse-2>create database xxx;

创建建表的 SQL 文件。

PS:要注意这个标红的一定要和 Zookeeper 元数据的地址一样,就是上面导出来的时候第一列就是 Zookeeper 的元数据的地址,一定要好好验证,有些客户建表是存在uuid的,如果存在uuid一定要比对保证地址一样不然无法恢复数据。

ReplicatedReplacingMergeTree('/clickhouse/tables/3/xxxx/xxxxx', '{replica}', created_time)

shell> vim init_table.sql

重建表并确认表是否同步数据。

shell>clickhouse-client --password --port 9000 --multiquery < init_table.sql

检查表的数据是否正确这里总共 22 张本地表,存于在 3 个库。

经过验证已经全部重建完毕,现在验证数据是否传输。

clickhouse-2>use database
clickhouse-2>select * from xxxx limit 5;

检查磁盘的同步情况。

shell>df -h

数据一直同步每分钟数据量大概 10GB 的速度同步回来。

恢复分布式总表

 shell>clickhouse-client --password --host=xxx.xxx.77.30 --port=9000
 clickhouse-1>select   create_table_query from  system.tables a  where a.database  in ('xxx','xxx','xxx') and engine='Distributed';

创建分布式表的初始化 SQL 文件。

 shell>vim init_d_table.sql

同步。

shell>clickhouse-client --password --port 9000 --multiquery < init_d_table.sql

检查分布式总表是否全部创建总共 22 张。

clickhouse-2>select  count(1) from  system.tables a  where a.database  in ('xxx','xxx','xxx') and engine='Distributed';

查询分布式总表看看是否有数据。

通过其他副本验证同步复制关系是否正常

shell>clickhouse-client --password --host=xxx.xxx.77.30 --port=9000
clickhouse-1>select database,table,replica_is_active from system.replicas;

已经通过验证所有表已经全部恢复同步。

总结与启示

本次 ClickHouse 数据恢复案例展示了以下具体技术关键点:

  1. 数据冗余备份:
    • 确保每个分片有多个副本,防止单点故障导致数据丢失。
  2. 掌握 ClickHouse 和 Zookeeper 同步机制:
    • 了解如何通过 Zookeeper 获取其他副本的 parts 路径,并使用端口 9009 进行数据传输恢复。
  3. 清理 Zookeeper 元数据:
    • 在磁盘损坏后,需清理 Zookeeper 中的元数据,以避免重建表时发生元数据冲突。
  4. 详细的恢复操作步骤:
    1. 导出表结构并创建数据库。
    2. 使用create_table_query重建表并确认数据同步。
    3. 检查磁盘同步情况,确保数据正确恢复。
  5. 持续监控与维护:
    • 定期检查系统状态,及时发现并解决潜在问题,确保系统高可用性。

这些经验和具体操作步骤能有效提高系统的可靠性和运维效率,增强应对突发故障的能力。

更多技术文章,请访问: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/1811668.html

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

相关文章

微信公众号(公众平台) 和 微信开放平台的scope的差异

微信公众号&#xff08;公众平台&#xff09; 和 微信开放平台 是两码事。 公众号&#xff08;公众平台&#xff09;获取的scope只包括两种&#xff1a;snsapi_base 和snsapi_userinfo&#xff0c;前者是静默获取&#xff0c;用户无感知&#xff1b;后者是需要用户确认同意的。…

anaconda安装和环境配置

文章目录 一、Anaconda下载1.从官网直接下载&#xff1a;2.从镜像站中下载&#xff1a; 二、Anaconda安装三、检测是否有Anaconda配置anaconda环境 四、 Anaconda创建多个python环境&#xff08;方便管理项目环境&#xff09;1.查看conda有哪些环境2.创建python3.6的环境3.激活…

写小红书文案一定要把情绪值拉满

写小红书文案一定要把情绪值拉满&#xff01;很多小伙伴不懂这句话的意思。 本文伯乐网络传媒将为你揭秘如何在小红书文案中&#xff0c;巧妙地运用情绪值&#xff0c;让每一个字都充满吸引力。 一、注意事项&#xff1a;真实与平衡的艺术 1. 保持文案的真实性&#xff0c;不…

五年跨境电商实战干货经验:爆品测出来的!

爆品确实是测出来的&#xff0c;不是单纯选出来的。我在亚马逊摸爬滚打了五年&#xff0c;深深感受到了“七分选品&#xff0c;三分运营”的重要性。不管你的产品图片、描述多么精美&#xff0c;如果不去精选和测试&#xff0c;很难保证能出单。我见过很多跨境新手在选品上卡了…

【html】如何利用HTML+CSS制作自己的印章

大家有没有尝试过用HTML和CSS制作自己的印章. 首先印章具有两个最基本的特点就是它是圆形的并且有边框 当然它还有一些其他的属性吗&#xff0c;废话不多说我们直接上源码&#xff1a; 效果图&#xff1a; 源码&#xff1a; html&#xff1a; <!DOCTYPE html> <h…

5.mongodb 备份与恢复

mongodb备份工具介绍&#xff1a; 1.mongoexport(备份)/mongoimport(恢复) mongoexport是MongoDB提供的一个工具&#xff0c;用于将数据从MongoDB实例导出到JSON或CSV格式的文件中&#xff0c;这个工具对于数据迁移、数据备份或者在不同的数据库之间同步数据非常有用 2.mongodu…

问题:关于醋酸钠的结构,下列说法错误的是() #媒体#媒体

问题&#xff1a;关于醋酸钠的结构&#xff0c;下列说法错误的是&#xff08;&#xff09; A&#xff0e;有极性键 B&#xff0e;有非极性键 C&#xff0e;是极性分子 D&#xff0e;是离子晶体 参考答案如图所示

【MySQL】复合查询+表的内外连接

复合查询表的内外连接 1.基本查询回顾2.多表查询3.自连接4.子查询4.1单列子查询4.2多列子查询 5.在from子句中使用子查询6.合并查询7.表的内连和外连7.1内连接7.2外连接7.2.1左外连接 7.2.2右外连接 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1…

mov怎么转换mp4?关于mov转成MP4的四种方法

mov怎么转换mp4&#xff1f;在当今数字化时代&#xff0c;视频文件的格式转换是日常生活和工作中经常遇到的需求之一。而将mov格式转换为MP4格式是其中一个常见的任务。mov是由苹果公司开发的一种视频文件格式&#xff0c;通常在Mac和iOS设备上使用&#xff0c;而MP4是一种广泛…

【建议收藏】阿里巴巴1688如何打造7星产品,发布技巧

很多1688新手在问怎么打造7星产品&#xff0c;阿里1688七星产品对店铺的权重有加持作用&#xff0c;刚出来我也觉得很难打造7星产品&#xff0c;经过研究发现只有掌握到技巧&#xff0c;7星&#xff0c;真是很简单&#xff01;今天对小白商友来说&#xff0c;7个发布优化技巧&a…

携程无感验证

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…

KVM虚拟化平台

KVM Dirver 虚拟机创建虚拟机内存分配虚拟CPU寄存器读写虚拟CPU运行 QEMU&#xff08;经过讲话与修改&#xff09; 模拟PC硬件的用户控件组件提供I/O设备模型及访问外设的途径 KVM工作原理 下载KVM需要的组件 yum -y install qemu-kvm yum -y install qemu-…

【数学】927. 三等分

本文涉及知识点 数学 LeetCode927. 三等分 给定一个由 0 和 1 组成的数组 arr &#xff0c;将数组分成 3 个非空的部分 &#xff0c;使得所有这些部分表示相同的二进制值。 如果可以做到&#xff0c;请返回任何 [i, j]&#xff0c;其中 i1 < j&#xff0c;这样一来&#…

芯世界技术有限公司:驱动全球芯片产业未来

在国家政策的强劲驱动下&#xff0c;科技创新如同新时代的璀璨明星&#xff0c;照亮了企业前行的道路。其中&#xff0c;香港创科作为由中华人民共和国和香港特别行政区共同设立的公共机构&#xff0c;承载着推动和支持本地科技企业发展的重要使命。这不仅仅是一个提供办公室、…

系统提示xlive.dll丢失有什么解决办法?详细解决办法介绍

如果你曾经在玩那些超酷的大型游戏时遇到过xlive.dll文件丢失的问题&#xff0c;那么你来对地方了&#xff01;这篇文章将带你一步步学习如何修复这个烦人的xlive.dll文件缺失问题。不仅如此&#xff0c;我们还会分享一些超级重要的注意事项&#xff0c;确保在修复过程中不会引…

你好,广州!6月15日,聚焦 PGConf.dev 2024 聊聊 IvorySQL 最新应用实践

「IvorySQL地区用户组」已在济南、成都、北京、南京等相继成立并成功举办多场线下技术沙龙&#xff0c;地区队伍在不断壮大&#xff0c;我们也很开心与社区伙伴们一起畅聊技术和开源文化&#xff0c;让更多优秀的小伙伴及其技术实践经验在社区中与大家分享。 广州&#xff1a;一…

PHP-CGI Windows平台远程代码执行漏洞(CVE-2024-4577)

文章目录 前言声明一、简介二、漏洞描述三、影响版本四、漏洞复现五、漏洞修复 前言 PHP 在设计时忽略 Windows 中对字符转换的Best-Fit 特性&#xff0c;当 PHP-CGI 运行在Window平台且使用了如下语系&#xff08;简体中文936/繁体中文950/日文932等&#xff09;时&#xff0…

2024泰迪智能科技大数据实训室方案

大数据实训室的主要目的是培养大数据平台运维项目的实践能力,以数据计算、分析、挖掘和可视化的案例训练为辅助。实训室旨在培养德智体全面发展、遵纪守法、掌握大数据平台运维基本技能、具备大数据应用、分析和系统管理与运维能力的高素质大数据技术人才。 大数据实训室建设的…

python之点云数据读取与可视化

1、前言 将文件中点云数据进行读取进来&#xff0c;并进行数据处理&#xff0c;将处理后的点云数据进行可视化显示&#xff0c;是非常常见的操作。本博客介绍如何将文本形式的点云数据读取进来&#xff0c;并进行可视化展示。 2、点云可视化 点云可视化即将点云数据在三维空间…

GIGE 协议摘录 —— GVSP 协议(三)

系列文章目录 GIGE 学习笔记 GIGE 协议摘录 —— 设备发现&#xff08;一&#xff09; GIGE 协议摘录 —— GVCP 协议&#xff08;二&#xff09; GIGE 协议摘录 —— GVSP 协议&#xff08;三&#xff09; GIGE 协议摘录 —— 引导寄存器&#xff08;四&#xff09; GIGE 协议…