有云存储团队公布 Ceph 中最严重数据不一致 BUG!

简介:

触发场景

目前,块存储服务是Ceph存储中被使用的最普遍的服务之一,通过块存储服务,可以向客户端以使用块设备一样访问Ceph集群。然而,目前在使用块存储服务时,尤其是OpenStack与Ceph对接时,如果没有严格的控制Ceph端的对象大小(使用 >= 8MB对象时),将有可能导致严重的数据不一致情况,该异常由于XFS文件系统本身对Fiemap的支持特性导致的。

XFS使用fiemap时,当extents数量大于1364时,通过ioctl的FS_IOC_FIEMAP接口,获取的extents数量上限为1364,导致超出部分extents数据获取不到。这将导致,在开启fiemap时,Ceph集群进行recovery与backfill之后,产生大量数据不一致的情况,也是迄今为止Ceph中影响最大的,最严重的数据不一致BUG。

由于fiemap BUG,碎片化对象在recovery与backfill之后(fiemap 获取不正确的数据),从而使的恢复的对象数据与原对象数据不一致。而恢复后的副本若成为主副本,则可能发生静默读错误,并且如果使用Ceph策略自动修复对象(repair object之后),可能将错误数据覆盖至正确数据,数据将永远损毁。在某些情况下,还会触发对象永远处于inconsistent状态。

复现方式

初始化大量extents碎片文件test,使其成为一个拥有3999个extents的碎片文件。

通过fiemap系统调用,获取这些extents
image

编译g++ do_fiemap.cc -o do_fiemap

通过该程序可以打印出可以获取的到fiemap extents, do_fiemap test,通过xfs_bmap test 打印出真正的extents数量后,进行比较。

image

可以看到,我们最先写了2000个extents,并通过xfs_bmap获取到了 2000个有内容的extents,但是通过fiemap系统调用,只获取到了1364个有数据的extents,所以在ceph中使用fiemap系统调用在某些情况下导致数据一致性BUG。

修复方案
1)目前,在使用块存储使用场景时,通常情况下,默认使用4MB对象。在无特殊情况下,不用使用大于4MB 对象的RBD 镜像。

2)在I版以后,通过新的系统调用,seek_data, seek_hole,可以避免触发该BUG,防止extents过多时使用fiemap调用产生的问题

image

这组系统调用,可以让使用者通过while循环,反复的发现文件中的data 与 hole,从而组织出一个文件中真正存在的数据,能够避免产生与fiemap系统调用类似的BUG,又保证了recovery或者clone时候只复制有用数据,而反复的系统调,应该会带来一定性能上的影响,请读者们自行测试。

目前,在I版本以后的ceph中,提供参数filestore_seek_data_hole,来启用该功能。当filestore_seek_data_hole 与 filestore_fiemap同时设置时,只用文件系统支持seek_data_hole,那么就会先通过seek_data_hole方式来获取文件的extents,所以在I版本以后的ceph中,应启用filestore_seek_data_hole功能来替代filestore_fiemap 功能。

3)对于已经使用8MB,16MB 甚至更大对象大小的RBD镜像,请暂时设置禁用Fiemap功能,并等待后续版本修复。

文章转载自 开源中国社区 [http://www.oschina.net]

目录
相关文章
|
存储 缓存 监控
安谋科技(Arm China)马闯:Arm架构下性能分析与优化介绍
2023年9月19日,系列课程第九节《Arm®架构下性能分析与优化介绍》正式上线,由安谋科技 (Arm China)主任工程师马闯主讲,内容涵盖:Arm架构下性能监控单元 (PMU) 介绍、Arm统计性能分析扩展 (SPE) 介绍、Arm性能分析工具介绍、Arm架构下性能优化案例分享,本期节目在阿里云官网、阿里云微信视频号、阿里云钉钉视频号、InfoQ官网、阿里云开发者微信视频号、阿里云创新中心直播平台 & 微信视频号同步播出,同时可以点击【https://developer.aliyun.com/topic/ecs-yitian】进入【倚天实例迁移课程官网】了解更多内容。
|
Linux
Win或Linux系统下用conda安装Open Babel
Win或Linux系统下用conda安装Open Babel
2256 0
Win或Linux系统下用conda安装Open Babel
|
6月前
|
存储 运维 监控
确定Ceph集群中OSD组件与具体物理磁盘的关联。
总结来说,确定Ceph集群中OSD与具体物理磁盘的关联需要搜集和对比Ceph集群的配置信息、OSD元数据、物理磁盘的详细信息,以及运行时的系统日志。这对于Ceph存储集群的维护和问题诊断至关重要,也有助于进行正常的运维活动,如扩容、升级或替换硬件。通过上述步骤,管理员可以直观且高效地管理和定位Ceph集群中的存储资源。
343 15
|
Kubernetes 前端开发 分布式数据库
工作中常见的软件系统部署架构
在实际应用中,会根据项目的具体需求、规模、性能要求等因素选择合适的部署架构,或者综合使用多种架构模式来构建稳定、高效、可扩展的系统。
1051 2
|
存储 缓存 网络协议
深入理解Linux网络——内核是如何发送网络包的
一、相关实际问题 1. 查看内核发送数据消耗的CPU时应该看sy还是si 2. 在服务器上查看/proc/softirqs,为什么NET_RX要比NET_TX大得多 3. 发送网络数据的时候都涉及那些内存拷贝操作 4. 零拷贝到底是怎么回事 5. 为什么Kafka的网络性能很突出
|
JavaScript 前端开发 API
Vue 3新特性详解:Composition API的威力
【10月更文挑战第25天】Vue 3 引入的 Composition API 是一组用于组织和复用组件逻辑的新 API。相比 Options API,它提供了更灵活的结构,便于逻辑复用和代码组织,特别适合复杂组件。本文将探讨 Composition API 的优势,并通过示例代码展示其基本用法,帮助开发者更好地理解和应用这一强大工具。
288 2
|
存储 分布式计算 安全
HDFS分布式文件系统架构原理详解
HDFS(Hadoop Distributed File System)是Hadoop核心组成之一,是分布式计算中数据存储管理的基础,被设计成适合运行在通用硬件上的分布式文件系统。HDFS架构中有两类节点,一类是NameNode,又叫“元数据节点”,另一类是DataNode,又叫“数据节点”,分别执行Master和Worker的具体任务。HDFS是一个(Master/Slave)体系结构,“一次写入,多次读取”。HDFS的设计思想:分而治之—将大文件、大批量文件分布式存放在大量独立的机器上。
HDFS分布式文件系统架构原理详解
|
缓存 网络协议 Unix
程序员超实用的文件系统性能评测工具盘点
程序员超实用的文件系统性能评测工具盘点
|
人工智能 监控 测试技术
|
定位技术 API
GIS开发:自定义坐标系的地图
GIS开发:自定义坐标系的地图
299 0