大数据ZooKeeper知识点

it2023-07-18  69

Apache ZooKeeper

1.Zookeeper基本知识

1.1.ZooKeeper概述

Zookeeper是一个分布式协调服务的开源框架。主要用来解决分布式集群中应用系统的一致性问题。 ZooKeeper本质上是一个分布式的小文件存储系统。提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理。从而用来维护和监控你存储的数据的状态变化。通过监控这些数据状态的变化,从而可以达到基于数据的集群管理。

1.2.ZooKeeper特性

1.全局数据一致:集群中每个服务器保存一份相同的数据副本,client无论连接到哪个服务器,展示的数据都是一致的,这是最重要的特征; 2.可靠性:如果消息被其中一台服务器接受,那么将被所有的服务器接受。 3.顺序性:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布。 4.数据更新原子性:一次数据更新要么成功(半数以上节点成功),要么失败,不存在中间状态; 5.实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。

1.3.ZooKeeper集群角色

Leader: Zookeeper集群工作的核心 事务请求(写操作)的唯一调度和处理者,保证集群事务处理的顺序性; 集群内部各个服务器的调度者。 对于create,setData,delete等有写操作的请求,则需要统一转发给leader处理,leader需要决定编号、执行操作,这个过程称为一个事务。 Follower: 处理客户端非事务(读操作)请求,转发事务请求给Leader; 参与集群Leader选举投票。 此外,针对访问量比较大的zookeeper集群,还可新增观察者角色。 Observer: 观察者角色,观察Zookeeper集群的最新状态变化并将这些状态同步过来,其对于非事务请求可以进行独立处理,对于事务请求,则会转发给Leader服务器进行处理。 不会参与任何形式的投票只提供非事务服务,通常用于在不影响集群事务处理能力的前提下提升集群的非事务处理能力。

2.ZooKeeper shell

2.1.客户端连接

zkCli.sh -server IP

2.2.shell基本操作

1创建节点

1. 1创建临时节点
create -e
1.2创建顺序节点

create -s

1.3创建永久节点
create

2.读取节点

与读取相关的命令有ls 命令和get 命令,ls命令可以列出Zookeeper指定节点下的所有子节点, 只能查看指定节点下的第一级的所有子节点;get命令可以获取Zookeeper指定节点的 数据内容和属性信息   ls path [watch]   get path [watch]   ls2 path [watch]

3.更新节点

set path data [version] data就是要更新的新内容,version表示数据版本。

4.删除节点

delete path [version] 注意:若删除节点存在子节点,那么无法删除该节点,必须先删除子节点,再删除父节点。 Rmr path 可以递归删除节点。

5.其他命令

history : 列出命令历史

3.ZooKeeper Watcher(监听机制)

ZooKeeper提供了分布式数据发布/订阅功能,一个典型的发布/订阅模型系统定义了一种一对多的订阅关系,能让多个订 阅者同时监听某一个主题对象,当这个主题对象自身状态变化时,会通知所有订阅者,使他们能够做出相应的处理。 ZooKeeper中,引入了Watcher机制来实现这种分布式的通知功能。ZooKeeper允许客户端向服务端注册一个Watcher监 听,当服务端的一些事件触发了这个Watcher,那么就会向指定客户端发送一个事件通知来实现分布式的通知功能。 触发事件种类很多,如:节点创建,节点删除,节点改变,子节点改变等。 总的来说可以概括Watcher为以下三个过程:客户端向服务端注册Watcher、服务端事件发生触发Watcher、客户端回调 Watcher得到触发事件情况

Watch机制特点

一次性触发 事件发生触发监听,一个watcher event就会被发送到设置监听的客户端,这种效果是一次性的,后续再次发生同样的事件,不会再次触发。 事件封装 ZooKeeper使用WatchedEvent对象来封装服务端事件并传递。 WatchedEvent包含了每一个事件的三个基本属性: 通知状态(keeperState),事件类型(EventType)和节点路径(path) event异步发送 watcher的通知事件从服务端发送到客户端是异步的。 先注册再触发 Zookeeper中的watch机制,必须客户端先去服务端注册监听,这样事件发送才会触发监听,通知给客户端。

4.ZooKeeper Java API

org.apache.zookeeper.Zookeeper Zookeeper 是在Java中客户端主类,负责建立与zookeeper集群的会话,并提供方法进行操作。 org.apache.zookeeper.Watcher Watcher接口表示一个标准的事件处理器,其定义了事件通知相关的逻辑,包含KeeperState和EventType两个枚举类,分别代表了通知状态和事件类型,同时定义了事件的回调方法:process(WatchedEvent event)。 process方法是Watcher接口中的一个回调方法,当ZooKeeper向客户端发送一个Watcher事件通知时,客户端就会对相应的process方法进行回调,从而实现对事件的处理。 `public class Demo1 { public static void main(String[] args) throws Exception { //0.创建zk对象 ZooKeeper zk = new ZooKeeper("node01:2181,node02:2181,node03:2181", 3000, new Watcher() { @Override public void process(WatchedEvent watchedEvent) { System.out.println("监听类型 :"+watchedEvent.getType()); System.out.println("监听状态 :"+watchedEvent.getState()); System.out.println("监听路径 :"+watchedEvent.getPath()); } }); //1.创建zk节点和子节点 zk.create("/dashuju12","dashuju12".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); //2.查看节点数据 System.out.println(new java.lang.String(zk.getData("/dashuju12",false,null))); //3.修改节点数据 zk.setData("/dashuju12","dashuju12".getBytes(),-1); //4.删除节点数据 zk.delete("dashuju12",-1); //5.关闭zk zk.close(); } }`

5.ZooKeeper选举机制

zookeeper默认的算法是FastLeaderElection,采用投票数大于半数则胜出的逻辑。

概念

服务器ID 比如有三台服务器,编号分别是1,2,3。 编号越大在选择算法中的权重越大。 选举状态 LOOKING,竞选状态。 FOLLOWING,随从状态,同步leader状态,参与投票。 OBSERVING,观察状态,同步leader状态,不参与投票。 LEADING,领导者状态。 数据ID 服务器中存放的最新数据version。 值越大说明数据越新,在选举算法中数据越新权重越大。 逻辑时钟 也叫投票的次数,同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加,然后与接收到的 其它服务器返回的投票信息中的数值相比,根据不同的值做出不同的判断。

全新集群选举

假设目前有5台服务器,每台服务器均没有数据,它们的编号分别是1,2,3,4,5,按编号依次启动,它们的选择举过程如下: 服务器1启动,给自己投票,然后发投票信息,由于其它机器还没有启动所以它收不到反馈信息,服务器1的状态一直属 于Looking。 服务器2启动,给自己投票,同时与之前启动的服务器1交换结果,由于服务器2的编号大所以服务器2胜出,但此时投票 数没有大于半数,所以两个服务器的状态依然是LOOKING。 服务器3启动,给自己投票,同时与之前启动的服务器1,2交换信息,由于服务器3的编号最大所以服务器3胜出,此时投 票数正好大于半数,所以服务器3成为领导者,服务器1,2成为小弟。 服务器4启动,给自己投票,同时与之前启动的服务器1,2,3交换信息,尽管服务器4的编号大,但之前服务器3已经胜 出,所以服务器4只能成为小弟。 服务器5启动,后面的逻辑同服务器4成为小弟。
最新回复(0)