日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[转]Zookeeper入门看这篇就够了

發(fā)布時間:2023/12/4 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]Zookeeper入门看这篇就够了 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Zookeeper是什么

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

上面的解釋有點抽象,簡單來說zookeeper=文件系統(tǒng)+監(jiān)聽通知機(jī)制。

1、 文件系統(tǒng)

?

?

Zookeeper維護(hù)一個類似文件系統(tǒng)的數(shù)據(jù)結(jié)構(gòu):

?

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

有四種類型的znode:

  • PERSISTENT-持久化目錄節(jié)點

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

  • PERSISTENT_SEQUENTIAL-持久化順序編號目錄節(jié)點

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

  • EPHEMERAL-臨時目錄節(jié)點

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

  • EPHEMERAL_SEQUENTIAL-臨時順序編號目錄節(jié)點

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

2、 監(jiān)聽通知機(jī)制

客戶端注冊監(jiān)聽它關(guān)心的目錄節(jié)點,當(dāng)目錄節(jié)點發(fā)生變化(數(shù)據(jù)改變、被刪除、子目錄節(jié)點增加刪除)時,zookeeper會通知客戶端。

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

Zookeeper能做什么

zookeeper功能非常強(qiáng)大,可以實現(xiàn)諸如分布式應(yīng)用配置管理、統(tǒng)一命名服務(wù)、狀態(tài)同步服務(wù)、集群管理等功能,我們這里拿比較簡單的分布式應(yīng)用配置管理為例來說明。

假設(shè)我們的程序是分布式部署在多臺機(jī)器上,如果我們要改變程序的配置文件,需要逐臺機(jī)器去修改,非常麻煩,現(xiàn)在把這些配置全部放到zookeeper上去,保存在 zookeeper 的某個目錄節(jié)點中,然后所有相關(guān)應(yīng)用程序?qū)@個目錄節(jié)點進(jìn)行監(jiān)聽,一旦配置信息發(fā)生變化,每個應(yīng)用程序就會收到 zookeeper 的通知,然后從 zookeeper 獲取新的配置信息應(yīng)用到系統(tǒng)中。

?

如上,你大致應(yīng)該了解zookeeper是個什么東西,大概能做些什么了,我們馬上來學(xué)習(xí)下zookeeper的安裝及使用,并開發(fā)一個小程序來實現(xiàn)zookeeper這個分布式配置管理的功能。

Zookeeper單機(jī)模式安裝

Step1:配置JAVA環(huán)境,檢驗環(huán)境:java -version

Step2:下載并解壓zookeeper

