Zookeeper,动物管理员,是用来管理hadoop(大象)、Hive(蜜蜂)、Pig(小猪)的管理员。html
Apache Hbase和Apache Solr的分布式集群都用到了Zookeeper。node
Zookeeper是一个分布式、开源的程序协调服务,是Hadoop项目下的一个子项目。它提供的主要功能是配置管理、名字服务、分布式锁、集群管理。linux
抛出问题:数据库
在咱们的应用中,除了代码,还有一些就是各类配置。好比:数据库链接等。通常咱们都是使用配置文件的形式,在代码中引入这些配置文件。apache
当咱们只有一种配置,只有一台服务器,而且不常常作修改的时候,使用配置文件是一个很好的作法。可是,若是咱们的配置很是多,并且不少服务器都须要这个配置,这时,使用配置文件求不是一个很好的选择。编程
这个时候就须要寻找一种集中管理配置的方法,咱们在这个集中的地方修改了配置,全部对该配置文件感兴趣的均可以得到变动,Zookeeper就这样的一种服务。缓存
问题解决:服务器
Zookeeper使用Zab这样的一致性协议来提供一致性。如今不少开源项目都使用Zookeeper来维护配置。网络
好比HBase,客户端就是链接一个Zookeeper,得到必要的HBase集群配置信息,而后才能够进一步进行操做。数据结构
开源的消息队列Kafka中,也是使用Zookeeper来维护broker的信息。
在Alibaba开源的SOA框架Dubbo中也普遍的使用Zookeeper管理一些配置来实现服务治理
问题抛出:
好比,为了经过网络访问一个系统,咱们得知道对方的IP地址,可是IP地址很复杂,这个时候就须要使用功域名来进行访问。可是,计算机是不能为域名的,有一种解决方案,就是咱们为你每台机器都备份有一份域名到IP的映射,这个能解决一部分问题,可是若是域名对应的IP发生变化怎么办?因而就有了DNS,咱们只须要访问一个你们都熟知的(known)的点,它就会告诉你这个域名对应的IP是什么。
问题解决:
在咱们的应用中也会存在这种问题,特别是在咱们的服务特别多的时候,若是咱们在本地保存服务的地址的时候将很是不方便,可是,若是咱们只须要访问一个你们都熟知的访问点,这里提供统一的入口,那么维护起来就会很方便
问题抛出:
好比:在一个分布式环境中,为了提升可靠性,咱们集群的每台服务器都部署着一样的服务,可是,一件事情若是集群中的每一个服务器都进行的话,那相互之间就须要进行协调,编程起来就会很是复杂。而若是咱们只让一个服务进行操做,那又存在单点问题。
问题解决:
使用分布式锁,在某个时刻只让一个服务去干活,的那个这台服务出现问题的时候锁释放,当即fail over到另外的服务。在不少分布式系统中,都是这么作的,也叫Leader Election。
好比:HBase的Master就是采用这种机制,可是要注意的是分布式锁和同一个进程的锁仍是有区别的,因此使用的时候,要比同一个进程里的锁更谨慎的使用。
问题抛出:
在分布式的集群中,常常会因为各类缘由,好比硬件故障、软件故障、网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。
这个时候,集群中的其余机器须要感知到这种变化,而后根据这种变化作出相应的对策。
问题解决:
好比,咱们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候咱们须要根据如今集群的状态来分配存储节点。这时咱们就须要动态感知到集群目前的状态。
好比,一个分布式的SOA架构中,服务是一个集群提供的,当消费者访问某个服务时,就须要采用某种机制发现如今有哪些节点能够提供这种服务(也被称之为服务发现,好比Alibaba开源的SOA框架Dubbo就采用了Zookeeper做为服务发现的底层机制)。还有开源的Kafka队列就采用了Zookeeper做为Cosnumer的上下线管理。
在Zookeeper中,znode是一个根Unix文件系统路径类似的节点,能够往这个节点存储或者获取数据。
Zookeeper底层是一套数据结构。这个数据结构是一个树形结构,上面的每个节点,称之为“znode”,Zookeeper中的数据是按照树结构进行存储的,并且znode节点还分为4中不一样的类型。
每一个znode节点默认存储1MB的数据(仅仅用来记录状态)。
可使用zkCli命令,登陆到Zookeeper上,并经过ls、create、delete、get、set等命令来操做这些znode节点。
(1)PERSISTENT(持久化节点):所谓持久化节点,是指在节点建立后,就会一直存在,直到有删除操做来主动清除这个节点,不然不会由于建立该节点的客户端会话失效而消失。
(2)PERSISTENT_SEQUENTIAL(持久顺序节点):这类节点基本特征和持久化节点是一致的。额外的特性是,在ZK中,每一个父节点会为它的第一级子节点维护一份时序,会记录每一个子节点建立的前后顺序。基于这个特性,在建立子节点的同时,能够设置这个属性,那么在建立节点的过程当中,ZK会自动为给定节点加上一个数字后缀,做为新的节点名。这个数字后缀范围是整型的最大范围值。在建立节点的同时,只须要传入节点“/test_”,这样,Zookeeper会自动给后面补充数字。
(3)EPHEMERAL(临时节点):和持久化节点不一样的是,临时节点的生命周期和客户端会话绑定。也就是说,若是客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而不是链接断开。另外,在临时节点下面不能再建立子节点。
值得注意的是,当客户端失效的时候,所产生的节点并非一会儿就消失,也要过一段时间,大概10s之内。
(4)EPHEMERAL_SEQUENTIAL(临时自动编号节点):此节点属于临时节点,不过带有顺序,客户端会话结束,节点就消失。
安装环境:Linux系统、JDK
安装步骤:
第一步:上传Zookeeper压缩包
官方资源包可在 zookeeper.apache.com 站点中下载。最新发布版本为:3.4.12。
第二步:解压Zookeeper压缩包
tar -zxf zookeeper-3.4.6.tar.gz
cp zookeeper-3.4.6 /usr/local/zookeeper -r
第三步:配置Zookeeper
Zookeeper在启动的时候,默认去conf目录下查找一个名为zoo.cfg的配置文件。
cp zoo_sample.cfg zoo.cfg
修改zoo.cfg配置文件:
设置dataDir路径:即数据缓存路径,须要先建立一个data文件夹
第四步:启动Zookeeper
在/bin目录下,启动zkServer,sh文件
(1)默认加载配置文件:./zkServer.sh start,会默认去conf目录下加载zoo.cfg配置文件
(2)指定加载配置文件:./zkServer.sh start [配置文件路径位置]
中止Zookeeper:./zkServer.sh stop
查看Zookeeper状态:./zkServer.sh status
zookeeper文件目录:
Zookeeper集群中的角色主要有如下三类:
(1)最终一致性:client不论链接到哪个server,展现的都是同一个视图,这是zookeeper最重要的性能。
(2)可靠性:若是消息m被一台服务器接收到,那么它将会被全部的服务器接收
(3)实时性:Zookeeper保证客户端将在一个时间间隔范围内,得到服务器的更新信息,或者服务器失效的信息;但因为网络延迟的缘由,zookeeper不能保证两个客户端能同时获得刚更新的数据,若是须要最新的数据,应该在读数据以前调用sync()接口
(4)等待无关(wait-free):慢的或者实效的client不得干预快速的client请求,使得每一个client都能有效的等待
(5)原子性:更新只有成功或者失败,没有中间状态
(6)顺序性:包括全局有序和偏序两种:全局有序是指若是一台服务器上消息a在消息b以前发布,则在全部的server上消息a都会在消息b以前发布;偏序是指若是一个消息b在消息a后被同一个发布者发布,消息a必将排在消息b以前。
使用三个zookeeper搭建一个伪集群,应用部署在linux系统:192.168.110.128;服务器监听端口为218一、218二、2183;投票选举端口为2881/388一、2882/388二、2883/3883。
三个集群都在:/usr/local/zookeepercluster目录下
子目录分别为:zookeeper0一、zookeeper0二、zookeeper03
安装方法与单机版同样。配置文件须要指定data目录。
特殊地方:
每一个集群须要提供应用惟一标识:
在zookeeper集群中,每一个节点须要一个惟一标识,这个惟一标识要求必须是一个天然数,且惟一标识保存位置是:/data/myid,其中myid为配置文件。
配置方案:
(1)手动用vi命令编辑myid,并添加标识1,2,3
(2)使用简化命令:echo [惟一标识] >> myid
echo命令为回声命令,系统会将命令发送数据返回,“>>”为定位,表明系统回声数据指定发送到什么位置,此命令表明系统回声数据发送到myid文件中,若是没有文件则建立文件。
一般须要给配置文件添加客户自行权限,命令以下:
chmod +x 文件名
修改配置文件zoo.cfg:设置服务、投票、选举端口
vi zoo.cfg(每一个集群都须要配置)
clientPort=2181 #服务端口根据应用作对应修改,zk01-2181,zk02-2182,zk03-2183 server.1=192.168.70.143:2881:3881 server.2=192.168.70.143:2882:3882 server.3=192.168.70.143:2883:3883
启动zookeeper应用:
在bin/zkServer.sh.start
注:zookeeper集群搭建完成后,至少须要启动两个应用才能提供服务,由于须要选举出主服务节点。启动全部的zookeeper节点后,可使用命令:bin/zkServer.sh status来查看节点状态,以下所示:
Model:leader 表示主机
Model:follower 表示备份机
关闭zookeeper应用:
命令:bin/zkServer.sh stop
启动zookeeper客户端:
bin目录下:./zkCli.sh
(1)当输入命令不正确时,会提示信息:
(2)经常使用命令:ls
使用格式:ls path
表示列表路径下的资源
指的注意的是:在zookeeper中,
根节点路径: ls /
子节点路径: ls /zookeeper
下一级子节点:ls /zookeeper/quota
(3)经常使用命令:quit
表示:退出客户端
(4)链接指定的ip地址下的服务器
./zkCli.sh -server 192.168.110.128:2182
(5)经常使用命令:connect 【ip】
表示:链接到指定的服务器
例如:connect 192.168.110.128:2183
(6)经常使用命令:create 【-e】【-s】 path data
表示:建立节点
-e:表示建立临时节点,能够不指定
-s:表示建立一个顺序节点,能够不指定
path:表示在哪一个节点下建立新的节点,其中,根节点表示为/
data:表示节点数据
例如:create /test 123
表示:在根节点下,建立一个test节点,数据为123,节点类型没有给定,默认为持久型节点。
例如:建立顺序节点:create /test2 2
zookeeper自动为节点添加后缀信息;
(7)经常使用命令:get path
表示:查看指定节点的数据
例如:get /test
123 cZxid = 0x400000004 ctime = Fri Jul 05 18:00:23 CST 2019 mZxid = 0x400000004 mtime = Fri Jul 05 18:00:23 CST 2019 pZxid = 0x400000004 cversion = 0 dataVersion = 0 aclVersion = 0 ephemeralOwner = 0x0 dataLength = 3 numChildren = 0
(8)经常使用命令:set path data 【version】
表示:设置对应位置节点的数据
例如:
(9)delete path 【version】
表示:删除指定节点,此命令不能删除有子节点的节点
(10)经常使用命令:rmr path
表示:删除指定节点,包括子节点
(11)经常使用命令:quit
表示:退出控制台
原文出处:https://www.cnblogs.com/ncl-960301-success/p/11228597.html