口水:Zookeeper是我目前接觸過Apache開源系統中比較複雜的一個產品,要搞清楚這個東東里面的運做關係還真不是一時半會能夠搞定的事,本人目前只略知皮毛之術。html
ZooKeeper 是什麼?java
ZooKeeper 顧名思義 動物園管理員,他是拿來管大象(Hadoop) 、 蜜蜂(Hive) 、 小豬(Pig) 的管理員, Apache Hbase和 Apache Solr 以及LinkedIn sensei 等項目中都採用到了 Zookeeper。ZooKeeper是一個分佈式的,開放源碼的分佈式應用程序協調服務,ZooKeeper是以Fast Paxos算法爲基礎,實現同步服務,配置維護和命名服務等分佈式應用。
node
ZooKeeper 如何工做?算法
ZooKeeper是做爲分佈式應用創建更高層次的同步(synchronization)、配置管理 (configuration maintenance)、羣組(groups)以及名稱服務(naming)。在編程上,ZooKeeper設計很簡單,所使用的數據模型風格很像文件系統的目錄樹結構,簡單來講,有點相似windows中註冊表的結構,有名稱,有樹節點,有Key(鍵)/Value(值)對的關係,能夠看作一個樹形結構的數據庫,分佈在不一樣的機器上作名稱管理。數據庫
Zookeeper分爲2個部分:服務器端和客戶端,客戶端只鏈接到整個ZooKeeper服務的某個服務器上。客戶端使用並維護一個TCP鏈接,經過這個鏈接發送請求、接受響應、獲取觀察的事件以及發送心跳。若是這個TCP鏈接中斷,客戶端將嘗試鏈接到另外的ZooKeeper服務器。客戶端第一次鏈接到ZooKeeper服務時,接受這個鏈接的 ZooKeeper服務器會爲這個客戶端創建一個會話。當這個客戶端鏈接到另外的服務器時,這個會話會被新的服務器從新創建。apache
啓動Zookeeper服務器集羣環境後,多個Zookeeper服務器在工做前會選舉出一個Leader,在接下來的工做中這個被選舉出來的Leader死了,而剩下的Zookeeper服務器會知道這個Leader死掉了,在活着的Zookeeper集羣中會繼續選出一個Leader,選舉出leader的目的是爲了能夠在分佈式的環境中保證數據的一致性。如圖所示:
編程
另外,ZooKeeper 支持watch(觀察)的概念。客戶端能夠在每一個znode結點上設置一個觀察。若是被觀察服務端的znode結點有變動,那麼watch就會被觸發,這個watch所屬的客戶端將接收到一個通知包被告知結點已經發生變化。若客戶端和所鏈接的ZooKeeper服務器斷開鏈接時,其餘客戶端也會收到一個通知,也就說一個Zookeeper服務器端能夠對於多個客戶端,固然也能夠多個Zookeeper服務器端能夠對於多個客戶端,如圖所示:
windows
你還能夠經過命令查看出,當前那個Zookeeper服務端的節點是Leader,哪一個是Follower,如圖所示:
服務器
我經過試驗觀察到 Zookeeper的集羣環境最好有3臺以上的節點,若是隻有2臺,那麼2臺當中無論那臺機器down掉,將只會剩下一個leader,那麼若是有再有客戶端鏈接上來,將沒法工做,而且剩下的leader服務器會不斷的拋出異常。內容以下:
java.net.ConnectException: Connection refused
at sun.nio.ch.Net.connect(Native Method)
at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:507)
at java.nio.channels.SocketChannel.open(SocketChannel.java:146)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:347)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:381)
at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:674)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:611)
2010-11-15 00:31:52,031 – INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FastLeaderElection@683] – Notification time out: 12800session
而且客戶端鏈接時還會拋出這樣的異常,說明鏈接被拒絕,而且等待一個socket鏈接新的鏈接,這裏socket新的鏈接指的是zookeeper中的一個Follower。
org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1000) Opening socket connection to server 192.168.50.211/192.168.50.211:2181
org.apache.zookeeper.ClientCnxn$SendThread.primeConnection(ClientCnxn.java:908) Socket connection established to 192.168.50.211/192.168.50.211:2181, initiating session
org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1118) Unable to read additional data from server sessionid 0×0, likely server has closed socket, closing socket connection and attempting reconnect
org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1000) Opening socket connection to server localhost/127.0.0.1:2181
2010-11-15 13:31:56,626 WARN org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1120) Session 0×0 for server null, unexpected error, closing socket connection and attempting reconnect
先寫到這裏,全面瞭解Zookeeper不太容易,光看Apache Zookeeper官方的wiki和文檔還不能對其有深刻的瞭解,想閱讀Zookeeper中的部分源代碼。另外,本人目前正在學習和了解ing,歡迎你們與我交流,謝謝。