当前位置: 首页 > article >正文

从一次线上故障复盘:我是如何用Ceph的PG状态和CRUSH规则定位数据迁移问题的

从一次线上故障复盘我是如何用Ceph的PG状态和CRUSH规则定位数据迁移问题的凌晨3点17分监控系统突然弹出一连串告警——集群IOPS跌至正常值的30%部分业务请求开始超时。作为值班工程师我立即登录Ceph集群查看状态发现三个OSD节点因机架电源故障被标记为down状态。这本应是分布式存储系统常见的硬件故障场景但异常在于数据恢复进度条像被冻住一般整整两小时仅完成12%的迁移量。这次故障排查让我对Ceph的PG状态机与CRUSH规则有了更深刻的理解也总结出一套高效的问题定位方法论。1. 从现象到本质故障排查的黄金四步法1.1 第一步锁定异常PG状态当OSD下线触发数据迁移时首先需要确认受影响PG的当前状态。通过以下命令快速获取关键信息ceph pg dump | jq .pg_stats[] | select(.state | contains(degraded))在我的案例中输出显示大量PG同时处于activedegradedrecovering状态其中recovering表示集群正在尝试增量恢复数据。但令人警惕的是部分PG的last_update时间戳显示恢复操作已停滞超过90分钟。关键观察点正常恢复场景下PG状态应快速从degraded过渡到recovering再到activeclean。长期卡在recovering状态往往意味着底层存在瓶颈。1.2 第二步绘制CRUSH拓扑关系图通过ceph osd tree命令发现三个故障OSDosd.12/15/18均位于机架B。进一步检查CRUSH规则时发现了关键线索ceph osd getcrushmap -o crushmap.txt crushtool -d crushmap.txt -o crushmap-decompiled.txt规则配置显示当前pool使用的故障域是host级别而这三个OSD恰好在同一台物理主机上。这意味着单点瓶颈所有恢复流量都集中通过该主机剩余的一个健康OSDosd.19带宽争用osd.19同时承担正常业务IO和恢复流量形成资源死锁1.3 第三步量化恢复性能瓶颈使用ceph daemon osd.id perf dump获取各OSD的实时性能指标重点关注恢复线程队列recovery_ops值持续高于50表示处理能力不足网络吞吐recovery_bytes与recovery_ops比值异常正常应≈4MB/op磁盘延迟apply_latency_ms大于200ms说明存储介质过载在我的场景中osd.19的recovery_ops长期维持在80而recovery_bytes仅1.2MB/op表明小文件恢复导致吞吐效率低下。1.4 第四步动态调整恢复策略基于上述发现立即执行以下优化措施# 临时降低恢复并发度 ceph tell osd.* injectargs --osd-recovery-max-active 3 # 提升大块恢复优先级 ceph tell osd.* injectargs --osd-recovery-op-priority 3 # 限制恢复带宽 ceph tell osd.* injectargs --osd-recovery-max-single-start 1M调整后通过ceph -w观察恢复速率从2MB/s提升到45MB/sPG状态开始有序迁移。2. CRUSH规则设计的防坑指南2.1 故障域配置的黄金法则通过这次事故我总结了CRUSH规则设计的三个核心原则原则错误示例正确实践故障域隔离同一机柜所有OSD设为host级跨机架设置为rack级恢复路径分散所有副本集中在同交换机下副本分布在不同TOR交换机容量均衡预留OSD权重差异超过30%权重差控制在±10%以内特别需要注意的是当使用EC池时故障域必须大于EC KM的配置。例如EC 42策略要求故障域至少为rack级别。2.2 PG数量计算的实战公式原始问题中PG数量设置不合理也是恢复缓慢的潜在因素。这里分享我的计算公式Total_PGs (OSD_Count × 100) / Replica_Count × Pool_Weight例如对于120个OSD副本数3该pool权重占比40%则合理PG数量为(120×100)/3×0.41600向上取整为2048。可通过以下命令验证分布均衡性ceph pg dump | awk /^[0-9]\.[0-9a-f]/ {pg$1; osds$15} END { split(osds, arr, ,) for(i in arr) count[arr[i]] for(osd in count) print osd, count[osd] }理想情况下各OSD的PG数量差异应小于15%。3. 高级调试技巧深入PG状态机3.1 解读PG状态转换日志通过提高debug级别获取详细状态转换信息ceph tell osd.0 injectargs --debug-osd 20 ceph log last 1000 | grep pg_state典型的状态流转路径应为creating → peering → active → activeclean ↘ degraded → recovering → activeclean ↘ backfilling → activeclean若发现状态在recovering与backfilling间反复切换往往意味着存在底层存储介质故障通过smartctl验证网络闪断检查ifconfig的error/drop计数CRUSH规则冲突使用crushtool --test验证3.2 人工干预PG恢复流程当自动恢复失败时可手动触发特定PG的重建# 强制重新执行peering ceph pg force_create_pg pg_id # 重置PG状态机 ceph pg pg_id mark_unfound_lost revert危险操作预警这些命令可能导致数据不一致必须提前确认该PG无最新写入请求。4. 构建预防性监控体系4.1 关键指标告警阈值根据实战经验推荐设置以下监控项PG状态异常activeclean占比95%持续5分钟恢复滞后recovering状态PG超过总数的10%OSD负载不均最忙与最闲OSD的op/s差异3倍CRUSH分布偏离任一OSD的PG数量偏离均值20%4.2 自动化修复工作流通过以下脚本实现智能恢复需配合Prometheus Alertmanager#!/usr/bin/env python3 import subprocess import json def auto_recovery(): # 获取异常PG列表 pgs json.loads(subprocess.check_output( ceph pg dump_json | jq .pg_stats[] | select(.state!\activeclean\), shellTrue)) for pg in pgs: if recovering in pg[state]: # 检查是否卡住 if pg[last_update] (time.time() - 3600): osd_id pg[acting_primary] # 动态调整该OSD的恢复权重 subprocess.run(fceph tell osd.{osd_id} injectargs --osd-recovery-max-active 1, shellTrue)这套体系上线后类似故障的平均恢复时间从4.2小时缩短至27分钟。最深刻的教训是分布式存储系统的稳定性不仅取决于硬件冗余更在于对数据分布算法和状态机的精准掌控。每次故障都是一次学习机会而真正的专业价值就体现在将这些经验转化为可复用的知识体系。

