Zookeeper机制和应用场景

2023-05-16

Zookeeper简介

Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等等。

  • Zookeeper就是用来做第三方的,起作用只有俩个。
    1、管理(存储、读取)用户提交的数据。
    2、并为数据提供监听功能。(监听服务器是有正常)

  • Zookeeper本来就是一个分布式集群(只要有半数以上的节点存活,zookeeper就能正常*服务)

  • Zookeeper服务的场景涵盖:主从协调、服务器节点的动态上下线、同意配置管理、分布式共享锁、同意服务名称。

  • Keepalived也是一种保护数据的软件,通过建立虚拟的ip地址来访问别人,而不是用作服务器来让客户端进行访问。所以在保护服务器数据时这个没用。

Zookeeper基本概念

zk角色

Zookeeper中的角色主要有以下三类,如下表所示:
这里写图片描述

zk service网络结构

Zookeeper的工作集群可以简单分成两类,一个是Leader,唯一一个,其余的都是follower,这样才能确定Leader是通过内部选举确定的。
这里写图片描述

工作流程
Leader工作流程 

—恢复数据;
—维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型;
—Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。

PING 消息是指Learner的心跳信息;
REQUEST消息是Follower发送的提议信息,包括写请求及同步请求;
ACK消息是Follower的对提议 的回复,超过半数的Follower通过,则commit该提议;
REVALIDATE消息是用来延长SESSION有效时间。

Leader的工作流程简图具体如下所示:
这里写图片描述

Follower工作流程 

Follower主要有四个功能:
— 向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
— 接收Leader消息并进行处理;
— 接收Client的请求,如果为写请求,发送给Leader进行投票;
— 返回Client结果。

  • Follower的消息循环处理如下几种来自Leader的消息:
    — PING消息: 心跳消息;
    — PROPOSAL消息:Leader发起的提案,要求Follower投票;
    — COMMIT消息:服务器端最新一次提案的信息;
    — UPTODATE消息:表明同步完成;
    — REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session还是允许其接受消息;
    — SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。
    Follower的工作流程简图具体如下所示:
    · 这里写图片描述
zk读写数据

1、Zookeeper是一个由多个server组成的集群
2、 一个leader,多个follower
3、每个server保存一份数据副本
4、 全局数据一致
5、 分布式读写
6、 更新请求转发,由leader实施
ps:其实写数据的时候不是要保证所有zk节点都写完才响应,而是保证一半以上的节点写完了就把这次变更更新到内存,并且当做最新命名空间的应用。所以在读数据的时候可能会读到不是最新的zk节点,这时候只能通过sync()解决。这里先不考虑了,假设整个zk service都是同步meta信息的,后面的文章再讨论。

Zookeeper的选举机制

一种是基于basic paxos实现的,另外一种是基于fast paxos算法实现的。

系统默认的选举算法为fast paxos。

 

Zookeeper leader 的fast paxos选举 
 
  • 半数通过
    – 3台机器 挂一台 2>3/2
    – 4台机器 挂2台 2!>4/2
  
  • A提案说,我要选自己,B你同意吗?C你同意吗?B说,我同意选A;C说,我同意选A。(注意,这里超过半数了,其实在现实世界选举已经成功了。
   但是计算机世界是很严格,另外要理解算法,要继续模拟下去。)
  • 接着B提案说,我要选自己,A你同意吗;A说,我已经超半数同意当选,你的提案无效;C说,A已经超半数同意当选,B提案无效。
  • 接着C提案说,我要选自己,A你同意吗;A说,我已经超半数同意当选,你的提案无效;B说,A已经超半数同意当选,C的提案无效。
  • 选举已经产生了Leader,后面的都是follower,只能服从Leader的命令。
  
而且这里还有个小细节,就是其实谁先启动谁当头。

下面是fast paxos选举流程图:
   这里写图片描述

 

Zookeeper leader 的basic paxos选举

