天天看點

ZooKeeper-3.3.4叢集安裝配置

zookeeper是一個分布式開源架構,提供了協調分布式應用的基本服務,它向外部應用暴露一組通用服務——分布式同步(distributed synchronization)、命名服務(naming service)、叢集維護(group maintenance)等,簡化分布式應用協調及其管理的難度,提供高性能的分布式服務。zookeeper本身可以以standalone模式安裝運作,不過它的長處在于通過分布式zookeeper叢集(一個leader,多個follower),基于一定的政策來保證zookeeper叢集的穩定性和可用性,進而實作分布式應用的可靠性。

有關zookeeper的介紹,網上很多,也可以參考文章後面,我整理的一些相關連結。

zookeeper的安裝配置還算比較容易的,下面,我們簡單說明一下zookeeper的配置。

zookeeper standalone模式

将zookeeper-3.3.4/conf目錄下面的 zoo_sample.cfg修改為zoo.cfg,配置檔案内容如下所示:

<code>1</code>

<code>ticktime=2000</code>

<code>2</code>

<code>datadir=/home/hadoop/storage/zookeeper</code>

<code>3</code>

<code>clientport=2181</code>

<code>4</code>

<code>initlimit=5</code>

<code>5</code>

<code>synclimit=2</code>

上面各個配置參數的含義也非常簡單,引用如下所示:

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伺服器程序:

<code>cd</code> <code>zookeeper-3.3.4/</code>

<code>bin/zkserver.sh start</code>

通過jps指令可以檢視zookeeper伺服器程序,名稱為quorumpeermain。

在用戶端連接配接zookeeper伺服器,執行如下指令:

<code>bin/zkcli.sh -server dynamic:2181</code>

上面dynamic是我的主機名,如果在本機執行,則執行如下指令即可:

<code>bin/zkcli.sh</code>

用戶端連接配接資訊如下所示:

<code>01</code>

<code>shirdrn@master:~/installation/zookeeper-3.3.4$ bin/zkcli.sh -server dynamic:2181</code>

<code>02</code>

<code>connecting to dynamic:2181</code>

<code>03</code>

<code>2013-10-28 21:30:06,178 - info [main:environment@97] - client environment:zookeeper.version=3.3.3-1203054, built on 11/17/2011 05:47 gmt</code>

<code>04</code>

<code>2013-10-28 21:30:06,188 - info [main:environment@97] - client environment:host.name=master</code>

<code>05</code>

<code>2013-10-28 21:30:06,191 - info [main:environment@97] - client environment:java.version=1.6.0_30</code>

<code>06</code>

<code>2013-10-28 21:30:06,194 - info [main:environment@97] - client environment:java.vendor=sun microsystems inc.</code>

<code>07</code>

<code>2013-10-28 21:30:06,200 - info [main:environment@97] - client environment:java.home=/home/hadoop/installation/jdk1.6.0_30/jre</code>

<code>08</code>

<code>2013-10-28 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</code>

<code>09</code>

<code>2013-10-28 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</code>

<code>10</code>

<code>2013-10-28 21:30:06,213 - info [main:environment@97] - client environment:java.io.tmpdir=/tmp</code>

<code>11</code>

<code>2013-10-28 21:30:06,216 - info [main:environment@97] - client environment:java.compiler=&lt;na&gt;</code>

<code>12</code>

<code>2013-10-28 21:30:06,235 - info [main:environment@97] - client environment:os.name=linux</code>

<code>13</code>

<code>2013-10-28 21:30:06,244 - info [main:environment@97] - client environment:os.arch=i386</code>

<code>14</code>

<code>2013-10-28 21:30:06,246 - info [main:environment@97] - client environment:os.version=3.0.0-14-generic</code>

<code>15</code>

<code>2013-10-28 21:30:06,251 - info [main:environment@97] - client environment:user.name=hadoop</code>

<code>16</code>

<code>2013-10-28 21:30:06,254 - info [main:environment@97] - client environment:user.home=/home/hadoop</code>

<code>17</code>

<code>2013-10-28 21:30:06,255 - info [main:environment@97] - client environment:user.</code><code>dir</code><code>=/home/hadoop/installation/zookeeper-3.3.4</code>

<code>18</code>

<code>2013-10-28 21:30:06,264 - info [main:zookeeper@379] - initiating client connection, connectstring=dynamic:2181 sessiontimeout=30000 watcher=org.apache.zookeeper.zookeepermain$mywatcher@bf32c</code>

<code>19</code>

<code>2013-10-28 21:30:06,339 - info [main-sendthread():clientcnxn$sendthread@1061] - opening socket connection to server dynamic/192.168.0.107:2181</code>

<code>20</code>

<code>welcome to zookeeper!</code>

<code>21</code>

<code>2013-10-28 21:30:06,397 - info [main-sendthread(dynamic:2181):clientcnxn$sendthread@950] - socket connection established to dynamic/192.168.0.107:2181, initiating session</code>

<code>22</code>

<code>jline support is enabled</code>

<code>23</code>

<code>2013-10-28 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</code>

<code>24</code>

<code>25</code>

<code>watcher::</code>

<code>26</code>

<code>27</code>

<code>watchedevent state:syncconnected</code><code>type</code><code>:none path:null</code>

<code>28</code>

<code>[zk: dynamic:2181(connected) 0]</code>

接着,可以使用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叢集中每個結點的配置,以zk-01為例,/etc/hosts内容如下所示:

<code>192.168.0.179 zk-01</code>

<code>192.168.0.178 zk-02</code>

<code>192.168.0.177 zk-03</code>

zookeeper采用一種稱為leader election的選舉算法。在整個叢集運作過程中,隻有一個leader,其他的都是follower,如果zookeeper叢集在運作過程中leader出了問題,系統會采用該算法重新選出一個leader。是以,各個結點之間要能夠保證互相連接配接,必須配置上述映射。

zookeeper叢集啟動的時候,會首先選出一個leader,在leader election過程中,某一個滿足選舉算的結點就能成為leader。整個叢集的架構可以參考http://zookeeper.apache.org/doc/trunk/zookeeperover.html#sc_designgoals。

第二步:修改zookeeper配置檔案

在其中一台機器(zk-01)上,解壓縮zookeeper-3.3.4.tar.gz,修改配置檔案conf/zoo.cfg,内容如下所示:

<code>6</code>

<code>server.1=zk-01:2888:3888</code>

<code>7</code>

<code>server.2=zk-02:2888:3888</code>

<code>8</code>

<code>server.3=zk-03:2888:3888</code>

第三步:遠端複制分發安裝檔案

上面已經在一台機器zk-01上配置完成zookeeper,現在可以将該配置好的安裝檔案遠端拷貝到叢集中的各個結點對應的目錄下:

<code>cd</code> <code>/home/hadoop/installation/</code>

<code>scp</code> <code>-r zookeeper-3.3.4/ shirdrn@zk-02:/home/hadoop/installation/</code>

<code>scp</code> <code>-r zookeeper-3.3.4/ shirdrn@zk-03:/home/hadoop/installation/</code>

第四步:設定myid

在我們配置的datadir指定的目錄下面,建立一個myid檔案,裡面内容為一個數字,用來辨別目前主機,conf/zoo.cfg檔案中配置的server.x中x為什麼數字,則myid檔案中就輸入這個數字,例如:

<code>shirdrn@zk-01:~/installation/zookeeper-3.3.4$</code><code>echo</code> <code>"1"</code> <code>&gt; /home/hadoop/storage/zookeeper/myid</code>

<code>shirdrn@zk-02:~/installation/zookeeper-3.3.4$</code><code>echo</code> <code>"2"</code> <code>&gt; /home/hadoop/storage/zookeeper/myid</code>

<code>shirdrn@zk-03:~/installation/zookeeper-3.3.4$</code><code>echo</code> <code>"3"</code> <code>&gt; /home/hadoop/storage/zookeeper/myid</code>

按照上述進行配置即可。

第五步:啟動zookeeper叢集

在zookeeper叢集的每個結點上,執行啟動zookeeper服務的腳本,如下所示:

<code>shirdrn@zk-01:~/installation/zookeeper-3.3.4$ bin/zkserver.sh start</code>

<code>shirdrn@zk-02:~/installation/zookeeper-3.3.4$ bin/zkserver.sh start</code>

<code>shirdrn@zk-03:~/installation/zookeeper-3.3.4$ bin/zkserver.sh start</code>

以結點zk-01為例,日志如下所示:

<code>001</code>

<code>shirdrn@zk-01:~/installation/zookeeper-3.3.4$</code><code>tail</code> <code>-500f zookeeper.out</code>

