一、介绍

  一个分布式协调服务框架;

  一个精简的文件系统,每个节点大小最好不大于1MB;

  众多hadoop组件依赖于此,比如hdfs,kafka,hbase,storm等;

  旨在,分布式应用中,提供一个可靠的、可拓展的、分布式的、可配置的协调机制来管理整个集群的状态;

  主要角色有:leader、follower、observer。

二、简单使用配置

  安装很简单。一个tar包解压即可。

  启动所需的配置文件为:zk安装目录/conf/zoo.cfg(需将安装包中原zoo_sample.cfg改名为zoo.cfg)

  配置文件中,需指定dataDir,这个参数可以自定义,其意义为存放zk集群环境配置信息的。

  clientport为客户端连接zk端口,默认为2181

  此外,分布式集群zk,需增加配置,指定集群中每一个节点的ip。

  因为我用的是3.4.7版本,集群中本机ip必须指定为0.0.0.0。

  此外,还需要在指定的dataDir的数据目录下,创建一个myid文件,此中只需要写本zk的id。

  我这里的集群是3台zk。每台配置基本都是如此,其他都是默认配置。

  启动命令:./zkServer.sh start ----->>>观察zk状态:./zkServer.sh status可以观察当前zk服务状态,启动会显示zk的角色。

  启动zk客户端可以进行一些简单对于zk的操作:./zkCli.sh

