集羣設置

系統需求

  • 客戶端:Java客戶端庫,用戶鏈接ZooKeeper應用程序使用。
  • 服務器端:運行在ZooKeeper節點上的Java服務端。
  • 本地客戶端:C客戶端接口,和Java客戶端相似,用於鏈接ZooKeeper的應用程序使用。
  • 普通發佈版:多個可選的附加組件。

系統支持度:java

多服務器集羣設置

一、安裝JDKnode

    查看 >>apache

二、設置JAVA堆內存大小。避免使用交換空間(swap),會極大拉低ZooKeeper的性能。經過壓測,肯定設定內存大小,建議最大4G。api

三、下載安裝ZooKeeper。bash

    下載地址:http://mirror.bit.edu.cn/apache/zookeeper/ 這裏選擇下載3.4.10版本。http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz服務器

四、建立配置文件。數據結構

tickTime=2000
dataDir=/var/lib/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888

每臺機器都是機器的一部分,每臺機器配置一行。app

server.id=host:port:port異步

五、建立機器ID文件ide

每臺機器都對應一個myid文件,文件內容爲相應的數字ID。存放在對應dataDir目錄下。

$ echo "1" > /tmp/data/myid    #對應的dataDir位置

六、啓動ZooKeeper

$ java -cp zookeeper.jar:lib/slf4j-api-1.6.1.jar:lib/slf4j-log4j12-1.6.1.jar:lib/log4j-1.2.15.jar:conf \ org.apache.zookeeper.server.quorum.QuorumPeerMain zoo.cfg

(java -cp等同於:classpath)

使用 bin/zkServer.sh啓動實例

bin/zkServer.sh start

七、測試部署

$ bin/zkCli.sh -server 127.0.0.1:2181

 

數據模型

Znode,節點。絕對的,/zookeeper用於保存管理信息,好比關鍵配額信息。

艱鉅文件和目錄兩種特色。既像文件同樣維護着數據,原信息、ACL、時間戳等數據結構,又像目錄同樣能夠做爲路徑標識的一部分。

Znode由3部分組成:

  1. stat:狀態信息,描述該Znode的版本,權限等信息
  2. data:與該Znode關聯的數據
  3. children:該Znode下的子節點

管理調度數據。每一個Znode數據至多1M。

每個節點都擁有本身的ACL。

節點類型:

  1. 臨時節點
    1. 生命週期依賴於建立時的會話。Session結束,自動刪除。
    2. 對全部的客戶端課件
    3. 不容許擁有子節點
  2. 永久節點
    1. 不依賴於會話,顯示地執行刪除操做

順序節點

路徑結尾添加一個遞增的計數。對於此節點的父節點惟一。格式爲「%10d」(10位數字,沒有數值的位數用0補充)。當值大於2^32-1時,計數器溢出。

觀察

客戶端可在節點上設置watch,稱爲監視器。當節點發生改變時(Znode的增、刪、改)將會觸發對應的操做。當watch被觸發時,ZooKeeper將會向客戶端發送且僅發送一條通知。

ZooKeeper中的時間

有多種記錄時間的形式

一、Zxid

導致節點狀態改變的每個操做都將使節點接收到一個Zxid格式的時間戳。而且該時間戳全局有序。

節點改變,產生惟一Zxid。每一個節點維護着3個Zxid值。

  1. cZxid:建立時間
  2. mZxid:修改時間
  3. pZxid:

實現中Zxid是一個64位的數字。高32位epoch用來標識leader關係是否改變,每次一個leader被選出,都會有一個新的epoch。低32位遞增計數

二、版本號

對節點的每個操做,都將導致這個節點的版本號增長。

  1. version:節點數據版本號
  2. cversion:子節點版本號
  3. aversion:節點所擁有的ACL版本號

三、節點屬性

  • czxid
  • mzxid
  • ctime
  • mtime
  • version
  • cversion
  • aversion
  • ephemeralOwner(臨時節點,值爲節點擁有者的SessionID;不然爲0)
  • dataLength
  • numChildren
  • pzxid(最新修改的zxid)

