今天web服务器发现挂载的分布式文件系统mfs无法访问,去mfsmaster检查发现服务器没有启动。
启动服务器,登陆,查看没有mfs进程,端口都没启动,手动启动服务,提示错误:
[root@centos-6.5-x64 ~]#/usr/local/mfs/sbin/mfsmaster start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmaster modules …
loading sessions … ok
sessions file has been loaded
exports file has been loaded
loading metadata …
can’t open metadata file
if this is new instalation then rename metadata.mfs.empty as metadata.mfs
init: file system manager failed !!!
error occured during initialization – exiting
根据提示判断为mfs启动时认为这是一台新的mfsmaster,需要rename metadata.mfs.empty as metadata.mfs
这完全不是新服务器,赶紧恢复日志: [root@centos-6.5-x64 var]#tar zcvf mfs.tar.gz mfs/ #防止意外,把整个数据日志信息目录备份
[root@centos-6.5-x64 mfs]#/usr/local/mfs/sbin/mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog.*.mfs
loading objects (files,directories,etc.) … loading node: read error: Success
error
can’t read metadata from file: metadata.mfs.back
看样子metadata.mfs.back文件损坏。
赶紧查资料:http://blog.ztrix.me/blog/2012/05/13/restore-mfs-metadata/
根据资料查看我本地linux文件系统确实是ext4,可以判断跟资料上的情况一样了,可是我不会像文章写的一样会编程寻找数据。
遂再次检查:
[root@centos-6.5-x64 mfs]#ll
总用量 1724
-rw-r—– 1 mfs mfs 8543 4月 26 11:09 changelog.0.mfs
-rw-r—– 1 mfs mfs 4246 4月 26 11:09 changelog.10.mfs
-rw-r—– 1 mfs mfs 3368 4月 26 11:09 changelog.11.mfs
-rw-r—– 1 mfs mfs 8543 4月 26 11:09 changelog.1.mfs
-rw-r—– 1 mfs mfs 51757 4月 26 11:09 changelog.2.mfs
-rw-r—– 1 mfs mfs 183976 4月 26 11:09 changelog.3.mfs
-rw-r—– 1 mfs mfs 4901 4月 26 11:09 changelog.4.mfs
-rw-r—– 1 mfs mfs 1796 4月 26 11:09 changelog.5.mfs
-rw-r—– 1 mfs mfs 1502 4月 26 11:09 changelog.6.mfs
-rw-r—– 1 mfs mfs 599839 4月 26 11:09 changelog.7.mfs
-rw-r—– 1 mfs mfs 4383 4月 26 11:09 changelog.8.mfs
-rw-r—– 1 mfs mfs 4988 4月 26 11:09 changelog.9.mfs
-rw-r—– 1 mfs mfs 81920 4月 26 11:09 metadata.mfs.back
-rw-r—– 1 mfs mfs 147081 4月 26 11:09 metadata.mfs.back.tmp
-rw-r–r– 1 root root 8 4月 26 11:09 metadata.mfs.empty
-rw-r—– 1 mfs mfs 10541 4月 26 11:09 sessions.mfs
-rw-r—– 1 mfs mfs 610016 4月 26 11:09 stats.mfs
[root@centos-6.5-x64 mfs]#rm -f metadata.mfs.back
[root@centos-6.5-x64 mfs]#mv metadata.mfs.back.tmp metadata.mfs.back
发现有个metadata.mfs.back.tmp文件,把之前的metadata.mfs.back删掉,metadata.mfs.back.tmp改名metadata.mfs.back
恢复日志:
[root@centos-6.5-x64 mfs]#/usr/local/mfs/sbin/mfsmetarestore -m metadata.mfs.back -o metadata.mfs changelog.*.mfs
loading objects (files,directories,etc.) … ok
loading names … ok
loading deletion timestamps … ok
checking filesystem consistency … ok
loading chunks data … ok
connecting files and chunks … ok
applying changes from file: changelog.0.mfs
meta data version: 22443
version after applying changelog: 22698
applying changes from file: changelog.10.mfs
meta data version: 22698
version after applying changelog: 22698
applying changes from file: changelog.11.mfs
meta data version: 22698
version after applying changelog: 22698
applying changes from file: changelog.1.mfs
meta data version: 22698
version after applying changelog: 22698
applying changes from file: changelog.2.mfs
meta data version: 22698
version after applying changelog: 22698
applying changes from file: changelog.3.mfs
meta data version: 22698
version after applying changelog: 22698
applying changes from file: changelog.4.mfs
meta data version: 22698
version after applying changelog: 22698
applying changes from file: changelog.5.mfs
meta data version: 22698
version after applying changelog: 22698
applying changes from file: changelog.6.mfs
meta data version: 22698
version after applying changelog: 22698
applying changes from file: changelog.7.mfs
meta data version: 22698
version after applying changelog: 22698
applying changes from file: changelog.8.mfs
meta data version: 22698
version after applying changelog: 22698
applying changes from file: changelog.9.mfs
meta data version: 22698
version after applying changelog: 22698
store metadata into file: metadata.mfs
太好了,没报错,启动服务:
[root@centos-6.5-x64 mfs]#/usr/local/mfs/sbin/mfsmaster start
working directory: /usr/local/mfs/var/mfs
lockfile created and locked
initializing mfsmaster modules …
loading sessions … ok
sessions file has been loaded
exports file has been loaded
loading metadata …
loading objects (files,directories,etc.) … ok
loading names … ok
loading deletion timestamps … ok
checking filesystem consistency … ok
loading chunks data … ok
connecting files and chunks … ok
all inodes: 1622
directory inodes: 124
file inodes: 1498
chunks: 1485
metadata file has been loaded
stats file has been loaded
master <-> metaloggers module: listen on *:9419
master <-> chunkservers module: listen on *:9420
main master server module: listen on *:9421
mfsmaster daemon initialized properly
[root@centos-6.5-x64 mfs]#
[root@centos-6.5-x64 mfs]#ps aux | grep mfs
root 1556 0.0 0.4 170416 460 ? S 10:51 0:00 python /usr/local/mfs/sbin/mfscgiserv start
mfs 1946 6.2 43.1 82056 46196 ? S< 11:16 0:00 /usr/local/mfs/sbin/mfsmaster start
root 1948 2.0 0.7 103256 844 pts/0 S+ 11:17 0:00 grep mfs
服务启动,去web服务器查看,数据出来了。
转来的丢失原因:
ext4 文件系统的 delay allocation 导致的。moosefs 在持久化 metadata 信息的时候,会重写整个文件。他会首先把之前的 metadata.mfs.back 文件重命名成 metadaba.mfs.back.tmp,然后开始写 metadata.mfs.back 文件,写完了 fclose 之后,删除 metadata.mfs.back.tmp。如果断电的时候,正常在进行这么一个过程,那么有可能 fclose 之后,metadata.mfs.back.tmp 也删除了,但是 ext4 的 delay allocation 特性导致文件还没有真正写入到磁盘。(也有可能文件写入了磁盘 block,但是文件 inode 还没有更新)。我们在网上发现有不少人也遇到过同样的断电之后文件大小变成 0 的问题,如这个:http://www.symantec.com/connect/blogs/ext4-data-recovery-how-recovery-lost-files-ext4-file-system-linux
有可能是 moosefs 写 metadata 失败导致的。阅读了相关源代码之后,我们发现 moosefs 写文件和 fclose 的时候居然从来不判断返回值!有些地方有判断返回值,但是也仅仅打印一句 log,既不做相应错误处理,也不停止。于是就有可能是写文件失败,fclose 也失败,但是它不查返回值,所以又把之前的 metadata.mfs.back.tmp 删除了。
有可能是 ext4 修复导致的。断电造成文件系统出现不一致,然后自动修复之后造成了数据丢失。
这样一来,强烈建议将mfs的文件系统改为ext3上运行。
PS:
环境中有一台mfs slave机器做备份机,发现备份机也出问题,当我加电给master时,任务计划每个一分钟同步数据日志到备机,导致备机的日志也出错。
考虑到的方案:
在一台chunkserver中添加mfslog服务,每1小时获取一次master日志,定时备份数据日志目录。把损失降到最小。
原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/2445.html