<code>002</code>

<code>2013-10-28 06:51:19,117 - info [main:quorumpeerconfig@90] - reading configuration from: /home/hadoop/installation/zookeeper-3.3.4/bin/../conf/zoo.cfg</code>

<code>003</code>

<code>2013-10-28 06:51:19,133 - info [main:quorumpeerconfig@310] - defaulting to majority quorums</code>

<code>004</code>

<code>2013-10-28 06:51:19,167 - info [main:quorumpeermain@119] - starting quorum peer</code>

<code>005</code>

<code>2013-10-28 06:51:19,227 - info [main:nioservercnxn$factory@143] - binding to port 0.0.0.0/0.0.0.0:2181</code>

<code>006</code>

<code>2013-10-28 06:51:19,277 - info [main:quorumpeer@819] - ticktime</code><code>set</code> <code>to 2000</code>

<code>007</code>

<code>2013-10-28 06:51:19,278 - info [main:quorumpeer@830] - minsessiontimeout</code><code>set</code> <code>to -1</code>

<code>008</code>

<code>2013-10-28 06:51:19,279 - info [main:quorumpeer@841] - maxsessiontimeout</code><code>set</code> <code>to -1</code>

<code>009</code>

<code>2013-10-28 06:51:19,281 - info [main:quorumpeer@856] - initlimit</code><code>set</code> <code>to 5</code>

<code>010</code>

<code>2013-10-28 06:51:19,347 - info [thread-1:quorumcnxmanager$listener@473] - my election bind port: 3888</code>

<code>011</code>

<code>2013-10-28 06:51:19,393 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:quorumpeer@621] - looking</code>

<code>012</code>

<code>2013-10-28 06:51:19,396 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:fastleaderelection@663] - new election. my</code><code>id</code> <code>= 1, proposed zxid = 0</code>

<code>013</code>

<code>2013-10-28 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)</code>

<code>014</code>

<code>2013-10-28 06:51:19,416 - warn [workersender thread:quorumcnxmanager@384] - cannot</code><code>open</code> <code>channel to 2 at election address zk-02/192.168.0.178:3888</code>

<code>015</code>

<code>java.net.connectexception: connection refused</code>

<code>016</code>

<code></code><code>at sun.nio.ch.socketchannelimpl.checkconnect(native method)</code>

<code>017</code>

<code></code><code>at sun.nio.ch.socketchannelimpl.finishconnect(socketchannelimpl.java:567)</code>

<code>018</code>

<code></code><code>at sun.nio.ch.socketadaptor.connect(socketadaptor.java:100)</code>

<code>019</code>

<code></code><code>at org.apache.zookeeper.server.quorum.quorumcnxmanager.connectone(quorumcnxmanager.java:371)</code>

<code>020</code>

<code></code><code>at org.apache.zookeeper.server.quorum.quorumcnxmanager.tosend(quorumcnxmanager.java:340)</code>

<code>021</code>

<code></code><code>at org.apache.zookeeper.server.quorum.fastleaderelection$messenger$workersender.process(fastleaderelection.java:360)</code>

<code>022</code>

<code></code><code>at org.apache.zookeeper.server.quorum.fastleaderelection$messenger$workersender.run(fastleaderelection.java:333)</code>

<code>023</code>

<code></code><code>at java.lang.thread.run(thread.java:662)</code>

<code>024</code>

<code>2013-10-28 06:51:19,420 - warn [workersender thread:quorumcnxmanager@384] - cannot</code><code>open</code> <code>channel to 3 at election address zk-03/192.168.0.177:3888</code>

<code>025</code>

<code>026</code>

<code>027</code>

<code>028</code>

<code>029</code>

<code>030</code>

<code>031</code>

<code>032</code>

<code>033</code>

<code>034</code>

<code>2013-10-28 06:51:19,612 - warn [quorumpeer:/0:0:0:0:0:0:0:0:2181:quorumcnxmanager@384] - cannot</code><code>open</code> <code>channel to 2 at election address zk-02/192.168.0.178:3888</code>

<code>035</code>

<code>036</code>

<code>037</code>

<code>038</code>

<code>039</code>

<code>040</code>

<code></code><code>at org.apache.zookeeper.server.quorum.quorumcnxmanager.connectall(quorumcnxmanager.java:404)</code>

<code>041</code>

