ZooKeeper JAVA API 之環境準備和建立會話

    Zookeeper是一個開放源代碼的分佈式協調服務,由雅虎建立,是Google Chubby的開源實現。Zookeeper的設計目標是將那些複雜且容易出錯的分佈式一致性服務封裝起來,構成一個高效可靠的元語集,並以一系列簡單易用的接口提供給用戶使用。 html

單機模式部署與運行(Windows) java

  1. 確保已經安裝了JAVA 1.6及其以上版本的JDK
  2. 下載Zookeeper    http://zookeeper.apache.org/releases.html  目前穩定版本即stable版本爲3.4.6。將下載完成的壓縮包解壓到%ZK_HOME%下,其中ZK_HOME 目錄能夠隨意設定,如:D://programes 等
  3. 配置文件 zoo.cfg ,單機模式下,只須要將%ZK_HOME%/conf/zoo_sample.cfg文件重命名便可
  4. 啓動服務,在%ZK_HOME%bin目錄下執行zkServer.cmd便可啓動zookeeper服務器

Zookeeper 可執行腳本說明 apache

  1. zkCleanup  清理ZooKeeper歷史數據,包括事務日誌和快照文件
  2. zkCli  ZooKeeper的一個建議客戶端
  3. zkEnv  設置ZooKeeper的環境變量
  4. zkServer  ZooKeeper服務器的啓動、中止和重啓腳本

建立會話 安全

       客戶端能夠經過建立一個ZooKeeper實例來鏈接ZooKeeper服務器。該類中的註釋這樣寫道: 服務器

ZooKeeper類是ZooKeeper客戶端庫的主類。要使用ZooKeeper服務,應用程序首先必需要實現一個ZooKeeper的實例。全部的迭代都將經過調用ZooKeeper類的方法來完成。這個類的方法都是線程安全的除非另有說明。
 一旦一個與服務器的鏈接被創建,會分配給客戶端一個Session ID. 客戶端會週期性地發送心跳到服務器端,以保持會話有效。
 只要Session ID 有效,應用程序均可以經過客戶端調用ZooKeeper的 API
  若是由於某些緣由,致使客戶端未能在指定的時間段內(超過SessionTimeout的值)發送心跳到服務器端,則該會話將過時,Session ID 將失效。
  若是客戶端對象不可用,爲了調用ZooKeeper API,應用程序必須建立一個新的客戶端 session

 

ZooKeeper的構造方法有: socket

 ZooKeeper(String connectString,int sessionTimeout,Watcher watcher) 分佈式

 ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,boolean canBeReadOnly) ui

 ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,long sessionId,boolean canBeReadOnly) spa

  ZooKeeper(String connectString,int sessionTimeout,Watcher watcher,long sessionId,byte[] sessionPasswd, boolean canBeReadOnly)

   connectString 是指ZooKeeper服務器的列表,host:prot,host:port 這樣的格式構成,即主機:端口號經過英文逗號分隔。固然若是是單擊模式下只須要一個;

    sessionTimeout 值會話的超時時間,單位是毫秒

  watcher Watcher事件的處理器,若是設置爲null,表示不須要默認的Watcher事件處理器

   canBeReadOnly 用於表示當前會話是否支持 read-only

    sessionId,sessionPasswd 分別表明 會話的Id和密鑰。這兩個參數能夠惟一肯定一個會話。能夠經過ZooKeeper 實例調用 getSesssionId()和getSessionPasswd()方法獲取。

 

Java代碼   收藏代碼
  1. /** 
  2.  *建立一個最基本的ZooKeeper會話示例 
  3.  * @author zhangwei_david 
  4.  * @version $Id: ZKConstructorDemo.java, v 0.1 2015年5月1日 下午5:55:21 zhangwei_david Exp $ 
  5.  */  
  6. public class ZKConstructorDemo implements Watcher {  
  7.   
  8.     private static CountDownLatch connectedSemphore = new CountDownLatch(1);  
  9.   
  10.     public static void main(String[] args) throws Exception {  
  11.         //建立Zookeeper會話實例  
  12.         ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181"5000new ZKConstructorDemo());  
  13.         // 輸出當前會話的狀態  
  14.         System.out.println("zk客戶端的狀態是:" + zookeeper.getState());  
  15.         System.out.println("zk 客戶端的sessionId=" + zookeeper.getSessionId() + ",  sessionPasswd是:"  
  16.                            + new String(zookeeper.getSessionPasswd()));  
  17.         try {  
  18.             // 當前閉鎖在爲0以前一直等待,除非線程中斷  
  19.             connectedSemphore.await();  
  20.         } catch (Exception e) {  
  21.             System.out.println("Zookeeper session established");  
  22.         }  
  23.     }  
  24.   
  25.     /** 
  26.      * @see org.apache.zookeeper.Watcher#process(org.apache.zookeeper.WatchedEvent) 
  27.      */  
  28.     public void process(WatchedEvent event) {  
  29.         System.out.println("Receive watched event:" + event);  
  30.         //若是客戶端已經處於鏈接狀態閉鎖減去1  
  31.         if (KeeperState.SyncConnected == event.getState()) {  
  32.             connectedSemphore.countDown();  
  33.         }  
  34.     }  
  35. }  

 結果:

