什么是Zookeeper
在Zookeeper的官網上有這么一句話:ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services。
這大概描述了Zookeeper主要是一個分布式服務協調框架,實現同步服務,配置維護和命名服務等分布式應用。是一個高性能的分布式數據一致性解決方案。
Zookeeper是集中式存儲和管理分布式系統的配置中心
CP系統
Zookeeper是個CP(一致性+分區容錯性)的,即任何時刻對Zookeeper的訪問請求能得到一致的數據結果,同時系統對網絡分割具備容錯性;但是它不能保證每次服務請求的可用性。也就是在極端環境下,ZooKeeper可能會丟棄一些請求,消費者程序需要重新請求才能獲得結果。
brew安裝zookeeper
brew search zookeepker
zookeeper 支持brew安裝
安裝
brew install zookeeper
安裝成功后主要安裝文件路徑
/usr/local/Cellar/zookeeper/3.4.13
配置文件路徑
/usr/local/etc/zookeeper
包含四個主要文件
這里引申說明一下 windows系統和Linux及Mac系統的區別:配置文件與安裝文件分離.這種思維方式的區別很有用
啟動
$ zkServer start:
查看狀態
$ zkServer status:
ZooKeeper JMX enabled by default
Using config: /usr/local/etc/zookeeper/zoo.cfg
Mode: standalone
這里的standalone指的是單機模式
PHP客戶端
sudo pecl install zookeeper 。 【直接終端運行,mac的生產力的表現之一】
Build process completed successfully
Installing '/usr/local/Cellar/php@7.2/7.2.18/pecl/20170718/zookeeper.so'
install ok: channel://pecl.php.net/zookeeper-0.6.4
Extension zookeeper enabled in php.ini
https://pecl.php.net/package/zookeeper
Zookeeper主要作用
它的作用主要是用來維護和監控你存儲的數據的狀態變化。通過監控這些數據狀態的變化,從而可以達到基于數據的集群管理。
ZNode
ZNode是Zookeeper中數據的最小單元,每個ZNode都可以保存數據,同時還可以掛載子節點,因此構成了一個層次化的命名空間,稱為樹。
Watcher數據變更通知
Zookeeper使用Watcher機制實現分布式數據的發布/訂閱功能。
分布式協調的具體案例
來源于公眾號javaEdge
如上圖所示,系統A發送一個請求到MQ,然后系統B消費消息之后處理了。那系統A如何知道系統B的處理結果?
用ZK就可實現分布式系統之間的協調工作!
系統A發送請求之后可以在ZK上對某個節點的值注冊監聽器,一旦系統B處理完了就修改ZK那個節點的值,A立馬就可以收到通知,完美解決~
以上是一種典型的實時通知與通信模型
不同的客戶端都對ZooKeeper上同一個數據節點進行Watcher注冊,監聽數據節點的變化(包括數據節點本身及其子節點),如果數據節點發生變化,那么所有訂閱的客戶端都能夠接收到相應的Watcher通知,并做出相應的處理
總結
本篇以PHP環境下Zookeeper擴展安裝為起點,簡單介紹了Zookeeper基本概念和使用場景,不是很完整。如果PHP和Zookeeper作為一個分布式系統的客戶端而言,網上的使用案例非常有限,跟PHP環境下熔斷組建的使用一樣,案例非常少,穩定性不能保證。
從兩方面來看這個事:一,業界基本沒有這樣的使用場景和技術案例,為什么沒有,因為PHP語言生態不適合做這塊,能做嗎,或許能做,但是不適合,不是強項。二,如果有類似的需求,我們不應該選擇PHP來做這塊,因為整個業界都沒有這樣做的,我們應該把經歷花在更有意義的選擇上。