[轉]Zookeeper入門看這篇就夠了

Zookeeper是什么

官方文檔上這么解釋zookeeper,它是一個分布式服務框架,是Apache Hadoop 的一個子項目,它主要是用來解決分布式應用中經常遇到的一些數據管理問題,如:統一命名服務、狀態同步服務、集群管理、分布式應用配置項的管理等。

上面的解釋有點抽象,簡單來說zookeeper=文件系統+監聽通知機制。

1、 文件系統

?

?

Zookeeper維護一個類似文件系統的數據結構:

?

每個子目錄項如 NameService 都被稱作為 znode(目錄節點),和文件系統一樣,我們能夠自由的增加、刪除znode,在一個znode下增加、刪除子znode,唯一的不同在于znode是可以存儲數據的。

有四種類型的znode:

  • PERSISTENT-持久化目錄節點

    客戶端與zookeeper斷開連接后,該節點依舊存在

  • PERSISTENT_SEQUENTIAL-持久化順序編號目錄節點

    客戶端與zookeeper斷開連接后,該節點依舊存在,只是Zookeeper給該節點名稱進行順序編號

  • EPHEMERAL-臨時目錄節點

    客戶端與zookeeper斷開連接后,該節點被刪除

  • EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節點

    客戶端與zookeeper斷開連接后,該節點被刪除,只是Zookeeper給該節點名稱進行順序編號

2、 監聽通知機制

客戶端注冊監聽它關心的目錄節點,當目錄節點發生變化(數據改變、被刪除、子目錄節點增加刪除)時,zookeeper會通知客戶端。

就這么簡單,下面我們看看Zookeeper能做點什么呢?

Zookeeper能做什么

zookeeper功能非常強大,可以實現諸如分布式應用配置管理、統一命名服務、狀態同步服務、集群管理等功能,我們這里拿比較簡單的分布式應用配置管理為例來說明。

假設我們的程序是分布式部署在多臺機器上,如果我們要改變程序的配置文件,需要逐臺機器去修改,非常麻煩,現在把這些配置全部放到zookeeper上去,保存在 zookeeper 的某個目錄節點中,然后所有相關應用程序對這個目錄節點進行監聽,一旦配置信息發生變化,每個應用程序就會收到 zookeeper 的通知,然后從 zookeeper 獲取新的配置信息應用到系統中。

?

如上,你大致應該了解zookeeper是個什么東西,大概能做些什么了,我們馬上來學習下zookeeper的安裝及使用,并開發一個小程序來實現zookeeper這個分布式配置管理的功能。

Zookeeper單機模式安裝

Step1:配置JAVA環境,檢驗環境:java -version

Step2:下載并解壓zookeeper

?
  1. # cd /usr/local
  2. # wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz
  3. # tar -zxvf zookeeper-3.4.12.tar.gz
  4. # cd zookeeper-3.4.12

Step3:重命名配置文件zoo_sample.cfg

# cp conf/zoo_sample.cfg conf/zoo.cfg

Step4:啟動zookeeper

# bin/zkServer.sh start

Step5:檢測是否成功啟動,用zookeeper客戶端連接下服務端

# bin/zkCli.sh

Zookeeper使用

使用客戶端命令操作zookeeper

1、使用 ls 命令來查看當前 ZooKeeper 中所包含的內容

?

?

2、創建一個新的 znode ,使用 create /zkPro myData

3、再次使用 ls 命令來查看現在 zookeeper 中所包含的內容:

4、下面我們運行 get 命令來確認第二步中所創建的 znode 是否包含我們所創建的字符串:

5、下面我們通過 set 命令來對 zk 所關聯的字符串進行設置:

6、下面我們將剛才創建的 znode 刪除

?

使用Java API操作zookeeper

使用Java API操作zookeeper需要引用下面的包

?

下面我們來實現上面說的分布式配置中心:

1、在zookeeper里增加一個目錄節點,并且把配置信息存儲在里面

2、啟動兩個zookeeper客戶端程序,代碼如下所示