<code></code><code>at org.apache.zookeeper.server.quorum.fastleaderelection.lookforleader(fastleaderelection.java:688)</code>

<code>042</code>

<code></code><code>at org.apache.zookeeper.server.quorum.quorumpeer.run(quorumpeer.java:622)</code>

<code>043</code>

<code>2013-10-28 06:51:19,615 - warn [quorumpeer:/0:0:0:0:0:0:0:0:2181:quorumcnxmanager@384] - cannot</code><code>open</code> <code>channel to 3 at election address zk-03/192.168.0.177:3888</code>

<code>044</code>

<code>045</code>

<code>046</code>

<code>047</code>

<code>048</code>

<code>049</code>

<code>050</code>

<code>051</code>

<code>052</code>

<code>2013-10-28 06:51:19,616 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:fastleaderelection@697] - notification</code><code>time</code> <code>out: 400</code>

<code>053</code>

<code>2013-10-28 06:51:20,019 - warn [quorumpeer:/0:0:0:0:0:0:0:0:2181:quorumcnxmanager@384] - cannot</code><code>open</code> <code>channel to 2 at election address zk-02/192.168.0.178:3888</code>

<code>054</code>

<code>055</code>

<code>056</code>

<code>057</code>

<code>058</code>

<code>059</code>

<code>060</code>

<code>061</code>

<code>062</code>

<code>2013-10-28 06:51:20,021 - warn [quorumpeer:/0:0:0:0:0:0:0:0:2181:quorumcnxmanager@384] - cannot</code><code>open</code> <code>channel to 3 at election address zk-03/192.168.0.177:3888</code>

<code>063</code>

<code>064</code>

<code>065</code>

<code>066</code>

<code>067</code>

<code>068</code>

<code>069</code>

<code>070</code>

<code>071</code>

<code>2013-10-28 06:51:20,022 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:fastleaderelection@697] - notification</code><code>time</code> <code>out: 800</code>

<code>072</code>

<code>2013-10-28 06:51:20,825 - warn [quorumpeer:/0:0:0:0:0:0:0:0:2181:quorumcnxmanager@384] - cannot</code><code>open</code> <code>channel to 2 at election address zk-02/192.168.0.178:3888</code>

<code>073</code>

<code>074</code>

<code>075</code>

<code>076</code>

<code>077</code>

<code>078</code>

<code>079</code>

<code>080</code>

<code>081</code>

<code>2013-10-28 06:51:20,827 - warn [quorumpeer:/0:0:0:0:0:0:0:0:2181:quorumcnxmanager@384] - cannot</code><code>open</code> <code>channel to 3 at election address zk-03/192.168.0.177:3888</code>

<code>082</code>

<code>083</code>

<code>084</code>

<code>085</code>

<code>086</code>

<code>087</code>

<code>088</code>

<code>089</code>

<code>090</code>

<code>2013-10-28 06:51:20,828 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:fastleaderelection@697] - notification</code><code>time</code> <code>out: 1600</code>

<code>091</code>

<code>2013-10-28 06:51:22,435 - warn [quorumpeer:/0:0:0:0:0:0:0:0:2181:quorumcnxmanager@384] - cannot</code><code>open</code> <code>channel to 2 at election address zk-02/192.168.0.178:3888</code>

<code>092</code>

<code>093</code>

<code>094</code>

<code>095</code>

<code>096</code>

<code>097</code>

<code>098</code>

<code>099</code>

<code>100</code>

<code>2013-10-28 06:51:22,439 - warn [quorumpeer:/0:0:0:0:0:0:0:0:2181:quorumcnxmanager@384] - cannot</code><code>open</code> <code>channel to 3 at election address zk-03/192.168.0.177:3888</code>

<code>101</code>

<code>102</code>

<code>103</code>

<code>104</code>

<code>105</code>

<code>106</code>

<code>107</code>

<code>108</code>

<code>109</code>

<code>2013-10-28 06:51:22,441 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:fastleaderelection@697] - notification</code><code>time</code> <code>out: 3200</code>

<code>110</code>

<code>2013-10-28 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)</code>

<code>111</code>

<code>2013-10-28 06:51:22,946 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:fastleaderelection@721] - updating proposal</code>

<code>112</code>

<code>2013-10-28 06:51:22,949 - warn [workersender thread:quorumcnxmanager@384] - cannot</code><code>open</code> <code>channel to 3 at election address zk-03/192.168.0.177:3888</code>

