redis實現分散式鎖天然的缺陷

mushishi發表於2021-07-01

redis分散式鎖基本原理

採用 redis 實現分散式鎖,主要是利用其單執行緒命令執行的特性,一般是 setnx, 只會有一個執行緒會執行成功,也就是隻有一個執行緒能成功獲取鎖; 看著很完美

看看可能有什麼問題?

一般生產環境為了可用性,redis 會部署 master-slave + sentinel 的結構, 如:
master-slave-sentinel
master 提供服務、slave standby 作為備份節點不提供服務, master非同步將資料複製給 slave 以保證資料一致, sentinel哨兵檢查 master節點,當master節點故障時 將slave節點提升為 新的master 對外提供服務;

正常情況下,都是當前 master 對外提供服務,多個執行緒 setnx 只會有一個成功
normal

當 master 故障時

線上環境嘛,總會有各種各樣的故障出現,這也是為什麼要部署 ha 的原因;

我們設想,thread-1 setnx a 1 成功後,master節點發生故障;但是,此時 a=1 這條資料還沒來得及同步到 slave 節點,然後 sentinel 哨兵會進行故障切換將 slave 提升上來對外提供服務, 然後 thread-2 來 setnx a 1 加鎖,因為之前鎖狀態在 slave 不存在,那這時候 thread-2 也會加鎖成功, 這個時候鎖的語義就被破壞了
image

相關文章