了解一下zookeeper,搭建单机版和集群版的环境玩玩,需要手稿的,留下邮箱
第一章:Zookeeper介绍
Zookeeper,动物管理员,是用来管理hadoop(大象)、Hive(蜜蜂)、Pig(小猪)的管理员。
Apache Hbase和Apache Solr的分布式集群都用到了Zookeeper。
Zookeeper是一个分布式、开源的程序协调服务,是Hadoop项目下的一个子项目。它提供的主要功能是配置管理、名字服务、分布式锁、集群管理。
1.1:Zookeeper的作用:配置管理(重点)
抛出问题:
在我们的应用中,除了代码,还有一些就是各种配置。比如:数据库连接等。一般我们都是使用配置文件的形式,在代码中引入这些配置文件。
当我们只有一种配置,只有一台服务器,并且不经常做修改的时候,使用配置文件是一个很好的做法。但是,如果我们的配置非常多,而且很多服务器都需要这个配置,这时,使用配置文件求不是一个很好的选择。
这个时候就需要寻找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对该配置文件感兴趣的都可以获得变更,Zookeeper就这样的一种服务。
问题解决:
Zookeeper使用Zab这样的一致性协议来提供一致性。现在很多开源项目都使用Zookeeper来维护配置。
比如HBase,客户端就是连接一个Zookeeper,获得必要的HBase集群配置信息,然后才可以进一步进行操作。
开源的消息队列Kafka中,也是使用Zookeeper来维护broker的信息。
在Alibaba开源的SOA框架Dubbo中也广泛的使用Zookeeper管理一些配置来实现服务治理
1.2:Zookeeper的作用:名字服务(了解)
问题抛出:
比如,为了通过网络访问一个系统,我们得知道对方的IP地址,但是IP地址很复杂,这个时候就需要使用功域名来进行访问。但是,计算机是不能为域名的,有一种解决方案,就是我们为你每台机器都备份有一份域名到IP的映射,这个能解决一部分问题,但是如果域名对应的IP发生变化怎么办?于是就有了DNS,我们只需要访问一个大家都熟知的(known)的点,它就会告诉你这个域名对应的IP是什么。
问题解决:
在我们的应用中也会存在这种问题,特别是在我们的服务特别多的时候,如果我们在本地保存服务的地址的时候将非常不方便,但是,如果我们只需要访问一个大家都熟知的访问点,这里提供统一的入口,那么维护起来就会很方便
1.3:Zookeeper的作用:分布式锁(了解)
问题抛出:
比如:在一个分布式环境中,为了提高可靠性,我们集群的每台服务器都部署着同样的服务,但是,一件事情如果集群中的每个服务器都进行的话,那相互之间就需要进行协调,编程起来就会非常复杂。而如果我们只让一个服务进行操作,那又存在单点问题。
问题解决:
使用分布式锁,在某个时刻只让一个服务去干活,的那个这台服务出现问题的时候锁释放,立即fail over到另外的服务。在很多分布式系统中,都是这么做的,也叫Leader Election。
比如:HBase的Master就是采用这种机制,但是要注意的是分布式锁和同一个进程的锁还是有区别的,所以使用的时候,要比同一个进程里的锁更谨慎的使用。
1.4:Zookeeper的作用:集群管理(重点)
问题抛出:
在分布式的集群中,经常会由于各种原因,比如硬件故障、软件故障、网络问题,有些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。
这个时候,集群中的其他机器需要感知到这种变化,然后根据这种变化做出相应的对策。
问题解决:
比如,我们是一个分布式存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们需要根据现在集群的状态来分配存储节点。这时我们就需要动态感知到集群目前的状态。
比如,一个分布式的SOA架构中,服务是一个集群提供的,当消费者访问某个服务时,就需要采用某种机制发现现在有哪些节点可以提供这种服务(也被称之为服务发现,比如Alibaba开源的SOA框架Dubbo就采用了Zookeeper作为服务发现的底层机制)。还有开源的Kafka队列就采用了Zookeeper作为Cosnumer的上下线管理。
第二章:Zookeeper的存储结构
2.1:Znode
在Zookeeper中,znode是一个根Unix文件系统路径相似的节点,可以往这个节点存储或者获取数据。
Zookeeper底层是一套数据结构。这个数据结构是一个树形结构,上面的每一个节点,称之为“znode”,Zookeeper中的数据是按照树结构进行存储的,而且znode节点还分为4中不同的类型。
每个znode节点默认存储1MB的数据(仅仅用来记录状态)。
可以使用zkCli命令,登录到Zookeeper上,并通过ls、create、delete、get、set等命令来操作这些znode节点。
2.2:Znode节点类型
(1)PERSISTENT(持久化节点):所谓持久化节点,是指在节点创建后,就会一直存在,直到有删除操作来主动清除这个节点,否则不会因为创建该节点的客户端会话失效而消失。
(2)PERSISTENT_SEQUENTIAL(持久顺序节点):这类节点基本特征和持久化节点是一致的。额外的特性是,在ZK中,每个父节点会为它的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的同时,可以设置这个属性,那么在创建节点的过程中,ZK会自动为给定节点加上一个数字后缀,作为新的节点名。这个数字后缀范围是整型的最大范围值。在创建节点的同时,只需要传入节点“/test_”,这样,Zookeeper会自动给后面补充数字。
(3)EPHEMERAL(临时节点):和持久化节点不同的是,临时节点的生命周期和客户端会话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这里提到的是会话失效,而不是连接断开。另外,在临时节点下面不能再创建子节点。
值得注意的是,当客户端失效的时候,所产生的节点并不是一下子就消失,也要过一段时间,大概10s以内。
(4)EPHEMERAL_SEQUENTIAL(临时自动编号节点):此节点属于临时节点,不过带有顺序,客户端会话结束,节点就消失。
第三章:Zookeeper的安装(单机版)
安装环境: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集群原理
4.1:Zookeeper集群中的角色
Zookeeper集群中的角色主要有以下三类:
4.2:设计目的
(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创建集群
使用三个zookeeper搭建一个伪集群,应用部署在linux系统:192.168.110.128;服务器监听端口为2181、2182、2183;投票选举端口为2881/3881、2882/3882、2883/3883。
三个集群都在:/usr/local/zookeepercluster目录下
子目录分别为:zookeeper01、zookeeper02、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常见命令
启动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
表示:退出控制台