<code>113</code>

<code>114</code>

<code>115</code>

<code>116</code>

<code>117</code>

<code>118</code>

<code>119</code>

<code>120</code>

<code>121</code>

<code>122</code>

<code>2013-10-28 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)</code>

<code>123</code>

<code>2013-10-28 06:51:23,156 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:quorumpeer@643] - following</code>

<code>124</code>

<code>2013-10-28 06:51:23,170 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:learner@80] - tcp nodelay</code><code>set</code> <code>to:</code><code>true</code>

<code>125</code>

<code>2013-10-28 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</code>

<code>126</code>

<code>2013-10-28 06:51:23,207 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:environment@97] - server environment:host.name=zk-01</code>

<code>127</code>

<code>2013-10-28 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</code>

<code>128</code>

<code>2013-10-28 06:51:23,208 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:environment@97] - server environment:java.vendor=sun microsystems inc.</code>

<code>129</code>

<code>2013-10-28 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</code>

<code>130</code>

<code>2013-10-28 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</code>

<code>131</code>

<code>2013-10-28 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</code>

<code>132</code>

<code>2013-10-28 06:51:23,210 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:environment@97] - server environment:java.io.tmpdir=/tmp</code>

<code>133</code>

<code>2013-10-28 06:51:23,212 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:environment@97] - server environment:java.compiler=&lt;na&gt;</code>

<code>134</code>

<code>2013-10-28 06:51:23,212 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:environment@97] - server environment:os.name=linux</code>

<code>135</code>

<code>2013-10-28 06:51:23,212 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:environment@97] - server environment:os.arch=i386</code>

<code>136</code>

<code>2013-10-28 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</code>

<code>137</code>

<code>2013-10-28 06:51:23,213 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:environment@97] - server environment:user.name=hadoop</code>

<code>138</code>

<code>2013-10-28 06:51:23,214 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:environment@97] - server environment:user.home=/home/hadoop</code>

<code>139</code>

<code>2013-10-28 06:51:23,214 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:environment@97] - server environment:user.</code><code>dir</code><code>=/home/hadoop/installation/zookeeper-3.3.4</code>

<code>140</code>

<code>2013-10-28 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</code>

<code>141</code>

<code>2013-10-28 06:51:23,339 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:learner@294] - getting a snapshot from leader</code>

<code>142</code>

<code>2013-10-28 06:51:23,358 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:learner@325] - setting leader epoch 1</code>

<code>143</code>

<code>2013-10-28 06:51:23,358 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:filetxnsnaplog@254] - snapshotting: 0</code>

<code>144</code>

<code>2013-10-28 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)</code>

<code>145</code>

<code>2013-10-28 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)</code>

我啟動的順序是zk-01&gt;zk-02&gt;zk-03,由于zookeeper叢集啟動的時候,每個結點都試圖去連接配接叢集中的其它結點,先啟動的肯定連不上後面還沒啟動的,是以上面日志前面部分的異常是可以忽略的。通過後面部分可以看到,叢集在選出一個leader後,最後穩定了。

其他結點可能也出現類似問題,屬于正常。

第六步:安裝驗證

可以通過zookeeper的腳本來檢視啟動狀态,包括叢集中各個結點的角色(或是leader,或是follower),如下所示,是在zookeeper叢集中的每個結點上查詢的結果:

<code>shirdrn@zk-01:~/installation/zookeeper-3.3.4$ bin/zkserver.sh status</code>

<code>jmx enabled by default</code>

<code>using config: /home/hadoop/installation/zookeeper-3.3.4/bin/../conf/zoo.cfg</code>

<code>mode: follower</code>

<code>shirdrn@zk-02:~/installation/zookeeper-3.3.4$ bin/zkserver.sh status</code>

<code>mode: leader</code>

<code>shirdrn@zk-03:~/installation/zookeeper-3.3.4$ bin/zkserver.sh status</code>

通過上面狀态查詢結果可見,zk-02是叢集的leader,其餘的兩個結點是follower。

另外,可以通過用戶端腳本,連接配接到zookeeper叢集上。對于用戶端來說,zookeeper是一個整體(ensemble),連接配接到zookeeper叢集實際上感覺在獨享整個叢集的服務,是以,你可以在任何一個結點上建立到服務叢集的連接配接,例如:

<code>shirdrn@zk-03:~/installation/zookeeper-3.3.4$ bin/zkcli.sh -server zk-01:2181</code>