?
  1. import java.util.concurrent.CountDownLatch;
  2. import org.apache.zookeeper.WatchedEvent;
  3. import org.apache.zookeeper.Watcher;
  4. import org.apache.zookeeper.Watcher.Event.EventType;
  5. import org.apache.zookeeper.Watcher.Event.KeeperState;
  6. import org.apache.zookeeper.ZooKeeper;
  7. import org.apache.zookeeper.data.Stat;
  8. /**
  9. * 分布式配置中心demo
  10. * @author
  11. *
  12. */
  13. public class ZooKeeperProSync implements Watcher {
  14. private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
  15. private static ZooKeeper zk = null;
  16. private static Stat stat = new Stat();
  17. public static void main(String[] args) throws Exception {
  18. //zookeeper配置數據存放路徑
  19. String path = "/username";
  20. //連接zookeeper并且注冊一個默認的監聽器
  21. zk = new ZooKeeper("192.168.31.100:2181", 5000, //
  22. new ZooKeeperProSync());
  23. //等待zk連接成功的通知
  24. connectedSemaphore.await();
  25. //獲取path目錄節點的配置數據,并注冊默認的監聽器
  26. System.out.println(new String(zk.getData(path, true, stat)));
  27. Thread.sleep(Integer.MAX_VALUE);
  28. }
  29. public void process(WatchedEvent event) {
  30. if (KeeperState.SyncConnected == event.getState()) { //zk連接成功通知事件
  31. if (EventType.None == event.getType() && null == event.getPath()) {
  32. connectedSemaphore.countDown();
  33. } else if (event.getType() == EventType.NodeDataChanged) { //zk目錄節點數據變化通知事件
  34. try {
  35. System.out.println("配置已修改,新值為:" + new String(zk.getData(event.getPath(), true, stat)));
  36. } catch (Exception e) {
  37. }
  38. }
  39. }
  40. }
  41. }

兩個程序啟動后都正確的讀取到了zookeeper的/username目錄節點下的數據'qingfeng'

3、我們在zookeeper里修改下目錄節點/username下的數據

?

修改完成后,我們看見兩個程序后臺都及時收到了他們監聽的目錄節點數據變更后的值,如下所示

?

Zookeeper集群模式安裝

本例搭建的是偽集群模式,即一臺機器上啟動三個zookeeper實例組成集群,真正的集群模式無非就是實例IP地址不同,搭建方法沒有區別

Step1:配置JAVA環境,檢驗環境:java -version

Step2:下載并解壓zookeeper

?
  1. # cd /usr/local
  2. # wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz
  3. # tar -zxvf zookeeper-3.4.12.tar.gz
  4. # cd zookeeper-3.4.12

Step3:重命名 zoo_sample.cfg文件

# cp conf/zoo_sample.cfg conf/zoo-1.cfg

Step4:修改配置文件zoo-1.cfg,原配置文件里有的,修改成下面的值,沒有的則加上

?
  1. # vim conf/zoo-1.cfg
  2. dataDir=/tmp/zookeeper-1
  3. clientPort=2181
  4. server.1=127.0.0.1:2888:3888
  5. server.2=127.0.0.1:2889:3889
  6. server.3=127.0.0.1:2890:3890

配置說明

  • tickTime:這個時間是作為 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
  • initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這里所說的客戶端不是用戶連接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集群中連接到 Leader 的 Follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 10個心跳的時間(也就是 tickTime)長度后 Zookeeper 服務器還沒有收到客戶端的返回信息,那么表明這個客戶端連接失敗。總的時間長度就是 10*2000=20 秒
  • syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 5*2000=10秒
  • dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日志文件也保存在這個目錄里。
  • clientPort:這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。
  • server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集群中的 Leader 服務器交換信息的端口;D 表示的是萬一集群中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通信的端口。如果是偽集群的配置方式,由于 B 都是一樣,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號。

Step4:再從zoo-1.cfg復制兩個配置文件zoo-2.cfg和zoo-3.cfg,只需修改dataDir和clientPort不同即可

?
  1. # cp conf/zoo-1.cfg conf/zoo-2.cfg
  2. # cp conf/zoo-1.cfg conf/zoo-3.cfg
  3. # vim conf/zoo-2.cfg
  4. dataDir=/tmp/zookeeper-2
  5. clientPort=2182
  6. # vim conf/zoo-2.cfg
  7. dataDir=/tmp/zookeeper-3
  8. clientPort=2183

Step5:標識Server ID

創建三個文件夾/tmp/zookeeper-1,/tmp/zookeeper-2,/tmp/zookeeper-2,在每個目錄中創建文件myid 文件,寫入當前實例的server id,即1.2.3

