pod里的redis用nfs存aof及rdb數據,報錯Stale file handle


log里報:

1:M 13 Jan 2022 21:00:43.015 * Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
1:M 13 Jan 2022 21:00:52.137 # Fail to fsync the AOF file: Stale file handle
1:M 13 Jan 2022 21:12:24.529 # Error writing to the AOF file: Stale file handle

 

Stale file handle是一個文件系統的普遍問題,主要是linode變了,但外部沒變。相當於元信息沒了,但外部文件還在,成了野指針。

而特別在nfs里又是個普遍問題。

相關分析:

https://cloud.tencent.com/developer/article/1593914

這個問題通過百度搜索能得出一片的結果,但是其中的結果沒有幾個是有營養的。

使用google能搜到就比百度有用的多,但是也沒有個說是怎么怎么出來的。

因為中工作中遇到了這個問題,也花費了不少的時間去處理 這個問題。希望這篇分析和總結是有用個的。

1.問題描述

 這個英文的雖然說的NFS,但是實際上不僅僅NFS系統會遇到這個問題。當然如果你的系統就是NFS的,那么你排查這個問題會簡單很多。本文不是針對NFS系統。

 Stale NFS file handle具體是什么意思,為還沒有看到中文是怎么解釋的。英文的意思:文件是變得不可用了。當使用ls, stat,cat等等命令去查看文件的時候會發現無法看到文件的任何信息。

有個問題大家都很熟悉的,就是寫程序的時候經常會避免野指針的問題,這個問題與此類似,只是這個野指針是存在於磁盤上的。

2.復現該問題的方法

要重現這個問題不是一般般的簡單的,光靠運氣會搞死人的。下面給出一種為知道的重現方法:

假設文件系統是/dev/sda2,則可以進行如下操作:

debugfs -w /dev/sda2

這時候會進入到debugfs的命令行中,假設壞掉的文件是/dev/sda2中的file文件,那么使用

stat ./file 命令查看出文件對應的inode,假設是62345

然后使用命令 mi <62345>

修改該文件的Link count數為0

然后quit。

這時候ls去看/dev/sda2的file文件就會出現Stale NFS file handle的報錯了(如果不出現,重啟系統必定出現)。

3.問題分析

從重現方法就大概知道,是Link count計數不對導致的這個問題。這個報錯是系統保持來的。是的沒錯,就是文件的引用計數出現問題了。一般的,對linux系統來說,文件的引用計數為0表示文件被刪除了。這個時候它占用的inode節點要被回收,被它所在目錄要去除改文件的目錄項。(不清楚文件存儲方法的請自行查閱)。

然后,通過debugfs的修改,我們發現,目錄還是有這個文件的目錄項,但是由於文件的引用計數是0,文件系統認為改文件已經被刪除了,那么就意味着根據目錄項的該文件的記錄是找不到該文件的,即這個目錄項是一個野指針。

4.出現的原因

文件系統出問題的原因太復雜了,這里總結兩個大家認為不可能但是又十分可能的原因:    

系統正在刪除文件的時候發生斷電,即文件的link count被標記為0,但是對應的目錄項還沒有來得及刪除;

5.解決方法

     - 如果文件系統是ext2,那么你會高概率的遇到這個問題,請將系統升級為ext3.(請自行腦補ext2和ext3的對比)

     - 使用fsck -y修復文件系統,並且確保系統中啟動的過程中會自行修復,這樣當系統發生這個問題時可以中啟動的時候就自行處理好,而不至於導致系統啟動中斷掉。

 

ps

從整個的排查過程來說,個人覺得這個報錯信息真的應該改改,有點南轅北轍的意思,如下的鏈接也在吐槽該問題:

https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/391094


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM