Zookeeper深入理解(一)搭建與測試


Zookeeper 分布式服務框架是 Apache Hadoop 的一個子項目,它主要是用來解決分布式應用中經常遇到的一些數據管理問題,如:統一命名服務、狀態同步服務、集群管理、分布式應用配置項的管理等。現在openstack的項目已經有開始使用zookeeper來實現分布式開發,例如Ceilometer的Central Agent。在SDN控制器開發領域,對於控制器的高可用和負載均衡的需求也需要引用zookeeper工具。因此作為openstack架構師和開發人員,有必要深入研究zookeeper的原理和開發技巧。由於zookeeper是基於java開發項目,作為openstack的python開發語言,現在已經有一些成熟的接口api和項目,例如kazoo、tooz等。

首先我們要搭建一套zookeeper的學習研究環境

1.獲取zookeeper包

wget http://mirror.nus.edu.sg/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

2.創建三節點環境

server1

├── data

├── dataLog

├── logs

├── zookeeper-3.4.6

└── zookeeper-3.4.6.tar.gz

server2

├── data

├── dataLog

├── logs

├── zookeeper-3.4.6

└── zookeeper-3.4.6.tar.gz

server3

├── data

├── dataLog

├── logs

├── zookeeper-3.4.6

└── zookeeper-3.4.6.tar.gz

 

Server主配置zoo.cfg

# 心跳間隔時間(ms)

tickTime=2000

# Follower與Leader初始化時能容忍的時間(initLimit * tickTime)

initLimit=10

# Follower與Leader請求響應時能容忍的時間(syncLimit * tickTime)

syncLimit=5

# server1數據目錄,每個server各自配置

dataDir=/path/to/server1/data

# 客戶端連接端口

clientPort=2182

# server列表:

#

# .n(標記server)=(server地址):(投票時所用端口):(選舉Leader時所用端口)

server.1=127.0.0.1:2889:3889

server.2=127.0.0.1:2990:3990

server.3=127.0.0.1:2991:3991

 

在每個Server/data目錄下建立一個myid文件,標識自己是哪個Server(對應zoo.cfg的server列表)

 

現在啟動server1

server1/zookeeper-3.4.6/bin/zkServer.sh start-foreground

 

#

# 輸出

2015-03-02 19:56:47,485 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2182:QuorumPeer@714] - LOOKING

2015-03-02 19:56:47,486 [myid:1] - INFO  [QuorumPeer[myid=1]/0:0:0:0:0:0:0:0:2182:FastLeaderElection@815] - New election. My id =  1, proposed zxid=0x1a00000006

2015-03-02 19:56:47,488 [myid:1] - INFO  [WorkerReceiver[myid=1]:FastLeaderElection@597] - Notification: 1 (message format version), 1 (n.leader), 0x1a00000006 (n.zxid), 0x1 (n.round), LOOKING (n.state), 1 (n.sid), 0x1a (n.peerEpoch) LOOKING (my state)

2015-03-02 19:56:47,510 [myid:1] - WARN  [WorkerSender[myid=1]:QuorumCnxManager@382] - Cannot open channel to 2 at election address /127.0.0.1:3990

java.net.ConnectException: Connection refused

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.QuorumCnxManager.connectOne(QuorumCnxManager.java:368)

at org.apache.zookeeper.server.quorum.QuorumCnxManager.toSend(QuorumCnxManager.java:341)

at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.process(FastLeaderElection.java:449)

at org.apache.zookeeper.server.quorum.FastLeaderElection$Messenger$WorkerSender.run(FastLeaderElection.java:430)

at java.lang.Thread.run(Thread.java:744)

2015-03-02 19:56:47,560 [myid:1] - WARN  [WorkerSender[myid=1]:QuorumCnxManager@382] - Cannot open channel to 3 at election address /127.0.0.1:3991

 

server1嘗試連接zoo.cfg中配置的server列表,這時server2,server3還沒啟動,因此連接失敗, 將server2,server3一並啟動后,可以看到server1已經成為Follower

2015-03-02 20:02:41,487 [myid:1] - INFO  [/127.0.0.1:3889:QuorumCnxManager$Listener@511] - Received connection request /127.0.0.1:65469

2015-03-02 20:02:41,492 [myid:1] - INFO  [WorkerReceiver[myid=1]:FastLeaderElection@597] - Notification: 1 (message format version), 3 (n.leader), 0x1a00000006 (n.zxid)0x1 (n.round), LOOKING (n.state), 3 (n.sid), 0x1a (n.peerEpoch) FOLLOWING (my state)

 

於是,可以使用客戶端嘗試連接這個集群,並且客戶端會被隨機分配到一個server

zookeeper-3.4.6/bin/zkCli.sh -server 127.0.0.1:2182,127.0.0.1:2183,127.0.0.1:2184

 

3.簡單測試

列出節點信息:

[zk: 127.0.0.1:2182,127.0.0.1:2183,127.0.0.1:2184(CONNECTED) 11] ls /

[dubbo, zookeeper, pampas, pubsub]

創建/workers節點:

[zk: 127.0.0.1:2182,127.0.0.1:2183,127.0.0.1:2184(CONNECTED) 11] create /workers ""

[zk: 127.0.0.1:2182,127.0.0.1:2183,127.0.0.1:2184(CONNECTED) 11] ls /

[dubbo, zookeeper, workers, pampas, pubsub]

刪除/workers節點:

[zk: 127.0.0.1:2182,127.0.0.1:2183,127.0.0.1:2184(CONNECTED) 11] delete /workers

[zk: localhost:2181(CONNECTED) 4] ls /

[zk: 127.0.0.1:2182,127.0.0.1:2183,127.0.0.1:2184(CONNECTED) 11]

[zk: localhost:2181(CONNECTED) 5] quit

 

通過以上步驟,我們就成功搭建出一套三節點zookeeper偽集群環境,為后面原理驗證和python接口開發打好基礎。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM