?Zookeeper?分布式服務框架是?Apache Hadoop?的一個子項目,它主要是用來解決分布式應用中經常遇到的一些數據管理問題,如:統一命名服務、狀態同步服務、集群管理、分布式應用配置項的管理等。本文將從使用者角度詳細介紹?Zookeeper?的安裝和配置文件中各個配置項的意義,以及分析?Zookeeper?的典型的應用場景(配置文件的管理、集群管理、同步鎖、Leader?選舉、隊列管理等),用?Java?實現它們并給出示例代碼。
ZooKeeper?是一個為分布式應用所設計的分布的、開源的協調服務。分布式的應用可以建立在同步、配置管理、分組和命名等服務的更高級別的實現的基礎之上。?ZooKeeper?意欲設計一個易于編程的環境,它的文件系統使用我們所熟悉的目錄樹結構。?ZooKeeper?使用Java?所編寫,但是支持?Java?和?C?兩種編程語言。
眾所周知,協調服務非常容易出錯,但是卻很難恢復正常,例如,協調服務很容易處于競態以至于出現死鎖。我們設計?ZooKeeper?的目的是為了減輕分布式應用程序所承擔的協調任務。
ZooKeeper是一個高可用、高可靠的協同工作系統,分布式程序可以用ZooKeeper保存并更新關鍵共享狀態。
zookeeper是針對分布式應用的分布式協作服務,它的目的就是為了減輕分布式應用從頭開發協作服務的負擔。
Zookeeper?作為一個分布式的服務框架,主要用來解決分布式集群中應用系統的一致性問題,它能提供基于類似于文件系統的目錄節點樹方式的數據存儲,但是?Zookeeper?并不是用來專門存儲數據的,它的作用主要是用來維護和監控你存儲的數據的狀態變化。通過監控這些數據狀態的變化,從而可以達到基于數據的集群管理。
ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,它包含一個簡單的原語集,分布式應用程序可以基于它實現同步服務,配置維護?和命名服務等。Zookeeper是hadoop的一個子項目,其發展歷程無需贅述。在分布式應用中,由于工程師不能很好地使用鎖機制,以及基于消息的協?調機制不適合在某些應用中使用,因此需要有一種可靠的、可擴展的、分布式的、可配置的協調機制來統一系統的狀態。Zookeeper的目的就在于此。
zookeeper的下載地址:http://www.apache.org/dyn/closer.cgi/zookeeper/
下載好后的zookeeper解壓到一個地方目錄大概是這樣的
?F:\zookeeper-3.3.6 的目錄
2014/09/16 ?17:04 ? ?<DIR> ? ? ? ? ?.
2014/09/16 ?17:04 ? ?<DIR> ? ? ? ? ?..
2014/09/16 ?16:10 ? ?<DIR> ? ? ? ? ?bin
2012/07/29 ?14:23 ? ? ? ? ? ?59,687 build.xml
2012/07/29 ?14:23 ? ? ? ? ? ?52,566 CHANGES.txt
2014/09/16 ?17:06 ? ?<DIR> ? ? ? ? ?conf
2014/09/16 ?16:10 ? ?<DIR> ? ? ? ? ?contrib
2014/09/16 ?17:09 ? ?<DIR> ? ? ? ? ?data
2014/09/16 ?16:10 ? ?<DIR> ? ? ? ? ?dist-maven
2014/09/16 ?16:10 ? ?<DIR> ? ? ? ? ?docs
2012/07/29 ?14:23 ? ? ? ? ? ? 2,415 ivy.xml
2012/07/29 ?14:23 ? ? ? ? ? ? 1,932 ivysettings.xml
2014/09/16 ?16:10 ? ?<DIR> ? ? ? ? ?lib
2012/07/29 ?14:23 ? ? ? ? ? ?11,358 LICENSE.txt
2014/09/16 ?17:04 ? ?<DIR> ? ? ? ? ?log
2012/07/29 ?14:23 ? ? ? ? ? ? ? 165 NOTICE.txt
2012/07/29 ?14:23 ? ? ? ? ? ? 1,578 README.txt
2014/09/16 ?16:10 ? ?<DIR> ? ? ? ? ?recipes
2014/09/16 ?16:10 ? ?<DIR> ? ? ? ? ?src
2012/07/29 ?14:23 ? ? ? ? 1,031,338 zookeeper-3.3.6.jar
2012/07/29 ?14:25 ? ? ? ? ? ? ? 198 zookeeper-3.3.6.jar.asc
2012/07/29 ?14:23 ? ? ? ? ? ? ? ?33 zookeeper-3.3.6.jar.md5
2012/07/29 ?14:23 ? ? ? ? ? ? ? ?41 zookeeper-3.3.6.jar.sha1
? ? ? ? ? ? ? 11 個文件 ? ? ?1,161,311 字節
? ? ? ? ? ? ? 12 個目錄 94,507,941,888 可用字節
進到conf目錄下復制一個名字為zoo_sample.cfg的文件并修改名字為zoo.cfg
添加如下內容
# The number of milliseconds of each tick 維持心跳的時間間隔
tickTime=2000
# The number of ticks that the initial?
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between?
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot isstored. ?鏡像數據位置
dataDir=F:\\zookeeper-3.3.6\\data
#日志位置
dataLogDir=F:\\zookeeper-3.3.6\\log
# the port at which the clients will connect 客戶端連接的端口
clientPort=2181
這里簡單的說明一下,這些配置只是做一個簡單的測試并未做分布式處理
dataDir就是zookeeper的鏡像數據位置,這個文件需要用戶自行設置博主暫時將其放在zookeeper的子目錄下的data文件中
dataLogDir就是zookeeper的日志記錄位置,這個文件同樣需要用戶自行設置博主暫時將其放在zookeeper的子目錄下log文件中
做完上面的這些后就可以啟動zookeeper了啟動的方式就是執行zookeeper/bin目錄下的zkServer.cmd文件即可
啟動完成后就可以重啟一個命令窗口連接zookeeper了
連接zookeeper的命令同樣是bin目錄下的zkCli.sh?–server?127.0.0.1:2182
連接成功后就可以輸入相關的命令了
剛開始由于我們不知道輸入什么命令zookeeper會給出一個help
?connect host:port
?get path [watch]
?ls path [watch]
?set path data [version]
?delquota [-n|-b] path
?quit
?printwatches on|off
?create [-s] [-e] path data
?stat path [watch]
?close
?ls2 path [watch]
?history
?listquota path
?setAcl path acl
?getAcl path
?sync path
?redo cmdno
?addauth scheme auth
?delete path [version]
?setquota -n|-b val path
ls(查看當前節點數據),
ls2(查看當前節點數據并能看到更新次數等數據) ,
create(創建一個節點) ,
get(得到一個節點,包含數據和更新次數等數據),
set(修改節點)
delete(刪除一個節點)
通過上述命令實踐,我們可以發現,zookeeper使用了一個類似文件系統的樹結構,數據可以掛在某個節點上,可以對這個節點進行刪改。另外我們還發現,當改動一個節點的時候,集群中活著的機器都會更新到一致的數據。?
zookeeper的數據模型
在簡單使用了zookeeper之后,我們發現其數據模型有些像操作系統的文件結構,結構如下圖所示
(1)?????每個節點在zookeeper中叫做znode,并且其有一個唯一的路徑標識,如/SERVER2節點的標識就為/APP3/SERVER2
(2)?????Znode可以有子znode,并且znode里可以存數據,但是EPHEMERAL類型的節點不能有子節點
(3)?????Znode中的數據可以有多個版本,比如某一個路徑下存有多個數據版本,那么查詢這個路徑下的數據就需要帶上版本。
(4)?????znode?可以是臨時節點,一旦創建這個?znode?的客戶端與服務器失去聯系,這個?znode?也將自動刪除,Zookeeper?的客戶端和服務器通信采用長連接方式,每個客戶端和? 服務器通過心跳來保持連接,這個連接狀態稱為?session,如果?znode?是臨時節點,這個?session?失效,znode?也就刪除了
(5)?????znode?的目錄名可以自動編號,如?App1?已經存在,再創建的話,將會自動命名為?App2?
(6)?????znode?可以被監控,包括這個目錄節點中存儲的數據的修改,子節點目錄的變化等,一旦變化可以通知設置監控的客戶端,這個功能是zookeeper對于應用最重要的特性,通過這個特性可以實現的功能包括配置的集中管理,集群管理,分布式鎖等等。??