三、基本运行原理

  1、zk结构

    

  1)zk有一个根节点------>>>"/";

  2)每个节点都叫znode节点;

  3)每个znode都会有自己的子节点;

  4)每个子节点的路径都是唯一的;

  5)不可用zk节点存储海量数据,第一与其使用场景不符合,第二zk对节点的存储基于内存,容易撑爆内存,且多台zk存储的属于都一致;

  6)zk持久化目录就在于传说中的,配置文件中指定的dataDir目录;

  7)zk回为每一个操作,除读之外的,分配一个全局递增的事务id;

  8)zk可以创建临时顺序节点,基于此,主节点服务器可以对应一个临时节点,备用服务器监控此临时节点,当主节点挂了时,此备用节点也会消失,从而备用节点可以顶上,从而zk可以管理集群中节点的服务状态。

   2、zk选举

  zk本身是支持HA的,在集群中会存在一个leader,其他都是follower,leader和follower之间会存在心跳访问,当leader挂了之后,zk集群接下一步的操作为重新选举新的leader;

  1)如果并非leader挂了的情况,而是新启动zk集群,那么zk集群会先从本地指定的dataDir中恢复本节点数据,找到本方最大的事务id,即是最新的事务,此阶段为数据恢复阶段;

  2)选举过程,集群中的每台zk都会向彼此提交选举协议,希望成为leader;

    选举协议中包含本节点最新的事务id,自己在集群中的id,逻辑时钟值(确保是在同一轮选举中);

    这时候zk节点会多出一个状态为looking状态;

  3)PK原则,先比较事务id,谁的事务id最大谁是leader;

    如果zxid比较不出,那就比选举id,此时需满足过半性原则,01、02、03为02,01、03、02为03,02、03,01为03,03、02、01为03

    简单总结,进行id比较,从先向后启动顺序比较,谁满足了一半同意,谁就是leader。

    zk的选举机制可以保证崩溃恢复,当leader挂了之后,如果集群数量满足过半性,那么就会从剩下的follower中选出薪的leader。

  3、zk分布式一致性算法

  先了解分布式一致性算法有哪些:

  2PC算法-------->>>二阶段提交算法:

  阶段一:leader向follower询问是否可以进行事务提交操作,follower进行预执行,如果都成功,先不提交,返回成功ack给leader;

  阶段二:若所有follower都是成功ack,那么leader通知所有follower进行事务提交操作,事务完成;

      若有follower有返回失败ack或者超时响应,leader通知所有follower进行回滚操作,follower给leader返回回滚ack。事务失败。

  优点是简单,方便实现。

  缺点是同步阻塞,leader在1阶段后一致在等待,造成时间浪费;

  leader会存在单点问题,事务中leader挂了的话,那么整个事务将无法继续运行。

  ZK使用的是改进后Paxos算法,也是改进后的二阶段提交算法:ZAB协议:

  1)进行消息原子广播,保证数据一致性;

  2)崩溃恢复,解决了2PC算法的单点问题。

  简单说明ZAB协议:

  1)zk通过原子(消息)广播的方式进行通信;

  2)zk有一个单一的leader接收并处理所有client的事务请求,然后将数据状态的更新,通过广播的方式通知到所有的follower或者Observer中;

  3)每一个事务请求都有一个全局唯一的id,此id为zxid,递增;

  4)通过消息的广播的方式,每个follower接收到事务请求后,处理事务后,返回ack,只要follower收到半数以上的成功ack事务即成功。

  但说到这里,并未解决leader的单点问题,并且只是半数ack即确认事务成功,虽然提高了效率,但是事务一致性可疑;

  所以,zk更加详细的ZAB协议应该为:

  1)leader将所有的事务分配一个递增的全局事务id;

  2)leader在进行原子广播事务操作时,为每一个follower单独创建一个propersal(提案)队列,队列遵循fifo的策略,将事务操作放入,然后原子广播出去;

  3)follower也有一个先入先出的事务队列,收到事务操作后,将事务操作写入事务日志中,然后反馈给leader,ack,leader收到半数以上的follower的ack后,会再次发出原子广播指挥所有的follower进行事务提交操作;

  这个时候,假如有的follower没有返回ack,但是收到了commit指令,那么将直接执行完事务后提交事务;

  如果这个follower挂掉了,那么当他重启时会进入数据恢复阶段,与follower进行数据一致性的同步,由这一点可见过半性原则的重要性;

  当leader挂了之后,进入到崩溃恢复阶段;

  1)整个zk集群假如仍有半数以上活着,先进行leader的选举操作;

  2)如果所有的follower事务id都是一致的,从来没有接受过之前的事务操作,那么此事务就当没执行过,飘到外星宇宙去了(因为leader极端的在一瞬间进行原子广播时,失去了所有的follower);

  3)那么根据zk的选举原则,新leader的事务id一定是最新的,对于刚才的事务,要不已经提交,要不未进行提交操作,对于未进行提交操作的,新的leader复制继续完成此事务,进行事务操作;

  4)zk集群进入广播模式,新来的节点进行数据恢复。当原leader恢复了之后,会废掉自己的porpersal,从而成为follower。

参考:https://www.jianshu.com/p/400a44edee88

hadoop知识整理(4)之zookeeper的更多相关文章

  1. 转:hadoop知识整理

    文章来自于:http://tianhailong.com/hadoop%E7%9F%A5%E8%AF%86%E6%95%B4%E7%90%86.html 按照what.how.why整理了下文章,帮助 ...

  2. hadoop知识整理(2)之MapReduce

    之前写的关于MR的文章的前半部分已丢. 所以下面重点从3个部分来谈MR: 1)Job任务执行过程,以及主要进程-ResourceManager和NodeManager作用: 2)shuffle过程: ...

  3. hadoop知识整理(1)之HDFS

    一.HDFS是一个分布式文件系统 体系架构: hdfs主要包含了3部分,namenode.datanode和secondaryNameNode namenode主要作用和运行方式: 1)管理hdfs的 ...

  4. hadoop知识整理(5)之kafka

    一.简介 来自官网介绍: 翻译:kafka,是一个分布式的流处理平台.LinkedIn公司开发.scala语言编写.   1.支持流处理的发布订阅模式,类似一个消息队列系统: 2.多备份存储,副本冗余 ...

  5. hadoop知识整理(3)之MapReduce之代码编写

    前面2篇文章知道了HDFS的存储原理,知道了上传和下载文件的过程,同样也知晓了MR任务的执行过程,以及部分代码也已经看到,那么下一步就是程序员最关注的关于MR的业务代码(这里不说太简单的): 一.关于 ...

  6. kafka知识整理

    title: kafka知识整理 date: 2019-06-18 10:59:46 categories: MQ tags: kafka --- 转载自:https://www.cnblogs.co ...

  7. js事件(Event)知识整理

    事件(Event)知识整理,本文由网上资料整理而来,需要的朋友可以参考下   鼠标事件 鼠标移动到目标元素上的那一刻,首先触发mouseover 之后如果光标继续在元素上移动,则不断触发mousemo ...

  8. Kali Linux渗透基础知识整理(四):维持访问

    Kali Linux渗透基础知识整理系列文章回顾 维持访问 在获得了目标系统的访问权之后,攻击者需要进一步维持这一访问权限.使用木马程序.后门程序和rootkit来达到这一目的.维持访问是一种艺术形式 ...

  9. Kali Linux渗透基础知识整理(二)漏洞扫描

    Kali Linux渗透基础知识整理系列文章回顾 漏洞扫描 网络流量 Nmap Hping3 Nessus whatweb DirBuster joomscan WPScan 网络流量 网络流量就是网 ...

