1. 程式人生 > >zookeeper分散式協調服務的使用一

zookeeper分散式協調服務的使用一

Zookeeper是一個高效能,分散式的應用協調服務。

提供服務:

1、叢集成員的管理(Group Membership)

2、分散式鎖(Locking)

3、選主(Leader Election)

4、同步(Synchronization)

5、釋出/訂閱(Publisher/Subsriber)

一、資料模型

  • 分層結構
  • 屬性結構的中的每個節點叫做Znode
  •  每個Znode都有資料(byte[]型別),也可以有子節點
  • 節點路徑: 斜線分割(/zoo/duck);沒有相對路徑
  • 通過資料結構stat類儲存資料的變化,ACL的變化和時間戳
  • 資料發生變化時,版本號遞增
  • 可以對Znode中的資料進行讀寫操作

二、應用場景

1、資料釋出/訂閱

釋出者將資料釋出到zk的一個或者一系列的節點上,訂閱者進行資料訂閱,當有資料變化時,可以及時的得到資料變化的通知。

2、負載均衡

本質是利用zookeeper的配置管理功能,步驟為:
服務提供者把自己的域名及IP埠的對映註冊到zk中
服務消費者通過域名從zk中獲取到對應的IP及埠,這個IP及埠有多個,只是獲取其中一個
當服務這當及時,對於的域名與IP的對於就會減少一個對映

3、命名服務

在分散式系統中,命名服務(Name Service)也就是重要的應用場景,zk命名服務提供的是資源定位,其本質也是通過zk的集中配置管理和查詢

4、分散式協調/通知

通過watcher的通知機制實現

分散式鎖

分散式事務

5、叢集管理

當前叢集中的機器數量

叢集中機器的執行時狀態

叢集中節點的上下線操作

叢集節點的統一配置

6、Master選舉

臨時節點

順序節點

7、分散式鎖

 排它鎖

共享鎖

8、分散式佇列

FIFO機制

三、Zookeeper的機制

1、叢集角色

Leader:為客戶端提供讀寫服務

Follow:提供讀服務,所有寫服務需要交給Leader角色,參與選舉

Observe:提供讀服務,不參與選舉過程,一般是為了增強zk叢集的讀請求的併發能力

2、會話(session)

zk的客戶端與zk伺服器之間的連線

通過心跳檢測保持客戶端連線的存活度

接受來自服務端的watch事件通知

可以設定超時間

3、資料節點(Znode)

zk樹形結構中的資料節點,用於儲存資料

持久節點:一旦建立,除非主動呼叫刪除操作,否者一直儲存在zk上

臨時節點:與客戶端的回話繫結,一旦客戶端回話消失,這個客戶端建立的臨時節點都會被移除

SEQUENTIAL Znode:建立節點時,如果設定屬性SEQUENTIAL,則會自動在節點名後面追加一個整型數字

4、版本

Version:當前Znode的版本

Gversion:當前Znode的子節點的版本

Aversion:當前Znode的ACL(訪問控制)版本

5、Watcher

作用於Znode節點上

多種事件通知:資料更新,子節點狀態等

6、ACL(Access Control Lists)許可權控制

CREATE:建立子節點的許可權

READ:獲取節點資料和子節點列表的許可權

WRITE:更新節點資料的許可權

DELETE:刪除子節點的許可權

ADMIN:設定節點ACL的許可權

其中:CREATE和DELETE是針對子節點的許可權控制

四、zookeeper的配置部署(單機配置)

1、配置環境變數

在/etc/profile檔案中配置zk的環境變數

export JAVA_HOME=/usr/andy/jdk/jdk1.7.0_79
export ZOOKEEPER_HOME=/usr/andy/zookeeper/zookeeper-3.4.8
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$ZOOKEEPER_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar:$ZOOKEEPER_HOME/lib

      生效配置:  source /etc/profile 

2、zookeeper配置

# 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=/usr/andy/zookeeper/zookeeper-3.4.8/data
dataLogDir=/usr/andy/zookeeper/zookeeper-3.4.8/logs
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the 
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.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

1、將conf下的zoo_sample.cfg修改配置為zoo.cfg

2、tickTime:預設2000ms,作為基本單元,用它的配屬來表示系統內部的時間間隔配置,比如:

2*tickTime是客戶端回話的超時時間

1*tickTime是客戶端與zk伺服器端的心跳時間

      dataDir:用於配置儲存快照檔案的目錄,如果沒有配置dataLogDir,事務日誌也會儲存在該目錄【需要配置】,一般建立data資料夾

dataLogDir:事務日誌母了路徑,一般在zookeeper下建立logs資料夾

clientPort:zk的執行埠,預設2181

3、啟動與關閉

 cd zookeeper-3.4.8/bin

./zkServer.sh  [start|start-foreground|stop|restart|status|upgrade|print-cmd]

[[email protected] bin]# ./zkServer.sh  start
ZooKeeper JMX enabled by default
Using config: /usr/andy/zookeeper/zookeeper-3.4.8/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[[email protected] bin]# netstat -anp | grep 2181
tcp6       0      0 :::2181                 :::*                    LISTEN      14562/java          
[[email protected] bin]# 
啟動成功。

五、zookeeper叢集的配置

暫略。