Zookeeper學習基礎內容

[TOC]java

1、Zookeeper簡介

ZooKeeper致力於提供一個高性能、高可用,且具有嚴格的順序訪問控制能力的分佈式協調服務,是雅虎公司建立,是Google的Chubby一個開源的實現,也是Hadoop和Hbase的重要組件. node

Zookeeper

設計目標:算法

  • 簡單的數據結構:共享的樹形結構,相似文件系統,存儲於內存
  • 能夠構建集羣:避免單點故障,3-5臺機器就能夠組成集羣,超過半數正常工做就能對外提供服務;
  • 順序訪問:對於每一個讀請求,zk會分配一個全局惟一的遞增編號,利用這個特性能夠實現高級協調服務
  • 高性能:基於內存操做,服務於非事務請求,適用於讀操做爲主的業務場景。3臺zk集羣能達到13w QPS

2、分佈式系統協調「方法論」

1.CAP理論

  • C 一致性:數據在分佈式環境下的多個副本之間可否保持一致性,這裏的一致性更可能是指強一致性;
  • A 可用性:分佈式系統一直處於可用狀態,對於請求老是能在有限的時間 內返回結果致性;
  • P 分區容錯性:除非整個網絡故障,分佈式系統在任何網絡或者單點故障時,仍能對外提供知足一致性和可用性的服務;

CAP理論:一個分佈式系統不可能同時知足一致性、可用性和分區容錯性這三個 基本需求,最多隻能同時知足其中的兩項; apache

CAP

TIPS:架構師的精力每每就花在怎麼樣根據業務場景在A和C直接尋求平衡;api

2.BASE理論

  • Basically Avaliable 基本可用:當分佈式系統出現不可預見的故障時,容許損失部分可用性,保障系統的「基本可用」;體如今「時間上的損失」和「功能上的損失」;e.g:部分用戶雙十一高峯期淘寶頁面卡頓或 降級處理;
  • Soft state 軟狀態:容許系統中的數據存在中間狀態,既系統的不一樣節點的數據副本之間的數據同步過程存在延時,並認爲這種延時不會影響系統可用性;e.g:12306網站賣火車票,請求會進入排隊隊列;
  • Eventually consistent 最終一致性:全部的數據在通過一段時間的數據同步後,最終可以達到一個一致的狀態;e.g:理財產品首頁充值總金額 短時不一致;

BASE理論:即便沒法作到強一致性,但分佈式系統能夠根據本身的業務特色,採 用適當的方式來使系統達到最終的一致性緩存

3、分佈式環境協調通訊應用場景

Zookeeper常應用如下場景:bash

  • 數據發佈訂閱
  • 負載均衡
  • 命名服務
  • Master選舉
  • 集羣管理
  • 配置管理
  • 分佈式隊列
  • 分佈式鎖

4、Zookeeper配置文件詳解

