Zookeeper
什麼是zookeeper?原理?
分佈式協調服務,底層基於ZAB(原子消息廣播);
由Leader、Follower、Observer組成。
維護有層次的數據結構;數據一般存儲在內存中;數據讀取性能高;(JMeter壓測讀取性能最高可達12-13w)
leader負責統一接收客戶端數據,廣播給Follower處理;各個請求之間是順序的;
各個Follower之間數據是一致的;
Observer負責監控Leader與Follower;
創建集羣服務時,zookeeper服務官方推薦爲奇數個,比如3個,5個等;
ZAB算法:支持崩潰恢復的原子廣播協議,爲分佈式主備系統設計的;
崩潰恢復機制:
Leader掛了,則升級ZXID最大的Follower爲Leader,選取後其他Follower向新的leader同步狀態後,新的leader才處理客戶端請求。
消息廣播:
1.客戶端提交數據,Leader接收,生成事務(含事務id,zxid等)
2.leader生成事務隊列提交事務給各個Follower,Follower接收寫入事務日誌待處理;
3.各個Follower向Leader作出ACK迴應;
4.Leader確保收到半數以上回應後,向Follower發出Commit指令提交事務;
5.響應客戶端
ZAB底層基於cas算法,cas是基於paxos算法;
paxos算法:一致性狀態;隨機算法;
ZK應用
- 配置管理
(要求:數據量小;
運行時數據動態變化;
集羣中各個節點共享信息,配置一直) - 數據庫切換
- 發佈與訂閱(eg:zk+rocketmq)
- 分佈式鎖/分佈式隊列管理
- 集羣管理(eg:zk+dubbo)
- 分佈式日誌收集
相較於zk,nameserver更輕量級且無狀態同步,支持存儲策略;
rocketMq後續使用的就是nameserver;
zk安裝
官方文檔:http://dubbo.apache.org/zh-cn/docs/admin/install/zookeeper.html
外網下載:
wget http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.6.1/zookeeper-3.6.1.tar.gz
解壓:
tar zxvf (目錄)/zookeeper-3.6.1.tar.gz 目標目錄
##配置開始
修改配置文件名稱:mv zoo_sample.cfg zoo.cfg
配置集羣節點:
格式:server.名稱=ip:2555:3555
server.node1=109.254.2.151:2555:3555
server.node2=109.254.2.152:2555:3555
zoo.cfg文件編輯:vim zoo.cfg
添加以上集羣節點配置,同時修改data數據存放目錄爲:
data=/temp/zookeeper/data(zookeeper目錄下沒有data)
保存退出:esc :wq(保存/退出)
強制保存退出:esc :wq!
在zookeeper下創建data目錄:mkdir data
在data目錄下創建測試文件(例如:mydata):vim mydata 添加測試內容
##配置結束
node2重複以上步驟;
啓動: ./bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /home/cheilpengtai/apache-zookeeper-3.6.1/bin/…/conf/zoo.cfg
Starting zookeeper … STARTED
關閉:./bin/zkServer.sh stop
ZooKeeper JMX enabled by default
Using config: /home/cheilpengtai/apache-zookeeper-3.6.1/bin/…/conf/zoo.cfg
Stopping zookeeper … ./bin/zkServer.sh: line 213: kill: (31380) - No such process
STOPPED
zoo.conf
tickTime:維持心跳時間間隔
dataDir:數據存儲目錄
clientPort:客戶端連接zk端口,zk監聽這個端口;
initLimit:zk接受客戶端初始化連接最長時間;
synclimit:leader與follower之間發送消息,請求與應答時間長度;
如何實現分佈式鎖?
通過創建臨時節點來實現,臨時節點在本次會話中有效;