文章出處

一些概念

ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase和Kafka重要組件。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。
ZooKeeper的目標就是封裝好復雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
ZooKeeper代碼版本中,提供了分布式獨享鎖、選舉、隊列的接口,其中分布鎖和隊列有Java和C兩個版本,選舉只有Java版本。

原理

ZooKeeper是以Fast Paxos算法為基礎的,Paxos 算法存在活鎖的 問題,即當有多個proposer交錯提交時,有可能互相排斥導致沒有一個proposer能提交成功,而Fast Paxos作了一些優化,通過選舉產生一個leader (領導者),只有leader才能提交proposer,具體算法可見Fast Paxos。因此,要想弄懂ZooKeeper首先得對Fast Paxos有所了解。
ZooKeeper的基本運轉流程:
1、選舉Leader。
2、同步數據。
3、選舉Leader過程中算法有很多,但要達到的選舉標準是一致的。
4、Leader要具有最高的執行ID,類似root權限。
5、集群中大多數的機器得到響應并follow選出的Leader。

特點

在Zookeeper中,znode是一個跟Unix文件系統路徑相似的 節點,可以往這個節點存儲或獲取數據。如果在創建znode時Flag設置為EPHEMERAL,那么當創建這個znode的節點和Zookeeper失 去連接后,這個znode將不再存在在Zookeeper里,Zookeeper使用Watcher察覺事件信息。當客戶端接收到事件信息,比如連接超 時、節點數據改變、子節點改變,可以調用相應的行為來處理數據。Zookeeper的Wiki頁面展示了如何使用Zookeeper來處理事件通知,隊 列,優先隊列,鎖,共享鎖,可撤銷的共享鎖,兩階段提交。
那么Zookeeper能做什么事情呢,簡單的例子:假設我們有20個搜索引擎的服務器(每 個負責總索引中的一部分的搜索任務)和一個總服務器(負責向這20個搜索引擎的服務器發出搜索請求并合并結果集),一個備用的總服務器(負責當總服務器宕 機時替換總服務器),一個web的cgi(向總服務器發出搜索請求)。搜索引擎的服務器中的15個服務器提供搜索服務,5個服務器正在生成索引。這20個 搜索引擎的服務器經常要讓正在提供搜索服務的服務器停止提供服務開始生成索引,或生成索引的服務器已經把索引生成完成可以提供搜索服務了。使用 Zookeeper可以保證總服務器自動感知有多少提供搜索引擎的服務器并向這些服務器發出搜索請求,當總服務器宕機時自動啟用備用的總服務器。

環境部署

