安裝配置ZooKeeper及基本用法

要想學習分佈式應用,ZooKeeper是一個繞不過去的基礎系統。它爲大型分佈式計算提供開源的分佈式配置服務、同步服務和命名註冊。java

今天先介紹系統的安裝和基本使用,後續會推一些基本的Java使用代碼。node

1 安裝配置ZooKeeper

https://www.apache.org/dyn/closer.cgi/zookeeper/,下載最新的ZooKeeper程序,當前最新版本是3.5.5,要求JDK在1.8以上。git

1.1      基本安裝

將下載的apache-zookeeper-3.5.5-bin.tar.gz文件使用命令tar -xzvf 解壓到 /usr/java 目錄,並將原目錄名修改成zookeeper-3.5.5。github

進入zookeeper-3.5.5目錄並建立兩個子目錄 data 和logs。數據庫

# mkdir data logsapache

# echo 建立一個惟一的zookeeper實例號,我是用IP最後一個字節編程

# cd datavim

# vim myid  // 輸入 128 後保存退出bash

  128服務器

# echo 複製 zoo_sample.cfg 爲 zoo.cfg

# cp zoo_sample.cfg zoo.cfg

# 修改參數 dataDir

# vim zoo.cfg

dataDir=/var/lib/zookeeper

 

而後修改 /etc/profile,增長修改相應的環境變量

# vim /etc/profile

export PGDATA=/usr/java/postgres/data

ZOOKEEPER_HOME=/usr/java/zookeeper-3.5.5

PATH=$ZOOKEEPER_HOME/bin:$PATH

export ZOOKEEPER_HOME PATH

# zkServer.sh start  //啓動服務

# zkServer.sh status //查看服務狀態

# zkServer.sh stop  //中止服務

Zookeeper使用的默認端口是2181,能夠在conf/zoo.cfg中修改這個端口號。安裝完成後,須要在防火牆開啓端口

# firewall-cmd --zone=public --add-port=2181/tcp –permanent

# firewall-cmd –reload

1.2      ZooKeeper安裝爲服務

建立自動啓動的腳本

# cd /etc/rc.d/init.d

# touch zookeeper

# chmod +x zookeeper

# vim zookeeper

#!/bin/bash

#chkconfig:2345 10 90

#description:service zookeeper

 

#set java environment

JAVA_HOME=/usr/java/jdk8u222-b10

JRE_HOME=/usr/java/jdk8u222-b10/jre

CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

export JAVA_HOME JRE_HOME CLASS_PATH PATH

 

export PGDATA=/usr/java/postgres/data

ZOOKEEPER_HOME=/usr/java/zookeeper-3.5.5

PATH=$ZOOKEEPER_HOME/bin:$PATH

 

export PATH ZOOKEEPER_HOME

 

su root ${ZOOKEEPER_HOME}/bin/zkServer.sh "$1"

 

// 添加到啓動腳本

# chkconfig --add zookeeper

 

// 手工啓動

# service start zookeeper

 

1.3      控制檯使用zookeeper

命令行鏈接到zookeeper

# zhCli.sh -server 127.0.0.1:2181

 

嘗試輸入help查看可用的命令,列出了命令,發現其實沒有help命令。

 

輸入ls,查看根目錄下有哪些節點

 

嘗試建立一個新的節點,並設置一個字符串,而後使用命令get查看已經建立的節點。

 

嘗試爲/hello從新賦值

 

賦值命令執行後,控制檯收到了一條通知事件:/hello值已經被修改。從新查看這個值,發現它的版本(dataVersion)已經從0變爲1。

再執行刪除命令,刪掉這個節點

 

1.4      Windows客戶端程序

在Windows上,能夠安裝zkui這個ZooKeeper的客戶端,下載網址:https://github.com/echoma/zkui/wiki/Download

下載解壓後,直接運行 zkui.exe,彈出來鏈接頁面。

 

