2018-12-08 補(bǔ)充:
其實(shí)這兩種方案也就是Curator提供的兩種選主機(jī)制:
基于選舉和基于搶占的選主方式边苹,具體原理和使用參見(jiàn)以下鏈接
[Curator] Leader Latch 的使用與分析
[Curator] Leader Election 的使用與分析
建議直接使用Curator封裝好的接口
分布式鎖種類
zookeep分布式鎖的種類:排他鎖摆昧、共享鎖
如何用 zookeeper 實(shí)現(xiàn)分布式鎖 - world6 的博客 - CSDN 博客
鎖實(shí)現(xiàn)
Curator已經(jīng)實(shí)現(xiàn)的分布式鎖:
可重入鎖:InterProcessMutex 實(shí)現(xiàn)了可重入的排它鎖谁撼,支持鎖等待超時(shí)娃胆、保證獲取鎖的公平性。
不可重入鎖:InterProcessSemaphoreMutex 實(shí)現(xiàn)了不可重入的排它鎖矩距,支持鎖等待超時(shí)捞镰、保證獲取鎖的公平性『葡浚可以在多個(gè)線程間傳遞和釋放鎖可岂,從而滿足異步調(diào)用場(chǎng)景下的鎖需求。
信號(hào)量:InterProcessSemaphoreV2 實(shí)現(xiàn)了信號(hào)量翰灾,支持信號(hào)量等待超時(shí)缕粹、保證獲取信號(hào)量的公平性≈交矗客戶端每次獲取信號(hào)量成功都會(huì)返回一個(gè)租約(Lease)對(duì)象平斩,建議客戶端在 finally 代碼塊 close 這個(gè)租約對(duì)象以釋放租約。注意在線程重入時(shí)咽块,每次獲取信號(hào)量成功也會(huì)占用一個(gè)租約绘面。另外,在多進(jìn)程場(chǎng)景下侈沪,可以通過(guò) SharedCountReader 來(lái)保障最大租約數(shù)的一致性揭璃,避免不同的進(jìn)程設(shè)置不同的最大租約數(shù)。
讀寫鎖:InterProcessReadWriteLock 實(shí)現(xiàn)了可重入讀寫鎖亭罪,支持鎖等待超時(shí)瘦馍、保證獲取鎖的公平性。并且支持寫鎖降級(jí)(持有寫鎖的線程可以同時(shí)獲取到讀鎖)应役,不支持讀鎖升級(jí)(持有讀鎖的線程不能同時(shí)獲取到寫鎖)情组。 聯(lián)鎖:InterProcessMultiLock 實(shí)現(xiàn)了聯(lián)鎖,它使用裝飾器模式實(shí)現(xiàn)多把鎖的組合箩祥,與可重入鎖院崇、不可重入鎖實(shí)現(xiàn)相同的接口,使得可以像使用單鎖一樣使用聯(lián)鎖袍祖。聯(lián)鎖獲取成功代表它擁有的所有內(nèi)部鎖都獲取成功底瓣,聯(lián)鎖獲取失敗則會(huì)自動(dòng)釋放所有內(nèi)部已經(jīng)獲取成功的部分鎖,從而保證聯(lián)鎖的原子性語(yǔ)義盲泛。
教你使用 Zookeeper 實(shí)現(xiàn)分布式鎖(上)
實(shí)際應(yīng)用
需求:集群中所有host都有池化好的相同資源濒持,后臺(tái)取資源比較耗時(shí),而且會(huì)頻繁請(qǐng)求這個(gè)集群來(lái)取寺滚。
基于排他鎖設(shè)計(jì)
開(kāi)始:各host在zk上競(jìng)爭(zhēng)創(chuàng)建臨時(shí)節(jié)點(diǎn)柑营,創(chuàng)建成功者為主節(jié)點(diǎn),同時(shí)其他候選host監(jiān)聽(tīng)節(jié)點(diǎn)目錄村视。后臺(tái)取目錄下的節(jié)點(diǎn)信息官套,從主節(jié)點(diǎn)中獲取資源。當(dāng)主服務(wù)主動(dòng)刪除節(jié)點(diǎn)或者會(huì)話失效時(shí),候選host將繼續(xù)競(jìng)爭(zhēng)選主奶赔。
主節(jié)點(diǎn)結(jié)束: 當(dāng)主節(jié)點(diǎn)被后臺(tái)占用最后一個(gè)資源時(shí)惋嚎,主動(dòng)刪除臨時(shí)節(jié)點(diǎn)。
重新選主: 候選host發(fā)現(xiàn)節(jié)點(diǎn)目錄有節(jié)點(diǎn)刪除事件站刑,如果自己有空余資源另伍,立刻參與選主,否則繼續(xù)監(jiān)聽(tīng)節(jié)點(diǎn)目錄绞旅。
所有節(jié)點(diǎn)忙: 當(dāng)所有host沒(méi)有空余資源時(shí)摆尝,zk目錄下沒(méi)有節(jié)點(diǎn)。
有空余節(jié)點(diǎn): 當(dāng)有host重新?lián)碛匈Y源因悲,檢查節(jié)點(diǎn)目錄是否有節(jié)點(diǎn)堕汞,如果沒(méi)有節(jié)點(diǎn),則嘗試創(chuàng)建晃琳,創(chuàng)建成功則成為主服務(wù)讯检,否則繼續(xù)監(jiān)聽(tīng)節(jié)點(diǎn)目錄。
基于共享鎖設(shè)計(jì)
開(kāi)始:各host在zk上競(jìng)爭(zhēng)創(chuàng)建臨時(shí)有序節(jié)點(diǎn)卫旱,后臺(tái)從創(chuàng)建最小節(jié)點(diǎn)的host中獲取資源人灼,因此該host成為主節(jié)點(diǎn)。
主節(jié)點(diǎn)結(jié)束: 當(dāng)主節(jié)點(diǎn)被后臺(tái)占用最后一個(gè)資源時(shí)誊涯,主動(dòng)刪除臨時(shí)節(jié)點(diǎn)挡毅。當(dāng)自己重新?lián)碛匈Y源后蒜撮,再次在zk創(chuàng)建臨時(shí)有序節(jié)點(diǎn)暴构,參加排隊(duì)。
重新選主:后臺(tái)從之前次小的節(jié)點(diǎn)host中獲取資源段磨,該host成為主節(jié)點(diǎn)取逾。
所有節(jié)點(diǎn)忙:當(dāng)所有host沒(méi)有空余資源時(shí),zk目錄下沒(méi)有節(jié)點(diǎn)苹支。
有空余節(jié)點(diǎn): 當(dāng)有host重新?lián)碛匈Y源砾隅,再次在zk創(chuàng)建臨時(shí)有序節(jié)點(diǎn),立即成為主節(jié)點(diǎn)债蜜。