Zookeeper-基礎

基本概念

集羣角色

這裏寫圖片描述
- Leader
接受所有Follower的提案;
請求並統一協調發起提案;
負責與所有Follower進行內部數據交換(同步)。

  • Follower
    直接爲客戶端服務;
    參與提案的投票;
    與Leader交換數據。

  • Observer
    直接爲客戶端服務;
    不參與提案的投票;
    與Leader交換數據。

數據模型

由znode組成的樹形結構,znode是一個跟Unix文件系統路徑相似的節點,可以往這個節點存儲或獲取數據。如下圖
這裏寫圖片描述

版本

  • cversion
  • dataversion
  • aclversion

Acl權限控制

OPEN_ACL_UNSAFE : 對所有用戶開放
READ_ACL_UNSAFE : 只讀
CREATOR_ALL_ACL: 創建者可以做任何操作

特點

  • 順序一致性:按照客戶端發送請求的順序更新數據。
  • 原子性:更新要麼成功,要麼失敗,不會出現部分更新。
  • 單一性 :無論客戶端連接哪個server,都會看到同一個視圖。
  • 可靠性:一旦數據更新成功,將一直保持,直到新的更新。
  • 及時性:客戶端會在一個確定的時間內得到最新的數據。

僞集羣環境搭建

  • 下載安裝包
wget http://mirrors.hust.edu.cn/apache/zookeeper/stable/zookeeper-3.4.9.tar.gz
  • 創建三個文件夾,模擬集羣
[root@iZwz9io83xn1czh8rty3qlZ zookeeper]# mkdir server1
[root@iZwz9io83xn1czh8rty3qlZ zookeeper]# mkdir server2
[root@iZwz9io83xn1czh8rty3qlZ zookeeper]# mkdir server3
  • 分別複製tar包並解壓
  • 修改server1配置文件
[root@iZwz9io83xn1czh8rty3qlZ conf]# cp zoo_sample.cfg zoo.cfg
[root@iZwz9io83xn1czh8rty3qlZ conf]# vi zoo.cfg

--修改數據存儲路徑
dataDir=/usr/local/zookeeper/server1/data
--新增集羣配置
server.1=xxx.xxx.xxx.xxx:2881:3881
server.2=xxx.xxx.xxx.xxx:2882:3882
server.3=xxx.xxx.xxx.xxx:2883:3883

第一個端口號是leader和follower之間的通信端口;
第二個端口號是選舉的端口號;

  • 複製到server2、server3
[root@iZwz9io83xn1czh8rty3qlZ conf]# cp zoo.cfg /usr/local/zookeeper/server2/zookeeper-3.4.9/conf/zoo.cfg
[root@iZwz9io83xn1czh8rty3qlZ conf]# cp zoo.cfg /usr/local/zookeeper/server3/zookeeper-3.4.9/conf/zoo.cfg
  • 修改dataDir和端口號
--修改對應的端口號,保證不重複
clientPort=2182
--修改對應的路徑
dataDir=/usr/local/zookeeper/server2/data

server3同理
- 在對應的data目錄下創建myid文件並添加id號,對應着集羣配置中的id

[root@iZwz9io83xn1czh8rty3qlZ data]# cd /usr/local/zookeeper/server1/data
[root@iZwz9io83xn1czh8rty3qlZ data]# vi myid
1

:wq
  • 服務命令
--服務啓動停止等
./zkServer.sh start|stop|status|restart
--客戶端連接服務
./zkCli.sh [-timeout 0 -r]-server ip:port

分別啓動
- 連接

[root@iZwz9io83xn1czh8rty3qlZ bin]# ./zkCli.sh -server xxx.xxx.xxx.xxx:2182
Connecting to xxx.xxx.xxx.xxx:2182
...
[zk: xxx.xxx.xxx.xxx:2182(CONNECTED) 0]
  • 操作命令
    1. create [-s] [-e] path data acl
      //-s 有序
      //-e 臨時
    2. ls path [watch] 查看節點目錄
    3. get path [watch]
    4. set path data [version] 修改節點數據
    5. delete path [version]
    6. setquota -n|-b val path 雖然設置了限制,但是仍然是可以創建成功。同時,會bin/zookeeper.out 輸出警告信息
      7.delquota [-n|-b] path

常見應用場景

配置中心(Configuration Management)

例如,同一個應用系統需要多臺Server 運行,它們運行的應用系統的某些配置項是相同的,如果要修改這些相同的配置項,那麼就必須同時修改每臺運行這個應用系統的Server,這樣非常麻煩而且容易出錯。
這種情況可以將配置信息交給 Zookeeper 來管理,將配置信息保存在 Zookeeper 的某個目錄節點中,然後將所有需要修改的應用機器監控配置信息的狀態,一旦配置信息發生變化,每臺應用機器就會收到 Zookeeper 的通知,然後從 Zookeeper 獲取新的配置信息應用到系統中。
這裏寫圖片描述

集羣管理(Group Membership)

Zookeeper 上創建一個 EPHEMERAL 類型的目錄節點,然後每個 Server 在它們創建目錄節點的父目錄節點上調用 getChildren(String path, boolean watch) 方法並設置 watch 爲 true,由於是 EPHEMERAL 目錄節點,當創建它的 Server 死去,這個目錄節點也隨之被刪除,所以 Children 將會變化,這時 getChildren上的 Watch 將會被調用,所以其它 Server 就知道已經有某臺 Server 死去了。新增 Server 也是同樣的原理同理。
這裏寫圖片描述

統一命名服務(Name Service)

分佈式應用中,通常需要有一套完整的命名規則,既能夠產生唯一的名稱又便於人識別和記住,通常情況下用樹形的名稱結構是一個理想的選擇,樹形的名稱結構是一個有層次的目錄結構,既對人友好又不會重複。

共享鎖(Locks)

1、獲得鎖的Server創建一個 EPHEMERAL_SEQUENTIAL 目錄節點,然後調用 getChildren方法獲取當前的目錄節點列表中最小的目錄節點是不是就是自己創建的目錄節點,如果正是自己創建的,那麼它就獲得了這個鎖;如果不是那麼它就調用exists(String path, boolean watch) 方法並監控 Zookeeper 上目錄節點列表的變化,一直到自己創建的節點是列表中最小編號的目錄節點,從而獲得鎖。
2、釋放鎖只要刪除前面它自己所創建的目錄節點就行了。


[1] http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/
[2] http://baike.baidu.com/link?url=ShlHMULtsxQ5T-BhYkY_9__v5cZXeEiNiVUmlvnNBAh_Nc0DbhrYp7fqszvMvbyl4lK_g7W_cFFCN2N0glCpNnxVilUQ9dghli_PkRgZc7e

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章