?
  1. # cd /tmp/zookeeper-1
  2. # vim myid
  3. 1
  4. # cd /tmp/zookeeper-2
  5. # vim myid
  6. 2
  7. # cd /tmp/zookeeper-3
  8. # vim myid
  9. 3

Step6:啟動三個zookeeper實例

?
  1. # bin/zkServer.sh start conf/zoo-1.cfg
  2. # bin/zkServer.sh start conf/zoo-2.cfg
  3. # bin/zkServer.sh start conf/zoo-3.cfg

Step7:檢測集群狀態,也可以直接用命令“zkCli.sh -server IP:PORT”連接zookeeper服務端檢測

至此,我們對zookeeper就算有了一個入門的了解,當然zookeeper遠比我們這里描述的功能多,比如用zookeeper實現集群管理,分布式鎖,分布式隊列,zookeeper集群leader選舉等等

推薦閱讀:https://www.roncoo.com/course/view/255bac222b1b4300b42838b58fea3a2e

文章來源:https://my.oschina.net/u/3796575/blog/1845035


---------------------
作者:java_66666
來源:CSDN
原文:https://blog.csdn.net/java_66666/article/details/81015302
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!
內容解析By:CSDN,CNBLOG博客文章一鍵轉載插件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/285186.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/285186.shtml
英文地址,請注明出處:http://en.pswp.cn/news/285186.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

微服務-springcloud(eureka實踐, nacos實踐)

Spring 體系圖 版本關系 eureka 實踐 1 父工程依賴 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.14</version> </parent> <dependencyManage…

Windows服務二:測試新建的服務、調試Windows服務

一、測試Windows服務 為了使Windows服務程序能夠正常運行&#xff0c;我們需要像創建一般應用程序那樣為它創建一個程序的入口點。像其他應用程序一樣&#xff0c;Windows服務也是在Program.cs的Main()函數中完成這個操作。首先我們在Main&#xff08;&#xff09;函數中創建一…

角度前方交會點坐標計算完整步驟

測量工作中&#xff0c;我們常常會遇到待測點被障礙物遮擋住觀測視線而無法進行觀測的情況。這時候我們就需要特殊的交會計算方法對待定點進行特別的觀測。 前方交會又稱為測角交會&#xff0c;是指從相鄰兩個已知點向待定點觀測兩個水平角&#xff0c;用以計算待定點的坐標。 …

Mysql 的子查詢

子查詢&#xff1a; 子查詢&#xff1a;嵌套在其它查詢中的查詢語句。&#xff08;又稱為內部查詢&#xff09; 主查詢&#xff1a;包含其它子查詢的查詢稱為主查詢。&#xff08;又稱外部查詢&#xff09; 非相關子查詢&#xff1a; 在主查詢中&#xff0c;子查詢只需要執行一…

【系統設計】指標監控和告警系統

在本文中&#xff0c;我們將探討如何設計一個可擴展的指標監控和告警系統。一個好的監控和告警系統&#xff0c;對基礎設施的可觀察性&#xff0c;高可用性&#xff0c;可靠性方面發揮著關鍵作用。下圖顯示了市面上一些流行的指標監控和告警服務。接下來&#xff0c;我們會設計…

C語言試題154之兩個字符串連接程序

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:兩個字符串連接程序 2 、溫馨…

[轉]Android studio 快速解決Gradle's dependency cache may be corrupt 和 Gradle配置 gradle

用了好久的AS了&#xff0c;官方版本更新&#xff0c;各種配置工具 也跟著更新。更新后導入工程時&#xff08;使用Android工程編譯或者導入新的工程沒有對應的gradle版本&#xff09;一些電腦出現一下問題。 Error:Failed to open zip file. Gradles dependency cache may …

mybatis源碼學習

2019獨角獸企業重金招聘Python工程師標準>>> 學習主線&#xff1a; 目的&#xff1a;mybatis的作用orm框架&#xff0c;用了該框架就不用自己調用jdbc了。 用法&#xff1a;。。。。。 邏輯&#xff1a;。。。。。 源代碼&#xff1a;。。。。。 1、猜想mybatis對數…

自己封裝一個彈框插件

彈出層提示信息&#xff0c;這是移動前端開發中最常見的需求&#xff0c;你可能會想到一些流行的彈框插件&#xff0c;比如 經典的artDialog 炫酷的Sweetalert等等.. 但是慢慢地你其實會發現通常情況下需求定制化要求較高&#xff0c;一般的彈框插件可能只滿足大部分要求&#…