相关文章:

从一次线上故障复盘:我是如何用Ceph的PG状态和CRUSH规则定位数据迁移问题的

从一次线上故障复盘:我是如何用Ceph的PG状态和CRUSH规则定位数据迁移问题的 凌晨3点17分,监控系统突然弹出一连串告警——集群IOPS跌至正常值的30%,部分业务请求开始超时。作为值班工程师,我立即登录Ceph集群查看状态&#xff0c…...

[进阶配置] 从零到一:Windows 10 上 WSL2 的完整配置与优化指南

1. WSL2环境准备与基础安装 第一次接触WSL2的朋友可能会觉得有点懵,其实它就是Windows系统里内置的一个Linux运行环境。相比传统虚拟机,WSL2性能更好、资源占用更低,特别适合开发者使用。我自己从WSL1用到WSL2,实测开发效率提升了…...

5步精通ruoyi-vue-pro邮件系统:从模板化发送到全链路监控的实战指南

5步精通ruoyi-vue-pro邮件系统:从模板化发送到全链路监控的实战指南 【免费下载链接】ruoyi-vue-pro 🔥 官方推荐 🔥 RuoYi-Vue 全新 Pro 版本,优化重构所有功能。基于 Spring Boot MyBatis Plus Vue & Element 实现的后台管…...

遥感领域研究生投稿指南:如何根据2021-2022年JCR/中科院分区快速锁定目标期刊

遥感领域研究生投稿指南:数据驱动的期刊选择策略 第一次投稿就像在陌生的城市找路——手里有地图,但每条街看起来都差不多。去年这个时候,我盯着二十多个遥感期刊的分区数据发愁,直到导师点醒我:"分区不是用来膜…...

CI/CD质量门禁(Quality Gate)介绍(指代码进入下一阶段(如合并到主分支、发布到生产环境)前,必须满足的一组自动化质量检查标准)

