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]
- [root@localhost 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
- [root@localhost bin]# netstat -anp | grep 2181
- tcp6 0 0 :::2181 :::* LISTEN 14562/java
- [root@localhost bin]#
啟動成功。
五、zookeeper集群的配置
暫略。