zookeeper集群的安裝,準備三臺服務器server1:127.0.0.1,server2:192.168.1.2,  server3:192.168.1.3
    1)下載zookeeper
    到http://zookeeper.apache.org/releases.html去下載最新版本Zookeeper-3.4.5的安裝包zookeeper-3.4.5.tar.gz.將文件保存server1的~目錄下
    2)安裝zookeeper
    先在服務器server分別執行a-c步驟
    a)解壓  
    tar -zxvf zookeeper-3.4.5.tar.gz
    解壓完成后在目錄~下會發現多出一個目錄zookeeper-3.4.5,重新命令為zookeeper
    b)配置
    將conf/zoo_sample.cfg拷貝一份命名為zoo.cfg,也放在conf目錄下。然后按照如下值修改其中的配置:
   
    # The number of milliseconds of each tick
    tickTime=2000
    # The number of ticks that the initial
    # synchronization phase can take
    initLimit=10
    # The number of ticks that can pass between
    # sending a request and getting an acknowledgement
    syncLimit=5
    # the directory where the snapshot is stored.
    # do not use /tmp for storage, /tmp here is just
    # example sakes.
    dataDir=/home/wwb/zookeeper /data
    dataLogDir=/home/wwb/zookeeper/logs
    # the port at which the clients will connect
    clientPort=2181
    #
    # Be sure to read the maintenance section of the
    # administrator guide before turning on autopurge.
    #http://zookeeper.apache.org/doc/ ... html#sc_maintenance
    #
    # The number of snapshots to retain in dataDir
    #autopurge.snapRetainCount=3
    # Purge task interval in hours
    # Set to "0" to disable auto purge feature
    #autopurge.purgeInterval=1
    server.1=192.168.0.1:3888:4888
    server.2=192.168.0.2:3888:4888
    server.3=192.168.0.3:3888:4888
    tickTime:這個時間是作為 Zookeeper 服務器之間或客戶端與服務器之間維持心跳的時間間隔,也就是每個 tickTime 時間就會發送一個心跳。
    dataDir:顧名思義就是 Zookeeper 保存數據的目錄,默認情況下,Zookeeper 將寫數據的日志文件也保存在這個目錄里。
    clientPort:這個端口就是客戶端連接 Zookeeper 服務器的端口,Zookeeper 會監聽這個端口,接受客戶端的訪問請求。
    initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這 里所說的客戶端不是用戶連接 Zookeeper 服務器的客戶端,而是 Zookeeper 服務器集群中連接到 Leader 的 Follower 服務器)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 5個心跳的時間(也就是 tickTime)長度后 Zookeeper 服務器還沒有收到客戶端的返回信息,那么表明這個客戶端連接失敗。總的時間長度就是 5*2000=10 秒
    syncLimit:這個配置項標識 Leader 與Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是2*2000=4 秒
    server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號服務器;B 是這個服務器的 ip 地址;C 表示的是這個服務器與集群中的 Leader 服務器交換信息的端口;D 表示的是萬一集群中的 Leader 服務器掛了,需要一個端口來重新進行選舉,選出一個新的 Leader,而這個端口就是用來執行選舉時服務器相互通信的端口。如果是偽集群的配置方式,由于 B 都是一樣,所以不同的 Zookeeper 實例通信端口號不能一樣,所以要給它們分配不同的端口號
注意:dataDir,dataLogDir中的wwb是當前登錄用戶名,data,logs目錄開始是不存在,需要使用mkdir命令創建相應的目錄。并且在該目錄下創建文件myid,serve1,server2,server3該文件內容分別為1,2,3。
針對服務器server2,server3可以將server1復制到相應的目錄,不過需要注意dataDir,dataLogDir目錄,并且文件myid內容分別為2,3
    3)依次啟動server1,server2,server3的zookeeper.
    /home/wwb/zookeeper/bin/zkServer.sh start,出現類似以下內容
    JMX enabled by default
    Using config: /home/wwb/zookeeper/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
   4) 測試zookeeper是否正常工作,在server1上執行以下命令
    /home/wwb/zookeeper/bin/zkCli.sh -server192.168.0.2:2181,出現類似以下內容
    JLine support is enabled
    2013-11-27 19:59:40,560 - INFO      [main-SendThread(localhost.localdomain:2181):ClientCnxn$SendThread@736]- Session   establishmentcomplete on server localhost.localdomain/127.0.0.1:2181, sessionid =    0x1429cdb49220000, negotiatedtimeout = 30000
     WATCHER::
     WatchedEvent state:SyncConnected type:None path:null
    [zk: 127.0.0.1:2181(CONNECTED) 0] [root@localhostzookeeper2]#  
    即代表集群構建成功了,如果出現錯誤那應該是第三部時沒有啟動好集群,
運行,先利用
    ps aux | grep zookeeper查看是否有相應的進程的,沒有話,說明集群啟動出現問題,可以在每個服務器上使用
    ./home/wwb/zookeeper/bin/zkServer.sh stop。再依次使用./home/wwb/zookeeper/binzkServer.sh start,這時在執行4一般是沒有問題,如果還是有問題,那么先stop再到bin的上級目錄執行./bin/zkServer.shstart試試。
 注意:zookeeper集群時,zookeeper要求半數以上的機器可用,zookeeper才能提供服務。
文章選自:
http://baike.baidu.com/link?url=3sD-XmRT2i5iM0KTNkooe3BMot9FtBflNPkdhfadxR3N5ubGiyKSDsHbgKt4Ne8FAXhlHE4U2K9TVBuNPxQpNlvXIItbytAFFss2k46NvEq
http://www.cnblogs.com/likehua/p/3999538.html
大家也可以去閱讀原文,大叔自對自己做總結.
 

文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()