實例基礎(chǔ)信息:
redis版本:redis-cli 3.2.5
架構(gòu):傳統(tǒng)主從架構(gòu)
背景
給一臺運行一段時間的redis主庫增加一臺從庫仑扑,增加后發(fā)現(xiàn)以下異常:
- 主庫查看主從復(fù)制偏移量基本相同,能確定主從基本是同步的
master_repl_offset - slave1:ip.offset = 2351604050 - 2351602973 = 1077 byte - 但是從庫查看key的數(shù)量和主庫少幾萬個
主從總key數(shù)量差距 = 599178 - 563705 = 35473
主從過期key數(shù)量差距 = 581619 - 546248 = 35371
主庫截圖
從庫截圖
通過key數(shù)量這兩個差值大概可以定位到問題出現(xiàn)在過期key
原理解剖
- redis的過期key在到期的時候不會自動刪除失驶,一般通過惰性刪除(訪問該key的時候判斷過期,過期就刪除挡育,否則不刪除)和定期刪除(定期迭代刪除一定量的key)驱还,這種策略就會導(dǎo)致主庫存在一定量的過期key
- 新的從庫slave host port同步主庫時,主庫會bgsave一個快照文件胀莹,在進(jìn)行bgsave的時候?qū)τ谝呀?jīng)過期的key不會保存到該文件,文件保存完后發(fā)送給slave,slave載入數(shù)據(jù)文件婚温,這是后從庫是沒有這些過期的key值的描焰,所以出現(xiàn)了主從key的數(shù)量不一致
- 通過在主庫執(zhí)行scan 0 count xxx多次迭代所有的key,將所有的過期key進(jìn)行刪除栅螟,這時候發(fā)現(xiàn)主從的key數(shù)量趨于一致
主庫截圖
從庫截圖