1. 程式人生 > >在windows下 zookeeper 入門安裝和測試

在windows下 zookeeper 入門安裝和測試

一、序言

      以下是我對zookeeper 的一些理解:
      zookeeper 作為一個服務註冊資訊儲存的管理工具,好吧,這樣說得很抽象,我們舉個“例子”。

      栗子1號:

      假設我是一家KTV的老闆,我同時擁有5家KTV,我肯定得時刻監視我KTV 的情況吧,是不是有人打架,或者發生火災什麼的,這時候我會給設定一個視訊監控,然後每一家都連線到我的視訊監控裡面,那麼我就可以在家裡看到所有KTV 的情況了,如果某一家出現問題,我就能及時發現,並且做出反應。

這個視訊監控就相當於zookeeper,每一家的連線,就相當於KTV 的資訊。

 

二、安裝過程

     2.1  http://mirrors.hust.edu.cn/apache/zookeeper/  下載,我的版本是 3.4.6(stable) 穩定

     2.2  解壓到 F:\zookeeper-3.4.6 

     3.3  到目錄conf 下建立 zoo.cfg 檔案,預設就是載入這個檔案,檔案內容 我直接copy 的sample裡面的


#zoo.cfg 的內容
#   心跳檢查的時間 2秒
tickTime=2000
# 初始化時 連線到伺服器端的間隔次數,總時間10*2=20秒
initLimit=10
# ZK Leader 和follower 之間通訊的次數,總時間5*2=10秒 
syncLimit=5
# 儲存記憶體中資料庫快照的位置,如果不設定引數,更新事務日誌將被儲存到預設位置。
dataDir=F:\\zk\\tmp\\zookeeper
# 錯誤日誌的存放位置
dataLogDir=F:\\zk\\logs\\zookeeper

# ZK 伺服器端的監聽埠
clientPort=2181


   上面的說明介紹:http://zookeeper.apache.org/doc/current/zookeeperStarted.html

   然後 cd 到bin 目錄下 執行zkServer.cmd 就啟動成功了。

   注意:dataDir  和  dataLogDir 目錄不會自動建立,得手動建立才能啟動。

   可以用netstat -ano|findstr "2181" 看看是否OK。

   也可以用JPS 檢視啟動的JAVA 程序的情況,會出現這樣


C:\windows\system32>jps
8068
10040 QuorumPeerMain  // 這東西是zk的東西,原始碼有介紹
10556 Jps


   也可以用自帶客戶端命令 :  zkCli.cmd -server 127.0.0.1:2181

   關於JPS的東西,可以自己去JAVA_HOME\bin 目錄下去看,裡面很多命令。

四、JAVA 操作zookeeper :

       上面安裝挺簡單的,我們來實際操作下:

       4.1  匯入依賴:


 <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
 </dependency>

或者匯入以下lib包

jline-0.9.94.jar
log4j-1.2.15.jar
netty-3.2.2.Final.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar
zookeeper-3.4.5.jar

  4.2 JAVA 實現:這裡我們簡單實現上面的例子
package cn.itcast.bigdata.zk;

import java.util.Arrays;
import java.util.List;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;

public class ZkserverExample {
	// 根節點  
	public static final String ROOT = "/root-ktv"; 
	private static final String connectString = "127.0.0.1:2191";
	private static final int sessionTimeout = 2000;
	
	  
	public static void main(String[] args) throws Exception {  
	    // 建立一個與伺服器的連線  
	    ZooKeeper zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
			@Override
			public void process(WatchedEvent event) {
				// 收到事件通知後的回撥函式(應該是我們自己的事件處理邏輯)
				System.out.println("狀態:" + event.getState()+":"+event.getType()+":"+event.getWrapper()+":"+event.getPath());
			}
		});	    
	    
	    // 建立一個總的目錄ktv,並不控制權限,這裡需要用持久化節點,不然下面的節點建立容易出錯  
	    zk.create(ROOT, "root-ktv".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);  
	  
	    // 然後杭州開一個KTV ,       PERSISTENT_SEQUENTIAL 型別會自動加上 0000000000 自增的字尾  
	    zk.create(ROOT+"/杭州KTV", "杭州KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);  
	  
	    // 也可以在北京開一個,       EPHEMERAL session 過期了就會自動刪除  
	    zk.create(ROOT+"/北京KTV", "北京KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);  
	  
	    // 同理,我可以在北京開多個,EPHEMERAL_SEQUENTIAL  session 過期自動刪除,也會加數字的字尾  
	    zk.create(ROOT+"/北京KTV-分店", "北京KTV-分店".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);  
	  
	    // 我們也可以 來看看 一共監視了多少家的ktv  
	    List<String> ktvs = zk.getChildren(ROOT, true);  
	    System.out.println(Arrays.toString(ktvs.toArray()));  
	    for(String node : ktvs){  
	        // 刪除節點  
	        zk.delete(ROOT+"/"+node,-1);  
	    }  
	    // 根目錄得最後刪除的  
	    zk.delete(ROOT, -1);  
	    zk.close();  
	}  
}

