首页 > 其他分享 >ZooKeeper

ZooKeeper

时间:2023-07-27 20:34:28浏览次数:41  
标签:zookeeper 信令 ZooKeeper leader Zookeeper znode 节点


1 Zookeeper介绍

Zookeeper是一个分布式的协调服务,为分布式应用程序提供synchronization、configuration maintenance、groups和nameing服务。

Zookeeper是一个有众多服务器节点组成的集群,这些节点中有一个主节点(leader),leader是通过leader selection自动地从服务器节点中选举出来。Zookeeper提供了一个类似于标准文件系统目录结构的hierarchal namespace(层次化的命名空间)。如下图所示,hierarchal namespace中的每一个节点都被称为 znode。Znode是组成hierarchal namespace的基本单位。在源码中对应于类DataNode,其维护着节点用户数据、父节点和子节点集合,以及本节点状态。用户可以在 hierarchal namespace中创建znode,将数据保存在znode中,并监听znode的状态变化,Zookeeper会保证client对znode的操作 是顺序一致性。

2 Zookeeper实现分析

Zookeeper服务器节点的实现可以分成两部分:一部分是处理与客户端交互,实现客户端对zookeeper的hierachal namespace的各种操作。另一部分是作为zab算法(paxos算法的zookeeper实现)的参与者(leader、follower、 observer三种角色的其中一种),实现具体的算法逻辑。

在这篇博客里,我们只讨论zookeeper服务器如何实现第一个部分功能。

Zookeeper服务器的hierachal namespace、znode、客户端与服务器连接、以及客户端可以监听服务器的znode状态的watch机制之间的元数据关系如下图所示:

Zookeeper使用Trie树 来实现了hierachal namespace,由PathTrie这个类来完成。为了实现从路径到znode的映射,zookeeper在内存中维护了一个znode的 hashmap,key为znode在hierachal namespace上的路径,value为znode对象,znode在zookeeper源码中由DataNode这个类实现。为了实现client监 听znode的状态变化,zookeeper将与客户端的连接和hierachal namespace的节点路径进行映射,WatchManager这个类就是用于维护这个映射关系的,其中NIOServerCnxn是 zookeeper服务器与client的一个socket连接;为了监听Znode的目录结构的变化和数据变化,zookeeper使用了两个 WatchManager,分别用来监听namespace的目录结构和数据的变化。

所有以上这些关系都封装在DateTree这个类中,DateTree的类图如下所示。

在paxos算法中有三种角色,分别是提案者,接受者和学习者。在zookeeper中有三种类型的节点,分别是leader、follower和 observer三种类型的节点,分别与paxos的三种角色相对应;需要注意的是zookeeper中还有一个learner的概念,这个 learner是paxos中的学习者,leader、follower和observer都是learner(即都是学习者,可以学习提案),但 observer节点除了是learner之外没有其他功能,也就是说observer只能学习已经批准的提案,而不会参与到提案的投票过程中。 observer这个角色的设定是为了保证提案选举的性能不会随着zookeeper集群规模扩大而降低(参与投票的节点越多,每一次投票花费的事件就越 多)。

在zookeeper中用LeaderZooKeeperServer,FollowerZooKeeperServer和

ObserverZooKeeperServer这三个类来实现三种类型的服务器节点。类图如下所示,为了简单起见没有详细给出成员变量和成员函数。

由于Zookeeper的服务器节点有多种类型,不同类型的服务器节点对client发过来的信令都有不同的处理流程,为了实现最大程度上的代码复 用,zookeeper采用了责任链的设计模式来实现各种类型的zookeeper节点。所以在每一个ZookeeperServer上都会维护一个 RequestProcessor责任链,来处理各个节点上的逻辑。

2.1 leaderZookeeperServer

Leader要完成以下几个事情:

1、接收客户端的request请求

2、将会修改同步数据的request请求 转化为proposal,并保存.

3、向所有的follower发送proposal。

4、接收follower的ack。

5、统计收到的ack,如果某一个proposal的ack超过了半数,那么向所有follower发送commit 信令,并向所有observer发送inform信令,执行这个proposal的动作。

6、leader自己执行已经被commit的proposal所对应的操作,并回复结果。

LeaderZookeeperServer的责任链如下面两图所示:

2.2 FollowerZooKeeperServer

Follower:主要负责批准或否决leader提出的proposal。Follower的主要逻辑处理如下:

1、 发现leader。

2、 建立与leader的连接。

3、 向leader注册。(leader activation)

4、 与leader进行同步。

5、 无限循环

---读取从leader处接收到的信令。

---处理从leader处接收到的信令。

A、 如果是PROPOSAL信令(写请求),将此信令投递到FollowerZooKeeperServer的synProcessor。主要作用是回复leader一个ack。