在Host部分輸入ZooKeeper的地址和端口,點擊Login按鈕後,左邊窗口列出Root下的全部zNode。使用比較簡單,本身摸索幾分鐘就都會了。

 

1.5      ZooKeeper複製模式

在評估、開發、測試環境,使用一臺ZooKeeper就能夠了,但在生產環境應該配置爲多點複製模式。同一個應用多臺服務器複製部署的狀況,術語叫 quorum,全部的服務器使用相同的配置文件。

複製模式部署,最少須要三臺服務器,而且服務器的總數最好是奇數。複製模式部署,配置文件 conf/zoo.cfg同單點模式差很少,有一些不一樣,如:

dataDir=/var/lib/zookeeper

clientPort=2181

tickTime=2000

initLimit=5

syncLimit=2

server.128=zoo1:2888:3888

server.129=zoo2:2888:3888

server.130=zoo3:2888:3888

在配置文件中,initLimit是集羣中ZooKeeper Server鏈接到leader的超時時間;syncLimit是服務器的超時時間。這兩個參數,使用的時間單位都是tickTime,initLimit值爲5,最終表明的是10秒;syncLimit值爲2,最終表明的是4秒。

列表server.X構成了整個ZooKeeper服務,當服務啓動的時候,會讀取data/myid文件,獲取本身的編號。

在server後面有兩個端口號:"2888"和"3888"。ZooKeeper服務器之間使用這兩個端口進行通訊。若是使用同一臺機器安裝多個ZooKeeper實例搭建集羣,每一個實例應該使用不一樣的端口,如:2888:3888/2889:3889/2890:3890;另外,每一個實例的dataDir和clientPort也應該不一樣。

2 編程使用ZooKeeper

2.1      數據模型

ZooKeeper使用層級命名空間,相似一個分佈式文件系統。區別在於目錄節點也能夠綁定數據,相似於一個文件系統,一個文件同時也是一個目錄。ZooKeeper不支持相對路徑。Unicode字符均可以出如今名稱中,除了下面的一些特例:

  • 不能使用null字符(\u0000)
  • 下面的字符不能正常顯示,也不能使用:\u0001-\u001F和\u007F和\u009F
  • 下面的字符不容許:\ud800 - uF8FF, \uFFF0 – uFFFF
  • .能夠是名稱的一部分,但不能獨立使用 . 和 ..,下面的名稱不合法:"/a/b/./c"或"/a/b/../c"
  • "zookeeper" 是保留字

2.2      ZNodes

在ZooKeeper樹中,每個節點就是一個znode。Znode包括一個stat結構,含數據修改的版本號,以及acl版本號,時間戳。每次一個znode節點的數據發生變化,版本號都會增長。當客戶端讀取數據時,也會把數據的版本號一併取回去。當客戶端嘗試修改或刪除一個znode時,須要提供嘗試修改節點的版本號。若是提供的版本號同系統中當前的版本號不一致,更新失敗。(相似於數據庫的樂觀鎖實現)

ZNodes是程序訪問的實體,有幾個須要瞭解的特性:

  • Watches:客戶端能夠在znode上設置監聽。znode數據發生變化時會觸發watch,而後清除watch。當watch觸發時,ZooKeeper會向客戶端發送一個通知。
  • 數據訪問:znode上的數據,讀寫都是原子性的。讀,是將整個znode的全部數據都讀出來;寫,會替換znode的全部數據。每一個znode有訪問控制列表(Access Control List-ACL),用於限制誰能夠訪問。ZooKeeper不是設計用於保存普通數據或大數據存儲,通常用於保存配置文件、狀態信息等。數據一般比較小,通常以KB爲單位。ZooKeeper的客戶端也限制數據不能超過1M。若是業務須要保存打數據,能夠將數據保存到大的存儲系統如NFS/HDFS等,並將其指針保存到ZooKeeper中。
  • 臨時節點:ZooKeeper能夠保存一些短生命週期的節點,好比會話信息,當會話失效時這些節點會被刪除。由於這個特性,臨時節點不容許有子節點。
  • 順序節點(惟一命名):建立一個節點時,能夠要求ZooKeeper在路徑後面添加自增的數字。格式爲%010d,是10個數字,如0000000001。最大數值是2147483647,超事後會溢出,變成-2147483648。
  • 容器節點(3.5.3增長):用於一些特定的場景如leader、lock。當容器中的最後一個節點被刪除後,容器變成候補(candidate)狀態,服務器會擇機自行刪除。當你在容器節點中建立子節點時,可能會獲得KeeperException.NoNodeException;所以建立子節點時應該catch這個異常,若是發生了則從新建立容器節點。
  • TTL節點(3.5.3增長):建立PERSISTENT或PERSISTENT_SEQUENTIAL節點時,能夠以毫秒爲單位設置TTL時間,若是在TTL時間以內沒有修改數據,也沒有建立子節點,服務器會在超時後擇機刪除這個節點。注意:這個參數缺省是關閉的,須要在系統參數中啓用。