操做

9個基本操做

create:建立Znode(父Znode必須存在)

delete:刪除Znode(Znode沒有子節點)

exists:是否存在,並獲取他的元數據

getACL/setACL:

getChildren:獲取全部子節點列表

getData/setData:

sync:使客戶端的Znode視圖與ZooKeeper同步

更新操做是有限制的。delete或setData必須明確要更新的Znode的版本號,能夠調用exists找到。

更新是非阻塞式的。

Watch觸發器

能夠爲全部的讀操做設置watch,(exists、getChildren、getData)。一次性的觸發器,異步發送,一致性保證。

watch類型:

  1. 數據watch:getData和exists負責設置數據watch
  2. 孩子watch:getChildren負責

經過返回的數據來設置不一樣的watch:

  1. getData和exists:返回關於節點的數據信息
  2. getChildren:返回子節點列表

所以:

  1. setData觸發數據watch
  2. create觸發數據watch和子節點watch
  3. delete觸發數據watch和子節點watch

注意

watch實際上要處理兩類事件:

  1. 鏈接狀態事件(type=None, path=null)
    1. 不須要註冊,也不須要連續觸發
  2. 節點事件
    1. one time trigger

上面2類事件都在Watch中處理,即重載process(Event event)

節點事件的觸發,經過exists,getData或getChildren來處理這類函數,有雙重做用:

  1. 註冊觸發事件
  2. 函數自己的功能

函數自己的功能又能夠異步的回調函數來實現,重載processResult()過程當中處理函數自己的功能。

ACL Permissions

  • CREATE
  • READ
  • WRITE
  • DELETE
  • ADMIN

Builtin ACL Schemes

  • world
  • auth
  • digest
  • ip

ZooKeeper C client API

  • const int ZOO_PERM_READ; //can read node’s value and list its children
  • const int ZOO_PERM_WRITE;// can set the node’s value
  • const int ZOO_PERM_CREATE; //can create children
  • const int ZOO_PERM_DELETE;// can delete children
  • const int ZOO_PERM_ADMIN; //can execute set_acl()
  • const int ZOO_PERM_ALL;// all of the above flags OR’d together

標準ACL IDs: 

  • struct Id ZOO_ANYONE_ID_UNSAFE; //(‘world’,’anyone’)
  • struct Id ZOO_AUTH_IDS;// (‘auth’,’’)

3個標準ACL:

  • struct ACL_vector ZOO_OPEN_ACL_UNSAFE; //(ZOO_PERM_ALL,ZOO_ANYONE_ID_UNSAFE)
  • struct ACL_vector ZOO_READ_ACL_UNSAFE;// (ZOO_PERM_READ, ZOO_ANYONE_ID_UNSAFE)
  • struct ACL_vector ZOO_CREATOR_ALL_ACL; //(ZOO_PERM_ALL,ZOO_AUTH_IDS)

The following ZooKeeper operations deal with ACLs:

  • int zoo_add_auth (zhandle_t *zh,const char* scheme,const char* cert, int certLen, void_completion_t completion, const void *data);

The application uses the zoo_add_auth function to authenticate itself to the server. The function can be called multiple times if the application wants to authenticate using different schemes and/or identities.

  • int zoo_create (zhandle_t *zh, const char *path, const char *value,int valuelen, const struct ACL_vector *acl, int flags,char *realpath, int max_realpath_len);

zoo_create(...) operation creates a new node. The acl parameter is a list of ACLs associated with the node. The parent node must have the CREATE permission bit set.

  • int zoo_get_acl (zhandle_t *zh, const char *path,struct ACL_vector *acl, struct Stat *stat);

This operation returns a node’s ACL info.

  • int zoo_set_acl (zhandle_t *zh, const char *path, int version,const struct ACL_vector *acl);

This function replaces node’s ACL list with a new one. The node must have the ADMIN permission set.

相關文章
相關標籤/搜索