故障描述
redis機器的一個ssd盤出故障,只能讀不能寫。其他盤寫入速度也很慢。導致redis實例的aof刷新一直失敗,最終掛掉。
故障原因
ssd盤早期沒有格式化好,4k對齊沒做好
處理過程
該redis機器是用來存儲collector采集到的日志的meta信息,比較關鍵,而且一臺機器上開啟了8個redis實例,所以不好處理。
一開始準備把redis的aof文件轉移到一個新的盤上,并且把aof的dir動態更改到其他盤,結果發現redis實例掛掉了,就沒有動態更換aof目錄。這其中,redis的數據可能有所丟失,不過通過collector和redis日志發現,磁盤掛了后redis寫入已經失敗,估計有丟失數據也不多。collector有實現meta寫入redis失敗時轉為寫入本地磁盤,所以在redis實例down掉時,數據也不會丟失。
接著,處理4k對齊。先把所有redis實例進行bgwrite. ?redis-cli -h redis02 -p 6379 bgrewriteaof, 停掉所有redis實例。
處理4k對齊, 重啟機器。結果發現機器重啟失敗,陣列卡或線松了。
重啟機器后,趕緊把所有aof文件都備份到其他機器上。結果有發現,有一塊盤丟了,嘗試mount回來。發現有很多block錯誤,要修復又怕丟數據。但現在盤有錯誤,只能先fsck修復,如果修復成功再從里面拷貝出來。要是覺得不保險,就先備份正常盤的數據,空出一塊盤,把cache3的盤做個鏡像,再做修復。最后aof文件終于弄出來了,啟動redis實例,發現aof文件有問題,啟動失敗。使用redis-check-aof --fix修復了aof文件,再啟動,成功。redis數據是被截斷一部分丟失了。
數據恢復后,開始重新把redis機器上的ssd盤一個個重新格式化。
經驗教訓
因為redis的meta信息,是銜接collector采集,以及storm處理和hadoop camus入庫。本次redis故障,大動干戈,對集群影響比較大。
還好collector有redis失敗轉存文件的功能,所以日志采集一直正常。
接下來的深圳新機房,存儲meta的redis準備使用cluster,避免單點故障。保障可用性。