B、 如果是COMMIT信令,将此信令投递到FollowerZooKeeperServer的commitProcessor。最终执行FollowerZooKeeperServer的commit函数。

C、 如果是SYNC信令,将此信令投递到FollowerZooKeeperServer的commitProcessor。commitProcessor直接将此信令转发给FinalRequestProcessor,将sync信令带的内容写入持久层。

FollowZookeeperServer的责任链如下所示:

2.3 ObserverZooKeeperServer

observer:学习已经被commit的proposal的结果,然后执行相应的操作。Observer主要处理逻辑:

1、 发现leader。

2、 连接到leader上,建立TCP连接。

3、 与leader进行同步,同步leader上已经被commit的proposal。

4、 无限循环,读取接收到得信令,处理信令。

1、如果是syn信令,调用ObserverZooKeeperServer的syn函数,投递到commitProcessor中。

2、如果是info信令,同样调用ObserverZooKeeperServer的commit函数,投递到commitProcessor中。

OserverZookeeperServer的责任链基本上与follower的相同如下,只是commitProcessor调用的commit函数里的处理不同:

2.4 Zookeeper各节点交互

Zookeeper各个角色的信令交互图:

最后画了一张各个zookeeper server的信令交互图

http://www.sxt.cn/u/756/blog/5236

标签:zookeeper,信令,ZooKeeper,leader,Zookeeper,znode,节点
From: https://blog.51cto.com/u_2650279/6872516

相关文章

  • 记录java中zookeeper客户端ZkClient一个小坑
    项目中使用org.I0Itec.zkclient.ZkClient库作为zookeeper的连接工具,一直很稳定。不过有个奇怪的问题,从ZooInspetor中连接Zookeeper,看NodeData,会发现数据像图中这样,字符串前面有一段奇怪的字符:一直不清楚"t%"这些像乱码一样的字符是什么东西。因为项目运行的比较稳定,也没报错,就......
  • zookeeper部署
    下载官网路径:https://dlcdn.apache.org/zookeeper/单机部署#解压tar-zxfapache-zookeeper-3.8.1.tar.gz#进入配置文件目录cdapache-zookeeper-3.8.1/conf#拷贝模板文件cp-azoo_sample.cfgzoo.cfg#编辑文件vimzoo.cfg    tickTime=2000    initL......
  • zookeeper(二):安装部署
    一、目标安装部署一套3节点的ZooKeeper集群,并运行起来。规划如下:节点ip主机名软件192.168.1.201zk-node1zookeeper192.168.1.202zk-node2zookeeper192.168.1.203zk-node3zookeeper二、搭建虚拟机1、安装虚拟机软件这里选择的是VirtualBox:Downloads......
  • ZooKeeper 之 zkCli.sh客户端的命令使用
    zkCli.sh的使用ZooKeeper服务器简历客户端./zkCli.sh-timeout0-r-serverip:port./zkCli.sh-serverhostname:port  port一般是2181(默认端口),比如./[email protected]:2181 h显示所有命令lspath:查看某个节点下的所有子节点信息ls/:列出根节点下......
  • 100303- ZooKeeper 配置管理代码实现案例
    一、ZooKeeper的配置管理( ConfigurationManagement)使用场景配置的管理在分布式应用环境中很常见,例如同一个应用系统需要多台 PCServer 运行,但是它们运行的应用系统的某些配置项是相同的,如果要修改这些相同的配置项,那么就必须同时修改每台运行这个应用系统的 PCServe......
  • docker-compose 部署zookeeper
    docker-compose.yamlversion:'3.1'services:zoo1:image:zookeeperrestart:alwayshostname:zoo1ports:-2181:2181environment:ZOO_MY_ID:1ZOO_SERVERS:server.1=zoo1:2888:3888;2181server.2=zoo2:2888......
  • 基于源码安装ZooKeeper
    下载ZK代码[email protected]:wangjingqian1995/zookeeper.gitcdzookeepergitcheckoutbranch-3.8设置环境变量echo"exportZOOKEEPER_HOME=/root/code/java/zookeeper">>/etc/profileecho"exportPATH=$PATH:$ZOOKEEPER_HOME/bin">>......
  • zookeeper-3.4.6的配置与使用
    1、下载我给大家配置好的链接:https://pan.baidu.com/s/1X0GG3yrrw9B85l9SPh2rOA提取码:uk042、解压下载的压缩包,解压到d盘的mysoft文件夹下,如果没有就创建一个,这样你就不用改配置了,如果没有d盘,就在放在c盘下,等下在我写好的配置文件中,修改盘符即可  3、如果你没有和我上面的......
  • java操作zookeeper
    java操作zookeeper创建一个maven项目在pom文件里引入如下依赖:<dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.10</version><scope>test</scope......
  • zookeeper作为注册中心,实现服务注册以及服务发现的思路图解
    一、服务发现 二、服务的发现: ......