我们先弄懂什么的zxid然后再看basic paxos算法的逻辑:
zxid

  • ZooKeeper状态的每一次改变, 都对应着一个递增的Transaction id, 该id称为zxid. 由于zxid的递增性质, 如果zxid1小于zxid2, 那么zxid1肯定先于zxid2发生.
  
  创建任意节点, 或者更新任意节点的数据, 或者删除任意节点, 都会导致Zookeeper状态发生改变, 从而导致zxid的值增加.

basic paxos选举流程
  • 选举线程由当前Server发起选举的线程担任,其主要功能是对投票结果进行统计,并选出推荐的Server;
  • 选举线程首先向所有Server发起一次询问(包括自己);
  • 选举线程收到回复后,验证是否是自己发起的询问(验证zxid是否一致),然后获取对方的id(myid),并存储到当前询问对象列表中,最后获取对方提议的leader相关信息(id,zxid),并将这些信息存储到当次选举的投票记录表中;
  • 收到所有Server回复以后,就计算出zxid最大的那个Server,并将这个Server相关信息设置成下一次要投票的Server;
  • 线程将当前zxid最大的Server设置为当前Server要推荐的Leader,如果此时获胜的Server获得n/2 + 1的Server票数, 设置当前推荐的leader为获胜的Server,将根据获胜的Server相关信息设置自己的状态,否则,继续这个过程,直到leader被选举出来。

通过流程分析我们可以得出:要使Leader获得多数Server的支持,则Server总数必须是奇数2n+1,且存活的Server的数目不得少于 n+1.每个Server启动后都会重复以上流程。在恢复模式下,如果是刚从崩溃状态恢复的或者刚启动的server还会从磁盘快照中恢复数据和会话信 息,zk会记录事务日志并定期进行快照,方便在恢复时进行状态恢复。
  这里写图片描述

同步流程

选完leader以后,zk就进入状态同步过程。

  • leader等待server连接;
  • Follower连接leader,将最大的zxid发送给leader;
  • Leader根据follower的zxid确定同步点;
  • 完成同步后通知follower 已经成为uptodate状态;
  • Follower收到uptodate消息后,又可以重新接受client的请求进行服务了。

同步的具体流程图如下所示:
这里写图片描述

常规疑问

1、 为什么zookeeper集群的数目,一般为奇数个?
  •Leader选举算法采用了Paxos协议;
  •Paxos核心思想:当多数Server写成功,则任务数据写成功如果有3个Server,则两个写成功即可;如果有4或5个Server,则三个写成功即可。
  •Server数目一般为奇数(3、5、7)如果有3个Server,则最多允许1个Server挂掉;如果有4个Server,则同样最多允许1个Server挂掉由此,
   我们看出3台服务器和4台服务器的的容灾能力是一样的,所以为了节省服务器资源,一般我们采用奇数个数,作为服务器部署个数。
2、Zookeeper 的数据模型 
  » 层次化的目录结构,命名符合常规文件系统规范
  » 每个节点在zookeeper中叫做znode,并且其有一个唯一的路径标识
  » 节点Znode可以包含数据和子节点,但是EPHEMERAL类型的节点不能有子节点
  » Znode中的数据可以有多个版本,比如某一个路径下存有多个数据版本,那么查询这个路径下的数据就需要带上版本
  » 客户端应用可以在节点上设置监视器
  » 节点不支持部分读写,而是一次性完整读写
3、Zookeeper 的节点
  » Znode有两种类型,短暂的(ephemeral)和持久的(persistent)
  » Znode的类型在创建时确定并且之后不能再修改
  » 短暂znode的客户端会话结束时,zookeeper会将该短暂znode删除,短暂znode不可以有子节点
  » 持久znode不依赖于客户端会话,只有当客户端明确要删除该持久znode时才会被删除
  » Znode有四种形式的目录节点
  » PERSISTENT(持久的)
  » EPHEMERAL(暂时的)
  » PERSISTENT_SEQUENTIAL(持久化顺序编号目录节点)
  » EPHEMERAL_SEQUENTIAL(暂时化顺序编号目录节点)