輸出:
狀態:SyncConnected:None:-1,3,
:null
[北京KTV-分店0000000002, 杭州KTV0000000000, 北京KTV]
狀態:SyncConnected:NodeChildrenChanged:4,3,'/root-ktv
:/root-ktv


    zookeeper 的結構圖和其他的一些功能,可參考:                                                                                         http://www.blogjava.net/shenh062326/archive/2011/10/29/zookeeper_yuling.html

 三、zookeeper 偽叢集

      上面栗子我們看到,如果我們的監控室也停電了,那不是就監測不到KTV情況了?一般情況下,zk 也是作為分散式部署了,也就是有多臺監控,由於監控多了,肯定要有一定為準(比如直播會有一些延遲),就要涉及到選舉的演算法,這裡暫時不介紹,先搭建一個偽叢集,因為機器不夠,只能再一臺機器上模擬搭建,整個過程無非是將上面的一些配置copy 幾份,然後配置不同的 地址和埠就行。

       3.1  我們將F:\zookeeper-3.4.6\conf\下的zoo.cfg 改成zoo1.cfg,內容改為:

# 儲存記憶體中資料庫快照的位置,如果不設定引數,更新事務日誌將被儲存到預設位置。
# 每一個檔案路徑和下面的對應,zk1 zk2 zk3
dataDir=F:\\zk\\tmp\\zk1
# 錯誤日誌的存放位置
dataLogDir=F:\\zk\\logs\\zk1

# ZK 伺服器端的監聽埠
# 對應分別:2191  2192  2193
clientPort=2191
# 偽叢集 
#2887 是server 之間通訊的,3887 是應用程式通訊的
# 同時加入其他兩個服務的地址和埠資訊
server.1=127.0.0.1:2887:3887 
server.2=127.0.0.1:2888:3888 
server.3=127.0.0.1:2889:3889 
# 最後在錢檔案目錄下建立3份,zoo1.cfg,zoo2.cfg,zoo3,cfg 記得改引數

記得建立data目錄和log目錄,修改客戶埠號.

說明: 
dataDir:資料目錄,不同的Zookeeper對應的目錄不一樣  
dataLogDir:日誌目錄,不同的Zookeeper對應的目錄不一樣 
clientPort:客戶端連線時用到的埠,不同的Zookeeper對應的目錄不一樣  
           “server.1=127.0.0.1:6660:7770”表示叢集中的伺服器,其格式為:
            server.X=A:B:C,X是伺服器標識ID,即其myid檔案中的內容;A是該
            Zookeeper的IP,C是該Zookeeper的IP埠;
C是叢集中各Zookeeper伺服器間進行選舉leader時要用到的埠。



 3.2 同時我們將F:\zookeeper-3.4.6\bin\下的 zkServer.cmd 改為zkServer1.cmd,內容加上:

set ZOOMAIN=org.apache.zookeeper.server.quorum.QuorumPeerMain
# 讀取配置的路徑,每個啟動服務對應一份
set ZOOCFG=..\conf\zoo1.cfg
# 同理建立3個zkServer1.cmd,zkServer2.cmd,zkServer3.cmd  記得改zoo 1 2 3.cfg

   3.3 還得在dataDir 指定目錄,也就是F:\\zk\\tmp\\zk1 下建立myid 的檔案,內容對應1 2 3 即可。

  這個的數字是唯一的,在1-255 之間,用來表示自身的id(其實我不明白 為啥zk 要這麼設計- -!)

   3.4 啟動3個zkServer1.cmd 就OK了,如果要多伺服器配置,只需要要將 3份分開放到不同伺服器就OK

   依次啟動的時刻有錯誤資訊,因為你啟動server1 的時候 2 和 3 沒找到,但是後面都啟動了 就沒問題了。

   3.5連線指令碼zkCli1.cmd加上

set ZOOCFG=..\conf\zoo1.cfg

  3.6連線

E:\zookeeper-qun\bin>zkCli1.cmd -server 127.0.0.1:2191

WATCHER::
WatchedEvent state:SyncConnected type:None path:null
[zk: 127.0.0.1:2191(CONNECTED) 0]

小結:

      1.zookeeper  現在大家都用得比較多,這裡也是僅僅介紹下入門知識,linux 上安裝區別不打,還是得看具體應用。

      2.關於選舉、一致性 和一些其他的東西,慢慢再寫!

      3.有錯誤,請指出哦~。~ 感激。

參考資料:

官網的:

http://zookeeper.apache.org/doc/trunk/zookeeperStarted.html

API 文件:

http://zookeeper.apache.org/doc/r3.4.6/api/

別人介紹的一些流程:

http://cailin.iteye.com/blog/2014486

常用的場景:

http://nileader.blog.51cto.com/1381108/1040007

ZooKeeper系列之八:ZooKeeper的簡單操作

http://blog.csdn.net/shenlan211314/article/details/6187035