溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Zookeeper該怎樣入門

發(fā)布時(shí)間:2021-12-24 16:16:05 來源:億速云 閱讀:133 作者:柒染 欄目:軟件技術(shù)

Zookeeper該怎樣入門,相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

Zookeeper是什么

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

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

1、 文件系統(tǒng)

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

Zookeeper該怎樣入門

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

有四種類型的znode:

  • 使用客戶端命令操作zookeeper

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

    Zookeeper該怎樣入門

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

    Zookeeper該怎樣入門

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

    Zookeeper該怎樣入門

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

    Zookeeper該怎樣入門

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

    Zookeeper該怎樣入門

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

    Zookeeper該怎樣入門


    使用Java API操作zookeeper

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

    Zookeeper該怎樣入門

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

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

    Zookeeper該怎樣入門

    2、啟動(dòng)兩個(gè)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;



    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并且注冊(cè)一個(gè)默認(rèn)的監(jiān)聽器

            zk = new ZooKeeper("192.168.31.100:2181", 5000, //

                    new ZooKeeperProSync());

            //等待zk連接成功的通知

            connectedSemaphore.await();

            //獲取path目錄節(jié)點(diǎn)的配置數(shù)據(jù),并注冊(cè)默認(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é)點(diǎn)數(shù)據(jù)變化通知事件

                    try {

                        System.out.println("配置已修改,新值為:" + new String(zk.getData(event.getPath(), true, stat)));

                    } catch (Exception e) {

                    }

                }

            }

        }

    }

    兩個(gè)程序啟動(dòng)后都正確的讀取到了zookeeper的/username目錄節(jié)點(diǎn)下的數(shù)據(jù)'qingfeng'

    3、我們?cè)趜ookeeper里修改下目錄節(jié)點(diǎn)/username下的數(shù)據(jù)

    Zookeeper該怎樣入門

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

    Zookeeper該怎樣入門


    Zookeeper集群模式安裝

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

    Step1:配置JAVA環(huán)境,檢驗(yà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.cfgdataDir=/tmp/zookeeper-1clientPort=2181server.1=127.0.0.1:2888:3888server.2=127.0.0.1:2889:3889server.3=127.0.0.1:2890:3890

    配置說明

    • tickTime:這個(gè)時(shí)間是作為 Zookeeper 服務(wù)器之間或客戶端與服務(wù)器之間維持心跳的時(shí)間間隔,也就是每個(gè) tickTime 時(shí)間就會(huì)發(fā)送一個(gè)心跳。

    • initLimit:這個(gè)配置項(xiàng)是用來配置 Zookeeper 接受客戶端(這里所說的客戶端不是用戶連接 Zookeeper 服務(wù)器的客戶端,而是 Zookeeper 服務(wù)器集群中連接到 Leader 的 Follower 服務(wù)器)初始化連接時(shí)最長(zhǎng)能忍受多少個(gè)心跳時(shí)間間隔數(shù)。當(dāng)已經(jīng)超過 10個(gè)心跳的時(shí)間(也就是 tickTime)長(zhǎng)度后 Zookeeper 服務(wù)器還沒有收到客戶端的返回信息,那么表明這個(gè)客戶端連接失敗??偟臅r(shí)間長(zhǎng)度就是 10*2000=20 秒

    • syncLimit:這個(gè)配置項(xiàng)標(biāo)識(shí) Leader 與 Follower 之間發(fā)送消息,請(qǐng)求和應(yīng)答時(shí)間長(zhǎng)度,最長(zhǎng)不能超過多少個(gè) tickTime 的時(shí)間長(zhǎng)度,總的時(shí)間長(zhǎng)度就是 5*2000=10秒

    • dataDir:顧名思義就是 Zookeeper 保存數(shù)據(jù)的目錄,默認(rèn)情況下,Zookeeper 將寫數(shù)據(jù)的日志文件也保存在這個(gè)目錄里。

    • clientPort:這個(gè)端口就是客戶端連接 Zookeeper 服務(wù)器的端口,Zookeeper 會(huì)監(jiān)聽這個(gè)端口,接受客戶端的訪問請(qǐng)求。

    • server.A=B:C:D:其中 A 是一個(gè)數(shù)字,表示這個(gè)是第幾號(hào)服務(wù)器;B 是這個(gè)服務(wù)器的 ip 地址;C 表示的是這個(gè)服務(wù)器與集群中的 Leader 服務(wù)器交換信息的端口;D 表示的是萬(wàn)一集群中的 Leader 服務(wù)器掛了,需要一個(gè)端口來重新進(jìn)行選舉,選出一個(gè)新的 Leader,而這個(gè)端口就是用來執(zhí)行選舉時(shí)服務(wù)器相互通信的端口。如果是偽集群的配置方式,由于 B 都是一樣,所以不同的 Zookeeper 實(shí)例通信端口號(hào)不能一樣,所以要給它們分配不同的端口號(hào)。

    Step4:再?gòu)膠oo-1.cfg復(fù)制兩個(gè)配置文件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.cfgdataDir=/tmp/zookeeper-2clientPort=2182# vim conf/zoo-2.cfgdataDir=/tmp/zookeeper-3clientPort=2183

    Step5:標(biāo)識(shí)Server ID

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

    # cd /tmp/zookeeper-1# vim myid1# cd /tmp/zookeeper-2# vim myid2# cd /tmp/zookeeper-3# vim myid3

    Step6:?jiǎn)?dòng)三個(gè)zookeeper實(shí)例

    # 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:檢測(cè)集群狀態(tài),也可以直接用命令“zkCli.sh -server IP:PORT”連接zookeeper服務(wù)端檢測(cè)

    Zookeeper該怎樣入門

看完上述內(nèi)容,你們掌握Z(yǔ)ookeeper該怎樣入門的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI