Redis 数据丢失问题排查
環境描述
某客戶的生產環境,Redis 4.0.2 單機
問題現象
客戶生產環境服務器因過年停機,年后開機后,Redis 重啟,Java 服務連接 Redis 提示某個 Key 在 Redis 里不存在。
問題分析
Java 服務從 Redis 讀 Key 讀失敗,說明服務本身是知道讀哪個 Key 的,于是梳理了下問題的相關流程:
既然讀 Key 失敗,說明在 Java 服務自身的業務庫里是保存了這個 Key 的,于是去 MySQL 中查詢,果然存在這個 Key,而 Redis 里確實也不存在這個 Key,說明 Redis 重啟后,這個 Key 確實丟了。
繼續分析,Java 程序在特定條件下會在 Redis 里寫入這個 Key,而且 Redis 配置文件里配置了 SnapShot 的 save 機制:
save 900 1 save 300 10 save 60 10000這個 Key 是個很早就寫入 Redis 的,按照第一條 save 規則,應該是已經從內存寫入到 rdb 文件中了,那為什么 Redis 啟動的時候沒有讀到這條數據呢?
繼續查看 Redis 配置文件,發現端倪:
# The working directory. # # The DB will be written inside this directory, with the filename specified # above using the 'dbfilename' configuration directive. # # The Append Only File will also be created inside this directory. # # Note that you must specify a directory here, not a file name. dir ./Redis 配置文件里,工作目錄配置的是 ./ 這種相對路徑,也就是說,啟動 Redis 時,在哪個目錄下運行啟動命令,它就會在那個目錄下找 rdb 文件并加載,如果目錄下沒有 rdb 文件,那 Redis 啟動后就沒有任何數據。
于是排查了 Redis 目錄,在 Redis 根目錄下發現了一個 rdb 文件,在 src 目錄下也有個 rdb 文件,而這次 Redis 啟動是在根目錄下啟動的,上次是在 src 目錄啟動的,導致這次啟動后無法加載上次的 rdb 文件,也就導致了 Key 丟失。
解決方案
由于 Redis 被很多 Java 服務使用,不能隨意重啟,只好手動在 Redis 里將這個 Key-Value 寫進去供程序使用;如果可以重啟,只需更換啟動目錄,再重啟下 Redis 就可以了。
不過最好的方式,還是將配置文件中的工作目錄 dir 設置成絕對路徑,這樣無論在哪里啟動 Redis,都能讀到同一份 rdb 文件。
總結
很多知識是書本上學不到的,只有從一次次生產事故中總結學習…
總結
以上是生活随笔為你收集整理的Redis 数据丢失问题排查的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大学计算机基础教程第1章计算机概述总结
- 下一篇: Centos7 搭建JDK/Mysql8