<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-7  評論-23  文章-0  trackbacks-0

    zookeeper介紹
    zookeeper是一個為分布式應(yīng)用提供一致性服務(wù)的軟件,它是開源的Hadoop項目中的一個子項目,并且根據(jù)google發(fā)表的<The Chubby lock service for loosely-coupled distributed systems>論文來實(shí)現(xiàn)的,接下來我們首先來安裝使用下這個軟件,然后再來探索下其中比較重要一致性算法。  

    zookeeper安裝和使用
    zookeeper的安裝基本上可以按照 http://hadoop.apache.org/zookeeper/docs/current/ zookeeperStarted.html 這個頁面上的步驟完成安裝,這里主要介紹下部署一個集群的步驟,因?yàn)檫@個官方頁面似乎講得并不是非常詳細(xì)(Running Replicated Zookeeper)

    由于手頭機(jī)器不足,所以在一臺機(jī)器上部署了
    3server,如果你手頭也比較緊,也可以這么做。那么我建了3個文件夾,如下
    server1   server2   server3

    然后每個文件夾里面解壓一個
    zookeeper的下載包,并且還建了幾個文件夾,總體結(jié)構(gòu)如下,最后那個是下載過來壓縮包的解壓文件
    data dataLog logs zookeeper-3.3.2

    那么首先進(jìn)入data目錄,創(chuàng)建一個myid的文件,里面寫入一個數(shù)字,比如我這個是server1,那么就寫一個1server2對應(yīng)myid文件就寫入2,server3對應(yīng)myid文件就寫個3

    然后進(jìn)入zookeeper-3.3.2/conf目錄,那么如果是剛下過來,會有3個文件,configuration.xml, log4j.properties,zoo_sample.cfg,3個文件我們首先要做的就是在這個目錄創(chuàng)建一個zoo.cfg的配置文件,當(dāng)然你可以把zoo_sample.cfg文件改成zoo.cfg,配置的內(nèi)容如下所示: 
    tickTime=2000
    initLimit=5
    syncLimit=2
    dataDir=xxxx/zookeeper/server1/data
    dataLogDir=xxx/zookeeper/server1/dataLog
    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

    標(biāo)紅的幾個配置應(yīng)該官網(wǎng)講得很清楚了,只是需要注意的是clientPort這個端口如果你是在1臺機(jī)器上部署多個server,那么每臺機(jī)器都要不同的clientPort,比如我server12181,server22182server32183,dataDirdataLogDir也需要區(qū)分下。

    最后幾行唯一需要注意的地方就是 server.X 這個數(shù)字就是對應(yīng) data/myid中的數(shù)字。你在3servermyid文件中分別寫入了123,那么每個server中的zoo.cfg都配server.1,server.2,server.3OK了。因?yàn)樵谕慌_機(jī)器上,后面連著的2個端口3server都不要一樣,否則端口沖突,其中第一個端口用來集群成員的信息交換,第二個端口是在leader掛掉時專門用來進(jìn)行選舉leader所用。

    進(jìn)入zookeeper-3.3.2/bin 目錄中./zkServer.sh start啟動一個server,這時會報大量錯誤?其實(shí)沒什么關(guān)系,因?yàn)楝F(xiàn)在集群只起了1serverzookeeper服務(wù)器端起來會根據(jù)zoo.cfg的服務(wù)器列表發(fā)起選舉leader的請求,因?yàn)檫B不上其他機(jī)器而報錯,那么當(dāng)我們起第二個zookeeper實(shí)例后,leader將會被選出,從而一致性服務(wù)開始可以使用,這是因?yàn)?/span>3臺機(jī)器只要有2臺可用就可以選出leader并且對外提供服務(wù)(2n+1臺機(jī)器,可以容n臺機(jī)器掛掉)。

    接下來就可以使用了,我們可以先通過 zookeeper自帶的客戶端交互程序來簡單感受下zookeeper到底做一些什么事情。進(jìn)入zookeeper-3.3.2/bin3server中任意一個)下,./zkCli.sh –server 127.0.0.1:2182,我連的是開著2182端口的機(jī)器。

    那么,首先我們隨便打個命令,因?yàn)?/span>zookeeper不認(rèn)識,他會給出命令的help,如下圖
      
      
    ls(查看當(dāng)前節(jié)點(diǎn)數(shù)據(jù)),
    ls2(查看當(dāng)前節(jié)點(diǎn)數(shù)據(jù)并能看到更新次數(shù)等數(shù)據(jù)) ,
    create(創(chuàng)建一個節(jié)點(diǎn)) ,
    get(得到一個節(jié)點(diǎn),包含數(shù)據(jù)和更新次數(shù)等數(shù)據(jù)),
    set(修改節(jié)點(diǎn))
    delete(刪除一個節(jié)點(diǎn))

    通過上述命令實(shí)踐,我們可以發(fā)現(xiàn),zookeeper使用了一個類似文件系統(tǒng)的樹結(jié)構(gòu),數(shù)據(jù)可以掛在某個節(jié)點(diǎn)上,可以對這個節(jié)點(diǎn)進(jìn)行刪改。另外我們還發(fā)現(xiàn),當(dāng)改動一個節(jié)點(diǎn)的時候,集群中活著的機(jī)器都會更新到一致的數(shù)據(jù)。

    zookeeper的數(shù)據(jù)模型
    在簡單使用了zookeeper之后,我們發(fā)現(xiàn)其數(shù)據(jù)模型有些像操作系統(tǒng)的文件結(jié)構(gòu),結(jié)構(gòu)如下圖所示



    (1)     每個節(jié)點(diǎn)在zookeeper中叫做znode,并且其有一個唯一的路徑標(biāo)識,如/SERVER2節(jié)點(diǎn)的標(biāo)識就為/APP3/SERVER2
    (2)     Znode可以有子znode,并且znode里可以存數(shù)據(jù),但是EPHEMERAL類型的節(jié)點(diǎn)不能有子節(jié)點(diǎn)
    (3)     Znode中的數(shù)據(jù)可以有多個版本,比如某一個路徑下存有多個數(shù)據(jù)版本,那么查詢這個路徑下的數(shù)據(jù)就需要帶上版本。
    (4)     znode 可以是臨時節(jié)點(diǎn),一旦創(chuàng)建這個 znode 的客戶端與服務(wù)器失去聯(lián)系,這個 znode 也將自動刪除,Zookeeper 的客戶端和服務(wù)器通信采用長連接方式,每個客戶端和  服務(wù)器通過心跳來保持連接,這個連接狀態(tài)稱為 session,如果 znode 是臨時節(jié)點(diǎn),這個 session 失效,znode 也就刪除了
    (5)     znode 的目錄名可以自動編號,如 App1 已經(jīng)存在,再創(chuàng)建的話,將會自動命名為 App2 
    (6)     znode 可以被監(jiān)控,包括這個目錄節(jié)點(diǎn)中存儲的數(shù)據(jù)的修改,子節(jié)點(diǎn)目錄的變化等,一旦變化可以通知設(shè)置監(jiān)控的客戶端,這個功能是zookeeper對于應(yīng)用最重要的特性,通過這個特性可以實(shí)現(xiàn)的功能包括配置的集中管理,集群管理,分布式鎖等等。
     

    通過java代碼使用zookeeper 
    Zookeeper的使用主要是通過創(chuàng)建其jar包下的Zookeeper實(shí)例,并且調(diào)用其接口方法進(jìn)行的,主要的操作就是對znode的增刪改操作,監(jiān)聽znode的變化以及處理。 

    以下為主要的API使用和解釋

    //創(chuàng)建一個Zookeeper實(shí)例,第一個參數(shù)為目標(biāo)服務(wù)器地址和端口,第二個參數(shù)為Session超時時間,第三個為節(jié)點(diǎn)變化時的回調(diào)方法
    ZooKeeper zk = new ZooKeeper("127.0.0.1:2181"500000,new Watcher() {
               
    // 監(jiān)控所有被觸發(fā)的事件
                 public void process(WatchedEvent event) {
               
    //dosomething
               }

          }
    );
    //創(chuàng)建一個節(jié)點(diǎn)root,數(shù)據(jù)是mydata,不進(jìn)行ACL權(quán)限控制,節(jié)點(diǎn)為永久性的(即客戶端shutdown了也不會消失)
    zk.create("/root""mydata".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

    //在root下面創(chuàng)建一個childone znode,數(shù)據(jù)為childone,不進(jìn)行ACL權(quán)限控制,節(jié)點(diǎn)為永久性的
    zk.create("/root/childone","childone".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);

    //取得/root節(jié)點(diǎn)下的子節(jié)點(diǎn)名稱,返回List<String>
    zk.getChildren("/root",true);

    //取得/root/childone節(jié)點(diǎn)下的數(shù)據(jù),返回byte[]
    zk.getData("/root/childone"truenull);

    //修改節(jié)點(diǎn)/root/childone下的數(shù)據(jù),第三個參數(shù)為版本,如果是-1,那會無視被修改的數(shù)據(jù)版本,直接改掉
    zk.setData("/root/childone","childonemodify".getBytes(), -1);

    //刪除/root/childone這個節(jié)點(diǎn),第二個參數(shù)為版本,-1的話直接刪除,無視版本
    zk.delete("/root/childone"-1);
          
    //關(guān)閉session
    zk.close();
     
    Zookeeper的主流應(yīng)用場景實(shí)現(xiàn)思路(除去官方示例)

    (1)
    配置管理
    集中式的配置管理在應(yīng)用集群中是非常常見的,一般商業(yè)公司內(nèi)部都會實(shí)現(xiàn)一套集中的配置管理中心,應(yīng)對不同的應(yīng)用集群對于共享各自配置的需求,并且在配置變更時能夠通知到集群中的每一個機(jī)器。

    Zookeeper
    很容易實(shí)現(xiàn)這種集中式的配置管理,比如將APP1的所有配置配置到/APP1 znode下,APP1所有機(jī)器一啟動就對/APP1這個節(jié)點(diǎn)進(jìn)行監(jiān)控(zk.exist("/APP1",true)),并且實(shí)現(xiàn)回調(diào)方法Watcher,那么在zookeeper/APP1 znode節(jié)點(diǎn)下數(shù)據(jù)發(fā)生變化的時候,每個機(jī)器都會收到通知,Watcher方法將會被執(zhí)行,那么應(yīng)用再取下數(shù)據(jù)即可(zk.getData("/APP1",false,null));

    以上這個例子只是簡單的粗顆粒度配置監(jiān)控,細(xì)顆粒度的數(shù)據(jù)可以進(jìn)行分層級監(jiān)控,這一切都是可以設(shè)計和控制的。
        
    (2)集群管理
    應(yīng)用集群中,我們常常需要讓每一個機(jī)器知道集群中(或依賴的其他某一個集群)哪些機(jī)器是活著的,并且在集群機(jī)器因?yàn)殄礄C(jī),網(wǎng)絡(luò)斷鏈等原因能夠不在人工介入的情況下迅速通知到每一個機(jī)器。

    Zookeeper
    同樣很容易實(shí)現(xiàn)這個功能,比如我在zookeeper服務(wù)器端有一個znode/APP1SERVERS,那么集群中每一個機(jī)器啟動的時候都去這個節(jié)點(diǎn)下創(chuàng)建一個EPHEMERAL類型的節(jié)點(diǎn),比如server1創(chuàng)建/APP1SERVERS/SERVER1(可以使用ip,保證不重復(fù)),server2創(chuàng)建/APP1SERVERS/SERVER2,然后SERVER1SERVER2watch /APP1SERVERS這個父節(jié)點(diǎn),那么也就是這個父節(jié)點(diǎn)下數(shù)據(jù)或者子節(jié)點(diǎn)變化都會通知對該節(jié)點(diǎn)進(jìn)行watch的客戶端。因?yàn)?/span>EPHEMERAL類型節(jié)點(diǎn)有一個很重要的特性,就是客戶端和服務(wù)器端連接斷掉或者session過期就會使節(jié)點(diǎn)消失,那么在某一個機(jī)器掛掉或者斷鏈的時候,其對應(yīng)的節(jié)點(diǎn)就會消失,然后集群中所有對/APP1SERVERS進(jìn)行watch的客戶端都會收到通知,然后取得最新列表即可。

    另外有一個應(yīng)用場景就是集群選
    master,一旦master掛掉能夠馬上能從slave中選出一個master,實(shí)現(xiàn)步驟和前者一樣,只是機(jī)器在啟動的時候在APP1SERVERS創(chuàng)建的節(jié)點(diǎn)類型變?yōu)?/span>EPHEMERAL_SEQUENTIAL類型,這樣每個節(jié)點(diǎn)會自動被編號,例如          
    zk.create("/testRootPath/testChildPath1","1".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
            
    zk.create(
    "/testRootPath/testChildPath2","2".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
            
    zk.create(
    "/testRootPath/testChildPath3","3".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
            
    // 創(chuàng)建一個子目錄節(jié)點(diǎn)
    zk.create("/testRootPath/testChildPath4","4".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);

    System.out.println(zk.getChildren(
    "/testRootPath"false));
     打印結(jié)果:[testChildPath10000000000, testChildPath20000000001, testChildPath40000000003, testChildPath30000000002]

    zk.create("/testRootPath""testRootData".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

    // 創(chuàng)建一個子目錄節(jié)點(diǎn)
    zk.create("/testRootPath/testChildPath1","1".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
            
    zk.create(
    "/testRootPath/testChildPath2","2".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
            
    zk.create(
    "/testRootPath/testChildPath3","3".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);
            
    // 創(chuàng)建一個子目錄節(jié)點(diǎn)
    zk.create("/testRootPath/testChildPath4","4".getBytes(), Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL);

    System.out.println(zk.getChildren(
    "/testRootPath"false));
    打印結(jié)果:[testChildPath2, testChildPath1, testChildPath4, testChildPath3]

    我們默認(rèn)規(guī)定編號最小的為
    master,所以當(dāng)我們對/APP1SERVERS節(jié)點(diǎn)做監(jiān)控的時候,得到服務(wù)器列表,只要所有集群機(jī)器邏輯認(rèn)為最小編號節(jié)點(diǎn)為master,那么master就被選出,而這個master宕機(jī)的時候,相應(yīng)的znode會消失,然后新的服務(wù)器列表就被推送到客戶端,然后每個節(jié)點(diǎn)邏輯認(rèn)為最小編號節(jié)點(diǎn)為master,這樣就做到動態(tài)master選舉。


    總結(jié) 

    我們初步使用了一下zookeeper并且嘗試著描述了幾種應(yīng)用場景的具體實(shí)現(xiàn)思路,接下來的文章,我們會嘗試著去探究一下zookeeper的高可用性與leaderElection算法。

    參考http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/

          http://hadoop.apache.org/zookeeper/docs/current/

          http://rdc.taobao.com/team/jm/archives/448

    posted on 2010-12-21 18:58 BucketLI 閱讀(118568) 評論(15)  編輯  收藏

    評論:
    # re: zookeeper使用和原理探究(一) 2012-04-27 16:56 | asialee
    寫的很好  回復(fù)  更多評論
      
    # re: zookeeper使用和原理探究(一) 2013-01-17 14:35 | Pete
    不錯,希望能繼續(xù)下去。  回復(fù)  更多評論
      
    # re: zookeeper使用和原理探究(一)[未登錄] 2013-04-02 15:10 | 民工
    3臺集群=1臺,隨便關(guān)閉那一個都無法正常運(yùn)行。。。  回復(fù)  更多評論
      
    # re: zookeeper使用和原理探究(一) 2013-10-18 15:48 | bingjie1217
    @民工
    啟動兩臺或關(guān)閉一臺都可以運(yùn)行  回復(fù)  更多評論
      
    # re: zookeeper使用和原理探究(一) 2013-12-11 11:41 | mingye
    寫的不錯,通俗易懂  回復(fù)  更多評論
      
    # re: zookeeper使用和原理探究(一) 2014-03-25 16:32 | Coolspan
    通俗易懂,我喜歡,呵呵  回復(fù)  更多評論
      
    # re: zookeeper使用和原理探究(一) 2014-05-12 10:53 | ljcn
    學(xué)習(xí)了,多謝!  回復(fù)  更多評論
      
    # re: zookeeper使用和原理探究(一)[未登錄] 2014-08-06 15:28 | evan
    寫的好  回復(fù)  更多評論
      
    # re: zookeeper使用和原理探究(一) 2014-08-14 15:17 | tie
    有個問題:

    應(yīng)用場景 集群管理中,server1,server2監(jiān)聽他們自己創(chuàng)建的znode有什么意義呢,應(yīng)該是這個服務(wù)集群的client來進(jìn)行watch吧,我不理解這點(diǎn)。  回復(fù)  更多評論
      
    # re: zookeeper使用和原理探究(一) 2014-09-24 14:09 | json
    比如server1創(chuàng)建/APP1SERVERS/SERVER1(可以使用ip,保證不重復(fù)),server2創(chuàng)建/APP1SERVERS/SERVER2,然后SERVER1和SERVER2都watch /APP1SERVERS這個父節(jié)點(diǎn),那么也就是這個父節(jié)點(diǎn)下數(shù)據(jù)或者子節(jié)點(diǎn)變化都會通知對該節(jié)點(diǎn)進(jìn)行watch的客戶端  回復(fù)  更多評論
      
    # re: zookeeper使用和原理探究(一) 2014-10-30 15:38 | Relieved
    贊一個  回復(fù)  更多評論
      
    # re: zookeeper使用和原理探究(一) 2014-12-30 12:18 | qingqing
    @tie
    其實(shí)zk的監(jiān)聽機(jī)制是這樣的:由zk服務(wù)端監(jiān)聽znode,監(jiān)聽到事件后,會把該事件通知給zk客戶端,客戶端再調(diào)用watch執(zhí)行業(yè)務(wù)邏輯,所以server1,server2需要監(jiān)聽他們自己創(chuàng)建的znode  回復(fù)  更多評論
      
    # re: zookeeper使用和原理探究(一) 2015-09-24 09:51 | zookeeper
    # re: zookeeper使用和原理探究(一) 2015-09-24 09:52 | zookeeper
    zoo@asialee
    zookeeper 最新版的視頻地址
    http://www.xuetuwuyou.com/course/20  回復(fù)  更多評論
      
    # re: zookeeper使用和原理探究(一) 2016-03-31 18:21 | shao_win
    寫得很好,希望繼續(xù)寫下去,學(xué)習(xí)了  回復(fù)  更多評論
      

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲日韩人妻第一页| 永久在线观看www免费视频| 亚洲第一精品电影网| 亚洲中久无码不卡永久在线观看| 猫咪社区免费资源在线观看| a级毛片免费高清毛片视频| 国产精品亚洲专区一区| 亚洲一区二区三区无码国产| 亚洲精品~无码抽插| 亚洲一区无码精品色| 尤物永久免费AV无码网站| av免费不卡国产观看| 99re免费在线视频| a毛片全部免费播放| 日韩在线视频免费| 黄色免费网址在线观看| 亚洲精华国产精华精华液| 亚洲国产系列一区二区三区| 亚洲国产超清无码专区| 亚洲男女一区二区三区| 久久亚洲中文字幕精品有坂深雪 | 国产亚洲色视频在线| 成人伊人亚洲人综合网站222| 天天摸天天操免费播放小视频| 美女视频黄的全免费视频网站| 中文字幕无码亚洲欧洲日韩| 亚洲综合激情六月婷婷在线观看| 久久精品国产亚洲av四虎| 久久精品国产亚洲网站| 亚洲色精品88色婷婷七月丁香| 中国在线观看免费高清完整版| 18女人毛片水真多免费| 1000部夫妻午夜免费| 国产h肉在线视频免费观看| 日本黄网站动漫视频免费| 国产精品入口麻豆免费观看| 99精品视频在线观看免费专区| 99久久综合精品免费| 久草免费在线观看视频| 免费观看的毛片大全 | 亚洲经典千人经典日产|