C語言中include““與include<>的區別(自定義頭文件、預設頭文件)

文章目錄 新建控制臺應用程序自定義頭文件編輯頭文件工程內引用頭文件,調用函數標準庫頭文件,調用函數新建控制臺應用程序 Win32 Application和Win32 Console Application 都是工作在32位Windows環境的程序。其中: (1)Win32 Application就是普通的常見的窗口應用程序,當…

.NET MAUI 性能提升

點擊藍字關注我們作者&#xff1a;Jonathan Peppers翻譯&#xff1a;Yijing Sun校稿&#xff1a;Amy Peng排版&#xff1a;Rani Sun精彩預告*本文干貨滿滿&#xff0c;預計閱讀時間32分鐘&#xff0c;建議收藏保存。.NET多平臺應用程序UI (MAUI)將android、iOS、macOS和Windows…

類與類之間的關系

橫向關系依賴 關聯 聚合 組合 判斷方法&#xff1a; 生命周期有關系&#xff1a;組合&#xff0c;聚合  聚合&#xff1a;包含多個相同的類  組合&#xff1a;定義的時候就要有  依賴&#xff1a;只要使用就必須要有  關聯&#xff1a;可有可無 縱向關系繼承 基類( 父類…

C語言試題155之有五個學生,每個學生有 3 門課的成績,從鍵盤輸入以上數據(包括學生號,姓名,三門課成績),計算出 平均成績,況原有的數據和計算出的平均分數存放在磁盤文件“stud“中

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:有五個學生,每個學生有 3 門…

仿照支付寶賬單界面--listview分組顯示 用來做!發!財樹充值交易明細

QQ圖片20150430155638.png (151.65 KB, 下載次數: 32) 下載鏈接: http://pan.baidu.com/s/1kVMY1SV 密碼: i8ta

系統中常用的目錄

Linux系統中常用的目錄 目錄 /bin 存放二進制可執行文件(ls,cat,mkdir等)&#xff0c;常用命令一般都在這里。 /etc 存放系統管理和配置文件 /home 存放所有用戶文件的根目錄&#xff0c;是用戶主目錄的基點&#xff0c;比如用戶user的主目錄就是/home/user&#xff0…

C語言試題156之有兩個磁盤文件 A 和 B,各存放一行字母,要求把這兩個文件中的信息合并(按字母順序排列), 輸出到一個新文件 C 中。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例 ??推薦一款模擬面試、刷題神器?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 題目:有兩個磁盤文件 A 和 B,各存…

【ArcGIS微課1000例】0002:創建漁網(Create fishnet)

本文講解ArcGIS軟件中漁網(fishnet)工具的原理,方法及使用技巧。 文章目錄 微課目標工具介紹實現過程微課目標 如下圖所示,影像為無人機航測生產的DOM,現在需要在ArcGIS平臺中進行DLG數據采集(數字化),由于測區較大,需要創建500*500的漁網,并對影像進行裁剪下發給多…

基于http協議的api接口對于客戶端的身份認證方式以及安全措施[轉]

基于http協議的api接口對于客戶端的身份認證方式以及安全措施 由于http是無狀態的&#xff0c;所以正常情況下在瀏覽器瀏覽網頁&#xff0c;服務器都是通過訪問者的cookie(cookie中存儲的jsessionid)來辨別客戶端的身份的&#xff0c;當客戶端進行登錄服務器也會將登錄信息存放…

使用 Scrutor 快速實現“裝飾者模式”

裝飾者模式介紹裝飾器模式&#xff08;Decorator Pattern&#xff09;是在不改變原類和使用繼承的情況下&#xff0c;動態地給一個對象添加一些額外的職責。它是通過創建一個包裝對象&#xff0c;也就是裝飾來包裹真實的對象。可以在如下使用場景中使用裝飾器模式&#xff1a;在…

各個 Android Gradle 插件版本所需的 Gradle 版本

下表列出了各個 Android Gradle 插件版本所需的 Gradle 版本。 要獲得最佳性能&#xff0c;您應該使用 Gradle 和插件這兩者的最新版本。 插件版本所需的 Gradle 版本1.0.0 - 1.1.32.2.1 - 2.31.2.0 - 1.3.12.2.1 - 2.91.5.02.2.1 - 2.132.0.0 - 2.1.22.10 - 2.132.1.3 - 2.2…