应用篇
分布式系统的运行是很复杂的,因为涉及到了网络通信还有节点失效等不可控的情况。下面介绍在最传统的master-workers模型,主要可以会遇到什么问题,传统方法是怎么解决以及怎么用zookeeper解决。
Master节点管理
集群当中最重要的是Master,所以一般都会设置一台Master的Backup。
Backup会定期向Master获取Meta信息并且检测Master的存活性,一旦Master挂了,Backup立马启动,接替Master的工作自己成为Master,分布式的情况多种多样,因为涉及到了网络通信的抖动,针对下面的情况:
1. Backup检测Master存活性传统的就是定期发包,一旦一定时间段内没有收到响应就判定Master Down了,于是Backup就启动,如果Master其实是没有down,Backup收不到响应或者收到响应延迟的原因是因为网络阻塞的问题呢?Backup也启动了,这时候集群里就有了两个Master,很有可能部分workers汇报给Master,另一部分workers汇报给后来启动的Backup,这下子服务就全乱了。
· Backup是定期同步Master中的meta信息,所以总是滞后的,一旦Master挂了,Backup的信息必然是老的,很有可能会影响集群运行状态。
解决问题:
Master节点高可用,并且保证唯一。
Meta信息的及时同步。
* Zookeeper Master选举 *
  Zookeeper会分配给注册到它上面的客户端一个编号,并且zk自己会保证这个编号的唯一性和递增性,N多机器中只需选出编号最小的Client作为Master就行,并且保证这些机器的都维护一个一样的meta信息视图,一旦Master挂了,那么这N机器中编号最小的胜任Master,Meta信息是一致的。
集群worker管理
集群中的worker挂了是很可能的,一旦worker A挂了,如果存在其余的workers互相之间需要通信,那么workers必须尽快更新自己的hosts列表,把挂了的worker剔除,从而不在和它通信,而Master要做的是把挂了worker上的作业调度到其他的worker上。同样的,这台worker重新恢复正常了,要通知其他的workers更新hosts列表。传统的作法都是有专门的监控系统,通过不断去发心跳包(比如ping)来发现worker是否alive,缺陷就是及时性问题,不能应用于在线率要求较高的场景
解决问题:
集群worker监控。
* Zookeeper监控集群 *
  利用zookeeper建立znode的强一致性,可以用于那种对集群中机器状态,机器在线率有较高要求的场景,能够快速对集群中机器变化作出响应。
分布式锁
在一台机器上要多个进程或者多个线程操作同一资源比较简单,因为可以有大量的状态信息或者日志信息提供保证,比如两个A和B进程同时写一个文件,加锁就可以实现。但是分布式系统怎么办?需要一个三方的分配锁的机制,几百台worker都对同一个网络中的文件写操作,怎么协同?还有怎么保证高效的运行?
解决问题:
高效分布式的分布式锁
Zookeeper分布式锁
  分布式锁主要得益于ZooKeeper为我们保证了数据的强一致性,zookeeper的znode节点创建的唯一性和递增性能保证所有来抢锁的worker的原子性。
