ZooKeeper的部署以及簡單使用

要想使用ZooKeeper,首先就要把它部署在服務器上跑起來,就想Apache,Tomcat,FtpServer等服務器同樣。ZooKeeper的部署方式主要有三種,單機模式、僞集羣模式、集羣模式。其實剩下的兩種模式都是集羣模式的特殊狀況。 

1.4.1. 基本的環境變量配置 
    Java大型的項目中,環境變量的配置很重要,若是沒有很好的配置環境變量的話,甚至項目連啓動都是難事。 
export ZOOKEEPER_HOME=/home/zookeeper-3.3.3 
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOOKEEPER_HOME/conf 

    1.4.2. ZooKeeper的單機模式部署 
ZooKeeper的單機模式一般是用來快速測試客戶端應用程序的,在實際過程當中不多是單機模式。單機模式的配置也比較簡單。 
l 編寫配置文件zoo.cfg 
    zookeeper-3.3.3/conf文件夾下面就是要編寫配置文件的位置了。在文件夾下面新建一個文件zoo.cfg。ZooKeeper的運行默認是讀取zoo.cfg文件裏面的內容的。如下是一個最簡單的配置文件的樣例: 
tickTime=2000 
dataDir=/var/zookeeper 
clientPort=2181 
    在這個文件中,咱們須要指定 dataDir 的值,它指向了一個目錄,這個目錄在開始的時候須要爲空。下面是每一個參數的含義: 
tickTime :基本事件單元,以毫秒爲單位。這個時間是做爲 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每一個 tickTime 時間就會發送一個心跳。 
dataDir :存儲內存中數據庫快照的位置,顧名思義就是 Zookeeper 保存數據的目錄,默認狀況下,Zookeeper 將寫數據的日誌文件也保存在這個目錄裏。 
clientPort :這個端口就是客戶端鏈接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。 
    使用單機模式時用戶須要注意:這種配置方式下沒有 ZooKeeper 副本,因此若是 ZooKeeper 服務器出現故障, ZooKeeper 服務將會中止。 
l 執行運行腳本 
    在zookeeper-3.3.3/bin文件夾下面運行zkServer.sh便可,運行完畢以後則ZooKeeper服務變啓動起來。 
./zkServer.sh start 
    腳本默認調用zoo.cfg裏面的配置,所以程序正常啓動。 

1.4.3. ZooKeeper的集羣模式部署 
    ZooKeeper的集羣模式下,多個Zookeeper服務器在工做前會選舉出一個Leader,在接下來的工做中這個被選舉出來的Leader死了,而剩下的Zookeeper服務器會知道這個Leader死掉了,在活着的Zookeeper集羣中會繼續選出一個Leader,選舉出Leader的目的是爲了能夠在分佈式的環境中保證數據的一致性。 

圖3.2 ZooKeeper集羣模式圖 
l 確認集羣服務器的數量 
    因爲ZooKeeper集羣中,會有一個Leader負責管理和協調其餘集羣服務器,所以服務器的數量一般都是單數,例如3,5,7...等,這樣2n+1的數量的服務器就能夠容許最多n臺服務器的失效。 
l 編寫配置文件 
配置文件須要在每臺服務器中都要編寫,如下是一個配置文件的樣本: 
# Filename zoo.cfg 
tickTime=2000 
dataDir=/var/zookeeper/ 
clientPort=2181 
initLimit=5 
syncLimit=2 
server.1=202.115.36.251:2888:3888 
server.2=202.115.36.241:2888:3888 
server.3=202.115.36.242:2888:3888 
    initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這裏所說的客戶端不是用戶鏈接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集羣中鏈接到 Leader 的 Follower 服務器)初始化鏈接時最長能忍受多少個心跳時間間隔數。當已經超過 10 個心跳的時間(也就是 tickTime)長度後 Zookeeper 服務器尚未收到客戶端的返回信息,那麼代表這個客戶端鏈接失敗。總的時間長度就是 5*2000=10 秒。 
    syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 2*2000=4 秒 
    server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集羣中的 Leader 服務器交換信息的端口;D 表示的是萬一集羣中的 Leader 服務器掛了,須要一個端口來從新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通訊的端口。若是是僞集羣的配置方式,因爲 B 都是同樣,因此不一樣的 Zookeeper 實例通訊端口號不能同樣,因此要給它們分配不一樣的端口號。 