Java代碼   收藏代碼
  1. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT  
  2. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:host.name=David  
  3. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:java.version=1.8.0  
  4. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:java.io.tmpdir=C:\Users\Lenovo\AppData\Local\Temp\  
  5. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:java.compiler=<NA>  
  6. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:os.name=Windows 8.1  
  7. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:os.arch=x86  
  8. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:os.version=6.3  
  9. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:user.name=Lenovo  
  10. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:user.home=C:\Users\Lenovo  
  11. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Client environment:user.dir=H:\Alipay.com\workspace4alipay\demo  
  12. 2015-05-01 19:03:43  [ main:0 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorDemo@1e717c2  
  13. zk客戶端的狀態是:CONNECTING  
  14. zk 客戶端的sessionId=0,  sessionPasswd是:  

 

Java代碼   收藏代碼
  1. **  
  2.  *使用SessionId和Sessionpwd建立的ZooKeeper會話示例  
  3.  * @author  zhangwei_david  
  4.  * @version $Id: ZKConstructorWithIdAndPasswdDemo.java, v 0.1 201551日 下午5:55:21 zhangwei_david Exp $  
  5.  */  
  6. public class ZKConstructorWithIdAndPasswdDemo implements Watcher {  
  7.   
  8.     private static CountDownLatch connectedSemphore = new CountDownLatch(1);  
  9.   
  10.     public static void main(String[] args) throws Exception {  
  11.         //建立Zookeeper會話實例  
  12.         ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181"5000,  
  13.             new ZKConstructorWithIdAndPasswdDemo());  
  14.         // 輸出當前會話的狀態  
  15.         System.out.println("未使用id和密鑰建立zk客戶端的狀態是:" + zookeeper.getState());  
  16.         long sessionId = zookeeper.getSessionId();  
  17.         byte[] sessionPasswd = zookeeper.getSessionPasswd();  
  18.         System.out.println("zk 客戶端的sessionId=" + zookeeper.getSessionId() + ",  sessionPasswd是:"  
  19.                 + new String(zookeeper.getSessionPasswd()));  
  20.         zookeeper = new ZooKeeper("127.0.0.1:2181"5000new ZKConstructorWithIdAndPasswdDemo(),  
  21.             sessionId, sessionPasswd);  
  22.         System.out.println("使用id和密鑰建立zk客戶端的狀態是:" + zookeeper.getState());  
  23.   
  24.         zookeeper = new ZooKeeper("127.0.0.1:2181"5000new ZKConstructorWithIdAndPasswdDemo(),  
  25.             1L, "test".getBytes());  
  26.         System.out.println("使用錯誤id和密鑰建立zk客戶端的狀態是:" + zookeeper.getState());  
  27.         try {  
  28.             // 當前閉鎖在爲0以前一直等待,除非線程中斷  
  29.             connectedSemphore.await();  
  30.         } catch (Exception e) {  
  31.             System.out.println("Zookeeper session established");  
  32.         }  
  33.     }  
  34.   
  35.     /** 
  36.      * @see org.apache.zookeeper.Watcher#process(org.apache.zookeeper.WatchedEvent) 
  37.      */  
  38.     public void process(WatchedEvent event) {  
  39.         System.out.println("Receive watched event:" + event);  
  40.         //若是客戶端已經處於鏈接狀態閉鎖減去1  
  41.         if (KeeperState.SyncConnected == event.getState()) {  
  42.             connectedSemphore.countDown();  
  43.         }  
  44.     }  
  45. }  

 

結果:

Java代碼   收藏代碼
  1. 2015-05-01 19:14:34  [ main:0 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorWithIdAndPasswdDemo@1e717c2  
  2. 未使用id和密鑰建立zk客戶端的狀態是:CONNECTING  
  3. zk 客戶端的sessionId=0,  sessionPasswd是:  
  4. 2015-05-01 19:14:34  [ main:31 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorWithIdAndPasswdDemo@aa7bc2 sessionId=0 sessionPasswd=<hidden>  
  5. 使用id和密鑰建立zk客戶端的狀態是:CONNECTING  
  6. 2015-05-01 19:14:34  [ main:31 ] - [ INFO ]  Initiating client connection, connectString=127.0.0.1:2181 sessionTimeout=5000 watcher=com.cathy.demo.zk.ZKConstructorWithIdAndPasswdDemo@ccd017 sessionId=1 sessionPasswd=<hidden>  
  7. 使用錯誤id和密鑰建立zk客戶端的狀態是:CONNECTING  
  8. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):31 ] - [ INFO ]  Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)  
  9. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):31 ] - [ INFO ]  Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)  
  10. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):31 ] - [ INFO ]  Opening socket connection to server 127.0.0.1/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)  
  11. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session  
  12. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session  
  13. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Socket connection established to 127.0.0.1/127.0.0.1:2181, initiating session  
  14. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x14d0ee972c70006, negotiated timeout = 5000  
  15. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Unable to reconnect to ZooKeeper service, session 0x1 has expired, closing socket connection  
  16. Receive watched event:WatchedEvent state:SyncConnected type:None path:null  
  17. Receive watched event:WatchedEvent state:Expired type:None path:null  
  18. 2015-05-01 19:14:34  [ main-SendThread(127.0.0.1:2181):47 ] - [ INFO ]  Session establishment complete on server 127.0.0.1/127.0.0.1:2181, sessionid = 0x14d0ee972c70007, negotiated timeout = 5000  
  19. 2015-05-01 19:14:34  [ main-EventThread:47 ] - [ INFO ]  EventThread shut down  
相關文章
相關標籤/搜索