韩震博客|关注于学习java&php与交流

Zookeeper分布式服务协调组件

admin 2018年04月11日 Java知识 508 0

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=2000initLimit=10syncLimit=5dataDir=/usr/Zookeeper/Zookeeper-3.4.6/zkdata dataLogDir=/usr/Zookeeper/Zookeeper-3.4.6/zklog clientPort=2181autopurge.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====/usr/Zookeeper/Zookeeper-./=/usr/Zookeeper/Zookeeper-./===.::=.::=.::
复制代码

 

在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  > 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客户端操作

 


值得一看的IT学习资讯类网站!http://hongsehuoxian.com
看到这里如果这篇文章真的帮到你了,不妨打赏一下哦!

以上就是红色火线JAVA加油站整理的关于Zookeeper分布式服务协调组件的文章,
希望可以帮到你,如果你有不同的见解可以留言指正哦,避免让别的java小伙伴在走挫折路。
Java 根据用户名生成字体头像,仿钉钉、通讯录样式
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

分享:

支付宝

微信