配置文件管理
集群中配置文件的更新和同步是很频繁的,传统的配置文件分发都是需要把配置文件数据分发到每台worker上,然后进行worker的reload,这种方式是最笨的方式,结构很难维护,因为如果集群当中有可能很多种应用的配置文件要同步,而且效率很低,集群规模一大负载很高。还有一种就是每次更新把配置文件单独保存到一个数据库里面,然后worker端定期pull数据,这种方式就是数据及时性得不到同步。
解决问题:
统一配置文件分发并且及时让worker生效
Zookeeper发布与订阅模型
  发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新。例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Zookeeper机制和应用场景 的相关文章

  • java.lang.reflect.InvocationTargetException

    产生原因 1 包冲突 有重复包或者缺少包 2 项目jdk和部署jdk版本不一样 导致InvocationTargetException异常信息返回一个空值 没有调用invoc里的重写消息方法 3 映射文件发生改变 对于不同原因的解决 1 包
  • ZooKeeper(一):基础介绍

    文章目录 什么是 ZooKeeper ZooKeeper 发展历史 ZooKeeper 应用场景 ZooKeeper 服务的使用 ZooKeeper 数据模型 data tree 接口 znode 分类 总结 什么是 ZooKeeper Z
  • 【狂神说Java】SpringBoo

    作者简介 CSDN内容合伙人 信息安全专业在校大学生 系列专栏 添砖加瓦 狂神说JAVA系列笔记 新人博主 欢迎点赞收藏关注 会回访 个人格言 舞台再大 你不上台 永远是个观众 平台再好 你不参与 永远是局外人 能力再大 你不行动 只能看别
  • 五:Zookeeper分布式一致性协议ZAB源码剖析

    目录 ZAB协议介绍 消息广播 崩溃恢复 数据同步 ZAB写数据源码流程图 整个Zookeeper就是一个多节点分布式一致性算法的实现 底层采用的实现协议是ZAB ZAB协议介绍 ZAB 协议全称 Zookeeper Atomic Broa
  • python-kafka多线程快速读取consumer消费者数据,同时使用批读取与无限流读取改进

    python单线程循环读取consumer会很浪费时间 而且速率远远低于生产者可容纳的速率 因此我们使用多线程来处理IO密集型的读取操作 文章目录 极简的示例 1 生产者 先运行 2 消费者部分多线程读取 消费者改进 1 批次读取 并将读取
  • 服务 zookeeper 不支持 chkconfig

    在给zk设置开机启动的时候 报错 服务 zookeeper 不支持 chkconfig 因为配置文件是从别人的博客了拷贝的 只是改了个性化的部分 然后就粘贴到服务器上了 服务器上使用service能正常执行start stop status
  • Dubbo SpringBoot版本入门

    Dubbo SpringBoot版本入门 1 目的 2 方法 2 1 系统工程总体介绍 2 2 系统工程环境搭建 2 2 1 新建 springboot order service consumer 服务 2 2 2 新建 springbo
  • CAP和BASE

    CAP概念 Consistency 一致性 所有节点在同一时间具有相同的数据 Availability 可用性 保证每个请求不管成功或者失败都有响应 Partition Tolerance 分区容错性 系统中任意信息的丢失或失败不会影响系统
  • zookeeper看这一篇就够了

    第一章 zookeeper简介 第1节 zookeeper的由来 1 2 3 4 1 zookeeper最早起源于雅虎研究院的一个研究小组 2 在雅虎内部很多大型系统基本都需要依赖一个类似的系统来进行分布式协调 并且这个系统还有单点问题 3
  • ZooKeeper系统模型之集群间消息通信。

    ZooKeeper的消息类型大体上可以分为四类 分别是 数据同步型 服务器初始化型 请求处理型和会话管理型 数据同步型 数据同步型消息是指在Learner和Leader服务器进行数据同步的时候 网络通信所用到的消息 通常有DIFF TRUN
  • kafka详解及集群环境搭建

    一 kafka详解 安装包下载地址 https download csdn net download weixin 45894220 87020758 1 1Kafka是什么 1 Kafka是一个开源消息系统 由Scala写成 是由Apac
  • dubbo 项目既是提供方又是消费方,调用不到服务问题

    1 先查看服务提供者有没有注册 这里通过安装eclipse中的zookeeper插件 进行了查看 服务已经注册上了 2 注册上以后 查看调用者有没有在zookeeper中注册 此时通过查看 并没有 3 没有注册上 然后查看是否是配置哪里出了
  • 手把手带你撸zookeeper源码系列目录

    手把手带你撸zookeeper源码 前言 手把手带你撸zookeeper源码 配置文件 手把手带你撸zookeeper源码 如何启动一个zookeeper服务 手把手带你撸zookeeper源码 从源码角度分析zookeeper启动时都做了
  • Zookeeper 基本操作

    Zookeeper 基本操作 文章目录 Zookeeper 基本操作 1 查看zk的运行状态 2 客户端连接zk 3 ls 查看 4 get 获取节点数据和更新信息 5 stat 获得节点的更新信息 6 ls2 ls命令和stat命令的整合
  • 年底裸辞准备面试,我用7张图画了ZK分布式锁!

    一 写在前面 之前写过一篇文章 都2022年了 出去面试连分布式锁的源码你都不会画 给大家说了一下Redisson这个开源框架是如何实现Redis分布式锁原理的 这篇文章再给大家聊一下ZooKeeper实现分布式锁的原理 同理 我是直接基于
  • zookeeper3.4.6集群部署

    在安装Zookeeper之前 首先需要确保的就是主机名称 可选 hosts都已经更改 并且JDK成功安装 1 安装Zookeeper 使用命令 tar zxvf 命令将gz压缩文件解压 笔者Zookeeper的安装目录为 home Hado
  • 从zookeeper官方文档系统学习zookeeper

    从zookeeper官方文档系统学习zookeeper 1 zookeeper 2 zookeeper 文档 3 zookeeper 单机版 3 1 配置 3 2 启动 3 3 验证 4 zookeeper 集群版 4 1 配置 4 2 启
  • 微服务框架

    微服务框架 1 SOA思想 面向服务的架构 SOA 是一个组件模型 它将应用程序的不同功能单元 称为服务 进行拆分 并通过这些服务之间定义良好的接口和协议联系起来 接口是采用中立的方式进行定义的 它应该独立于实现服务的硬件平台 操作系统和编
  • 终于找到了最新版的Zookeeper入门级教程,建议收藏!

    小熊学Java https javaxiaobear cn 1 分布式一致性 1 CAP 理论 CAP 理论指出对于一个分布式计算系统来说 不可能同时满足以下三点 一致性 在分布式环境中 一致性是指数据在多个副本之间是否能够保持一致的特性
  • 终于找到了最新版的Zookeeper入门级教程,建议收藏!

    小熊学Java https javaxiaobear cn 1 分布式一致性 1 CAP 理论 CAP 理论指出对于一个分布式计算系统来说 不可能同时满足以下三点 一致性 在分布式环境中 一致性是指数据在多个副本之间是否能够保持一致的特性