<code>connecting to zk-01:2181</code>

<code>2013-10-28 07:14:21,068 - info [main:environment@97] - client environment:zookeeper.version=3.3.3-1203054, built on 11/17/2011 05:47 gmt</code>

<code>2013-10-28 07:14:21,080 - info [main:environment@97] - client environment:host.name=zk-03</code>

<code>2013-10-28 07:14:21,085 - info [main:environment@97] - client environment:java.version=1.6.0_30</code>

<code>2013-10-28 07:14:21,089 - info [main:environment@97] - client environment:java.vendor=sun microsystems inc.</code>

<code>2013-10-28 07:14:21,095 - info [main:environment@97] - client environment:java.home=/home/hadoop/installation/jdk1.6.0_30/jre</code>

<code>2013-10-28 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</code>

<code>2013-10-28 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</code>

<code>2013-10-28 07:14:21,116 - info [main:environment@97] - client environment:java.io.tmpdir=/tmp</code>

<code>2013-10-28 07:14:21,124 - info [main:environment@97] - client environment:java.compiler=&lt;na&gt;</code>

<code>2013-10-28 07:14:21,169 - info [main:environment@97] - client environment:os.name=linux</code>

<code>2013-10-28 07:14:21,175 - info [main:environment@97] - client environment:os.arch=i386</code>

<code>2013-10-28 07:14:21,177 - info [main:environment@97] - client environment:os.version=3.0.0-14-generic</code>

<code>2013-10-28 07:14:21,185 - info [main:environment@97] - client environment:user.name=hadoop</code>

<code>2013-10-28 07:14:21,188 - info [main:environment@97] - client environment:user.home=/home/hadoop</code>

<code>2013-10-28 07:14:21,190 - info [main:environment@97] - client environment:user.</code><code>dir</code><code>=/home/hadoop/installation/zookeeper-3.3.4</code>

<code>2013-10-28 07:14:21,197 - info [main:zookeeper@379] - initiating client connection, connectstring=zk-01:2181 sessiontimeout=30000 watcher=org.apache.zookeeper.zookeepermain$mywatcher@bf32c</code>

<code>2013-10-28 07:14:21,305 - info [main-sendthread():clientcnxn$sendthread@1061] - opening socket connection to server zk-01/192.168.0.179:2181</code>

<code>2013-10-28 07:14:21,376 - info [main-sendthread(zk-01:2181):clientcnxn$sendthread@950] - socket connection established to zk-01/192.168.0.179:2181, initiating session</code>

<code>[zk: zk-01:2181(connecting) 0] 2013-10-28 07:14:21,872 - info [main-sendthread(zk-01:2181):clientcnxn$sendthread@739] - session establishment complete on server zk-01/192.168.0.179:2181, sessionid = 0x134bdcd6b730000, negotiated timeout = 30000</code>

<code>29</code>

<code>[zk: zk-01:2181(connected) 0]</code><code>ls</code> <code>/</code>

<code>30</code>

<code>[zookeeper]</code>

目前根路徑為/zookeeper。

總結說明

主機名與ip位址映射配置問題

啟動zookeeper叢集時,如果zookeeper叢集中zk-01結點的日志出現如下錯誤:

<code>java.net.sockettimeoutexception</code>

<code></code><code>at sun.nio.ch.socketadaptor.connect(socketadaptor.java:109)</code>

<code>2013-10-28 06:37:46,026 - info [quorumpeer:/0:0:0:0:0:0:0:0:2181:fastleaderelection@697] - notification time out: 6400</code>

<code>2013-10-28 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 zk-02/202.106.199.35:3888</code>

<code>2013-10-28 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 zk-03/202.106.199.35:3888</code>

很顯然,zk-01在啟動時連接配接叢集中其他結點(zk-02、zk-03)時,主機名映射的ip與我們實際配置的不一緻,是以叢集中各個結點之間無法建立鍊路,整個zookeeper叢集啟動是失敗的。

上面錯誤日志中zk-02/202.106.199.35:3888實際應該是zk-02/202.192.168.0.178:3888就對了,但是在進行域名解析的時候映射有問題,修改每個結點的/etc/hosts檔案,将zookeeper叢集中所有結點主機名到ip位址的映射配置上。

參考連結

下面是我整理搜集的有關zookeeper相關内容的網址,可以學習參考。