简介:
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,它提供了一个分布式环境中的高可用性、高性能、有序访问的数据存储,可以让分布式应用程序能够实现高效协调。提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户,让应用程序开发人员可以专注于应用程序的业务逻辑而不必关心协调任务的具体细节。ZooKeeper包含一个简单的原语集,提供Java和C的接口。ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在$zookeeper_home\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
ZooKeeper的优点包括:
ZooKeeper是一个强大且灵活的分布式协调服务,适用于大规模分布式系统的场景。
Index of /apache/zookeeper/zookeeper-3.7.1
注意: 3.5.5开始的版本要下载尾部有bin 别问为什么会报错
3.5.5开始,带有bin名称的包才是我们想要的下载可以直接使用的,里面有编译后的二进制的包。之前版本tar.gz包里面是只是源码包,无法直接使用。
检测是否在系统变量path中配置 %JAVA_HOME%\bin 如果没有新建配置一下
当前是windows的一个伪集群,正常的生产环境中分别部署到每一台机器上,也不是windows而是容器或linux中。
为什么是集群不是单机当然是保证系统高可用了。 开始吧.........
打开conf中的zoo_sample.cfg,修改后另存为zoo.cfg ,原始(zoo_sample.cfg)文件不会被执行。
1.tickTime:CS通信心跳时间Zookeeper 服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个 tickTime 时间就会发送一个心跳。tickTime以毫秒为单位。tickTime=2000
2.initLimit:LF初始通信时限集群中的follower服务器(F)与leader服务器(L)之间初始连接时能容忍的最多心跳数(tickTime的数量)。initLimit=5
3.syncLimit:LF同步通信时限集群中的follower服务器与leader服务器之间请求和应答之间能容忍的最多心跳数(tickTime的数量)。syncLimit=2
4.dataDir:数据文件目录Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这个目录里。dataDir=/home/zookeeper/zookeeper/zkdata
5.clientPort:客户端连接端口客户端连接 Zookeeper 服务器的端口,Zookeeper 会监听这个端口,接受客户端的访问请求。clientPort=2181
6.服务器名称与地址:集群信息(服务器编号,服务器地址,LF通信端口,选举端口)规则如下:集群分布模式,server.id(数字)=ip:集群交互端口:选举leader端口
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
注意: 下面路径单斜 " \ " 会当做是转义符处理 " \\ " 斜杠可以解决。(单机没问题 如果是集群 必报错)
#数据文件目录
dataDir=D:\work\zookeeperColony\apache-zookeeper-3.7.1-bin-server1\data
#日志文件目录
dataLogDir=D:\work\zookeeperColony\apache-zookeeper-3.7.1-bin-server1\logs
#伪集群分布模式,server.id(注意是数字)=ip:集群交互端口:选举leader端口
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
在server1、 server2、 server3、分别创建 data 文件夹 ,data中创建myid文件(注意:不需要任何后缀),myid文件内容分别为1、2、3(对应的各server.id)。
注意: 集群启动时要检查是否有该文件,如果没有话,会报错!
如果启动闪退 你可以编译 bin 下的 zkServer.cmd 添加pause 可以更清楚看清错误
三个实例都配置完成后启动 bin 下的 zkServer.cmd 报错了
单机可以正常启动,集群就报错。
原因: 集群查找myid文件就嗝屁……是把"\"当做是转义符处理,所以路径错误,找不到myid文件从而启动失败,修改该路径后重新启动一切正常(改为双斜杠\\)
修改路径: dataDir=D:\\work\\zookeeperColony\\apache-zookeeper-3.7.1-bin-server1\\data
dataLogDir=D:\\work\\zookeeperColony\\apache-zookeeper-3.7.1-bin-server1\\logs
启动 server1 server2 server3 (注意: 在启动第一台服务 会一直跳出错误信息,这是因为选举策略 不用管) 机器数量启动过半了才能选出Leader
server2
注意: 我在启动server3 这台服务的时候 由于我的端口被占用 我在server1 server2 server3 中分别对zoo.cfg 中的 server.3=localhost:2289:3389 改为 2286 :2286 方可正常。
server3
通过 cmd 命令行 查看 是否启动正常 命令:jps
通过控制台看看不是 一台LEADING 两台FOLLOWING
server1 是FOLLOWING
server2 是LEADING
server3 是FOLLOWING
总之,集群中id小的机器会向比自己id大的机器投票 如果现在把server2 Leader 关闭 xunh server3 会接任 Leader职务 可以自己试一下 。
一台一台启动太麻烦,创建文件 zookeeperstart.bat内容如下
总结: ZooKeeper的选举策略取决于具体的应用场景和需求。在选择选举策略时,需要考虑性能、可靠性、安全性等因素。不同的策略会对ZooKeeper集群的运行产生不同的影响,需要根据实际情况进行选择。
Zookeeper的ZAB协议是一种分布式一致性协议,用于确保在分布式环境下多个Zookeeper实例之间的数据一致性。它主要包括原子广播和崩溃恢复两个功能。
原子广播:
ZAB协议通过原子广播机制来确保分布式环境下多个Zookeeper实例之间的数据一致性。具体来说,当一个Zookeeper实例(主节点)需要向其他Zookeeper实例(从节点)广播数据时,主节点会将数据以原子的方式广播到所有从节点。这样,所有从节点都能够同步数据,从而确保整个集群中的数据一致性。
崩溃恢复:
当主节点崩溃时,ZAB协议会自动触发崩溃恢复机制。在这种情况下,崩溃的主节点会将其数据复制到备用节点上,并重新选举一个新的主节点。这样,即使主节点崩溃,整个集群仍然能够保持数据一致性。
总结: ZAB协议通过原子广播和崩溃恢复两个机制来确保Zookeeper集群中的数据一致性和可靠性。这使得Zookeeper成为分布式环境下进行高可用性和可靠性部署的理想选择。
ZooKeeper的数据模型主要包含以下几个部分:
1、Name Space:ZooKeeper的数据模型类似于文件系统,使用 Name Space 来表示不同的数据对象。每个 Name Space 由一组唯一的标识符组成,称为节点(Node)。节点是 ZooKeeper 树中的基本单位,每个节点都有一个唯一的数字标识符。
2、Data Store:ZooKeeper 的数据存储在称为数据存储(Data Store)的节点中。每个数据存储节点都是一个文件,用于存储数据和元数据信息。
数据存储节点通常包含以下几个部分:
a. Data:数据存储节点中存储的是数据对象,例如文件、哈希表等。
b. MetaData:数据存储节点中还包含元数据信息,例如文件权限、所有者等。
c. ACL:ACL(访问控制列表)是一个用于定义节点间权限的数据结构。在 ZooKeeper 中,ACL 用于限制不同用户对节点的访问权限。
3、Node:ZooKeeper 树中的每个节点都由一个唯一的数字标识符组成,称为 Znode。Znode 是 ZooKeeper 树中的基本单位,代表着一个数据对象。
Znode 包含以下几个部分:
a. Stat:Znode 包含一个元数据信息,例如文件大小、修改时间等。
b. Data:Znode 存储着实际的数据对象。
c. Children:Znode 可以包含子节点,用于存储子数据对象或者其他 Znode。
4、 Zxid:Zxid 是一个全局唯一的标识符,用于确保每个事件在 ZooKeeper 树中的唯一性。Zxid 用于生成序列号,以便在事件通知和领导者选举过程中使用。
注: ZooKeeper的数据模型通过使用树形结构来组织数据,每个节点代表着一个数据对象,节点之间通过父子关系相互关联。这种结构保证了在分布式系统中所有数据的一致性和事件驱动的行为。
以上是ZK的一些常见节点类型,不同的节点类型在ZK中具有不同的含义和用途。
ZooKeeper 的 watch 监听是一种机制,用于监视分布式系统中的变化。ZooKeeper 的 watch 监听机制可以帮助应用程序实现以下功能:
ZooKeeper 的 watch 监听机制通常由以下组件组成:
ZooKeeper 的 watch 监听机制可以帮助应用程序实现分布式系统的监视、心跳检测、变化检测和自动修复等功能。
导图
以上是Zookeeper集群中的主要角色,它们各司其职,共同保证Zookeeper集群的正常运行。