_node)方法得到鎖目錄下所有子節(jié)點(diǎn),并判斷序號(hào)最小的子結(jié)點(diǎn)是不是自己創(chuàng)建的結(jié)點(diǎn),如果是,那么它就獲得了這個(gè)鎖;
[0015](4)如果序號(hào)最小的子結(jié)點(diǎn)不是自己創(chuàng)建的,那么當(dāng)前索引用戶進(jìn)程就調(diào)用ZooKeeper的exists方法并監(jiān)控ZooKeeper上目錄節(jié)點(diǎn)列表中比自己序號(hào)小的最晚創(chuàng)建的有序臨時(shí)節(jié)點(diǎn)狀態(tài);
[0016](5)如果監(jiān)視的節(jié)點(diǎn)狀態(tài)發(fā)生變化,則跳轉(zhuǎn)到步驟3,直到退出鎖競爭。
[0017]分布式鎖是分布式環(huán)境下進(jìn)行共享資源控制的常用手段,它能有效協(xié)調(diào)分布式環(huán)境下的多線程協(xié)調(diào)問題,十分適合應(yīng)用于基于Twitter Storm LBS查詢框架之中。因此,本文將基于ZooKe印er的分布式鎖服務(wù)來解決分布式環(huán)境下LBS并行處理的同步問題。
[0018]ZooKeeper分布式服務(wù)框架是Apache Hadoop的一個(gè)子項(xiàng)目,它主要是用來解決分布式應(yīng)用中經(jīng)常遇到的一些數(shù)據(jù)管理問題,如:統(tǒng)一命名服務(wù)、分布式鎖服務(wù)、集群管理、分布式應(yīng)用配置項(xiàng)的管理等。它支持單機(jī)模式和分布式模式,在分布式模式下,能夠?yàn)榉植际綉?yīng)用提供高性能和可靠的協(xié)調(diào)服務(wù),而且使用ZooKeeper可以大大簡化分布式協(xié)調(diào)服務(wù)的實(shí)現(xiàn),這就為開發(fā)分布式應(yīng)用大大降低了成本。
[0019]ZooKeeper在集群中每個(gè)節(jié)點(diǎn)都維護(hù)著一棵相同的樹,樹的結(jié)構(gòu)和Linux的目錄結(jié)構(gòu)的概念類似。
[0020]本發(fā)明的優(yōu)點(diǎn)是:支持云計(jì)算環(huán)境中基于HBase的網(wǎng)格索引的高吞吐率的并發(fā)操作。
【附圖說明】
[0021]圖1網(wǎng)格索引結(jié)構(gòu)示意圖
[0022]圖2并行更新與查詢例子
[0023]圖3基于ZooKeeper的分布式共享鎖算法流程圖
【具體實(shí)施方式】
[0024]實(shí)施例1
[0025]網(wǎng)格劃分如圖1所示,假設(shè)共享資源為圖中單元格20,有四個(gè)索引用戶進(jìn)程要訪問此單元格
[0026](1)首先針對(duì)網(wǎng)格單元20,創(chuàng)建一個(gè)ZooKe印er結(jié)點(diǎn)作為鎖目錄,并且結(jié)點(diǎn)類型為PERSISTENT。用它來描述被共享的資源,稱為:/l0ck_n0de,用網(wǎng)格id作為標(biāo)識(shí)符,表示為/20。
[0027](2)每個(gè)希望獲得鎖的索引用戶進(jìn)程在鎖目錄下創(chuàng)建一個(gè)結(jié)點(diǎn)locks_i,作為鎖/20的子結(jié)點(diǎn),該結(jié)點(diǎn)類型為有序臨時(shí)節(jié)點(diǎn)(EPHEMERAL_SEQUENTIAL)。此時(shí),有四個(gè)進(jìn)程創(chuàng)建了結(jié)點(diǎn),根據(jù)它們創(chuàng)建節(jié)點(diǎn)的時(shí)間先后順序,分別表示為/20/locks_l、/20/locks_2、/20/locks_3 和 /20/locks_4o
[0028](3)當(dāng)前索引用戶進(jìn)程調(diào)用ZooKeeper的getChildren(/20)方法得到鎖目錄所有子節(jié)點(diǎn):/20/locks_l、/20/locks_2、/20/locks_3 和 /20/locks_4,獲取序號(hào)最小的子節(jié)點(diǎn)/20/lock-l,并判斷獲取到的序號(hào)最小的子結(jié)點(diǎn)是不是自己創(chuàng)建的結(jié)點(diǎn),如果當(dāng)前索引用戶進(jìn)程創(chuàng)建了/20/locks_l,最小的節(jié)點(diǎn)是自己創(chuàng)建的,那么它就獲得了鎖/20。
[0029](4)如果當(dāng)前索引用戶創(chuàng)建了節(jié)點(diǎn)/20/locks_4,最小的節(jié)點(diǎn)/20/locks_l不是當(dāng)前索引用戶進(jìn)程創(chuàng)建的,那么它就調(diào)用ZooKeeper的exists (/20,true)方法,監(jiān)控ZooKeeper上目錄節(jié)點(diǎn)列表中比自己序號(hào)小的最晚創(chuàng)建的有序臨時(shí)節(jié)點(diǎn)/20/locks_3的狀態(tài),因?yàn)槟夸浌?jié)點(diǎn)列表中比自己序號(hào)小的節(jié)點(diǎn)分別有/20/locks_l、/20/locks_2和/20/locks_3,其中,/20/locks_3節(jié)點(diǎn)創(chuàng)建時(shí)間和/20/locks_4節(jié)點(diǎn)的創(chuàng)建時(shí)間最接近。
[0030](5)如果當(dāng)前索引用戶監(jiān)視的節(jié)點(diǎn)/20/locks_3狀態(tài)發(fā)生變化,則跳轉(zhuǎn)到步驟3,直到退出鎖競爭。
[0031]如果索引用戶進(jìn)程想要釋放鎖或者退出鎖競爭,只需要?jiǎng)h除其在鎖目錄下創(chuàng)建的子結(jié)點(diǎn)即可。本文在此不在詳細(xì)陳述。
[0032]可以看出,基于ZooKe印er的分布式共享鎖是按照FIFO的策略分配共享資源。進(jìn)程請(qǐng)求鎖的順序和獲得鎖的順序是一致的。
[0033]圖3是ZooKe印er實(shí)現(xiàn)分布式共享鎖的算法流程圖,從圖中可以看出通過ZooKeeper進(jìn)行分布式環(huán)境下的進(jìn)程同步非常方便。
【主權(quán)項(xiàng)】
1.基于HBase分布式環(huán)境下移動(dòng)對(duì)象并行網(wǎng)格索引同步方法,其特征在于,包括以下幾步: (1)針對(duì)每個(gè)網(wǎng)格單元,創(chuàng)建一個(gè)ZooKe印er結(jié)點(diǎn)作為鎖目錄,并且結(jié)點(diǎn)類型為持久節(jié)點(diǎn),這種類型的節(jié)點(diǎn)在創(chuàng)建后,就一直存在,直到有刪除操作來主動(dòng)清除這個(gè)節(jié)點(diǎn)一一不會(huì)因?yàn)閯?chuàng)建該節(jié)點(diǎn)的索引用戶連接失效而消失。這個(gè)節(jié)點(diǎn)用來描述被共享的資源,稱為/lock_node,并有一個(gè)標(biāo)志符; (2)每個(gè)希望獲得鎖的索引用戶進(jìn)程在鎖目錄下創(chuàng)建一個(gè)結(jié)點(diǎn),作為鎖/loCk_node的子結(jié)點(diǎn),該結(jié)點(diǎn)類型為有序臨時(shí)節(jié)點(diǎn),這類節(jié)點(diǎn)的基本特性和持久節(jié)點(diǎn)是一致的,在ZooKeeper中,每個(gè)父節(jié)點(diǎn)會(huì)為他的第一級(jí)子節(jié)點(diǎn)維護(hù)一份時(shí)間順序,會(huì)記錄每個(gè)子節(jié)點(diǎn)創(chuàng)建的先后順序,每個(gè)節(jié)點(diǎn)有一個(gè)序號(hào); (3)當(dāng)前索引用戶進(jìn)程調(diào)用ZooKeeper的getChildren方法得到鎖目錄下所有子節(jié)點(diǎn),并判斷序號(hào)最小的子結(jié)點(diǎn)是不是自己創(chuàng)建的結(jié)點(diǎn),如果是,那么它就獲得了這個(gè)鎖; (4)如果序號(hào)最小的子結(jié)點(diǎn)不是自己創(chuàng)建的,那么當(dāng)前索引用戶進(jìn)程就調(diào)用ZooKeeper的exists方法并監(jiān)控ZooKeeper上目錄節(jié)點(diǎn)列表中比自己序號(hào)小的最晚創(chuàng)建的有序臨時(shí)節(jié)點(diǎn)狀態(tài); (5)如果監(jiān)視的節(jié)點(diǎn)狀態(tài)發(fā)生變化,則跳轉(zhuǎn)到步驟3,直到退出鎖競爭。
【專利摘要】本發(fā)明提供了基于HBase分布式環(huán)境下移動(dòng)對(duì)象并行網(wǎng)格索引同步方法,包括幾步:(1)針對(duì)每一個(gè)網(wǎng)格單元,創(chuàng)建一個(gè)ZooKeeper結(jié)點(diǎn)作為鎖目錄;(2)每個(gè)希望獲得鎖的索引用戶進(jìn)程在鎖目錄下創(chuàng)建一個(gè)結(jié)點(diǎn),該結(jié)點(diǎn)類型為有序臨時(shí)節(jié)點(diǎn)。(3)當(dāng)前索引用戶進(jìn)程調(diào)用ZooKeeper的getChildren方法得到鎖目錄所有子節(jié)點(diǎn),并判斷序號(hào)最小的子結(jié)點(diǎn)是不是自己創(chuàng)建的結(jié)點(diǎn),是,那么它就獲得了這個(gè)鎖;(4)不是,那么它就調(diào)用ZooKeeper的exists方法并監(jiān)控ZooKeeper上目錄節(jié)點(diǎn)列表中比自己序號(hào)小的最晚創(chuàng)建的有序臨時(shí)節(jié)點(diǎn)狀態(tài);(5)監(jiān)視的比自己序號(hào)小的最晚創(chuàng)建的節(jié)點(diǎn)狀態(tài)發(fā)生變化,則跳轉(zhuǎn)到步驟3,直到退出鎖競爭。本發(fā)明優(yōu)點(diǎn)是支持云計(jì)算環(huán)境中基于HBase的網(wǎng)格索引的高吞吐率的并發(fā)操作。
【IPC分類】G06F17/30
【公開號(hào)】CN105354263
【申請(qǐng)?zhí)枴緾N201510697236
【發(fā)明人】王波濤, 王國仁, 常立東, 趙凱利, 黃山
【申請(qǐng)人】東北大學(xué)
【公開日】2016年2月24日
【申請(qǐng)日】2015年10月19日