一次调查centos 6.2上xfs文件系统宕机后文件数据丢失的经历

简介:

阿里云每天都会接到大量的客户工单,工单问题千奇百怪,不少问题调查起来颇费周折。下面的这个问题很有意思,一开始我们以为是ECS的bug,导致用户数据丢失,吓出一身冷汗,后来发现问题出在操作系统。一次次与底层系统的交手,慢慢的让阿里云的产品变得更加透明。

 
今天接到用户工单,反馈说他的云服务器发生了宕机迁移,奇怪的是迁移后部分文件长度变成0了,但是之前升级应用的时候确认过这些文件肯定是正常的。粗看现象确实比较奇怪,根据用户提供的操作,可以抽象为向xfs文件系统上写了一些文件数据,然后系统宕机。系统恢复后文件长度为0。 据此,我们编写了一个复现脚本程序来模拟此问题。脚 本如下:

 

#!/bin/bash

dst=${1}

for ((i=1;i<=10000;i++)); do tmpfile=${dst}/file.$(date ‘+%T’).${i} echo ${tmpfile} dd if=/dev/zero of=${tmpfile} bs=1M count=8 &>/dev/null
done
 

该脚本通过dd(1)命 令在 指定的目录下创建10000个8M大 小的文件用来模拟用户的行为。在centos 6.2上(2.6.32-220.23.1) 上运行此脚本:
 

$ ./xfs-bug.sh ${XFS_MNT} # XFS_MNT为xfs文 件系统的挂载点
 

在持续运行一段时间,比如拷贝到2000+个 文件的时候我们强制系统重启(sudo sh -c “echo b >/proc/sysrq-trigger”)。在 重启 后我们会看到如下结果:
 

$ ls -l ${XFS_MNT} | less
total 15785984
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:23 file.14:23:01.1
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:23 file.14:23:01.10
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:23 file.14:23:01.11

-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:24 file.14:24:35.1240
-rw-rw-r– 1 wenqing.lz wenqing.lz 45056 Mar 13 14:24 file.14:24:35.1241
-rw-rw-r– 1 wenqing.lz wenqing.lz 6373376 Mar 13 14:24 file.14:24:35.1242
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:24 file.14:24:35.1243
-rw-rw-r– 1 wenqing.lz wenqing.lz 6311936 Mar 13 14:24 file.14:24:35.1244

-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:24 file.14:24:42.1304
-rw-rw-r– 1 wenqing.lz wenqing.lz 28672 Mar 13 14:24 file.14:24:42.1305
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:24 file.14:24:42.1306
-rw-rw-r– 1 wenqing.lz wenqing.lz 77824 Mar 13 14:24 file.14:24:42.1307
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:24 file.14:24:42.1308
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:24 file.14:24:43.1309

-rw-rw-r– 1 wenqing.lz wenqing.lz 4198400 Mar 13 14:25 file.14:25:17.1596
-rw-rw-r– 1 wenqing.lz wenqing.lz 4198400 Mar 13 14:25 file.14:25:17.1597
-rw-rw-r– 1 wenqing.lz wenqing.lz 0 Mar 13 14:25 file.14:25:17.1598
-rw-rw-r– 1 wenqing.lz wenqing.lz 0 Mar 13 14:25 file.14:25:17.1599

-rw-rw-r– 1 wenqing.lz wenqing.lz 0 Mar 13 14:26 file.14:26:21.2146
-rw-rw-r– 1 wenqing.lz wenqing.lz 0 Mar 13 14:26 file.14:26:21.2147
-rw-rw-r– 1 wenqing.lz wenqing.lz 0 Mar 13 14:26 file.14:26:21.2148
-rw-rw-r– 1 wenqing.lz wenqing.lz 0 Mar 13 14:26 file.14:26:21.2149
 

可以看到,很多已经拷贝了2、3分钟的文件的文件长度是不正确的,而很多文件的长度均为0。这一结果是不符合预期的。即操作系统在 用户没有执行sync(1)命令的情况下,会默认将超过30s的脏数据写回磁盘。而这里很多长度不对的文件的创建时间已经超过这 一时 间。 说明此脚本可以基本复现用户的问题,并且2.6.32-220.23.1内核上的xfs确实存在缺陷。
 
