|
Posted on 2012-05-03 10:28 云云 閱讀(79153) 評(píng)論(11) 編輯 收藏
ZooKeeper是一個(gè)分布式開源框架,提供了協(xié)調(diào)分布式應(yīng)用的基本服務(wù),它向外部應(yīng)用暴露一組通用服務(wù)——分布式同步(Distributed Synchronization)、命名服務(wù)(Naming Service)、集群維護(hù)(Group Maintenance)等,簡(jiǎn)化分布式應(yīng)用協(xié)調(diào)及其管理的難度,提供高性能的分布式服務(wù)。ZooKeeper本身可以以Standalone模式安裝運(yùn)行,不過(guò)它的長(zhǎng)處在于通過(guò)分布式ZooKeeper集群(一個(gè)Leader,多個(gè)Follower),基于一定的策略來(lái)保證ZooKeeper集群的穩(wěn)定性和可用性,從而實(shí)現(xiàn)分布式應(yīng)用的可靠性。
有關(guān)ZooKeeper的介紹,網(wǎng)上很多,也可以參考文章后面,我整理的一些相關(guān)鏈接。
下面,我們簡(jiǎn)單說(shuō)明一下ZooKeeper的配置。
ZooKeeper Standalone模式
從Apache網(wǎng)站上(zookeeper.apache.org)下載ZooKeeper軟件包,我選擇了3.3.4版本的(zookeeper-3.3.4.tar.gz),在一臺(tái)Linux機(jī)器上安裝非常容易,只需要解壓縮后,簡(jiǎn)單配置一下即可以啟動(dòng)ZooKeeper服務(wù)器進(jìn)程。
將zookeeper-3.3.4/conf目錄下面的 zoo_sample.cfg修改為zoo.cfg,配置文件內(nèi)容如下所示:
- tickTime=2000
- dataDir=/home/hadoop/storage/zookeeper
- clientPort=2181
- initLimit=5
- syncLimit=2
上面各個(gè)配置參數(shù)的含義也非常簡(jiǎn)單,引用如下所示:
- 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
下面啟動(dòng)ZooKeeper服務(wù)器進(jìn)程:
- cd zookeeper-3.3.4/
- bin/zkServer.sh start
通過(guò)jps命令可以查看ZooKeeper服務(wù)器進(jìn)程,名稱為QuorumPeerMain。
在客戶端連接ZooKeeper服務(wù)器,執(zhí)行如下命令:
- bin/zkCli.sh -server dynamic:2181
上面dynamic是我的主機(jī)名,如果在本機(jī)執(zhí)行,則執(zhí)行如下命令即可:
客戶端連接信息如下所示:
接著,可以使用help查看Zookeeper客戶端可以使用的基本操作命令。
ZooKeeper Distributed模式
ZooKeeper分布式模式安裝(ZooKeeper集群)也比較容易,這里說(shuō)明一下基本要點(diǎn)。
首先要明確的是,ZooKeeper集群是一個(gè)獨(dú)立的分布式協(xié)調(diào)服務(wù)集群,“獨(dú)立”的含義就是說(shuō),如果想使用ZooKeeper實(shí)現(xiàn)分布式應(yīng)用的協(xié)調(diào)與管理,簡(jiǎn)化協(xié)調(diào)與管理,任何分布式應(yīng)用都可以使用,這就要?dú)w功于Zookeeper的數(shù)據(jù)模型(Data Model)和層次命名空間(Hierarchical Namespace)結(jié)構(gòu),詳細(xì)可以參考http://zookeeper.apache.org/doc/trunk/zookeeperOver.html。在設(shè)計(jì)你的分布式應(yīng)用協(xié)調(diào)服務(wù)時(shí),首要的就是考慮如何組織層次命名空間。
下面說(shuō)明分布式模式的安裝配置,過(guò)程如下所示:
第一步:主機(jī)名稱到IP地址映射配置
ZooKeeper集群中具有兩個(gè)關(guān)鍵的角色:Leader和Follower。集群中所有的結(jié)點(diǎn)作為一個(gè)整體對(duì)分布式應(yīng)用提供服務(wù),集群中每個(gè)結(jié)點(diǎn)之間都互相連接,所以,在配置的ZooKeeper集群的時(shí)候,每一個(gè)結(jié)點(diǎn)的host到IP地址的映射都要配置上集群中其它結(jié)點(diǎn)的映射信息。
例如,我的ZooKeeper集群中每個(gè)結(jié)點(diǎn)的配置,以slave-01為例,/etc/hosts內(nèi)容如下所示:
- 192.168.0.179 slave-01
- 192.168.0.178 slave-02
- 192.168.0.177 slave-03
ZooKeeper采用一種稱為L(zhǎng)eader election的選舉算法。在整個(gè)集群運(yùn)行過(guò)程中,只有一個(gè)Leader,其他的都是Follower,如果ZooKeeper集群在運(yùn)行過(guò)程中Leader出了問(wèn)題,系統(tǒng)會(huì)采用該算法重新選出一個(gè)Leader。因此,各個(gè)結(jié)點(diǎn)之間要能夠保證互相連接,必須配置上述映射。
ZooKeeper集群?jiǎn)?dòng)的時(shí)候,會(huì)首先選出一個(gè)Leader,在Leader election過(guò)程中,某一個(gè)滿足選舉算的結(jié)點(diǎn)就能成為L(zhǎng)eader。整個(gè)集群的架構(gòu)可以參考http://zookeeper.apache.org/doc/trunk/zookeeperOver.html#sc_designGoals。
第二步:修改ZooKeeper配置文件
在其中一臺(tái)機(jī)器(slave-01)上,解壓縮zookeeper-3.3.4.tar.gz,修改配置文件conf/zoo.cfg,內(nèi)容如下所示:
- 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
上述配置內(nèi)容說(shuō)明,可以參考http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html#sc_RunningReplicatedZooKeeper。
第三步:遠(yuǎn)程復(fù)制分發(fā)安裝文件
上面已經(jīng)在一臺(tái)機(jī)器slave-01上配置完成ZooKeeper,現(xiàn)在可以將該配置好的安裝文件遠(yuǎn)程拷貝到集群中的各個(gè)結(jié)點(diǎn)對(duì)應(yīng)的目錄下:
- 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/
第四步:設(shè)置myid
在我們配置的dataDir指定的目錄下面,創(chuàng)建一個(gè)myid文件,里面內(nèi)容為一個(gè)數(shù)字,用來(lái)標(biāo)識(shí)當(dāng)前主機(jī),conf/zoo.cfg文件中配置的server.X中X為什么數(shù)字,則myid文件中就輸入這個(gè)數(shù)字,例如:
- 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
按照上述進(jìn)行配置即可。
第五步:?jiǎn)?dòng)ZooKeeper集群
在ZooKeeper集群的每個(gè)結(jié)點(diǎn)上,執(zhí)行啟動(dòng)ZooKeeper服務(wù)的腳本,如下所示:
- 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
以結(jié)點(diǎn)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)
我啟動(dòng)的順序是slave-01>slave-02>slave-03,由于ZooKeeper集群?jiǎn)?dòng)的時(shí)候,每個(gè)結(jié)點(diǎn)都試圖去連接集群中的其它結(jié)點(diǎn),先啟動(dòng)的肯定連不上后面還沒啟動(dòng)的,所以上面日志前面部分的異常是可以忽略的。通過(guò)后面部分可以看到,集群在選出一個(gè)Leader后,最后穩(wěn)定了。
其他結(jié)點(diǎn)可能也出現(xiàn)類似問(wèn)題,屬于正常。
第六步:安裝驗(yàn)證
可以通過(guò)ZooKeeper的腳本來(lái)查看啟動(dòng)狀態(tài),包括集群中各個(gè)結(jié)點(diǎn)的角色(或是Leader,或是Follower),如下所示,是在ZooKeeper集群中的每個(gè)結(jié)點(diǎn)上查詢的結(jié)果:
- 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
通過(guò)上面狀態(tài)查詢結(jié)果可見,slave-02是集群的Leader,其余的兩個(gè)結(jié)點(diǎn)是Follower。
另外,可以通過(guò)客戶端腳本,連接到ZooKeeper集群上。對(duì)于客戶端來(lái)說(shuō),ZooKeeper是一個(gè)整體(ensemble),連接到ZooKeeper集群實(shí)際上感覺在獨(dú)享整個(gè)集群的服務(wù),所以,你可以在任何一個(gè)結(jié)點(diǎn)上建立到服務(wù)集群的連接,例如:
- 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]
當(dāng)前根路徑為/zookeeper。
總結(jié)說(shuō)明
主機(jī)名與IP地址映射配置問(wèn)題
啟動(dòng)ZooKeeper集群時(shí),如果ZooKeeper集群中slave-01結(jié)點(diǎn)的日志出現(xiàn)如下錯(cuò)誤:
- 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在啟動(dòng)時(shí)連接集群中其他結(jié)點(diǎn)(slave-02、slave-03)時(shí),主機(jī)名映射的IP與我們實(shí)際配置的不一致,所以集群中各個(gè)結(jié)點(diǎn)之間無(wú)法建立鏈路,整個(gè)ZooKeeper集群?jiǎn)?dòng)是失敗的。
上面錯(cuò)誤日志中slave-02/202.106.199.35:3888實(shí)際應(yīng)該是slave-02/202.192.168.0.178:3888就對(duì)了,但是在進(jìn)行域名解析的時(shí)候映射有問(wèn)題,修改每個(gè)結(jié)點(diǎn)的/etc/hosts文件,將ZooKeeper集群中所有結(jié)點(diǎn)主機(jī)名到IP地址的映射配置上。
評(píng)論
# re: zookeeper 集群安裝(單點(diǎn)與分布式成功安裝)摘錄[未登錄] 回復(fù) 更多評(píng)論
2012-11-28 15:54 by
寫的很好,頂博主
# re: zookeeper 集群安裝(單點(diǎn)與分布式成功安裝)摘錄 回復(fù) 更多評(píng)論
2012-12-07 11:17 by
太感謝了!!贊!
# re: zookeeper 集群安裝(單點(diǎn)與分布式成功安裝)摘錄 回復(fù) 更多評(píng)論
2013-04-19 17:36 by
寫的很好,贊!!!!!!!
# re: zookeeper 集群安裝(單點(diǎn)與分布式成功安裝)摘錄 回復(fù) 更多評(píng)論
2013-07-11 15:40 by
寫的不錯(cuò),贊!!
請(qǐng)問(wèn)樓主在配置zookeeper集群時(shí),leader和follower是怎么決定的? 不是按服務(wù)器啟動(dòng)順序,是隨機(jī)分配嗎?
# re: zookeeper 集群安裝(單點(diǎn)與分布式成功安裝)摘錄 回復(fù) 更多評(píng)論
2014-11-27 01:29 by
我的ipy=映射是對(duì)的但還是出現(xiàn)這種異常 [myid=1]/0:0:0:0:0:0:0:0:2181:Learner@233] - Unexpected exception, tries=0, connecting to slave4/192.168.20.13:2888 java.net.NoRouteToHostException: 沒有到主機(jī)的路由 at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at org.apache.zookeeper.server.quorum.Learner.connectToLeader(Learner.java:225) at org.apache.zookeeper.server.quorum.Follower.followLeader(Follower.java:71) at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:786) 2014-11-27 01:19:30,946 [myid:1] - WARN [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2181:Learner@233] - Unexpected exception, tries=1, connecting to slave4/192.168.20.13:2888 java.net.NoRouteToHostException: 沒有到主機(jī)的路由 at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
# re: zookeeper 集群安裝(單點(diǎn)與分布式成功安裝)摘錄 回復(fù) 更多評(píng)論
2015-10-20 20:10 by
@龍斌 這個(gè)問(wèn)題,我也遇到了,你最后怎么解決的?
# re: zookeeper 集群安裝(單點(diǎn)與分布式成功安裝)摘錄[未登錄] 回復(fù) 更多評(píng)論
2015-12-07 12:28 by
我解決了 就是關(guān)閉防火墻就可以了。
# re: zookeeper 集群安裝(單點(diǎn)與分布式成功安裝)摘錄 回復(fù) 更多評(píng)論
2015-12-17 14:29 by
Zookeeper+Spring跨機(jī)房容災(zāi)系統(tǒng)以及灰度發(fā)布課程 課程學(xué)習(xí)地址: http://www.xuetuwuyou.com/course/20一、課程使用到的軟件及版本: centos系統(tǒng),zookeeper 3.4.6,Spring4 二、課程目標(biāo): 1、熟練開發(fā)各種分布式應(yīng)用 2、掌控zookeeper java客戶端開發(fā) 3、熟練運(yùn)用curator的各種特性 三、課程目錄 第1節(jié)、zookeepeer集群簡(jiǎn)介,跨機(jī)房容災(zāi)系統(tǒng)架構(gòu)設(shè)計(jì) 第2節(jié)、zookeeper的java客戶端與spring整合(上) 第3節(jié)、zookeeper的java客戶端與spring整合(下) 第4節(jié)、zookeeper-3watcher使用(上) 第5節(jié)、zookeeper-3watcher使用(下) 第6節(jié)、Curator介紹與使用 第7節(jié)、zookeeper跨機(jī)房容災(zāi)系統(tǒng)設(shè)計(jì)兩種方案詳細(xì)講解 第8節(jié)、zookeeper跨機(jī)房容災(zāi)具體實(shí)現(xiàn) 第9節(jié)、zookeeper跨機(jī)房容災(zāi)系統(tǒng)的調(diào)試,以及分布式鎖的簡(jiǎn)單介紹 第10節(jié)、zookeeper分布式鎖(上) 第11節(jié)、zookeeper分布式鎖(下) 第12節(jié)、zookeeper實(shí)現(xiàn)灰度指定服務(wù)器發(fā)布 第13節(jié)、課程總結(jié)以及未來(lái)展望
|