作者 | mushishi
來(lái)源 | urlify.cn/Mry6bi
redis分布式鎖基本原理
采用 redis 實(shí)現(xiàn)分布式鎖,主要是利用其單線程命令執(zhí)行的特性,一般是 setnx, 只會(huì)有一個(gè)線程會(huì)執(zhí)行成功,也就是只有一個(gè)線程能成功獲取鎖;看著很完美
看看可能有什么問(wèn)題?
一般生產(chǎn)環(huán)境為了可用性,redis 會(huì)部署 master-slave + sentinel 的結(jié)構(gòu), 如:
master 提供服務(wù)、slave standby 作為備份節(jié)點(diǎn)不提供服務(wù), master異步將數(shù)據(jù)復(fù)制給 slave 以保證數(shù)據(jù)一致, sentinel哨兵檢查 master節(jié)點(diǎn),當(dāng)master節(jié)點(diǎn)故障時(shí) 將slave節(jié)點(diǎn)提升為 新的master 對(duì)外提供服務(wù);
正常情況下,都是當(dāng)前 master 對(duì)外提供服務(wù),多個(gè)線程 setnx 只會(huì)有一個(gè)成功
當(dāng) master 故障時(shí)
線上環(huán)境嘛,總會(huì)有各種各樣的故障出現(xiàn),這也是為什么要部署 ha 的原因;
我們?cè)O(shè)想,thread-1 setnx a 1 成功后,master節(jié)點(diǎn)發(fā)生故障;但是,此時(shí) a=1 這條數(shù)據(jù)還沒(méi)來(lái)得及同步到 slave 節(jié)點(diǎn),然后 sentinel 哨兵會(huì)進(jìn)行故障切換將 slave 提升上來(lái)對(duì)外提供服務(wù), 然后 thread-2 來(lái) setnx a 1 加鎖,因?yàn)橹版i狀態(tài)在 slave 不存在,那這時(shí)候 thread-2 也會(huì)加鎖成功, 這個(gè)時(shí)候鎖的語(yǔ)義就被破壞了