1.简介
Zookeeper是一个分布式服务协调组件,是Hadoop、Hbase、Kafka的重要组件,它是一个为分布式应用提供一致性服务的组件.
Zookeeper的目标就是封装好复杂易出错的服务,为使用者提供高效、稳定的服务.
使用场景:
1.Hadoop、Hbase、Kafka依赖的组件.
2.作为注册中心,用于维护服务列表.
2.模型
2.1.Zookeeper的文件系统
Zookeeper维护了一个类似文件系统的数据结构,有根目录(/)和若干个子目录(树形结构,与Linux类似).
每个子目录都称为一个znode,znode是可以直接存储数据的,可以自定义增加和删除znode.
创建znode时需要添加数据,删除znode时若该znode拥有子znode时,必须先删除其所有子znode,否则操作将失败.
Zookeeper中的znode类型
1.持久化节点
当客户端创建一个持久化节点后,无论客户端的连接状态是连接还是断开该节点依然存在.
2.持久化节点并顺序编号
当客户端创建一个持久化节点并顺序编号时,znode会自动被编号,当客户端再创建该同名节点时,将会以最后一个同名znode的顺序进行编号.
*即一个客户端创建/p节点,那么Zookeeper将把其节点命名为/p1,当另一个客户端也创建/p节点,那么Zookeeper将把该节点命名为/p2.
3.临时节点
当客户端断开连接之后该节点包括节点中的数据将会被删除.
4.临时节点并顺序编号
与持久化节点并顺序编号的区别是,临时节点并顺序编号会在客户端断开连接之后会自动删除节点.
2.2.Zookeeper的通知机制
客户端可以监听它关心的节点,当目录节点发生变化时(数据改变、被删除、子目录节点增加和删除),Zookeeper会通知客户端.
2.3.Zookeeper集群的一致性同步
*Zookeeper一般是通过集群的方式使用,即多台Zookeeper服务构成一个有关系的组.
当搭建了一个Zookeeper集群,Zookeeper会根据选举算法,从多个Zookeeper服务中选取一个作为Leader,剩余的Zookeeper服务为Follwer,Leader会与各个服务节点建立一个有效的长连接,保证各个节点的通信正常(每台服务器都有可能被选取为Leader).
一旦选取的Leader节点宕机,则会重新组织Zookeeper集群,选取新的Leader之后,也会重新建立连接.(重新选取的时间很短,大概200ms的时间)
当Zookeeper集群搭建完成后,就可以启动很多个客户端,除了Leader以外的节点都可以被客户端连接,并建立长连接,保证客户端与服务器能有效持久的连接.
当某个服务节点收到修改的操作时,首先会把请求转发给Leader,Leader内有处理机制,它会操作修改并且同步修改给所有的Follower服务节点.
3.Zookeeper的使用
3.1.安装
*由于Zookeeper是由java语言编写的,因此在安装Zookeeper前需要安装好JDK,并且配置环境变量$JAVA_HOME
从Zookeeper官网下载zk进行解压安装:
bin目录下的命令:
zkEnv.sh命令是用于配置zk服务启动时的环境变量(包括加载配置文件的路径等).
zkServer.sh命名用于启动zk服务.
zkCli.sh命令用于启动zk客户端.
conf目录下的文件:
log4j.properties文件是zk运行时的日志输出文件,默认日志信息都将打印到bin目录下的Zookeeper.out文件(当使用Zookeeper遇到异常时应该查看此文件下的内容)
zoo_sample.conf文件是zk服务的配置文件,由Zookeeper官方提供(默认zk服务启动时将加载conf目录下的zoo.cfg配置文件)
3.2.配置讲解
Zookeeper启动时默认加载conf目录下的zoo.cfg配置文件,因此将conf目录下的zoo_sample.conf配置文件更名为zoo.cfg(Zookeeper官方提供的),
配置文件
#基础配置
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/Zookeeper/Zookeeper-3.4.6/zkdata
dataLogDir=/usr/Zookeeper/Zookeeper-3.4.6/zklog
clientPort=2181
autopurge.purgeInterval=1
tickTime: initLimit、syncLimit属性的时间单位,值是毫秒.
initLimit: Zookeeper集群搭建前所允许的初始化时间.
*其中一台zk服务启动后,剩余的zk服务必须在initLimit的时间内都启动成功,否则zk进行集群的搭建时会认为未启动的zk服务已失效.
syncLimit: leader发送心跳给follower,follower向leader回复心跳这一过程所允许的最大时长(rtt,往返时间),一旦超过了这个时间,则leader认为该follwer宕机.
dataDir: Zookeeper快照日志的存放目录(一般使用自定义的目录).
dataLogDir: Zookeeper事务日志的存放目录(一般使用自定义的目录).
*如果不配置dataLogDir,那么Zookeeper的事务日志以及快照日志都将写入到dataDir目录下(会严重影响zk的性能).
clientPort: Zookeeper服务的默认端口
3.3.Zookeeper的启动
使用zkServer.sh命令启动Zookeeper服务.
使用jps命令查询zk进程是否启动成功,当出现QuorumPeerMain表示zk启动成功.
*以上的是Zookeeper单个服务的搭建,通常情况下zk都是以集群的方式进行使用.
3.4.Zookeeper集群搭建
1.修改配置文件,添加zk集群配置
#基础配置
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/Zookeeper/Zookeeper-3.4.6/zkdata
dataLogDir=/usr/Zookeeper/Zookeeper-3.4.6/zklog
clientPort=2181
autopurge.purgeInterval=1
#集群配置
server.1=192.168.1.119:2888:3888
server.2=192.168.1.122:2888:3888
server.3=192.168.1.125:2888:3888
在conf文件下使用server.标识属性配置zk集群,使多个zk服务构成一个组(标识必须为整数).
server.本机zk标识 = zk服务地址:leader和follower之间的通信端口:leader选举端口
server.其他zk标识 = zk服务地址:leader和follower之间的通信端口:leader选举端口
*标识与zk服务进行绑定,因此同一个集群下的zk服务的标识不能相同.
*leader和follower之间的通信端口默认是2888、leader选举端口默认是3888
2.在快照日志目录下创建myid文件,文件中的值是本台zk服务的唯一标识
#将1输入到myid文件中
echo "1" > myid
*需要为要构成集群的其他zk服务都进行配置文件的修改以及设置myid文件.
3.启动Zookeeper服务
在 initLimit tickTime的时间内启动集群中的所有zk服务.
4.查看Zookeeper的状态
机器一:
机器二:
机器三:
注意事项
*1.搭建Zookeeper集群(2n+1台服务器),因为根据Zookeeper的工作原理,只要有大于一半的服务器存活,则Zookeeper集群就能够对外提供服务.
*2.搭建zk集群时需关闭每台zk服务器上的防火墙或者开放对应的端口,否则集群中的zk间无法进行通讯.
*3.zk集群在高负荷的工作时会产生大量的事务日志,如果日志长期不进行清理容易将分区中的空间占满最终导致zk服务无法运行,因此需要定期清理zk产生的事务日志(可以配合Linux的crontab命令设置每天定时去执行清除日志文件的脚本)
3.5.Zookeeper客户端操作
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。