一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java 中 zookeeper簡單使用

java 中 zookeeper簡單使用

2021-01-11 14:16動力節點 Java教程

ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。下面通過本文給大家分享java 中 zookeeper簡單使用,需要的朋友參考下吧

一、zookeeper的基本原理

數據模型,如下:


java 中 zookeeper簡單使用

zookeeper數據模型的結構與unix文件系統很類似,整體上可以看作是一棵樹,每個節點稱做一個znode。每個znode都可以通過其路徑唯一標識,比如上圖中第三層的第一個znode,它的路徑是/app1/c1。在每個znode上可存儲少量數據(默認是1m, 可以通過配置修改,通常不建議在znode上存儲大量的數據),這個特性非常有用。另外,每個znode上還存儲了其acl信息,這里需要注意,雖說znode的樹形結構跟unix文件系統很類似,但是其acl與unix文件系統是完全不同的,每個znode的acl的獨立的,子結點不會繼承父結點的。

zookeeper特性:

1、讀、寫(更新)模式

在zookeeper集群中,讀可以從任意一個zookeeperserver讀,這一點是保證zookeeper比較好的讀性能的關鍵;寫的請求會先forwarder到leader,然后由leader來通過zookeeper中的原子廣播協議,將請求廣播給所有的follower,leader收到一半以上的寫成功的ack后,就認為該寫成功了,就會將該寫進行持久化,并告訴客戶端寫成功了。

2、wal和snapshot

和大多數分布式系統一樣,zookeeper也有wal(write-ahead-log),對于每一個更新操作,zookeeper都會先寫wal,然后再對內存中的數據做更新,然后向client通知更新結果。另外,zookeeper還會定期將內存中的目錄樹進行snapshot,落地到磁盤上,這個跟hdfs中的fsimage是比較類似的。這么做的主要目的,一當然是數據的持久化,二是加快重啟之后的恢復速度,如果全部通過replaywal的形式恢復的話,會比較慢。

3、fifo

對于每一個zookeeper客戶端而言,所有的操作都是遵循fifo順序的,這一特性是由下面兩個基本特性來保證的:一是zookeeperclient與server之間的網絡通信是基于tcp,tcp保證了client/server之間傳輸包的順序;二是zookeeperserver執行客戶端請求也是嚴格按照fifo順序的。

4、linearizability

在zookeeper中,所有的更新操作都有嚴格的偏序關系,更新操作都是串行執行的,這一點是保證zookeeper功能正確性的關鍵。

二、zookeeper的常用命令

我們可以執行zookeeper-client或者執行/opt/cloudera/parcels/cdh-5.0.0-1.cdh5.0.0.p0.47/lib/zookeeper/bin/zkcli.sh-server localhost,進入zookeeper命令行,如下:


java 中 zookeeper簡單使用

然后,執行ls /可以看到:


java 中 zookeeper簡單使用
 

然后,我們可以執行create /qyktest‘qyktest'創建一個節點,如下:


java 中 zookeeper簡單使用

然后,我們執行get /qyktest獲取節點值,如下:


java 中 zookeeper簡單使用
 

然后,我們可以執行set /qyktest‘111'修改節點的值,如下:


java 中 zookeeper簡單使用
 

最后,我們執行delete /qyktest便可刪除此節點。

另外,我們還可以在qyktest此節點下繼續創建子節點。

好了,幾個基本命令就講到這人啦,其它的命令還有很多,大家可以去查閱下資料。

三、zookeeper的javaapi操作

關于javaapi操作zookeeper比較簡單,筆者直接貼出代碼,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
packageorg.zookeeper.demo;
importjava.io.ioexception;
importjava.util.concurrent.countdownlatch;
importorg.apache.zookeeper.createmode;
importorg.apache.zookeeper.keeperexception;
importorg.apache.zookeeper.watchedevent;
importorg.apache.zookeeper.watcher;
importorg.apache.zookeeper.watcher.event.keeperstate;
importorg.apache.zookeeper.zoodefs.ids;
importorg.apache.zookeeper.zookeeper;
publicclasszookeeperclientimplementswatcher{
//連接超時時間,10s
privatestaticfinalintsession_timeout= 10000;
//連接的zookeeperserver
privatestaticfinalstringconnection_string = "172.31.25.8:2181";
privatestaticfinalstringzk_path = "/qyktest";
privatezookeeperzk = null;
privatecountdownlatchconnectedsemaphore = newcountdownlatch(1);
publicvoidcreateconnection(stringconnectstring, intsessiontimeout){
this.releaseconnection();
try{
zk= newzookeeper(connectstring,sessiontimeout, this);
connectedsemaphore.await();
}catch(interruptedexceptione) {
system.out.println("連接創建失敗,發生interruptedexception");
e.printstacktrace();
}catch(ioexceptione) {
system.out.println("連接創建失敗,發生ioexception");
e.printstacktrace();
}
}
publicvoidreleaseconnection(){
if(this.zk!= null){
try{
this.zk.close();
}catch(interruptedexceptione) {
e.printstacktrace();
}
}
}
publicbooleancreatepath(stringpath, string data) {
try{
stringresult = this.zk.create(path,data.getbytes(), ids.open_acl_unsafe,createmode.persistent);
system.out.println("節點創建成功,path: "+result + ", content: "+data);
}catch(keeperexceptione) {
system.out.println("節點創建失敗,發生keeperexception");
e.printstacktrace();
}catch(interruptedexceptione) {
system.out.println("節點創建失敗,發生interruptedexception");
e.printstacktrace();
}
returntrue;
}
publicstringreaddata(stringpath) {
try{
system.out.println("獲取數據成功,path:"+path);
returnnewstring(this.zk.getdata(path,false,null));
}catch(keeperexceptione) {
system.out.println("讀取數據失敗,發生keeperexception,path:"+path);
e.printstacktrace();
return"";
}catch(interruptedexceptione) {
system.out.println("讀取數據失敗,發生interruptedexception,path: "+path);
e.printstacktrace();
return"";
}
}
publicbooleanwritedata(stringpath, string data) {
try{
system.out.println("更新數據成功,path:"+path + ", stat: "+this.zk.setdata(path,data.getbytes(), -1));
}catch(keeperexceptione) {
system.out.println("更新數據失敗,發生keeperexception,path:"+path);
e.printstacktrace();
}catch(interruptedexceptione) {
system.out.println("更新數據失敗,發生interruptedexception,path: "+path);
e.printstacktrace();
}
returnfalse;
}
publicvoiddeletenode(stringpath) {
try{
this.zk.delete(path,-1);
system.out.println("刪除節點成功,path:"+path);
}catch(keeperexceptione) {
system.out.println("刪除節點失敗,發生keeperexception,path:"+path);
e.printstacktrace();
}catch(interruptedexceptione) {
system.out.println("刪除節點失敗,發生interruptedexception,path: "+path);
e.printstacktrace();
}
}
publicstaticvoidmain(string[]args) {
zookeeperclientsample = newzookeeperclient();
//獲取連接
sample.createconnection(connection_string,session_timeout);
//讀數據
stringqyk = sample.readdata("/qyktest");
system.out.println("qyk:"+qyk);
stringurl = sample.readdata("/qyk/db/url");
system.out.println("url"+url);
stringdriver = sample.readdata("/qyk/db/driver");
system.out.println("driver"+driver);
stringusername = sample.readdata("/qyk/db/username");
system.out.println("username"+username);
stringpassword = sample.readdata("/qyk/db/password");
system.out.println("password"+password);
//創建節點
sample.createpath(zk_path,"我是節點初始內容");
system.out.println("數據內容:"+sample.readdata(zk_path) + "\n");
//更新節點
sample.writedata(zk_path,"更新后的數據");
system.out.println("數據內容:"+sample.readdata(zk_path) + "\n");
//刪除節點
sample.deletenode(zk_path);
//釋放連接
sample.releaseconnection();
}
@override
publicvoidprocess(watchedeventevent) {
system.out.println("收到事件通知:"+event.getstate() + "\n");
if(keeperstate.syncconnected== event.getstate()) {
connectedsemaphore.countdown();
}
}
}

然后,執行可以看到,控制臺輸出如下:


java 中 zookeeper簡單使用

所以,像一些公用的配置,我們可以存到zookeeper里面,之后其它的服務就可以使用了

總結

以上所述是小編給大家介紹的java 中 zookeeper簡單使用,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!

原文鏈接:http://blog.sina.com.cn/s/blog_9c6852670102wwyy.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 操极品女神 | 激情视频激情小说 | 我被男人下药添得好爽 | 免费被黄网站在观看 | 日韩在线视频免费观看 | 草草视频人人爽 | 久久久无码精品亚洲A片猫咪 | 日韩一区二区不卡 | 边摸边吃奶边做爽gif动态图 | 国产精品nv在线观看 | 国产亚洲欧美日韩综合综合二区 | 亚洲国产高清一区二区三区 | 欧美性白人顶级hd | 国产乱子伦真实china | 国产精自产拍久久久久久 | 国产免费一区二区三区 | 91精品啪在线观看国产91九色 | 欧美三茎同入 | 日产乱码卡1卡2卡三卡四在线 | 98在线视频噜噜噜国产 | 久久精品视频在线看 | 男人天堂色男人 | 波多野结衣一区 | 欧美日韩中文国产一区 | 男人免费视频 | 青青青在线免费 | 国产精品片 | chaopeng在线观看| 日剧整部剧护妻狂魔免费观看全集 | www.青草视频 | 3x免费高清视频 | 国产精品亚洲片在线不卡 | 99精品在线视频观看 | 国产福利在线免费观看 | 国产日韩一区二区三区 | 日韩欧美亚洲国产高清在线 | 欧美激情亚洲 | 精品久久99麻豆蜜桃666 | 免费被黄网站在观看 | 色臀网站| 女人特黄大aaaaaa大片 |