随机推荐

  1. flask之Flask特殊装饰器

    flask_decorators.py ''' Flask中的特殊装饰器: (1)@app.before_request 请求到达视图函数之前,进行自定义操作,类似django中间件中的process ...

  2. ThreadLocal 内存泄漏问题深入分析

    写在前面 ThreadLocal 基本用法本文就不介绍了,如果有不知道的小伙伴可以先了解一下,本文只研究 ThreadLocal 内存泄漏这一问题. ThreadLocal 会发生内存泄漏吗? 先给出 ...

  3. 如何在没有core文件的情况下用dmesg+addr2line定位段错误

    前言 在现网环境下,程序奔溃后不一定会留下core文件,原因有很多,比如存储空间不足就是其中一个常见的原因.此时我们只能依据linux记录的错误日志来定位问题. 涉及linux命令 本文涉及以下几条命 ...

  4. php连接数据库 需要下载adodb

    <?include('adodb/ADOdb.inc.php'); # 加载ADODB$conn = &ADONewConnection('odbc_mssql'); # 建立一个连结$ ...

  5. html5拖动监听

    在拖动目标上触发事件 (源元素): ondragstart - 用户开始拖动元素时触发 ondrag - 元素正在拖动时触发 ondragend - 用户完成元素拖动后触发 释放目标时触发的事件: o ...

  6. Istio Gateway网关

    Istio Ingress Gateway Istio 服务网格中的网关 使用网关为网格来管理入站和出站流量,可以让用户指定要进入或离开网格的流量. 使用网关为网格来管理入站和出站流量,可以让用户指定 ...

  7. Life In Changsha College- 第三次冲刺

    第三次冲刺任务 设计登录注册功能. 用户故事 用户打开“生活在长大”的界面,选择登录 已注册过则输入用户名和密码直接登录 未注册用户则可选择注册功能,注册成功后登录 登录成功则弹出提示框 系统结构图环 ...

  8. [JavaWeb基础] 010.Struts2 下载文件

    在web开发中,我们经常会有文件的上传下载功能,上一篇的介绍中我们讲解了上传功能,那么这次我们来讲讲下载功能. 1.首先我们需要有一个用于处理下载的测试页面,也就是jsp. <body> ...

  9. 关于安装Linux-centOS时遇到的问题

    1.新建虚拟机实例后倒入centos镜像开机报错.提示不支持 64 位.... 重新下载虚拟机安装包,重新安装. 2.安装到检查光盘镜像的下一步,vm is nor support (or ... c ...

  10. 副业收入是我做程序媛的3倍,工作外的B面人生

    到“程序员”,多数人脑海里首先想到的大约是:为人木讷.薪水超高.工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是 ...