天天看點

redis 腦裂等極端情況分析

 腦裂真的是一個很頭疼的問題(ps: 腦袋都裂開了,能不疼嗎?),看下面的圖:

一、哨兵(sentinel)模式下的腦裂

redis 腦裂等極端情況分析

資料就不一緻了,基于setNX指令的分布式鎖,可能會拿到相同的鎖;基于incr生成的全局唯一id,也可能出現重複。

二、叢集(cluster)模式下的腦裂

redis 腦裂等極端情況分析

custer模式下,這種情況要更複雜,見上面的示意圖,叢集中有6組分片,每給分片節點都有1主1從,如果出現網絡分區時,各種節點之間的分區組合都有可能,上面列了2種情況:

情況A:

情況B:

如果每給分片内部的邏輯(即:主從關系)沒有亂,隻是恰好分成二半,這時slot整體上看并沒有出現重複,如果原來請求的key落在其它區,最多隻是通路不到,還不緻于發生資料不一緻的情況。(即:甯可出錯,也不要出現資料混亂)

三、主從遷移帶來的不一緻

redis 腦裂等極端情況分析

如上圖,1主1從,如果采用incr來生成全局唯一鍵,假如master上的值是4,但是尚未同步到slave上(slave上仍然是舊值3),這時候如果發生選舉,slave被提升為新master,應用伺服器server1切換到新主後,下次再incr擷取的值,就可能重複了(3+1=4)

總結:雖然上面的情況都比較極端,但實際中還是有可能發生的,正如官方文檔所言,redis并不能保證強一緻性(Redis Cluster is not able to guarantee strong consistency. / In general Redis + Sentinel as a whole are a an eventually consistent system) 對于要求強一緻性的應用,更應該傾向于相信RDBMS(傳統關系型資料庫)。

參考:

<a href="http://www.redis.io/topics/sentinel">http://www.redis.io/topics/sentinel</a>

<a href="https://redis.io/topics/cluster-tutorial">https://redis.io/topics/cluster-tutorial</a>

繼續閱讀