這篇文章將為大家詳細講解有關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.cdh6.0.0.p0.47/lib/zookeeper/bin/zkCli.sh-server localhost,進入zookeeper命令行,如下:

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

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

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

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

最后,我們執行delete /qyktest便可刪除此節點。
另外,我們還可以在qyktest此節點下繼續創建子節點。
好了,幾個基本命令就講到這人啦,其它的命令還有很多,大家可以去查閱下資料。
三、zookeeper的javaapi操作
關于Javaapi操作zookeeper比較簡單,筆者直接貼出代碼,如下:
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();
}
}
}
網站題目:zookeeper如何在java項目中使用-創新互聯
轉載源于:http://www.yijiale78.com/article46/ceidhg.html
成都網站建設公司_創新互聯,為您提供動態網站、網站收錄、域名注冊、網站營銷、網站策劃、網站設計公司
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