l 建立myid文件 
    除了修改 zoo.cfg 配置文件,集羣模式下還要配置一個文件 myid,這個文件在 dataDir 目錄下,這個文件裏面就只有一個數據就是 A 的值,Zookeeper 啓動時會讀取這個文件,拿到裏面的數據與 zoo.cfg 裏面的配置信息比較從而判斷究竟是那個 server。 
l 執行運行腳本 
    和單機模式下的運行方式基本相同,值得注意的地方就是要分別在不一樣服務器上執行一次,例如分別在251,241,242上運行: 
./zkServer.sh start 
這樣才能使得整個集羣啓動起來。 

1.4.4. ZooKeeper的集羣僞分佈 
    其實在企業中式不會存在的,另外爲了測試一個客戶端程序也沒有必要存在,只有在物質條件比較匱乏的條件下才會存在的模式。 
集羣僞分佈模式就是在單機下模擬集羣的ZooKeeper服務,在一臺機器上面有多個ZooKeeper的JVM同時運行。 
l 確認集羣僞服務器的數量 
    2n+1,和以前的集羣分佈相同。 
l 編寫配置文件 
    在/conf文件夾新建三個配置文件,zoo1.cfg,zoo2.cfg以及zoo3.cfg。配置文件分別以下編寫: 
Zoo1.cfg 
tickTime=2000 
initLimit=10 
syncLimit=5 
dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_1 
clientPort=2181 
server.1=localhost:2887:3887 
server.2=localhost:2888:3888 
server.3=localhost:2889:3889 
Zoo2.cfg 
tickTime=2000 
initLimit=10 
syncLimit=5 
dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_2 
clientPort=2182 
server.1=localhost:2887:3887 
server.2=localhost:2888:3888 
server.3=localhost:2889:3889 
Zoo3.cfg 
tickTime=2000 
initLimit=10 
syncLimit=5 
dataDir=/root/hadoop-0.20.2/zookeeper-3.3.1/d_3 
clientPort=2183 
server.1=localhost:2887:3887 
server.2=localhost:2888:3888 
server.3=localhost:2889:3889 
    因爲三個服務都在同一臺電腦上,所以這裏要保證地址的惟一性,所以要特別注意IP地址和端口號不要互相沖突,以避免影響程序的正確執行。 
l 建立myid文件 
    這個同集羣模式部署,在各自的文件夾下面建立。 
l 執行運行腳本 
    因爲全部的配置文件都在/conf文件夾下面,所以要執行三次,並且要加文件名的參數,否則會默認執行zoo.cfg這個文件,以下: 
./zkServer.sh start zoo1.cfg 
./zkServer.sh start zoo2.cfg 
./zkServer.sh start zoo3.cfg 
執行完畢後,將完成ZooKeeper的集羣僞分佈的啓動。 

1.4.5. 經過ZooKeeper命令行工具訪問ZooKeeper 
    ZooKeeper命令行工具相似於Linux的shell環境,不過功能確定不及shell啦,可是使用它咱們能夠簡單的對ZooKeeper進行訪問,數據建立,數據修改等操做。 
當啓動 ZooKeeper 服務成功以後,輸入下述命令,鏈接到 ZooKeeper 服務: 
zkCli.sh –server 202.115.36.251:2181 
鏈接成功後,系統會輸出 ZooKeeper 的相關環境以及配置信息,並在屏幕輸出「 Welcome to ZooKeeper 」等信息。 
命令行工具的一些簡單操做以下: 
1 )使用 ls 命令來查看當前 ZooKeeper 中所包含的內容: 
[zk: 202.115.36.251:2181(CONNECTED) 1] ls / 
2 )建立一個新的 znode ,使用 create /zk myData 。這個命令建立了一個新的 znode 節點「 zk 」以及與它關聯的字符串: 
[zk: 202.115.36.251:2181(CONNECTED) 2] create /zk "myData" 
3 )咱們運行 get 命令來確認 znode 是否包含咱們所建立的字符串: 
[zk: 202.115.36.251:2181(CONNECTED) 3] get /zk 
4 )下面咱們經過 set 命令來對 zk 所關聯的字符串進行設置: 
[zk: 202.115.36.251:2181(CONNECTED) 4] set /zk "zsl" 
5 )下面咱們將剛纔建立的 znode 刪除: 
[zk: 202.115.36.251:2181(CONNECTED) 5] delete /zk 

