轉載於 千與 的 http://blog.csdn.net/shirdrn/article/details/7183503html
ZooKeeper是一個分佈式開源框架,提供了協調分佈式應用的基本服務,它向外部應用暴露一組通用服務——分佈式同步(Distributed Synchronization)、命名服務(Naming Service)、集羣維護(Group Maintenance)等,簡化分佈式應用協調及其管理的難度,提供高性能的分佈式服務。ZooKeeper自己能夠以Standalone模式安裝運行,不過它的長處在於經過分佈式ZooKeeper集羣(一個Leader,多個Follower),基於必定的策略來保證ZooKeeper集羣的穩定性和可用性,從而實現分佈式應用的可靠性。java
有關ZooKeeper的介紹,網上不少,也能夠參考文章後面,我整理的一些相關連接。node
下面,咱們簡單說明一下ZooKeeper的配置。 linux
ZooKeeper Standalone模式
從Apache網站上(zookeeper.apache.org)下載ZooKeeper軟件包,我選擇了3.3.4版本的(zookeeper-3.3.4.tar.gz),在一臺Linux機器上安裝很是容易,只須要解壓縮後,簡單配置一下便可以啓動ZooKeeper服務器進程。算法
將zookeeper-3.3.4/conf目錄下面的 zoo_sample.cfg修改成zoo.cfg,配置文件內容以下所示: 數據庫
- tickTime=2000
- dataDir=/home/hadoop/storage/zookeeper
- clientPort=2181
- initLimit=5
- syncLimit=2
上面各個配置參數的含義也很是簡單,引用以下所示: apache
- tickTime —— the basic time unit in milliseconds used by ZooKeeper. It is used to do heartbeats and the minimum session timeout will be twice the tickTime.
- dataDir —— the location to store the in-memory database snapshots and, unless specified otherwise, the transaction log of updates to the database.
- clientPort —— the port to listen for client connections
下面啓動ZooKeeper服務器進程: 編程
- cd zookeeper-3.3.4/
- bin/zkServer.sh start
經過jps命令能夠查看ZooKeeper服務器進程,名稱爲QuorumPeerMain。 緩存
在客戶端鏈接ZooKeeper服務器,執行以下命令: 服務器
- bin/zkCli.sh -server dynamic:2181
上面dynamic是個人主機名,若是在本機執行,則執行以下命令便可:
客戶端鏈接信息以下所示:
- hadoop@master:~/installation/zookeeper-3.3.4$ bin/zkCli.sh -server dynamic:2181
- Connecting to dynamic:2181
- 2012-01-08 21:30:06,178 - INFO [main:Environment@97] - Client environment:zookeeper.version=3.3.3-1203054, built on 11/17/2011 05:47 GMT
- 2012-01-08 21:30:06,188 - INFO [main:Environment@97] - Client environment:host.name=master
- 2012-01-08 21:30:06,191 - INFO [main:Environment@97] - Client environment:java.version=1.6.0_30
- 2012-01-08 21:30:06,194 - INFO [main:Environment@97] - Client environment:java.vendor=Sun Microsystems Inc.
- 2012-01-08 21:30:06,200 - INFO [main:Environment@97] - Client environment:java.home=/home/hadoop/installation/jdk1.6.0_30/jre
- 2012-01-08 21:30:06,203 - INFO [main:Environment@97] - Client environment:java.class.path=/home/hadoop/installation/zookeeper-3.3.4/bin/../build/classes:/home/hadoop/installation/zookeeper-3.3.4/bin/../build/lib/*.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../zookeeper-3.3.4.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/log4j-1.2.15.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/jline-0.9.94.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/commons-lang-2.4.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/commons-collections-3.2.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/commons-cli-1.1.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/apache-rat-tasks-0.6.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/apache-rat-core-0.6.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../src/java/lib/*.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../conf:/home/hadoop/installation/jdk1.6.0_30/lib/*.jar:/home/hadoop/installation/jdk1.6.0_30/jre/lib/*.jar
- 2012-01-08 21:30:06,206 - INFO [main:Environment@97] - Client environment:java.library.path=/home/hadoop/installation/jdk1.6.0_30/jre/lib/i386/client:/home/hadoop/installation/jdk1.6.0_30/jre/lib/i386:/home/hadoop/installation/jdk1.6.0_30/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
- 2012-01-08 21:30:06,213 - INFO [main:Environment@97] - Client environment:java.io.tmpdir=/tmp
- 2012-01-08 21:30:06,216 - INFO [main:Environment@97] - Client environment:java.compiler=<NA>
- 2012-01-08 21:30:06,235 - INFO [main:Environment@97] - Client environment:os.name=Linux
- 2012-01-08 21:30:06,244 - INFO [main:Environment@97] - Client environment:os.arch=i386
- 2012-01-08 21:30:06,246 - INFO [main:Environment@97] - Client environment:os.version=3.0.0-14-generic
- 2012-01-08 21:30:06,251 - INFO [main:Environment@97] - Client environment:user.name=hadoop
- 2012-01-08 21:30:06,254 - INFO [main:Environment@97] - Client environment:user.home=/home/hadoop
- 2012-01-08 21:30:06,255 - INFO [main:Environment@97] - Client environment:user.dir=/home/hadoop/installation/zookeeper-3.3.4
- 2012-01-08 21:30:06,264 - INFO [main:ZooKeeper@379] - Initiating client connection, connectString=dynamic:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@bf32c
- 2012-01-08 21:30:06,339 - INFO [main-SendThread():ClientCnxn$SendThread@1061] - Opening socket connection to server dynamic/192.168.0.107:2181
- Welcome to ZooKeeper!
- 2012-01-08 21:30:06,397 - INFO [main-SendThread(dynamic:2181):ClientCnxn$SendThread@950] - Socket connection established to dynamic/192.168.0.107:2181, initiating session
- JLine support is enabled
- 2012-01-08 21:30:06,492 - INFO [main-SendThread(dynamic:2181):ClientCnxn$SendThread@739] - Session establishment complete on server dynamic/192.168.0.107:2181, sessionid = 0x134b9b714f9000c, negotiated timeout = 30000
-
- WATCHER::
-
- WatchedEvent state:SyncConnected type:None path:null
- [zk: dynamic:2181(CONNECTED) 0]
接着,可使用help查看Zookeeper客戶端可使用的基本操做命令。
ZooKeeper Distributed模式
ZooKeeper分佈式模式安裝(ZooKeeper集羣)也比較容易,這裏說明一下基本要點。
首先要明確的是,ZooKeeper集羣是一個獨立的分佈式協調服務集羣,「獨立」的含義就是說,若是想使用ZooKeeper實現分佈式應用的協調與管理,簡化協調與管理,任何分佈式應用均可以使用,這就要歸功於Zookeeper的數據模型(Data Model)和層次命名空間(Hierarchical Namespace)結構,詳細能夠參考http://zookeeper.apache.org/doc/trunk/zookeeperOver.html。在設計你的分佈式應用協調服務時,首要的就是考慮如何組織層次命名空間。
下面說明分佈式模式的安裝配置,過程以下所示:
第一步:主機名稱到IP地址映射配置
ZooKeeper集羣中具備兩個關鍵的角色:Leader和Follower。集羣中全部的結點做爲一個總體對分佈式應用提供服務,集羣中每一個結點之間都互相鏈接,因此,在配置的ZooKeeper集羣的時候,每個結點的host到IP地址的映射都要配置上集羣中其它結點的映射信息。
例如,個人ZooKeeper集羣中每一個結點的配置,以slave-01爲例,/etc/hosts內容以下所示:
- 192.168.0.179 slave-01
- 192.168.0.178 slave-02
- 192.168.0.177 slave-03
ZooKeeper採用一種稱爲Leader election的選舉算法。在整個集羣運行過程當中,只有一個Leader,其餘的都是Follower,若是ZooKeeper集羣在運行過程當中Leader出了問題,系統會採用該算法從新選出一個Leader。所以,各個結點之間要可以保證互相鏈接,必須配置上述映射。
ZooKeeper集羣啓動的時候,會首先選出一個Leader,在Leader election過程當中,某一個知足選舉算的結點就能成爲Leader。整個集羣的架構能夠參考http://zookeeper.apache.org/doc/trunk/zookeeperOver.html#sc_designGoals。
第二步:修改ZooKeeper配置文件
在其中一臺機器(slave-01)上,解壓縮zookeeper-3.3.4.tar.gz,修改配置文件conf/zoo.cfg,內容以下所示:
- tickTime=2000
- dataDir=/home/hadoop/storage/zookeeper
- clientPort=2181
- initLimit=5
- syncLimit=2
- server.1=slave-01:2888:3888
- server.2=slave-02:2888:3888
- server.3=slave-03:2888:3888
上述配置內容說明,能夠參考http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html#sc_RunningReplicatedZooKeeper。
第三步:遠程複製分發安裝文件
上面已經在一臺機器slave-01上配置完成ZooKeeper,如今能夠將該配置好的安裝文件遠程拷貝到集羣中的各個結點對應的目錄下:
- cd /home/hadoop/installation/
- scp -r zookeeper-3.3.4/ hadoop@slave-02:/home/hadoop/installation/
- scp -r zookeeper-3.3.4/ hadoop@slave-03:/home/hadoop/installation/
第四步:設置myid
在咱們配置的dataDir指定的目錄下面,建立一個myid文件,裏面內容爲一個數字,用來標識當前主機,conf/zoo.cfg文件中配置的server.X中X爲何數字,則myid文件中就輸入這個數字,例如:
- hadoop@slave-01:~/installation/zookeeper-3.3.4$ echo "1" > /home/hadoop/storage/zookeeper/myid
- hadoop@slave-02:~/installation/zookeeper-3.3.4$ echo "2" > /home/hadoop/storage/zookeeper/myid
- hadoop@slave-03:~/installation/zookeeper-3.3.4$ echo "3" > /home/hadoop/storage/zookeeper/myid
按照上述進行配置便可。
第五步:啓動ZooKeeper集羣
在ZooKeeper集羣的每一個結點上,執行啓動ZooKeeper服務的腳本,以下所示:
- hadoop@slave-01:~/installation/zookeeper-3.3.4$ bin/zkServer.sh start
- hadoop@slave-02:~/installation/zookeeper-3.3.4$ bin/zkServer.sh start
- hadoop@slave-03:~/installation/zookeeper-3.3.4$ bin/zkServer.sh start
以結點slave-01爲例,日誌以下所示:
- hadoop@slave-01:~/installation/zookeeper-3.3.4$ tail -500f zookeeper.out
- 2012-01-08 06:51:19,117 - INFO [main:QuorumPeerConfig@90] - Reading configuration from: /home/hadoop/installation/zookeeper-3.3.4/bin/../conf/zoo.cfg
- 2012-01-08 06:51:19,133 - INFO [main:QuorumPeerConfig@310] - Defaulting to majority quorums
- 2012-01-08 06:51:19,167 - INFO [main:QuorumPeerMain@119] - Starting quorum peer
- 2012-01-08 06:51:19,227 - INFO [main:NIOServerCnxn$Factory@143] - binding to port 0.0.0.0/0.0.0.0:2181
- 2012-01-08 06:51:19,277 - INFO [main:QuorumPeer@819] - tickTime set to 2000
- 2012-01-08 06:51:19,278 - INFO [main:QuorumPeer@830] - minSessionTimeout set to -1
- 2012-01-08 06:51:19,279 - INFO [main:QuorumPeer@841] - maxSessionTimeout set to -1
- 2012-01-08 06:51:19,281 - INFO [main:QuorumPeer@856] - initLimit set to 5
- 2012-01-08 06:51:19,347 - INFO [Thread-1:QuorumCnxManager$Listener@473] - My election bind port: 3888
- 2012-01-08 06:51:19,393 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumPeer@621] - LOOKING
- 2012-01-08 06:51:19,396 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FastLeaderElection@663] - New election. My id = 1, Proposed zxid = 0
- 2012-01-08 06:51:19,400 - INFO [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 1 (n.leader), 0 (n.zxid), 1 (n.round), LOOKING (n.state), 1 (n.sid), LOOKING (my state)
- 2012-01-08 06:51:19,416 - WARN [WorkerSender Thread:QuorumCnxManager@384] - Cannot open channel to 2 at election address slave-02/192.168.0.178:3888
- java.net.ConnectException: Connection refused
- at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
- at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
- at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:100)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:371)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:340)
- at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:360)
- at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:333)
- at java.lang.Thread.run(Thread.java:662)
- 2012-01-08 06:51:19,420 - WARN [WorkerSender Thread:QuorumCnxManager@384] - Cannot open channel to 3 at election address slave-03/192.168.0.177:3888
- java.net.ConnectException: Connection refused
- at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
- at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
- at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:100)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:371)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:340)
- at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:360)
- at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:333)
- at java.lang.Thread.run(Thread.java:662)
- 2012-01-08 06:51:19,612 - WARN [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@384] - Cannot open channel to 2 at election address slave-02/192.168.0.178:3888
- java.net.ConnectException: Connection refused
- at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
- at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
- at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:100)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:371)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:404)
- at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:688)
- at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:622)
- 2012-01-08 06:51:19,615 - WARN [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@384] - Cannot open channel to 3 at election address slave-03/192.168.0.177:3888
- java.net.ConnectException: Connection refused
- at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
- at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
- at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:100)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:371)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:404)
- at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:688)
- at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:622)
- 2012-01-08 06:51:19,616 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FastLeaderElection@697] - Notification time out: 400
- 2012-01-08 06:51:20,019 - WARN [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@384] - Cannot open channel to 2 at election address slave-02/192.168.0.178:3888
- java.net.ConnectException: Connection refused
- at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
- at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
- at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:100)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:371)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:404)
- at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:688)
- at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:622)
- 2012-01-08 06:51:20,021 - WARN [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@384] - Cannot open channel to 3 at election address slave-03/192.168.0.177:3888
- java.net.ConnectException: Connection refused
- at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
- at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
- at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:100)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:371)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:404)
- at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:688)
- at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:622)
- 2012-01-08 06:51:20,022 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FastLeaderElection@697] - Notification time out: 800
- 2012-01-08 06:51:20,825 - WARN [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@384] - Cannot open channel to 2 at election address slave-02/192.168.0.178:3888
- java.net.ConnectException: Connection refused
- at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
- at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
- at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:100)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:371)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:404)
- at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:688)
- at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:622)
- 2012-01-08 06:51:20,827 - WARN [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@384] - Cannot open channel to 3 at election address slave-03/192.168.0.177:3888
- java.net.ConnectException: Connection refused
- at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
- at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
- at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:100)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:371)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:404)
- at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:688)
- at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:622)
- 2012-01-08 06:51:20,828 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FastLeaderElection@697] - Notification time out: 1600
- 2012-01-08 06:51:22,435 - WARN [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@384] - Cannot open channel to 2 at election address slave-02/192.168.0.178:3888
- java.net.ConnectException: Connection refused
- at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
- at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
- at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:100)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:371)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:404)
- at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:688)
- at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:622)
- 2012-01-08 06:51:22,439 - WARN [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@384] - Cannot open channel to 3 at election address slave-03/192.168.0.177:3888
- java.net.ConnectException: Connection refused
- at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
- at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
- at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:100)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:371)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:404)
- at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:688)
- at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:622)
- 2012-01-08 06:51:22,441 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FastLeaderElection@697] - Notification time out: 3200
- 2012-01-08 06:51:22,945 - INFO [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 2 (n.leader), 0 (n.zxid), 1 (n.round), LOOKING (n.state), 2 (n.sid), LOOKING (my state)
- 2012-01-08 06:51:22,946 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FastLeaderElection@721] - Updating proposal
- 2012-01-08 06:51:22,949 - WARN [WorkerSender Thread:QuorumCnxManager@384] - Cannot open channel to 3 at election address slave-03/192.168.0.177:3888
- java.net.ConnectException: Connection refused
- at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
- at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:567)
- at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:100)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:371)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:340)
- at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:360)
- at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:333)
- at java.lang.Thread.run(Thread.java:662)
- 2012-01-08 06:51:22,951 - INFO [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 2 (n.leader), 0 (n.zxid), 1 (n.round), LOOKING (n.state), 1 (n.sid), LOOKING (my state)
- 2012-01-08 06:51:23,156 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumPeer@643] - FOLLOWING
- 2012-01-08 06:51:23,170 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Learner@80] - TCP NoDelay set to: true
- 2012-01-08 06:51:23,206 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:zookeeper.version=3.3.3-1203054, built on 11/17/2011 05:47 GMT
- 2012-01-08 06:51:23,207 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:host.name=slave-01
- 2012-01-08 06:51:23,207 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:java.version=1.6.0_30
- 2012-01-08 06:51:23,208 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:java.vendor=Sun Microsystems Inc.
- 2012-01-08 06:51:23,208 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:java.home=/home/hadoop/installation/jdk1.6.0_30/jre
- 2012-01-08 06:51:23,209 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:java.class.path=/home/hadoop/installation/zookeeper-3.3.4/bin/../build/classes:/home/hadoop/installation/zookeeper-3.3.4/bin/../build/lib/*.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../zookeeper-3.3.4.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/log4j-1.2.15.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/jline-0.9.94.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/commons-lang-2.4.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/commons-collections-3.2.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/commons-cli-1.1.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/apache-rat-tasks-0.6.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/apache-rat-core-0.6.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../src/java/lib/*.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../conf:/home/hadoop/installation/jdk1.6.0_30/lib/*.jar:/home/hadoop/installation/jdk1.6.0_30/jre/lib/*.jar
- 2012-01-08 06:51:23,210 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:java.library.path=/home/hadoop/installation/jdk1.6.0_30/jre/lib/i386/client:/home/hadoop/installation/jdk1.6.0_30/jre/lib/i386:/home/hadoop/installation/jdk1.6.0_30/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
- 2012-01-08 06:51:23,210 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:java.io.tmpdir=/tmp
- 2012-01-08 06:51:23,212 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:java.compiler=<NA>
- 2012-01-08 06:51:23,212 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:os.name=Linux
- 2012-01-08 06:51:23,212 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:os.arch=i386
- 2012-01-08 06:51:23,213 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:os.version=3.0.0-14-generic
- 2012-01-08 06:51:23,213 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:user.name=hadoop
- 2012-01-08 06:51:23,214 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:user.home=/home/hadoop
- 2012-01-08 06:51:23,214 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Environment@97] - Server environment:user.dir=/home/hadoop/installation/zookeeper-3.3.4
- 2012-01-08 06:51:23,223 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:ZooKeeperServer@151] - Created server with tickTime 2000 minSessionTimeout 4000 maxSessionTimeout 40000 datadir /home/hadoop/storage/zookeeper/version-2 snapdir /home/hadoop/storage/zookeeper/version-2
- 2012-01-08 06:51:23,339 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Learner@294] - Getting a snapshot from leader
- 2012-01-08 06:51:23,358 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:Learner@325] - Setting leader epoch 1
- 2012-01-08 06:51:23,358 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FileTxnSnapLog@254] - Snapshotting: 0
- 2012-01-08 06:51:25,511 - INFO [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 3 (n.leader), 0 (n.zxid), 1 (n.round), LOOKING (n.state), 3 (n.sid), FOLLOWING (my state)
- 2012-01-08 06:51:42,584 - INFO [WorkerReceiver Thread:FastLeaderElection@496] - Notification: 3 (n.leader), 0 (n.zxid), 2 (n.round), LOOKING (n.state), 3 (n.sid), FOLLOWING (my state)
我啓動的順序是slave-01>slave-02>slave-03,因爲ZooKeeper集羣啓動的時候,每一個結點都試圖去鏈接集羣中的其它結點,先啓動的確定連不上後面還沒啓動的,因此上面日誌前面部分的異常是能夠忽略的。經過後面部分能夠看到,集羣在選出一個Leader後,最後穩定了。
其餘結點可能也出現相似問題,屬於正常。
第六步:安裝驗證
能夠經過ZooKeeper的腳原本查看啓動狀態,包括集羣中各個結點的角色(或是Leader,或是Follower),以下所示,是在ZooKeeper集羣中的每一個結點上查詢的結果:
- hadoop@slave-01:~/installation/zookeeper-3.3.4$ bin/zkServer.sh status
- JMX enabled by default
- Using config: /home/hadoop/installation/zookeeper-3.3.4/bin/../conf/zoo.cfg
- Mode: follower
-
- hadoop@slave-02:~/installation/zookeeper-3.3.4$ bin/zkServer.sh status
- JMX enabled by default
- Using config: /home/hadoop/installation/zookeeper-3.3.4/bin/../conf/zoo.cfg
- Mode: leader
-
- hadoop@slave-03:~/installation/zookeeper-3.3.4$ bin/zkServer.sh status
- JMX enabled by default
- Using config: /home/hadoop/installation/zookeeper-3.3.4/bin/../conf/zoo.cfg
- Mode: follower
經過上面狀態查詢結果可見,slave-02是集羣的Leader,其他的兩個結點是Follower。
另外,能夠經過客戶端腳本,鏈接到ZooKeeper集羣上。對於客戶端來講,ZooKeeper是一個總體(ensemble),鏈接到ZooKeeper集羣實際上感受在獨享整個集羣的服務,因此,你能夠在任何一個結點上創建到服務集羣的鏈接,例如:
- hadoop@slave-03:~/installation/zookeeper-3.3.4$ bin/zkCli.sh -server slave-01:2181
- Connecting to slave-01:2181
- 2012-01-08 07:14:21,068 - INFO [main:Environment@97] - Client environment:zookeeper.version=3.3.3-1203054, built on 11/17/2011 05:47 GMT
- 2012-01-08 07:14:21,080 - INFO [main:Environment@97] - Client environment:host.name=slave-03
- 2012-01-08 07:14:21,085 - INFO [main:Environment@97] - Client environment:java.version=1.6.0_30
- 2012-01-08 07:14:21,089 - INFO [main:Environment@97] - Client environment:java.vendor=Sun Microsystems Inc.
- 2012-01-08 07:14:21,095 - INFO [main:Environment@97] - Client environment:java.home=/home/hadoop/installation/jdk1.6.0_30/jre
- 2012-01-08 07:14:21,104 - INFO [main:Environment@97] - Client environment:java.class.path=/home/hadoop/installation/zookeeper-3.3.4/bin/../build/classes:/home/hadoop/installation/zookeeper-3.3.4/bin/../build/lib/*.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../zookeeper-3.3.4.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/log4j-1.2.15.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/jline-0.9.94.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/commons-lang-2.4.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/commons-collections-3.2.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/commons-cli-1.1.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/apache-rat-tasks-0.6.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../lib/apache-rat-core-0.6.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../src/java/lib/*.jar:/home/hadoop/installation/zookeeper-3.3.4/bin/../conf:/home/hadoop/installation/jdk1.6.0_30/lib/*.jar:/home/hadoop/installation/jdk1.6.0_30/jre/lib/*.jar
- 2012-01-08 07:14:21,111 - INFO [main:Environment@97] - Client environment:java.library.path=/home/hadoop/installation/jdk1.6.0_30/jre/lib/i386/client:/home/hadoop/installation/jdk1.6.0_30/jre/lib/i386:/home/hadoop/installation/jdk1.6.0_30/jre/../lib/i386:/usr/java/packages/lib/i386:/lib:/usr/lib
- 2012-01-08 07:14:21,116 - INFO [main:Environment@97] - Client environment:java.io.tmpdir=/tmp
- 2012-01-08 07:14:21,124 - INFO [main:Environment@97] - Client environment:java.compiler=<NA>
- 2012-01-08 07:14:21,169 - INFO [main:Environment@97] - Client environment:os.name=Linux
- 2012-01-08 07:14:21,175 - INFO [main:Environment@97] - Client environment:os.arch=i386
- 2012-01-08 07:14:21,177 - INFO [main:Environment@97] - Client environment:os.version=3.0.0-14-generic
- 2012-01-08 07:14:21,185 - INFO [main:Environment@97] - Client environment:user.name=hadoop
- 2012-01-08 07:14:21,188 - INFO [main:Environment@97] - Client environment:user.home=/home/hadoop
- 2012-01-08 07:14:21,190 - INFO [main:Environment@97] - Client environment:user.dir=/home/hadoop/installation/zookeeper-3.3.4
- 2012-01-08 07:14:21,197 - INFO [main:ZooKeeper@379] - Initiating client connection, connectString=slave-01:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@bf32c
- 2012-01-08 07:14:21,305 - INFO [main-SendThread():ClientCnxn$SendThread@1061] - Opening socket connection to server slave-01/192.168.0.179:2181
- Welcome to ZooKeeper!
- 2012-01-08 07:14:21,376 - INFO [main-SendThread(slave-01:2181):ClientCnxn$SendThread@950] - Socket connection established to slave-01/192.168.0.179:2181, initiating session
- JLine support is enabled
- [zk: slave-01:2181(CONNECTING) 0] 2012-01-08 07:14:21,872 - INFO [main-SendThread(slave-01:2181):ClientCnxn$SendThread@739] - Session establishment complete on server slave-01/192.168.0.179:2181, sessionid = 0x134bdcd6b730000, negotiated timeout = 30000
-
- WATCHER::
-
- WatchedEvent state:SyncConnected type:None path:null
-
- [zk: slave-01:2181(CONNECTED) 0] ls /
- [zookeeper]
當前根路徑爲/zookeeper。
總結說明
主機名與IP地址映射配置問題
啓動ZooKeeper集羣時,若是ZooKeeper集羣中slave-01結點的日誌出現以下錯誤:
- java.net.SocketTimeoutException
- at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:109)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:371)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:404)
- at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:688)
- at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:622)
- 2012-01-08 06:37:46,026 - INFO [QuorumPeer:/0:0:0:0:0:0:0:0:2181:FastLeaderElection@697] - Notification time out: 6400
- 2012-01-08 06:37:57,431 - WARN [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@384] - Cannot open channel to 2 at election address slave-02/202.106.199.35:3888
- java.net.SocketTimeoutException
- at sun.nio.ch.SocketAdaptor.connect(SocketAdaptor.java:109)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:371)
- at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:404)
- at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:688)
- at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:622)
- 2012-01-08 06:38:02,442 - WARN [QuorumPeer:/0:0:0:0:0:0:0:0:2181:QuorumCnxManager@384] - Cannot open channel to 3 at election address slave-03/202.106.199.35:3888
很顯然,slave-01在啓動時鏈接集羣中其餘結點(slave-0二、slave-03)時,主機名映射的IP與咱們實際配置的不一致,因此集羣中各個結點之間沒法創建鏈路,整個ZooKeeper集羣啓動是失敗的。
上面錯誤日誌中slave-02/202.106.199.35:3888實際應該是slave-02/202.192.168.0.178:3888就對了,可是在進行域名解析的時候映射有問題,修改每一個結點的/etc/hosts文件,將ZooKeeper集羣中全部結點主機名到IP地址的映射配置上。
附件:參考Zookeeper上的官方參考文檔:
ZooKeeper
ZooKeeper:分佈式應用程序的分佈式協調服務
ZooKeeper是一種用於分佈式應用程序的分佈式,開源協調服務。它暴露了一組簡單的原語,分佈式應用程序能夠基於實現更高級別的服務進行同步,配置維護以及組和命名。它被設計爲易於編程,並使用在文件系統熟悉的目錄樹結構以後設計的數據模型。它運行在Java中,而且具備Java和C的綁定。
協調服務是很是難以正確的。他們特別容易出現種族條件和僵局等錯誤。ZooKeeper背後的動機是緩解分佈式應用程序從頭開始執行協調服務的責任。
設計目標
ZooKeeper很簡單 ZooKeeper容許分佈式進程經過與標準文件系統相似的共享分層命名空間相互協調。名稱空間由ZooKeeper語法中的數據寄存器(稱爲znodes)組成,這些相似於文件和目錄。與專爲存儲設計的典型文件系統不一樣,ZooKeeper數據保存在內存中,這意味着ZooKeeper能夠實現高吞吐量和低延遲數量。
ZooKeeper實現對高性能,高可用性,嚴格有序的訪問很是重要。ZooKeeper的性能方面意味着它能夠在大型分佈式系統中使用。可靠性方面使其不會成爲單點故障。嚴格的排序意味着複雜的同步原語能夠在客戶端實現。
ZooKeeper被複制。像它所協調的分佈式進程同樣,ZooKeeper自己也是被複制到一組稱爲合奏的主機上。
ZooKeeper服務 |
|
構成ZooKeeper服務的服務器必須彼此瞭解。他們維護狀態的內存映像以及持久存儲中的事務日誌和快照。只要大多數服務器可用,ZooKeeper服務將可用。
客戶端鏈接到一個ZooKeeper服務器。客戶端維護TCP鏈接,經過它發送請求,獲取響應,獲取觀看事件併發送心跳。若是到服務器的TCP鏈接中斷,客戶端將鏈接到不一樣的服務器。
ZooKeeper訂購。ZooKeeper將每一個更新標記爲反映全部ZooKeeper事務順序的數字。後續操做可使用該命令來實現更高級的抽象,例如同步原語。
ZooKeeper很快。它在「讀主導」工做負載中特別快。ZooKeeper應用程序在數千臺機器上運行,而且在寫入次數比寫入次數多10到1的狀況下,性能最好。
數據模型和層次命名空間
ZooKeeper提供的名稱空間與標準文件系統相似。名稱是以斜槓(/)分隔的路徑元素序列。ZooKeeper的名稱空間中的每一個節點都由路徑標識。
ZooKeeper的分層命名空間 |
|
節點和短暫節點
與標準文件系統不一樣,ZooKeeper命名空間中的每一個節點均可以與其相關聯的數據以及子節點。就像有一個容許文件也是目錄的文件系統。(ZooKeeper設計用於存儲協調數據:狀態信息,配置,位置信息等,所以存儲在每一個節點上的數據一般很小,字節到千字節範圍)。咱們使用術語 znode來代表咱們正在談論ZooKeeper數據節點。
Znodes維護統計結構,其中包括數據更改,ACL更改和時間戳的版本號,以容許緩存驗證和協調更新。每次znode的數據發生變化時,版本號都會增長。例如,每當客戶端檢索數據時,它也會收到數據的版本。
存儲在命名空間中的每一個znode處的數據以原子方式讀取和寫入。讀取獲取與znode相關聯的全部數據字節,寫入替換全部數據。每一個節點都有一個訪問控制列表(ACL),它限制誰能作什麼。
ZooKeeper還具備短暫節點的概念。只要建立znode的會話處於活動狀態,就會存在這些znodes。當會話結束時,znode被刪除。當您想實現[ tbd ]時,臨時節點頗有用。
有條件的更新和手錶
ZooKeeper支持手錶的概念。客戶能夠在znode上設置手錶。當znode更改時,手錶將被觸發並移除。當手表觸發時,客戶端收到一個數據包,說明znode已經改變了。若是客戶端與Zoo Keeper服務器之間的鏈接斷開,客戶端將收到本地通知。這些能夠用於[tbd]。
保證
ZooKeeper很是快速,很是簡單。因爲其目標是爲建設更爲複雜的服務,如同步化的基礎,它提供了一套保證。這些是:
有關這些的更多信息以及如何使用它們,請參閱 [tbd]
簡單的API
ZooKeeper的設計目標之一是提供一個很是簡單的編程接口。所以,它僅支持如下操做:
-
建立
-
在樹中的某個位置建立一個節點
-
刪除
-
刪除一個節點
-
存在
-
測試節點是否存在於某個位置
-
獲取數據
-
從節點讀取數據
-
設置數據
-
將數據寫入節點
-
獲得孩子
-
檢索節點的子節點列表
-
同步
-
等待數據傳播
有關這些更深刻的討論,以及如何使用它們來實現更高層次的操做,請參考[ tbd ]
實施
ZooKeeper組件顯示ZooKeeper服務的高級組件。除了請求處理器以外,組成ZooKeeper服務的每一個服務器都會複製其每一個組件的本身的副本。
ZooKeeper組件 |
|
複製數據庫是包含整個數據樹的內存數據庫。將更新記錄到磁盤以獲取可恢復性,並將寫入序列化到磁盤,而後才能應用到內存數據庫。
每一個ZooKeeper服務器都爲客戶端服務。客戶端鏈接到一個服務器以提交irequests。從每一個服務器數據庫的本地副本服務器讀取請求。更改服務狀態,寫入請求的請求由協議協議進行處理。
做爲協議協議的一部分,客戶端的全部寫入請求都將轉發到單個服務器,稱爲 主管。稱爲關注者的其餘ZooKeeper服務器 從領導者接收消息提議,並贊成消息傳遞。消息傳遞層負責替代領導者的失敗,並與領導者同步追隨者。
ZooKeeper使用自定義的原子消息協議。因爲消息層是原子的,因此ZooKeeper能夠保證本地副本不會發散。當領導者收到寫請求時,它會計算要應用寫入時系統的狀態,並將其轉換爲捕獲此新狀態的事務。
用途
ZooKeeper的編程界面故意簡單。然而,您能夠實現更高階的操做,例如同步原語,組成員資格,全部權等。一些分佈式應用程序已使用它:[ tbd :從白皮書和視頻演示中添加用途。)有關詳細信息,請參閱 [tbd]
性能
ZooKeeper的設計是高性能的。可是呢 Yahoo! Research的ZooKeeper開發團隊的結果代表它是。(請參見ZooKeeper吞吐量做爲讀寫比率的變化。)讀取超出寫入的應用程序中性能特別高,由於寫入涉及同步全部服務器的狀態。(協調服務一般狀況下讀取數量超過寫入次數。)
ZooKeeper吞吐量隨讀寫速率的變化而變化 |
|
圖形ZooKeeper吞吐量做爲讀寫比率變化是ZooKeeper 3.2版本在具備雙2Ghz至強和兩個SATA 15K RPM驅動器的服務器上運行的吞吐量圖。一個驅動器用做專用的ZooKeeper日誌設備。快照已寫入OS驅動器。寫入請求是1K寫入,讀取是1K讀取。「服務器」表示ZooKeeper系統的大小,構成服務的服務器數量。大約使用其餘30臺服務器來模擬客戶端。ZooKeeper系列被配置爲使領導者不容許與客戶端的鏈接。
基準也代表它也是可靠的。出現錯誤的可靠性顯示部署如何響應各類故障。圖中標有的事件以下:
-
追隨者的失敗和恢復
-
失敗和恢復不一樣的追隨者
-
領導失敗
-
失敗和恢復的兩個追隨者
-
另外一位領導失敗
可靠性
爲了顯示系統隨着時間的推移,注意到咱們運行了一個由7臺機器組成的ZooKeeper服務。咱們執行了與之前相同的飽和基準,但此次咱們將寫入百分比保持在30%,這是咱們預期工做負荷的保守比例。
出現錯誤的可靠性 |
|
這是這個圖表的一些重要觀察。首先,若是追隨者失敗並迅速恢復,那麼ZooKeeper儘管發生故障仍然可以維持高吞吐量。但也許更重要的是,領導選舉算法可使系統恢復得足夠快,以防止吞吐量大幅降低。在咱們的觀察中,ZooKeeper須要不到200ms才能選出新的領導者。第三,隨着追隨者的恢復,ZooKeeper可以在開始處理請求後再次提升吞吐量。
ZooKeeper項目
ZooKeeper已經成功 應用於 許多工業應用。它在Yahoo!中用做Yahoo! Message Broker的協調和故障恢復服務,Yahoo! Message Broker是一個高度可擴展的發佈訂閱系統,用於管理數千個用於複製和數據傳送的主題。它由用於Yahoo! crawler的獲取服務使用,它還管理故障恢復。一些Yahoo!廣告系統也使用ZooKeeper來實現可靠的服務。
鼓勵全部用戶和開發人員加入社區並貢獻本身的專長。有關更多信息,請參閱 Apache上的 Zookeeper項目 。
參考連接
下面是我整理蒐集的有關ZooKeeper相關內容的網址,能夠學習參考。
中文連接:
英文連接: