国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美视频一区二区 | 国产精品久久久久久久久久久新郎 | 亚洲福利国产 | 黄色av影院 | 极品久久 | 亚洲午夜激情 | 羞羞视频免费 | 欧美日韩一级在线观看 | 黄色一级在线观看 | 精品一区二区三区免费 | 日韩精品一区二区三区精品av | 国产精品久久久久久亚洲调教 | 久久久美女 | 中文字幕一区在线观看视频 | 欧美日韩国产一区二区三区 | 精品美女在线观看视频在线观看 | 久久综合九色综合欧美狠狠 | 中文字幕成人 | 亚洲一区在线播放 | 午夜激情影院 | 欧美亚洲综合久久 | a国产精品 | 激情五月婷婷av | 久热免费视频 | 五月天婷婷国产精品 | 一区二区久久 | 国产一区二区av在线 | 国产综合精品一区二区三区 | 亚洲国产精品久久久久 | 久久久精品网站 | 久久亚洲一区 | 亚洲一区中文字幕在线观看 | av中文字幕第一页 | 久久久成人精品 | 日韩精品专区在线影院重磅 | 国产精品日本欧美一区二区三区 | 日日色视频 | 99久久久无码国产精品 | 99热在线精品免费 | 亚洲视频一区二区在线观看 | 在线观看av网站永久 |