Zookeeper分布式服务协调组件

2018-06-18 02:11:19来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

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集群搭建完成后,就可以启动很多个客户端与zk服务器进行连接(长连接方式,保证客户端与服务器能有效持久的连接)

 

当某个服务节点收到修改的操作时,首先会把请求转发给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客户端操作

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:java面向对象的理解

下一篇:初级 Java 的 3 本进阶书