序號 參數名 說明
1 clientPort 客戶端鏈接server的端口,即對外服務端口,通常設置爲2181
2 dataDir 存儲快照文件snapshot的目錄。默認狀況下,事務日誌也會存儲在這裏。建議同時配置參數dataLogDir, 事務日誌的寫性能直接影響zk性能。
3 tickTime ZK中的一個時間單元。ZK中全部時間都是以這個時間單元爲基礎,進行整數倍配置的。例如,session的最小超時時間是2*tickTime
4 dataLogDir 事務日誌輸出目錄。儘可能給事務日誌的輸出配置單獨的磁盤或是掛載點,這將極大的提高ZK性能
5 globalOutstandingLimit 最大請求堆積數。默認是1000。ZK運行的時候, 儘管server已經 沒有空閒來處理更多的客戶端請求了,可是仍是容許客戶端將請求提交到服務器上來,以提升吞吐性能。固然,爲了防止Server內存 溢出,這個請求堆積數仍是須要限制下的。(Java system property: zookeeper.globalOutstandingLimit.)
6 preAllocSize 預先開闢磁盤空間,用於後續寫入事務日誌。默認是64M,每一個事務日誌大小就是64M。若是ZK的快照頻率較大的話,建議適當減少 這個參數。(Java system property: zookeeper.preAllocSize)
7 snapCount 每進行snapCount次事務日誌輸出後,觸發一次快照(snapshot),此時,ZK會生成一個snapshot.文件,同時建立一個新的事務日誌文件log.。 默認是100000.(真正的代碼實現中,會進行必定的隨機數處理,以避 免 所 有 服 務 器 在 同 一 時 間 進 行 快 照 而 影 響 性 能 )(Java system property: zookeeper.snapCount)
8 traceFile 用於記錄全部請求的log,通常調試過程當中可使用,可是生產環境不建 議使用,會嚴重影響性能。(Java system property:? requestTraceFile)
9 maxClientCnxns 單個客戶端與單臺服務器之間的鏈接數的限制,是ip級別的,默認是60若是設置爲0,那麼代表不做任何限制。請注意這個限制的使用範圍,僅僅是單臺客戶端機器與單臺ZK服務器之間的鏈接數限制,不是針對指定客戶端IP,也不是ZK集羣的鏈接數限制,也不是單臺ZK對全部客戶端的 鏈接數限制。
10 clientPortAddress 對於多網卡的機器,能夠爲每一個IP指定不一樣的監聽端口。默認狀況是所 有IP都監聽 clientPort指定的端口。 New in 3.3.0
11 minSessionTimeou tmaxSessionTimeout Session超時時間限制,若是客戶端設置的超時時間不在這個範圍,那麼會被強制設置爲最大或最小時間。默認的Session超時時間是在2* tickTime ~ 20 * tickTime 這 個 範 圍 New in 3.3.0
12 fsync.warningthresholdms 事務日誌輸出時,若是調用fsync方法超過指定的超時時間,那麼會在日誌中輸出警告信息,默認是1000ms
13 autopurge.purgeInterval 清理任務的時間間隔,單位爲hours
14 autopurge.snapRetainCount zkserver啓動時會開啓一個org.apache.zookeeper.server.DatadirCleanupManager的線程,用於清理"過時"的snapshot文件和其相應的txn log file,此參數用於設定須要被retain保留的文件個數(從QuorumPeerMain跟蹤代碼)
15 electionAlg 選舉算法,默認爲3,能夠選擇(0,1,2,3),    0表示使用原生的UDP(LeaderElection), 1表示使用費受權的UDP 2表示使用受權的UDP(AuthFastLeaderElection)  3基於TCP的快速選舉(FastLeaderElection)
16 initLimit Leader與learner創建鏈接中 socket通信read所阻塞的時間(initLimit * tickTime) 若是是Leaner數量較多或者leader的數量很大, 能夠增長此值
17 SyncLimit learner與leader創建鏈接中,socket通信read阻塞的時間.其中包括數據同步/數據提交等
18 peerType zkserver 類型 observer 觀察者, participant參與者 ,默認爲參與者
19 leaderServes 系統屬性 zookeeper.leaderServes leader是否接受client請求,默認爲yes即leader能夠接受client的鏈接,在zk cluster 環境中,當節點數爲>3時,建議關閉
20 cnxTimeout 系統屬性:zookeeper.cnxTimeout leader選舉時socket鏈接打開的時長,只有在electionAlg=3有效
21 skipACL 系統屬性:zookeeper.skipACL 默認爲no,是否跳過ACL檢查
22 forceSync 系統屬性:zookeeper.forceSync 默認yes 在update執行以前,是否強制對操做當即持久寫入txn log文件.關閉此選項,會形成服務器失效後,還沒有持久化的數據丟失
23 jute.maxbuffer 每一個節點最大數據量,是默認是1M。這個限制必須在server和client 端都進行設置纔會生效。

5、Zookeeper特性

1.會話(Session)

客戶端與服務端的一次會話鏈接,本質是TCP長鏈接,經過會話能夠進行心跳檢測和數據傳輸; 服務器

會話

2.數據節點(znode)

