zookeeper,有些听说过,有些人没有,本人也是因为自己在做一个分布式的系统,由dubbo+zookeeper整合,所以接触一下。到底是什么东西?关于这个问题我首先到其官网和百度百科。其大致就是zookepper是hadoop的一个子项目,Apache软件基金会下的一个项目,作为分布式协调作用的,作用类型与我们的大脑。而至于hadoop是什么的话,我只能告诉你,是一个大数据的框架,具体是什么,小的不清楚,哈哈。其实zookeeper在hadoop的作用,我可以再打个比喻。不管是hadoop还是其它分布式系统,就好比我们人的身体,有心脏,胃,有呼吸道系统。腿,手。。。。。等等。这么多的子系统处于分布式环境,怎么协调呢?那就是我们大脑(zookeeper),大家可以把zookeepr想成大脑,本身没有其它功能,只有负责协调,联络子系统的功能,具体有哪些协调功能,往下看
回到主题,zookeeper官网是这么介绍它的
ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. All of these kinds of services are used in some form or another by distributed applications. Each time they are implemented there is a lot of work that goes into fixing the bugs and race conditions that are inevitable. Because of the difficulty of implementing these kinds of services, applications initially usually skimp on them ,which make them brittle in the presence of change and difficult to manage. Even when done correctly, different implementations of these services lead to management complexity when the applications are deployed.
中文翻译
ZooKeeper是一个集中式服务,用于维护配置信息,命名,提供分布式同步和提供组服务。所有这些类型的服务以分布式应用程序的某种形式或另一种形式使用。每次他们被实现,有很多工作,以修复错误和竞争条件是不可避免的。由于实现这些服务的难度,应用程序最初通常嘲弄它们,这使得它们在变化的存在下变得脆弱并且难以管理。即使正确地完成,这些服务的不同实施导致在应用被部署时的管理复杂性。
其实zookeeper怎么协调hadoop以及其它的分布式系统的,我们可以从其介绍看出(标红色部分),下面针对以上4个,我们简单讲一下,目的就是大家能简单知道,了解zookeeper。
1、维护配置信息
这个的应用场景:
比方说你有20多个,甚至更多的项目,共同使用很多配置文件。当你要修改配置文件时,你是不是要一个个去复制一遍,这样很耗时间,精力,而且也不利于管理。而且现在项目都是分布式项目,在加上如果项目已经上线,那你如果一个个去改,然后重启服务,那不是麻烦死了。
zookeeper提供的这个配置管理,就是把这公用的配置文件提取出来放到一个地方,对这个地方(目录节点)进行监听,一旦配置信息发生变化,每个应用程序就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中就好,项目不需要重启,这样上面一开始讲的问题就解决了.
参考文章:http://www.jianshu.com/p/01388f06e75d
2、命名
命名功能其实在dubbo上体现的,相信大家都知道jndi吧,如果不知道的话那我也没有办法了。zookeeper的命名服务跟jndi功能几乎差不多,这样说大家应该大致应该知道zookeeper的命名功能了。如果用过duboo+zookeeper整合的系统的人也能知道,正是因为这个命名服务,才方便了分布式个个项目之间的联系.在SOA框架里面,RMI框架就是通过很简单的你要某个服务器上的URL来获取远方服务器上的对象来调用服务,但到集群,和分布式环境下,如何做到子项目之间调用的关系不会很复杂,不会到时候出现问题都不知道哪个服务调用的哪个,所以这里就需要一个服务器专门替我们管理这里服务的信息和调节,管理这些服务,让我们可以把集中与项目的业务,zookeeper的命名功能就是这么一个服务器。当集群的时候,相同的一个服务有很多个提供者,这些提供者启动时,提供者服务器的相关信息,包括服务接口,地址,端口等一下连接提供者的信息注册到zookper中,当消费者要消费某服务的时候,从zookeeper中拿改服务的所有提供者信息目录,再根据dubbo的负载均衡机制从地图中选择一个提供者。其实从作用1,2可以看出,zookeeper大家可以看出是一个文件系统(类似与linux文件系统),还是那句话,zookeeper就是分布式中充当大脑。
3、分布式同步
分布式的同步,又叫分布式锁。相信对于锁这个概念,大家都应该知道吧。对于单服务器的锁,大家都知道怎么做。在分布式上,如果A要调用B的方法C,C方法也要加锁,但这个锁不能想单服务器那样加,因为这个是分布式调用的方法,不一样。就像事务一样,单服务器上的事务和分布式事务不一样。zookeeper提供了一个分布式同步(锁)的方法,使用其提供的,客户可以省了很多事。
zookeeper分布式锁的思路
进程需要访问共享数据时, 就在"/locks"节点下创建一个sequence类型的子节点, 称为thisPath. 当thisPath在所有子节点中最小时, 说明该进程获得了锁. 进程获得锁之后, 就可以访问共享资源了. 访问完成后, 需要将thisPath删除. 锁由新的最小的子节点获得.
有了清晰的思路之后, 还需要补充一些细节. 进程如何知道thisPath是所有子节点中最小的呢? 可以在创建的时候, 通过getChildren方法获取子节点列表, 然后在列表中找到排名比thisPath前1位的节点, 称为waitPath, 然后在waitPath上注册监听, 当waitPath被删除后, 进程获得通知, 此时说明该进程获得了锁.
大致流程图
参考文献
https://my.oschina.net/91jason/blog/500503
四、提供组服务
其实这个组服务也就是集群管理了,就像dubbo+zookeeer。服务器上的服务注册,或者获取服务,都是在zookeeper上操作的,所以所谓的提供组服务也就包括创建组、加入组成员、列出组成员和删除组成员。对于这些服务,主要通过zookeeper心跳机制,它会去检测与其连接的一些服务器的数量,以及信息。什么时候连上zookeeper,或什么时候断开都有其心跳机制完成。
本人只是本人对zookeeper的一些见解,如有问题可以提出来。