作为一个Java后台开发人员,一定都听过Apache软件基金会(也就是Apache Software Foundation),我们常用的软件有很多很多很多都来自这个组织。例如tomcat,maven,svn,ant,hadoop,pig等等等等,实在太多了。zookeeper是一个托管到Apache软件基金会的开源项目。大家都知道,这些开源项目大都是以动物的名字命名的,如tomcat,ant等等,zookeeper这个名字翻译过来就是动物园管理员,通过名字也能看到它的与众不同之处。zookeeper的官网地址就是 https://zookeeper.apache.org/ 。那么什么是zookeeper呢?
什么是zookeeper?
关于zookeeper,一直做单体开发的人员可能并不熟悉,比如我们开发了一个项目,打成war包放到tomcat下面运行,浏览器直接访问的是tomcat,或者为了提高并发搭建多个tomcat,用nginx等工具去负载均衡,在这样简单的项目中,其实用不到zookeeper。提到zookeeper不得不提到分布式,在很多关于分布式的教程中,往往第一部分的课程就会讲zookeeper,它是分布式的一个入门工具,它可以在分布式系统中协作多个任务。协作,意味着多个进程需要一同处理某些事情,或者竞争某些资源,zookeeper就可以管理这些竞争。
在典型的主从模式中,比如数据库的读写分离,从节点处于空闲状态主节点就会分配任务给从节点。竞争则不同,它指的是两个进程不能同时处理工作的情况,一个进程必须等待另一个进程,从而实现同步。有多线程开发经验的可以思考借鉴。多线程开发中的锁可以在单机上实现同步,但是在分布式的多台机器上,虽然很多消息传递算法可以实现同步原语,但是使用一个提供某种有序共享存储的组件往往更加简单高效,这正是zookeeper采用的方式。
使用程序实现协同是非常困难的一件事,开发这样的应用,很容易让程序员陷入如何使多个程序协同工作的逻辑中,导致对业务逻辑关注不够,又或者协同逻辑本身不完善,导致开发了一个简单脆弱的主协调器,导致不可靠的单一失效点。zookeeper的设计保证了其健壮性,是的开发人员可以更多的关注业务本身的逻辑。
zookeeper从文件系统API得到启发,提供了一些简单的API操作,使得开发人员可以实现通用的协作任务,包括选举主节点,管理组内成员关系,管理元数据等等,zookeeper的服务组件可以运行在一组专用的服务器集群上,保证了高容错性和可扩展性。
zookeeper常用实例
在一些常用的开源软件中,很多依靠zookeeper达到选举,高可用,实时同步更新等功能,如HBase,kafka,solr等等,这些是具有代表性的例子。根据这些例子,我们可以从更加抽象的层次上讨论zookeeper,当开发人员使用zookeeper时,开发人员设计的应用都可以看做一组连接到zookeeper的客户端,通过开发语言专门的API连接到zookeeper服务器进行操作,而zookeeper发挥了强大的功能,包括:
保障强一致性,有序性和持久性
实现通用的同步原语能力
在分布式系统中,zookeeper提供了一种简单的并发处理机制,解决分布式并发容易出错的行为
当然zookeeper并不是万能的,我们要了解的就是通过它能做什么,以便做到在应该使用它的时候去使用它,并且应该知道如何处理其中一些棘手的问题。
网友评论