2.3      ZooKeeper中的時間

經過多種方式跟蹤時間

  • Zxid:ZooKeeper的每次修改,都會收到zxid格式的時間戳。這表示在ZooKeeper上修改的順序。若是zxid1<zxid2,說明zxid2後發生。
  • 版本號(Version numbers):一個節點的每次修改,該節點的版本號都會增長。有三個版本號:version (節點數據的修改次數), cversion (子節點數據的修改次數), aversion (節點ACL修改的次數).
  • Ticks:使用ZooKeeper複製模式時,服務器使用ticks來定義事件的時間如:上載狀態、會話超時時間、服務器之間的鏈接超時時間等。
  • Real time:ZooKeeper不使用真實時間。

2.4      ZooKeeper Stat結構

節點的Stat結構有以下屬性

  • czxid:節點建立時的zxid
  • mzxid:節點最後一次修改時的zxid
  • pzxid:子節點最後一次修改時的zxid
  • ctime:節點建立時的時間戳,毫秒
  • mtime:節點最後一次修改時的時間戳,毫秒
  • version:節點數據的修改次數
  • cversion:子節點數據的修改次數
  • aversion:節點ACL的修改次數
  • ephemeralOwner:若是這是臨時節點,保存節點擁有者的session id;不然爲0
  • dataLength:節點數據長度
  • numChildren:子節點個數

2.5      ZooKeeper Watches

ZooKeeper的全部讀操做getData()、getChildren()和exists()都有一個備選參數:設置watch。ZooKeeper Watch的定義:是一次性的觸發器,當數據發生變化時,向設置了watch的客戶端發送消息。有三個關鍵點:

  • 一次性觸發器:當數據變化時,向客戶端發送watch事件。例如:使用命令 getData(「/hello」, true)讀取數據,當/hello被修改或刪除時,客戶端都會收到事件。當數據再次發生變化時,客戶端就不會收到事件了。
  • 推送到客戶端:ZooKeeper設計用於保證客戶端可以按照特定的順序收到推送事件。
  • Watch的數據對象:有兩種類型的watch,數據watch和子節點watch。getData()和exists()設置數據warch;getChildren()設置子節點watch。

2.6      ZooKeeper訪問控制

ZooKeeper使用ACL控制節點的讀寫權限。父子節點的讀寫權限是獨立的,不遞歸。

ZooKeeper支持的幾種權限:

  • CREATE: 能夠建立子節點
  • READ: 能夠讀取節點數據並列出子節點
  • WRITE: 能夠修改節點數據
  • DELETE: 能夠刪除子節點
  • ADMIN: 能夠設置權限

ZooKeeper內置的受權對象

  • world:全部用戶
  • auth:當前用戶
  • digest:使用 username:password指定的用戶,密碼會作MD5摘要
  • ip:使用客戶端IP地址,格式是 addr/bits
  • x509:使用X500認證信息,用戶名
相關文章
相關標籤/搜索