什么是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来做这块,因为整个业界都没有这样做的,我们应该把经历花在更有意义的选择上。