一.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