1.4.6. 使用API來訪問ZooKeeper 
    API訪問ZooKeeper纔是客戶端主要的使用手段,經過在客戶端編寫豐富多彩的程序,來達到對ZooKeeper的利用。這裏給出一個簡單的例子:(深刻的還沒能力給出啊,例子是從網上找的很清晰明瞭) 
1. import java.io.IOException; 
2. 
3. import org.apache.zookeeper.CreateMode; 
4. import org.apache.zookeeper.KeeperException; 
5. import org.apache.zookeeper.Watcher; 
6. import org.apache.zookeeper.ZooDefs.Ids; 
7. import org.apache.zookeeper.ZooKeeper; 
8. 
9. public class demo { 
10.     // 會話超時時間,設置爲與系統默認時間一致 
11.     private static final int SESSION_TIMEOUT=30000; 
12.    
13.     // 建立 ZooKeeper 實例 
14.     ZooKeeper zk; 
15.    
16.     // 建立 Watcher 實例 
17.     Watcher wh=new Watcher(){ 
18.            public void process(org.apache.zookeeper.WatchedEvent event) 
19.            { 
20.                    System.out.println(event.toString()); 
21.            } 
22.     }; 
23.    
24.     // 初始化 ZooKeeper 實例 
25.     private void createZKInstance() throws IOException 
26.     {             
27.            zk=new ZooKeeper("localhost:2181",demo.SESSION_TIMEOUT,this.wh); 
28.           
29.     } 
30.    
31.     private void ZKOperations() throws IOException,InterruptedException,KeeperException 
32.     { 
33.            System.out.println("\n1. 建立 ZooKeeper 節點 (znode : zoo2, 數據: myData2 ,權限: OPEN_ACL_UNSAFE ,節點類型: Persistent"); 
34.            zk.create("/zoo2","myData2".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); 
35.           
36.            System.out.println("\n2. 查看是否建立成功: "); 
37.            System.out.println(new String(zk.getData("/zoo2",false,null))); 
38.                           
39.            System.out.println("\n3. 修改節點數據 "); 
40.            zk.setData("/zoo2", "shenlan211314".getBytes(), -1); 
41.           
42.            System.out.println("\n4. 查看是否修改爲功: "); 
43.            System.out.println(new String(zk.getData("/zoo2", false, null))); 
44.                           
45.            System.out.println("\n5. 刪除節點 "); 
46.            zk.delete("/zoo2", -1); 
47.           
48.            System.out.println("\n6. 查看節點是否被刪除: "); 
49.            System.out.println(" 節點狀態: ["+zk.exists("/zoo2", false)+"]"); 
50.     } 
51.    
52.     private void ZKClose() throws  InterruptedException 
53.     { 
54.            zk.close(); 
55.     } 
56.    
57.     public static void main(String[] args) throws IOException,InterruptedException,KeeperException { 
58.            demo dm=new demo(); 
59.            dm.createZKInstance( ); 
60.            dm.ZKOperations(); 
61.            dm.ZKClose(); 
62.     } 
63.} 
    此類包含兩個主要的 ZooKeeper 函數,分別爲 createZKInstance ()和 ZKOperations ()。其中 createZKInstance ()函數負責對 ZooKeeper 實例 zk 進行初始化。 ZooKeeper 類有兩個構造函數,咱們這裏使用  「 ZooKeeper ( String connectString, , int sessionTimeout, , Watcher watcher )」對其進行初始化。所以,咱們須要提供初始化所需的,鏈接字符串信息,會話超時時間,以及一個 watcher 實例。 17 行到 23 行代碼,是程序所構造的一個 watcher 實例,它可以輸出所發生的事件。 
    ZKOperations ()函數是咱們所定義的對節點的一系列操做。它包括:建立 ZooKeeper 節點( 33 行到 34 行代碼)、查看節點( 36 行到 37 行代碼)、修改節點數據( 39 行到 40 行代碼)、查看修改後節點數據( 42 行到 43 行代碼)、刪除節點( 45 行到 46 行代碼)、查看節點是否存在( 48 行到 49 行代碼)。另外,須要注意的是:在建立節點的時候,須要提供節點的名稱、數據、權限以及節點類型。此外,使用 exists 函數時,若是節點不存在將返回一個 null 值。 


源碼來源: minglisoft.cn/technology java

相關文章
相關標籤/搜索