ZooKeeper的視圖結構和標準的Unix文件系統相似,其中每一個節點稱爲「數據節點」或ZNode,每一個znode能夠存儲數據,還能夠掛載子節點,所以能夠稱之爲「樹」網絡

特性:session

  • 在Zookeeper中,znode是一個跟Unix文件系統路徑類似的節點,能夠往這個節點存儲或獲取數據。
  • 經過客戶端可對znode進行增刪改 查的操做,還能夠註冊watcher監 控znode的變化。

Zookeeper節點類型

  • 持久節點(Persistent)
  • 持久順序節點(Persistent_Sequential)
  • 臨時節點(Ephemeral)
  • 臨時順序節點(Ephemeral_Sequential)

對於持久接地啊和臨時節點,同一個Znode下,節點的名稱是惟一的 -實現分佈式鎖的基礎

Znode

Zookeeper節點狀態屬性

Zookeeper節點屬性

3.版本

4.Watcher

事件監聽器,客戶端能夠在節點上註冊監聽器,當特定的事件發生後,zk會通知到感興趣的客戶 端;eventType: NodeCreated、NodeDeleted、NodeDataChanged、NodeChildrenChange

5.ACL

Zk採用ACL(access control lists)策略來控制權限,5種權限:create、read,write,delete,admin。

ACL機制,表示爲scheme:id:permissions,第一個字段表示採用哪種機制,第二個id表示用戶,permissions表示相關權限(如只讀,讀寫,管理等)。zookeeper提供了以下幾種機制( scheme):

  • world: 它下面只有一個id, 叫anyone, world:anyone表明任何人,zookeeper中對全部人有權限的結點就是屬於world:anyone的

  • auth: 它不須要id, 只要是經過authentication的user都有權限(zookeeper支持經過kerberos來進行authencation, 也支持username/password形式的authentication)

  • digest: 它對應的id爲username:BASE64(SHA1(password)),它須要先經過username:password形式的authentication

  • ip: 它對應的id爲客戶機的IP地址,設置的時候能夠設置一個ip段,好比ip:192.168.1. 0/16, 表示匹配前16個bit的IP段

  • super: 在這種scheme狀況下,對應的id擁有超級權限,能夠作任何事情(cdrwa)

6.集羣角色

6、經常使用客戶端命令

1.服務端經常使用命令

在準備好相應的配置以後能夠直接經過zkServer.sh 這個腳本進行服務的相關操做:

  • 啓動ZK服務: sh bin/zkServer.sh start
  • 查看ZK服務狀態: sh bin/zkServer.sh status
  • 中止Zk服務: sh bin/zkServer.sh stop
  • 重啓ZK服務: sh bin/zkServer.sh restart

2.客戶端經常使用命令

使用zkCli.sh -server 127.0.0.1:2181 鏈接到Zookeeper服務

  • 顯示根目錄下文件、文件
ls/
複製代碼
  • 顯示根目錄下、文件
ls2 /
複製代碼

查看當前節點數據並能看到更新次數等數據

  • 建立文件並設置初始內容
create /zk "test"
複製代碼

建立一個新的znode節點「zk" 以及與它關聯的字符串

  • 獲取文件
get /zk
複製代碼

確認znode是否包含建立的字符串

  • 修改文件內容
set /zk "zkbak"
複製代碼

對zk所關聯的字符串進行設置和修改

  • 刪除文件
delete /zk
複製代碼

將建立的znode節點進行刪除,若是存在子節點則刪除會失敗

  • 遞歸刪除
rmr /zk
複製代碼

將剛纔建立的znode刪除,同時刪除子節點

  • 退出客戶端
quit
複製代碼
  • 幫助命令
help
複製代碼

7、ACL 經常使用命令

1. getAcl

獲取指定節點的ACL信息

2.setACL

設置指定節點的ACL信息

3.addauth

註冊會話受權信息

8、Zookeeper經常使用命令

  • 查看哪一個節點被選擇做爲follower或者leader
echo stat|nc 127.0.0.1 2181 
複製代碼
  • 測試是否啓動了該Server,若回覆imok表示已經啓動
