Zookeeper维护了一个类似文件系统的数据结构,有根目录(/)和若干个子目录(树形结构,与Linux类似).
每个子目录都称为一个znode,znode是可以直接存储数据的,可以自定义增加和删除znode.
创建znode时需要添加数据,删除znode时若该znode拥有子znode时,必须先删除其所有子znode,否则操作将失败.
1.持久化节点
当客户端创建一个持久化节点后,无论客户端的连接状态是连接还是断开该节点依然存在.
2.持久化节点并顺序编号
当客户端创建一个持久化节点并顺序编号时,znode会自动被编号,当客户端再创建该同名节点时,将会以最后一个同名znode的顺序进行编号.
*即一个客户端创建/p节点,那么Zookeeper将把其节点命名为/p1,当另一个客户端也创建/p节点,那么Zookeeper将把该节点命名为/p2.
3.临时节点
当客户端断开连接之后该节点包括节点中的数据将会被删除.
4.临时节点并顺序编号
与持久化节点并顺序编号的区别是,临时节点并顺序编号会在客户端断开连接之后会自动删除节点.
客户端可以监听它关心的节点,当目录节点发生变化时(数据改变、被删除、子目录节点增加和删除),Zookeeper会通知客户端.
*Zookeeper一般是通过集群的方式使用,即多台Zookeeper服务构成一个有关系的组.
当搭建了一个Zookeeper集群,Zookeeper会根据选举算法,从多个Zookeeper服务中选取一个作为Leader,剩余的Zookeeper服务为Follwer,Leader会与各个服务节点建立一个有效的长连接,保证各个节点的通信正常(每台服务器都有可能被选取为Leader).
一旦选取的Leader节点宕机,则会重新组织Zookeeper集群,选取新的Leader之后,也会重新建立连接.(重新选取的时间很短,大概200ms的时间)
当Zookeeper集群搭建完成后,就可以启动很多个客户端,除了Leader以外的节点都可以被客户端连接,并建立长连接,保证客户端与服务器能有效持久的连接.
当某个服务节点收到修改的操作时,首先会把请求转发给Leader,Leader内有处理机制,它会操作修改并且同步修改给所有的Follower服务节点.
*由于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配置文件)
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服务的默认端口
使用zkServer.sh命令启动Zookeeper服务.
使用jps命令查询zk进程是否启动成功,当出现QuorumPeerMain表示zk启动成功.
*以上的是Zookeeper单个服务的搭建,通常情况下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
#将1输入到myid文件中
echo "1" > myid
*需要为要构成集群的其他zk服务都进行配置文件的修改以及设置myid文件.
*在 initLimit * tickTime的时间内启动集群中的所有zk服务.
机器一:
机器二:
机器三:
*1.搭建Zookeeper集群(2n+1台服务器),因为根据Zookeeper的工作原理,只要有大于一半的服务器存活,则Zookeeper集群就能够对外提供服务.
*2.搭建zk集群时需关闭每台zk服务器上的防火墙或者开放对应的端口,否则集群中的zk间无法进行通讯.
*3.zk集群在高负荷的工作时会产生大量的事务日志,如果日志长期不进行清理容易将分区中的空间占满最终导致zk服务无法运行,因此需要定期清理zk产生的事务日志(可以配合Linux的crontab命令设置每天定时去执行清除日志文件的脚本)
原文:https://www.cnblogs.com/funyoung/p/8778106.html