日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis 数据丢失问题排查

發布時間:2023/12/18 数据库 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis 数据丢失问题排查 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

環境描述

某客戶的生產環境,Redis 4.0.2 單機

問題現象

客戶生產環境服務器因過年停機,年后開機后,Redis 重啟,Java 服務連接 Redis 提示某個 Key 在 Redis 里不存在。

問題分析

Java 服務從 Redis 讀 Key 讀失敗,說明服務本身是知道讀哪個 Key 的,于是梳理了下問題的相關流程:

  • Java 服務實際提供了一個 SQL 類型的 API,可以將數據庫里的數據通過 API 透出給其他應用程序
  • 當 HTTP 請求達到 Java 服務后,它會通過自身的業務庫查詢到當前 API 對應在 Redis 里的 Key
  • 通過 Key 去 Redis 里查到對應的數據庫連接信息以及要執行的查詢 SQL
  • 通過 JDBC 連接數據庫,然后執行查詢 SQL 查詢數據,最后將數據返回給前臺
  • 既然讀 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 数据丢失问题排查的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。