echo ruok|nc 127.0.0.1 2181
複製代碼
  • 列出未經處理的會話和臨時節點
echo kill | nc 127.0.0.1 2181 
複製代碼
  • 輸出相關服務配置的詳細信息
echo conf | nc 127.0.0.1 2181 
複製代碼
  • 列出全部鏈接到服務器的客戶端的徹底的鏈接 / 會話的詳細信息
echo cons | nc 127.0.0.1 2181
複製代碼
  • 輸出關於服務環境的詳細信息(區別於 conf 命令)
echo envi |nc 127.0.0.1 2181 
複製代碼
  • 列出未經處理的請求
echo reqs | nc 127.0.0.1 2181 
複製代碼
  • 列出服務器 watch 的詳細信息
echo wchs | nc 127.0.0.1 2181 
複製代碼
  • 經過 session 列出服務器 watch 的詳細信息,它的輸出是一個與 watch相關的會話的列表
echo wchc | nc 127.0.0.1 2181 
複製代碼
  • 經過路徑列出服務器 watch 的詳細信息。它輸出一個與 session 相關的路 徑
echo wchp | nc 127.0.0.1 2181 
複製代碼

9、Zookeeper 日誌可視化

  • 事務日誌可視化(LogFormatter)
java -cp ../../zookeeper-3.4.6.jar;../../lib/slf4j-api-1.6.1.jar  org.apache.zookeeper.server.LogFormatter log.xxxx

複製代碼
  • 數據快照可視化( SnapshotFormatter)
java -cp ../../zookeeper-3.4.6.jar;../../lib/slf4j-api-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter	snapshot.xxxx

複製代碼

10、Zookeeper客戶端簡介

1.Zookeeper 客戶端

zookeeper官方提供的java客戶端API;

核心API

  • 建立會話
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,  long sessionId, byte[] sessionPasswd, boolean canBeReadOnly)

複製代碼
  • 建立節點
public String void create(final String path, byte data[], List<ACL> acl,  CreateMode  createMode,	StringCallback cb, Object ctx)

複製代碼
  • 讀取數據
public List<String> void getChildren(final String path, Watcher watcher,  Stat stat, Children2Callback cb, Object ctx)

複製代碼
public List<String>  void getData(final String path, Watcher watcher,  Stat stat, DataCallback cb, Object ctx)

複製代碼
  • 更新數據
public Static void setData(final String path, byte data[], int version,  StatCallback cb, Object ctx)

複製代碼
  • 檢測節點是否存在
public Static void exists(final String path, Watcher watcher,  StatCallback cb, Object ctx)

複製代碼
  • 權限控制
public void addAuthInfo(String scheme, byte auth[])

複製代碼
  • Watch

org.apache.zookeeper.Watcher(KeeperState、EventType)

(1)沒有專門的API去註冊watcher,依附於增刪改查API;

(2)watch是一次性產品

(3)watch的process方法中,可對不一樣事件進行處理;

原生客戶端開發弊端

  • 會話的連接是異步的
  • 序列化支持不透明
  • Watch須要重複註冊
  • Session 重連機制
  • 開發複雜性較高

2.ZkClient

開源的zk客戶端,在原生API基礎上封裝,是一個更易於使用的zookeeper客戶端; 引入Maven依賴

<!-- zkclient依賴 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>

複製代碼

核心API

  • 建立會話(同步,重試)
public ZkClient(final String zkServers, final int sessionTimeout,final int connectionTimeout, final ZkSerializer zkSerializer,  final long operationRetryTimeout)

複製代碼
  • 建立節點(同步、遞歸建立)
String create(final String path, Object data, final CreateMode mode)
複製代碼
public void createPersistent(String path,boolean createParents,List<ACL> acl)  
複製代碼
public void createPersistent(String path, Object data, List<ACL> acl)