随机推荐

  • (1)redis基础知识

    redis数据库 默认有16个数据库 xff0c redis conf有配置database 16数据库相关操作 span class token keyword select span 2 span class token comment
  • chown -R 用户名:组名 ./ 及 chown用法介绍

    当我们在不通过 yum CentOS apt get Ubuntu 来安装 MySQL 的时候 xff0c 通常执行以下命令来改变目录的拥有者 xff1a root 64 localhost chown R mysql mysql 这两个
  • Java中main函数调用同类中的方法

    1 需要创建这个类的实例 xff0c 再进行调用 br public class Test public static void main String args Test t 61 new Test t train void train
  • java开发工具IntelliJ或eclipse中maven项目pom文件错误failed to read artifact descriptor for xx.jar问题解决办法

    下载安装好开发软件之后 xff0c IntelliJ会自动对maven插件进行配置 xff0c file setting 输入maven可查看到配置信息 xff1a pom文件的编写过程会出现project错误 xff0c 第一种想法 xf
  • idea maven路径maven_repository老是自己改成默认的路径C:\Users\Ad\.m2\repository

    intellij中的maven项目 xff0c 打包部署 xff1a 1 程序入口类 extends SpringBootServletInitializer xff0c 并重写configure方法 xff0c builder sourc
  • 大数据在时代下的应用前景

    版权声明 xff1a 本文为博主原创文章 xff0c 未经博主允许不得转载 https blog csdn net garyond article details 81229199 1 概述 近年来 xff0c 随着大数据 云计算 区块链
  • 远程服务器上 tar方式 安装MySQL

    1 下载tar gz xff0c 解压到 usr local mysql 2 设置环境变量 vim etc profile export PATH 61 usr local mysql bin usr local mysql lib PAT
  • vue:从一个vue页面引入另一个vue页面的内容

    1 编写被引入的页面 xff1a span class token generics span class token punctuation lt span template span class token punctuation gt
  • Kafka彻底删除topic

    前言 xff1a 删除kafka topic及其数据 xff0c 严格来说并不是很难的操作 但是 xff0c 往往给kafka 使用者带来诸多问题 项目组之前接触过多个开发者 xff0c 发现都会偶然出现无法彻底删除kafka的情况 本文总
  • cas + tomcat 配置步骤详细笔记(一)

    首先需要准备资源如下 xff1a cas server 4 0 0 release zip xff0c cas client 2 0 11 zip xff0c apache tomcat 6 0 29 下面操作在dos下操作 xff08 开
  • Java泛型详解

    1 概述 在引入范型之前 xff0c Java类型分为原始类型 复杂类型 xff0c 其中复杂类型分为数组和类 引入范型后 xff0c 一个复杂类型 就可以在细分成更多的类型 例如原先的类型List xff0c 现在在细分成List lt
  • HDFS上传的文件保存再本机的什么位置?

    在hdfs中创建文件 xff0c 文件会被存储在哪里 xff1f 会就近存储在相应的子节点中的Datanode文件夹中 xff08 如果没有特殊说明的话 xff09 xff0c 主节点中不会有因为主节点中没有Datanode usr loc
  • namenode和secondary namenode之间的联系和区别

    1 namenode是存储客户端想hdfs发送增删改查的要求的元数据的 2 secondary namenode是存储namenode的元数据的 xff0c 防止namenode宕机产生的数据丢失 3 一条元数据打大小是150byte xf
  • Hive读取文件

    hive读取文件 教会hive怎么读文本数据 这样直接读数据就是将文本文件上传到该数据表所在的hdfs的文件夹中 hadoop fs span class hljs built in put span studen dat user hiv
  • Flume实战

    前言 在一个完整的大数据处理系统中 xff0c 除了hdfs 43 mapreduce 43 hive组成分析系统的核心之外 xff0c 还需要数据采集 结果数据导出 任务调度等不可或缺的辅助系统 xff0c 而这些辅助工具在hadoop生
  • sqoop安装

    sqoop安装 作为大数据协作框架之一 xff0c Sqoop是一款用于Hadoop和关系型数据库之间进行相互的数据导入和导出的工具 安装sqoop的前提是已经具备java和hadoop的环境 1 下载并解压 最新版下载地址http ftp
  • 利用视图进行多表关联

    疑问 在Maxcompute中我们关联的码表大于8个 xff0c 然后数据存储量大于500W xff0c 那么在进行sql清洗的时候极有可能会被卡死 可是我们就是要在一张表上关联10多个表 xff0c 比如一张表中的很多字段都要关联码表 x
  • CM&CDH安装

    笔者当时自己装CM amp CDH看了不下10篇博客 xff0c 重装集群不下3次 xff0c 后来快照这个功能深深的刻在了我的心里 这篇博客笔者呕心沥血啊 不过还是会有同学会挂掉 xff0c 所以希望大家做到那里一步记得快照 发一下牢骚
  • jvm复习:主动产生fullGC

    一 jdk8参数 Xms100m Xmx100m Xmn30m XX 43 PrintGCDetails 二 代码 xff1a package cn edu tju test public class GcTest01 public sta
  • Zookeeper机制和应用场景

    Zookeeper简介 Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目 xff0c 它主要是用来解决分布式应用中经常遇到的一些数据管理问题 xff0c 如 xff1a 统一命名服务 状态同步服务 集群管理 分