文章目录什么是质量门禁(Quality Gate)?一文讲清 CI/CD 中的“最后一道防线”一、质量门禁是什么?二、为什么需要质量门禁?三、质量门禁通常检查什么?1. 构建与测试2. 代码质量(静态分析&#x…...

SENT vs PWM vs CAN:为你的汽车电子项目选对通信协议(成本/速度/复杂度全对比)

SENT vs PWM vs CAN:为你的汽车电子项目选对通信协议(成本/速度/复杂度全对比) 在汽车电子系统的设计中,选择合适的通信协议往往决定了项目的成败。面对SENT、PWM、CAN等不同方案,工程师需要在成本、速度、抗干扰性和实…...

可观测性Observability三大支柱:指标Metrics、日志Logs、追踪Trace介绍(通过系统外部输出,推断系统内部状态能力)全链路路径、Span跨度、OpenTelemetry、性能监控

文章目录可观测性三大支柱:Metrics、Logs、Traces 全面解析一、什么是可观测性?二、Metrics(指标):系统“体征”1. 什么是 Metrics?2. Metrics 的特点3. 常见类型4. 使用场景5. 示例三、Logs(日…...

告别机械音:用Android TTS API实现更自然的语音播报(调整语速、音调与实时回调实战)

告别机械音:用Android TTS API实现更自然的语音播报(调整语速、音调与实时回调实战) 有声阅读类App的用户反馈中,"语音生硬"是最常见的问题之一。当一位儿童教育产品的开发者告诉我,他们的用户抱怨"故事…...

别再手动导数据了!用Kettle从API接口自动同步数据到MySQL的保姆级教程

别再手动导数据了!用Kettle从API接口自动同步数据到MySQL的保姆级教程 每周五下午,销售部门的王经理总会准时出现在IT部门门口,手里拿着一份Excel表格:"小李,这是本周CRM系统的新增客户数据,麻烦导入到…...

【技术底稿 18】FTP 文件处理 + LibreOffice Word 转 PDF 在线预览 + 集群乱码终极排查全记录

一、前言 本文为生产环境实战复盘技术底稿,聚焦后端通用文件处理场景,完整实现基于 LibreOffice 的 Word 转 PDF 在线预览接口。全文完整复盘 FTP 底层连接污染问题、分布式集群交替乱码玄学问题,沉淀可复用的生产开发规范与运维经验&#x…...

避坑指南:RH850 SPI DMA配置中PEG权限和InterDataTime那些事儿,你踩雷了吗?

RH850 SPI DMA实战避坑:PEG权限与InterDataTime的深度解析 实验室里,示波器上的SPI波形突然停滞,工程师盯着屏幕上的异常数据陷入沉思——这已经是本周第三次遇到DMA传输失败的问题了。RH850的SPI DMA配置看似简单,但PEG权限设置不…...

Blender骨骼命名太乱?手把手教你自定义Auto IK Rigger的JSON配置,适配任何骨架

Blender骨骼命名太乱?手把手教你自定义Auto IK Rigger的JSON配置,适配任何骨架 在三维角色动画制作中,骨骼绑定是最耗时的环节之一。不同软件、不同团队甚至不同项目都可能采用完全不同的骨骼命名规则,这给跨平台协作和插件使用带…...

Windows 11 LTSC 24H2如何恢复微软商店?3分钟一键安装完整指南

Windows 11 LTSC 24H2如何恢复微软商店?3分钟一键安装完整指南 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore 你是否在使用Windows 11 LT…...

告别龟速:最新版cnpm淘宝镜像配置全攻略(单次/永久/场景化指南)

1. 为什么你需要淘宝镜像? 如果你经常使用npm安装前端依赖,大概率遇到过这样的场景:盯着命令行界面,看着进度条像蜗牛一样缓慢前进,甚至时不时卡住报错。这种情况在国内开发者中非常普遍,因为npm默认的仓库…...

七大排序算法终极速查手册

一、先回顾:我们学过哪些排序?从 day21~day23 学了 7 种排序,分为两类:O (n) 简单排序冒泡排序选择排序插入排序O (n log n) 高效排序希尔排序快速排序归并排序堆排序二、一张表记住所有排序(面试必背&…...

结构体入门:高效封装数据的利器

一、什么是结构体?结构体是用户自定义的数据类型可以把多个不同类型的变量打包在一起用来描述一个完整的对象:学生、员工、点、书籍、游戏角色等比如一个学生包含:学号(int)、姓名(string)、年龄…...

你的 Vue v-model,VuReact 会编译成什么样的 React 代码?

VuReact 是一个能将 Vue 3 代码编译为标准、可维护 React 代码的工具。今天就带大家直击核心:Vue 中常见的 v-model 指令经过 VuReact 编译后会变成什么样的 React 代码? 前置约定 为避免示例代码冗余导致理解偏差,先明确两个小约定&#x…...

Android视频压缩终极指南:使用VideoCompressor释放手机存储空间

Android视频压缩终极指南:使用VideoCompressor释放手机存储空间 【免费下载链接】VideoCompressor A High-performance video compressor for Android using Hardware decoding and encoding API(MediaCodec). 项目地址: https://gitcode.com/gh_mirrors/vi/Video…...

Ostrakon-VL-8B实战体验:上传店铺图片,AI自动分析商品陈列与卫生合规

Ostrakon-VL-8B实战体验:上传店铺图片,AI自动分析商品陈列与卫生合规 1. 为什么选择Ostrakon-VL-8B进行店铺分析 在零售和餐饮行业,店铺的商品陈列和卫生合规检查是日常运营中不可或缺的环节。传统方式需要管理人员亲临现场,耗时…...

从单根谱线到频谱搬移:用Matlab的fft/pspectrum搞懂实信号与复信号频谱差异

从单根谱线到频谱搬移:用Matlab的fft/pspectrum搞懂实信号与复信号频谱差异 第一次用Matlab的fft函数画正弦信号频谱时,我盯着屏幕上对称的两根谱线愣了半天——明明只生成了一个频率的正弦波,为什么会出现两根线?直到后来接触复信…...

别再折腾CUDA了!用Anaconda给集成显卡(集显)5分钟搞定PyTorch CPU版(附Pycharm环境配置)

集成显卡用户5分钟极速搭建PyTorch开发环境指南 深度学习入门时最令人头疼的往往不是算法本身,而是复杂的环境配置。许多教程一上来就要求配置CUDA和cuDNN,让使用集成显卡的开发者望而却步。实际上,对于大多数学习和小型项目开发场景&#x…...

如何用开源工具彻底解决Windows C盘空间危机:Windows Cleaner完整指南

如何用开源工具彻底解决Windows C盘空间危机:Windows Cleaner完整指南 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否曾经因为C盘爆红而感到焦…...

从光谱分析到过程监控:偏最小二乘(PLS)在工业领域的实战避坑指南

从光谱分析到过程监控:偏最小二乘(PLS)在工业领域的实战避坑指南 在制药厂的质量控制实验室里,近红外光谱仪正快速扫描着流水线上的药片。数百个波长数据在屏幕上闪烁,而工程师需要从中准确预测活性成分含量——这正是偏最小二乘回归(PLS)大显…...

OpenMV传感器配置避坑指南:从sensor.reset()到find_blobs()的完整流程

OpenMV传感器配置避坑指南:从sensor.reset()到find_blobs()的完整流程 刚接触OpenMV的开发者常常会遇到这样的困惑:为什么同样的代码在不同环境下运行效果差异巨大?为什么颜色识别在实验室表现良好,到了实际场景却频频出错&#…...

LaTeX表格总是不听话?用[h]参数让它乖乖待在原地(附完整代码示例)

LaTeX表格浮动问题终极指南:精准控制表格位置的7种实战技巧 第一次用LaTeX写论文时,我盯着那个莫名其妙跑到页面顶端的表格整整发呆了十分钟——明明代码里它乖乖待在文字下方,编译后却像长了腿一样自己跑到了前面。这种"表格不听话&quo…...

从理想模型到宇宙熔炉:为何恒星光谱能近似为黑体辐射?

1. 黑体辐射:理解宇宙的钥匙 想象一下你正在观察一块烧红的铁块。随着温度升高,铁块的颜色会从暗红变成橙黄,最后呈现白炽状态。这种颜色变化背后隐藏着一个深刻的物理规律——黑体辐射。黑体辐射不仅是理解恒星发光机制的基础,更…...

FPGA新手避坑指南:Vivado MIG IP核配置DDR4时,这5个参数千万别乱动

FPGA开发实战:Vivado MIG IP核配置DDR4的10个关键参数解析 第一次打开Vivado的MIG IP核配置向导时,面对密密麻麻的参数选项,大多数FPGA工程师都会感到头皮发麻。特别是当项目进度紧迫,而DDR4接口又迟迟无法正常工作时,…...

PySpark实战:从版本冲突到精准匹配Python的避坑指南

1. 当PySpark遇上Python版本冲突:一个真实运维案例 去年接手公司大数据平台时,我遇到了一个典型问题:开发团队提交的PySpark作业频繁报错,错误信息五花八门,从"ImportError: cannot import name xxx"到"…...

终极SI4735 Arduino收音机开发实战:从零构建你的数字广播接收系统

终极SI4735 Arduino收音机开发实战:从零构建你的数字广播接收系统 【免费下载链接】SI4735 SI473X Library for Arduino 项目地址: https://gitcode.com/gh_mirrors/si/SI4735 在物联网和智能硬件快速发展的今天,如何快速搭建一个功能全面的广播接…...

别再只数连接数了!用Python的NetworkX库实战四大图中心性算法(附代码与可视化)

用Python实战四大图中心性算法:从社交网络分析到关键节点挖掘 当你面对一份社交网络数据时,是否曾好奇过:哪些用户才是真正的影响力中心?传统方法可能只关注"谁认识的人多",但现实情况往往复杂得多。本文将带…...