【Redis】主從同步可能遇到的坑


 
一、主從同步可能遇到的坑
1、主從數據不一致
2、從庫讀取到過期數據
 
二、問題1:主從數據不一致
 
原因:主從庫間命令復制是異步進行的
 
  主庫收到寫命令后,會發送給從庫。
  但是,主庫並不會等到從庫實際執行完命令后,再把結果返回給客戶端,而是主庫自己在本地執行完命令后,就向客戶端返回結果了。
  如果從庫還沒有執行主庫同步過來的命令或執行不及時,主從庫間的數據就不一致了。
 
  主要有兩個原因:
  1、主從庫間的網絡可能會有傳輸延遲,所以從庫不能及時地收到主庫發送的命令,導致命令執行延后
  2、從庫及時收到了主庫的命令,但是正在處理其它復雜度高的命令(例如集合操作命令),導致命令阻塞,執行延后
 
解決思路:
  1、盡量使用良好的硬件和網絡環境,並實時做好監控
  2、使用info replication 命令查看主庫寫命令進度(master_repl_offset)和從庫復制寫命令進度(slave_repl_offset),開發監控程序監控兩者的差值,
    如果超過閥值則移除客戶端對該從庫的訪問,避免數據不一致;如果兩者差值恢復到閥值范圍內,則重新調整客戶端對從庫的訪問。
 
 
三、問題2:從庫讀取到過期數據
 
原因:
  1、從庫不會同步執行主庫刪除命令,不會自動刪除過期數據(主庫讀取到過期數據會自動刪除)
  2、時間差:比如主庫設置60秒過期,是指主庫執行的時間點往后60秒;該命令同步到從庫后,是按從庫執行時間點往后60秒,可能因為命令執行的時間差導致主庫已過期,從庫還沒過期的情況
 
解決思路:
  1、Redis對過期數據的處理: Redis 3.2 之前會讀取到過期數據,之后會返回空值(不會刪除)。所以,盡量使用 Redis 3.2 以后版本
  2、時間差:盡量用EXPIREAT 和 PEXPIREAT,它們會把過期時間設置為具體的一個時間點(用時間服務器同步各個服務器的時鍾)
 


免責聲明!

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



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