最近想学东西,于是就又拿起前段时间因为“没时间”而落下的zookeeper
啃了起来,第一次啃完教程发现什么都不明白,第二次啃完发现,这东西,就这么"简单"的东西啊?
先来摘抄一段让人十分讨厌又不得不看的概述
Zookeeper是针对大型分布式系统的高可靠的协调系统。由这个定义我们知道zookeeper是个协调系统,作用的对象是分布式系统。
好吧,第一次看完这句话,协调
两个字吸引我,其他都是废话。众所周知分布式的系统非常难以管理,如果开发一个master又会碰到同步等各种多线程(进程)碰到的问题,zookeeper给了我们什么勇气能让我们搞定这个事情,那么答案如下:
zookeeper的特性
每时每刻我们访问zookeeper的树时, 相同节点返回的数据都是一致的.
OK,那行,我相信你了啊:P。上面这句话意味着我们对Zookeeper进行访问的时候,无论是什么时间(就是并发)访问的时候,不会引起脏读重复读等等(真的是这样么?其实心中还有点疑虑)。
好吧,暂且抛开疑虑,让我们看一下zookeeper的本质。说白了zookeeper的数据结构你可以看成是linux的文件系统(是不是这么说太简单粗暴),依照这种方式,zookeeper提供以下几种特性
统一命名服务
/zk_test
/zookeeper
/zk_test/dir
这几个路径是不是看上去很眼熟啊~ 这就是zooker的DataModel了。这些用来干嘛用呢?
有些博文里把zookeeper提供的这种命名结构称之为统一命名服务。 好吧,就是给指定的结点(zookeeper里面称之为znode)提供了统一的名称。前提是知道zookeeper是分布式的,而且zookeeper足够稳定,所以你的分布式服务的每一个服务器都可以找到一个统一的配置文件服务
(就是这里的一个znode啦),他们在任何时刻读到的内容都是一致的。因此你可以把你的配置文件,或者分布式的服务器列表等数据放入这个znode中,并使用watch监视,如果里面的内容被修改了,那么所有的服务器都会被通知到(这里使用了观察者模式咯)。
分布式锁服务
这个特性是最吸引我的特性了,如何实现分布式锁呢,就是使用zookeeper提供的有序
且临时
的znode特性实现。说白了就是需要锁的程序创建一个临时结点,这个结点会在它断开或者删除的时候被删除,它只用检测下它自己的序号在所有子结点中的序号是不是最小的即可。当然详细的可以参照zookeeper分布式锁避免羊群效应(Herd Effect) 这篇文章,同时写了如何避免羊群效应。
还有其他其他的一些特性。
这些特性都是基于zookeeper可靠的DataModel上来的。官网可能没有应用场景的展现。
以上是Zookeeper的介绍,我想写下一篇去介绍下官网的demo。
文章写的少,文笔好烂,如有错误,请指正,非常感谢非常感谢。