根据搜索网上的相关信息,可以看到redhat针 对2.6.32-220内核上的xfs曾经修复过一个类似错误(http://rhn.redhat.com/errata/RHSA-2012-1401.html)。 我把相关说明粘贴在此:
 

* Under certain circumstances, a system crash could result in data loss on
XFS file systems. If files were created immediately before the file system
was left to idle for a long period of time and then the system crashed,
those files could appear as zero-length once the file system was remounted.
This occurred even if a sync or fsync was run on the files. This was
because XFS was not correctly idling the journal, and therefore it
incorrectly replayed the inode allocation transactions upon mounting after
the system crash, which zeroed the file size. This problem has been fixed
by re-instating the periodic journal idling logic to ensure that all
metadata is flushed within 30 seconds of modification, and the journal is
updated to prevent incorrect recovery operations from occurring.
(BZ#856685)

 
大意是说在某些特定条件下或者系统宕机后会造成xfs文件系统上文件数据的丢失(文件长度为0)。为了验证此问题是否在后续版本中 已经得到修复,我们测试了最新的2.6.32-358.14.1内核。重复同样的测试,我们得到了如下的 结 果:
 

$ ls -l ${XFS_MNT} | less
total 15982592
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:39 file.14:39:11.1
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:39 file.14:39:11.10
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:39 file.14:39:11.11

-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:40 file.14:40:16.1019
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:40 file.14:40:16.1020
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:40 file.14:40:16.1021
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:40 file.14:40:16.1022

-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:41 file.14:41:09.1513
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:41 file.14:41:09.1514
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:41 file.14:41:09.1515

-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:42 file.14:42:09.2067
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:42 file.14:42:09.2068
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:42 file.14:42:09.2069
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:42 file.14:42:09.2070

-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:42 file.14:42:22.2187
-rw-rw-r– 1 wenqing.lz wenqing.lz 8388608 Mar 13 14:42 file.14:42:22.2188
-rw-rw-r– 1 wenqing.lz wenqing.lz 0 Mar 13 14:42 file.14:42:22.2189
 

可以看到,只有最后一小部分文件的长度为0。 这一结果是符合预期的。可以说明在2.6.32-358内核中, 此问 题已经得到修复。 为了确认358内核上xfs确实修复了此问题,我们对比了358和220内 核的changlog。 对比中我们发现了几个和XFS相关的补丁。 这里一并列举出来:
 
xfs: log the inode in ->write_inode calls for kupdate
xfs: log all dirty inodes in xfs_fs_sync_fs
 

根据xfs邮件列表里的 记 录,这两个补丁是作为一个整体提交给社区的。我们知道Linux内 核 的脏数据回写是由内核 writeback机制来保证的。第 一个补丁 的作用是修复xfs在Linux内 核尝试回写超过30s的 脏数据时的一个bug。即在此补丁 之前,有可能在某些条件下xfs无法正确回写超过已经超过30s的 脏数据。此补丁是在xfs_fs_write_inode()函 数中 判 断wbc->for_kupdate变量。而这 一变量在Linux kernel尝试刷新超过30s脏 数据时会被置为1。 第二个补丁修复的则是由于Linux Kernel中writeback路 径的修改引起的xfs回写行为的不正常。根据描述,由于writeback路径的修改造成 older_than_this变量的检查更加严格,由此造成有可能被置脏的inode得不到回写。这里的 older_than_this恰恰是系统回写超过30s脏 数据时判断脏数据时间的标志。
 

综上可以基本确认这次用户文件数据在宕机后的丢失是由于xfs文件系统中的一个缺陷造成的。
 

(本文作者是阿里云核心系统团队的文卿。)

相关文章
|
1月前
|
Linux 应用服务中间件 nginx
【PUSDN】centos查看日志文件内容,包含某个关键字的前后5行日志内容,centos查看日志的几种方法
【PUSDN】centos查看日志文件内容,包含某个关键字的前后5行日志内容,centos查看日志的几种方法
45 0
|
6月前
|
JSON Linux 数据格式
百度搜索:蓝易云【Centos 7 通过 targz 文件安装 Elastic Search 服务教程!】
请注意,本教程提供了基本的安装步骤,并且可以根据实际需求进行定制和配置。如果需要更深入的了解和配置,请参考Elasticsearch官方文档或其他权威资源。
282 0
|
4月前
|
网络协议 Unix Linux
Centos下nfs+rpcbind实现服务器之间的文件共享
Centos下nfs+rpcbind实现服务器之间的文件共享
92 0
|
2月前
|
Java Shell Linux
解决 centos下执行sh文件报错“/bin/bash^M: 坏的解释器:没有那个文件或目录” 问题
解决 centos下执行sh文件报错“/bin/bash^M: 坏的解释器:没有那个文件或目录” 问题
|
Linux 测试技术 Docker
Linux系统:第十三章:centos误删文件如何恢复文件数据
Linux系统:第十三章:centos误删文件如何恢复文件数据
362 0
Linux系统:第十三章:centos误删文件如何恢复文件数据
|
存储 分布式计算 安全
VMware 安装CentOS7配置环境、安装虚拟机、选择cd/dvd的方式安装系统、系统安装引导界面、需要定制化的内容、配置磁盘分区、修改主机名、网络配置、修改windows的主机映射文件(host
调整时间差、安装GHOME(图形化界面的方式)注意图上标注的点击顺序、添加boot、添加swap交换分区、配置根(/)目录、编辑VMware的网络配置、Windows的网络配置、虚拟机网络IP修改地址配置、修改主机名和hosts文件、配置Linux克隆机主机名称映射hosts文件,打开/etc/hosts、关闭 kdump本身虚拟机内存就不够,他会吃掉一部分内存,我们尽量省一点、是否打开安全协议(开启与否都可以)、安装时间比较长大概需要10几分钟(设置root用户密码,一定要设置)、创建一个普通用户(可以不
VMware 安装CentOS7配置环境、安装虚拟机、选择cd/dvd的方式安装系统、系统安装引导界面、需要定制化的内容、配置磁盘分区、修改主机名、网络配置、修改windows的主机映射文件(host
|
8天前
|
网络协议 Linux 网络安全
centos7下最简单的 unison实现文件双向同步图文详解
centos7下最简单的 unison实现文件双向同步图文详解
10 0
|
2月前
|
Linux
centos7实现磁盘挂载,解挂,开机自动挂载,解决挂载文件覆盖问题
centos7实现磁盘挂载,解挂,开机自动挂载,解决挂载文件覆盖问题
97 0
|
8月前
|
SQL 关系型数据库 MySQL
CentOS部署JAVA程序、安装Tomcat以及安装导入mysql文件的方法
CentOS部署JAVA程序、安装Tomcat以及安装导入mysql文件的方法
|
4月前
|
Prometheus 监控 Cloud Native
Linux|centos7 Prometheus的自动服务发现 一(文件发现机制)
Linux|centos7 Prometheus的自动服务发现 一(文件发现机制)
51 0