zookeeper的簡單入門

一.zookeeper的原理

1. zookeeper是一個數據庫 是一個使用樹形結構的數據庫,可以擁有高可用的集羣,80%在讀 ,20%在寫,只允許在一臺機器上寫,機器分爲兩種角色 leader(領導者)+foollower(追隨者),寫由leader寫入,讀由foollower負責 ,一個集羣只能有一個leader,leader由paxos算法選舉出來,票數最高的機器成爲leader。leader寫入的數據通過paxos算法將所有數據同步,zookeeper的集羣必須是2n+1臺,最少n=1。

2. zookeeper的path表示一個znode,/表示根節點,樹結構包含多個znode,每個節點都可以有一個值和多個子節點。

3. zookeeper有三種znode 

1 永久節點 數據被持久化 用戶不調用刪除,就不會被刪除 ,默認是永久節點

2 臨時節點 客戶端連接時 才保留數據,客戶端斷開 數據就刪除。create -e   / ,一般應用在註冊中心

3 順序節點 按順序生成 ,create -s  /,一般應用在搶票+秒殺+分佈式主鍵

二 zookeeper安裝

1.下載 安裝包(http://www.apache.org/dyn/closer.cgi/zookeeper/) 這裏建議下載3.4以上版本 (將事務日誌和快照數據拆分爲不同目錄 自動清除過期文件)


點擊add 輸入http://www.massedynamic.org/eclipse/updates/


點擊OK選擇


2.安裝jdk 設置javahome   bin目錄設置到path中

3.拷貝 conf/zoo_sample.cfg 命名爲 zoo.cfg ,zoo.cfg的參數

# 心跳的時間間隔
tickTime=2000
# 初始化同步數據要花費的時間 10個tickTime
initLimit=10
# leader和foollower互相發送心跳檢查對方失效的時間間隔 
syncLimit=5
# 數據存儲的位置
dataDir=D:\zookeeper-3.4.10\data
# 端口號
clientPort=2181
#默認的連接數
#maxClientCnxns=60
4. 運行 bin/zkServer 

5.使用客戶端命令進行連接進行數據設置   bin/zkCli -server localhost  輸入 help查看幫助

 常用的數據操作命令(樹結構節點數據的操作)

ls / 顯示根節點下所有的節點

[zk: localhost(CONNECTED) 1] ls /
[zookeeper]

create / 新增一個user節點 節點的值是 boy
[zk: localhost(CONNECTED) 2] create /user boy
Created /user
[zk: localhost(CONNECTED) 3] ls /
[user, zookeeper]

獲取/user節點的值
[zk: localhost(CONNECTED) 5] get /user
boy

重新設置user節點的值
[zk: localhost(CONNECTED) 6] set /user girl

[zk: localhost(CONNECTED) 7] get /user girl

刪除節點
[zk: localhost(CONNECTED) 8] delete /user
[zk: localhost(CONNECTED) 9] ls /
[zookeeper]
[zk: localhost(CONNECTED) 10]

其他命令

 help 查看所有命令的幫助

 close/quit 退出登錄

 connect ip:port 重新登錄

 histroy 查看操作歷史記錄  每個歷史記錄都有一個編號

 redo 編號  重新執行history中編號對應的語句

  close 關閉客戶端連接

  stat /user 查看znode的/user的狀態信息 

  ls2 /user 查看/user所有的子節點 同時查看狀態信息

  rmr /user 刪除/user以及他的所有子節點

  setquota -n 1 /test  給/test節點設置允許的子節點個數是1個 添加子節點操作1個 給予警告 可以添加

                  -b 10 /test 給/test的值的長度限制爲 10個字節 

  listquota /test 列出/test所有的配額

  delquota -n /test 刪除子節點設置的配額

【通過命令 添加node後  可以查看到一些列 這些列的意義 】

     cZxid = 0x2                                                     節點被創建時的事務id
    ctime = Thu May 11 17:32:27 CST 2017   節點被創建的時間
    mZxid = 0x3                                                    節點最後一次被更新(使用set 修改當前節點時 (修改子節點不影響該字段) 該值會自動更新 自動累加)時的事務id
    mtime = Thu May 11 17:33:16 CST 2017  節點最後一次被更新時間
    pZxid = 0x2                                子節點中最後一個被創建的子節點的czxid 如果當前節點沒有子節點pZxid=cZxid
    cversion = 0                                                    子節點被創建或者刪除 都會導致該版本號遞增       修改不會                                  
    dataVersion = 1                                              當前節點調用set 修改值  都會導致該版本號遞增    (子節點修改不影響該版本號)                           
   aclVersion = 0   
   ephemeralOwner = 0x0  如果是持久節點就是0  臨時節點是sessionid 客戶端連接會產生session
   dataLength = 4       數據長度 多少個字節 
   numChildren = 0    表示子節點的個數

三.Zkclient客戶端

1.創建maven項目 ,在pom.xml中加入zkclient的架包

<project xmlns="http://maven.apache.org/POM/4.0.0" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>cn.et</groupId>
  <artifactId>Zookeeper_Zkclient</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  	<dependencies>
  		<!-- 添加zkclient的架包 -->
  		<dependency>
  			<groupId>com.101tec</groupId>
  			<artifactId>zkclient</artifactId>
  			<version>0.10</version>
  		</dependency>
  	
  	</dependencies>
  	
</project>

2.創建測試類

package cn.et;

import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.CreateMode;

public class ZkclientTest {
	public static void main(String[] args) throws Exception{
		//連接zookeeper的URL
		String zkUrl="localhost:2181";
		//連接zookeeper的URL session的超時時間,連接超時時間,連接不上就重連
		ZkClient zk= new ZkClient(zkUrl, 10000, 5000);
		
			//創建一個永久節點 /user
			zk.createPersistent("/user");
			//創建兩個順序節點/user/ls ,
			String znodename =zk.create("/user/ls", "boy", CreateMode.PERSISTENT_SEQUENTIAL);
			String znodename1=zk.create("/user/ls", "girl", CreateMode.PERSISTENT_SEQUENTIAL);
			System.out.println(znodename);
			System.out.println(znodename1);
			//創建一個臨時節點 /user/zs
			zk.createEphemeral("/user/zs", "boy");
		
		//監控節點
		zk.subscribeDataChanges("/db", new IZkDataListener() {
			//刪除節點時被觸發
			public void handleDataDeleted(String path) throws Exception {
				
			}
			//修改節點時被觸發
			public void handleDataChange(String path, Object arg1) throws Exception {
				System.out.println(path);
			}
		});
		while(true){
			TimeUnit.SECONDS.sleep(5);
		}
		
	}
}


3.監控修改

package cn.et;

import org.I0Itec.zkclient.ZkClient;

public class Zkset {
	public static void main(String[] args) {
		//連接zookeeper的URL
		String zkUrl="localhost:2181";
		//連接zookeeper的URL session的超時時間,連接超時時間,連接不上就重連
		ZkClient zk= new ZkClient(zkUrl, 10000, 5000);
		//修改
		zk.writeData("/db", "orca");
	}
}

4.運行main方法

log4j:WARN No appenders could be found for logger (org.I0Itec.zkclient.ZkEventThread).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
log4j:WARN No appenders could be found for logger (org.I0Itec.zkclient.ZkConnection).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
/user/ls0000000000
/user/ls0000000001


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章