?
  • # cd /usr/local
  • # wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz
  • # tar -zxvf zookeeper-3.4.12.tar.gz
  • # 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客戶端連接下服務(wù)端

    # bin/zkCli.sh

    Zookeeper使用

    使用客戶端命令操作zookeeper

    1、使用 ls 命令來查看當(dāng)前 ZooKeeper 中所包含的內(nèi)容

    ?

    ?

    2、創(chuàng)建一個新的 znode ,使用 create /zkPro myData

    3、再次使用 ls 命令來查看現(xiàn)在 zookeeper 中所包含的內(nèi)容:

    4、下面我們運行 get 命令來確認(rèn)第二步中所創(chuàng)建的 znode 是否包含我們所創(chuàng)建的字符串:

    5、下面我們通過 set 命令來對 zk 所關(guān)聯(lián)的字符串進(jìn)行設(shè)置:

    6、下面我們將剛才創(chuàng)建的 znode 刪除

    ?

    使用Java API操作zookeeper

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

    ?

    下面我們來實現(xiàn)上面說的分布式配置中心:

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

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

    ?
  • import java.util.concurrent.CountDownLatch;
  • import org.apache.zookeeper.WatchedEvent;
  • import org.apache.zookeeper.Watcher;
  • import org.apache.zookeeper.Watcher.Event.EventType;
  • import org.apache.zookeeper.Watcher.Event.KeeperState;
  • import org.apache.zookeeper.ZooKeeper;
  • import org.apache.zookeeper.data.Stat;
  • /**
  • * 分布式配置中心demo
  • * @author
  • *
  • */
  • public class ZooKeeperProSync implements Watcher {
  • private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
  • private static ZooKeeper zk = null;
  • private static Stat stat = new Stat();
  • public static void main(String[] args) throws Exception {
  • //zookeeper配置數(shù)據(jù)存放路徑
  • String path = "/username";
  • //連接zookeeper并且注冊一個默認(rèn)的監(jiān)聽器
  • zk = new ZooKeeper("192.168.31.100:2181", 5000, //
  • new ZooKeeperProSync());
  • //等待zk連接成功的通知
  • connectedSemaphore.await();
  • //獲取path目錄節(jié)點的配置數(shù)據(jù),并注冊默認(rèn)的監(jiān)聽器
  • System.out.println(new String(zk.getData(path, true, stat)));
  • Thread.sleep(Integer.MAX_VALUE);
  • }
  • public void process(WatchedEvent event) {
  • if (KeeperState.SyncConnected == event.getState()) { //zk連接成功通知事件
  • if (EventType.None == event.getType() && null == event.getPath()) {
  • connectedSemaphore.countDown();
  • } else if (event.getType() == EventType.NodeDataChanged) { //zk目錄節(jié)點數(shù)據(jù)變化通知事件
  • try {
  • System.out.println("配置已修改,新值為:" + new String(zk.getData(event.getPath(), true, stat)));
  • } catch (Exception e) {
  • }
  • }
  • }
  • }
  • }
  • 兩個程序啟動后都正確的讀取到了zookeeper的/username目錄節(jié)點下的數(shù)據(jù)'qingfeng'

    3、我們在zookeeper里修改下目錄節(jié)點/username下的數(shù)據(jù)

    ?

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

    ?

    Zookeeper集群模式安裝

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

    Step1:配置JAVA環(huán)境,檢驗環(huán)境:java -version

    Step2:下載并解壓zookeeper

    ?
  • # cd /usr/local
  • # wget http://mirror.bit.edu.cn/apache/zookeeper/stable/zookeeper-3.4.12.tar.gz
  • # tar -zxvf zookeeper-3.4.12.tar.gz
  • # cd zookeeper-3.4.12
  • Step3:重命名 zoo_sample.cfg文件

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

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

    ?
  • # vim conf/zoo-1.cfg
  • dataDir=/tmp/zookeeper-1
  • clientPort=2181
  • server.1=127.0.0.1:2888:3888
  • server.2=127.0.0.1:2889:3889
  • server.3=127.0.0.1:2890:3890
  • 配置說明

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

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

    ?
  • # cp conf/zoo-1.cfg conf/zoo-2.cfg
  • # cp conf/zoo-1.cfg conf/zoo-3.cfg
  • # vim conf/zoo-2.cfg
  • dataDir=/tmp/zookeeper-2
  • clientPort=2182
  • # vim conf/zoo-2.cfg
  • dataDir=/tmp/zookeeper-3
  • clientPort=2183
  • Step5:標(biāo)識Server ID

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

    ?
  • # cd /tmp/zookeeper-1
  • # vim myid
  • 1
  • # cd /tmp/zookeeper-2
  • # vim myid
  • 2
  • # cd /tmp/zookeeper-3
  • # vim myid
  • 3
  • Step6:啟動三個zookeeper實例

    ?
  • # bin/zkServer.sh start conf/zoo-1.cfg
  • # bin/zkServer.sh start conf/zoo-2.cfg
  • # bin/zkServer.sh start conf/zoo-3.cfg
  • Step7:檢測集群狀態(tài),也可以直接用命令“zkCli.sh -server IP:PORT”連接zookeeper服務(wù)端檢測

    至此,我們對zookeeper就算有了一個入門的了解,當(dāng)然zookeeper遠(yuǎn)比我們這里描述的功能多,比如用zookeeper實現(xiàn)集群管理,分布式鎖,分布式隊列,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
    版權(quán)聲明:本文為作者原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!
    內(nèi)容解析By:CSDN,CNBLOG博客文章一鍵轉(zhuǎn)載插件

    總結(jié)

    以上是生活随笔為你收集整理的[转]Zookeeper入门看这篇就够了的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。