複製代碼
public String createPersistentSequential(String path,Object data,List<ACL> acl) 
複製代碼
public String createPersistentSequential(String path,Object data,List<ACL> acl  
複製代碼
public String createEphemeralSequential(String path,Object data,List<ACL> acl)

複製代碼
  • 刪除節點(同步,遞歸調用)
public boolean delete(String path,int version) 
複製代碼
public boolean deleteRecursive(String path)
複製代碼
  • 獲取節點(同步,避免不存在異常)
public List<String> getChildren(String path)

複製代碼
public <T> T readData(String path, boolean returnNullIfPathNotExists) 
複製代碼
public <T> T readData(String path, Stat stat)

複製代碼
  • 更新節點(同步、實現CAS、狀態返回)
public void writeData(String path, Object datat, int expectedVersion)

複製代碼
public Stat writeDataReturnStat(String path,Object datat,int expectedVersion)

複製代碼
  • 檢測節點存在(同步)
public boolean exists(String path)

複製代碼
  • 權限控制(同步)
public void addAuthInfo(String scheme, final byte[] auth);  
複製代碼
public void setAcl(final String path, final List<ACL> acl);
複製代碼
  • 監聽器
    監聽器

3.Cuator

開源的zk客戶端,在原生API基礎上封裝,apache頂級項目;

  • Curator採用Fluent風格API
<!-- curator依賴 -->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>4.0.0</version>
</dependency>

複製代碼

序列化支持很差

Curator 核心API

  • 建立會話(同步、重試)
CuratorFrameworkFactory.newClient(String connectString, int sessionTimeoutM int connectionTimeoutMs, RetryPolicy retryPolicy)

複製代碼
CuratorFrameworkFactory.builder().connectString("192.168.11.56:2180")
.sessionTimeoutMs(30000).connectionTimeoutMs(30000)
.canBeReadOnly(false)
.retryPolicy(new ExponentialBackoffRetry(1000, Integer.MAX_VALUE))
.build();

複製代碼
retryPolicy 鏈接策略:
RetryOneTime: 只重連一次.
RetryNTime: 指定重連的次數N.
RetryUtilElapsed: 指定最大重連超時時間和重連時間間隔,間歇性重連直到超時或者連接成功.
ExponentialBackoffRetry: 基於"backoff"方式重連,和RetryUtilElapsed的區別是重連的時間間隔是動態
BoundedExponentialBackoffRetry: 同ExponentialBackoffRetry,增長了最大重試次數的控制.
複製代碼
  • 建立節點
client.create().creatingParentIfNeeded()
.withMode(CreateMode.PERSISTENT)
.withACL(aclList)
.forPath(path, "hello, zk".getBytes());

複製代碼
  • 刪除節點
client.delete().guaranteed().deletingChildrenIfNeeded()
.withVersion(version).forPath(path)

複製代碼
  • 獲取節點
client.getData().storingStatIn(stat).forPath(path);
client.getChildren().forPath(path);

複製代碼
  • 更新節點
client.setData().withVersion(version).forPath(path, data)

複製代碼
  • 判斷節點是否存在
client.checkExists().forPath(path);

複製代碼
  • 設置權限
Build.authorization(String scheme, byte[] auth)

複製代碼
client.setACL().withVersion(version)
.withACL(ZooDefs.Ids.CREATOR_ALL_ACL)
.forPath(path);

複製代碼
  • 監聽器(避免重複監聽)
Cache是curator中對事件監聽的包裝,對事件的監聽能夠近似看作是本地緩存視圖和遠程zk視圖的對比過程

- NodeCache 節點緩存用於處理節點自己的變化 ,回調接口NodeCacheListener
- PathChildrenCache	子節點緩存用於處理節點的子節點變化,回調接口 PathChildrenCacheListener
- TreeCache	NodeCache和PathChildrenCache的結合體,回調接口TreeCacheListener
複製代碼
  • 事務支持(保證一組操做的原子性)
Collection<CuratorTransactionResult> results =  client.transaction().forOperations(operations);

複製代碼
  • 異步支持 引入BackgroundCallback接口,用於處理異步接口調用以後服務端返回的結果信息
public void processResult(CuratorFramework client, CuratorEvent event)

CuratorEventType 事件類型
org.apache.zookeeper.KeeperException.Code

複製代碼
相關文章
相關標籤/搜索