热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

zookeeper入门及原理

一.zookeeper是干什么的?zookeeper是一个分布式协调框架,其内部主要提供了两个功能文件系统通知机制通过以上两个功能,

一.zookeeper是干什么的?

zookeeper是一个分布式协调框架,其内部主要提供了两个功能

  1. 文件系统
  2. 通知机制

通过以上两个功能,zookeeper可以为我们的分布式服务提供一下几个功能

  1. 命名服务
  2. 配置管理
  3. 队列管理
  4. 分布式锁
  5. 集群管理
    换句话说就是说zookeeper通过文件系统与通知机制为我们的分布式系统实现了以上五个功能

二.zookeeper的文件系统

zookeeper的文件系统我们可以理解为在自己电脑上创建文件夹,与电脑上创建的文件夹不同的是,zookeeper的文件夹是可以存储数据的(最多可以存储1M大小的数据) 每个文件夹我们称之为znode 这种节点是不可以重复的;

znode 也就是zookeeper的节点一共有四种类型的节点

  1. 临时有序
  2. 临时无序
  3. 持久有序
  4. 持久无序
    解释1:临时与持久
    首先我们要知道zookeeper总体上分为两个部分,服务端与客户端,建立节点的命令是客户端与服务端连接,然后在服务端中建立节点,我们上面所说的功能都是服务端的功能,客户端的作用可以理解为向服务端发送命令的作用。

理解了上面的话,我们应该知道 客户端需要与服务端建立连接,所谓临时节点 就是说我们客户端与服务端创建连接的时候 调用创建临时节点的方法 当客户端与服务端的连接断开的时候,这个客户端创建的临时节点就会消失,反之持久节点就是当客户端与服务端断开连接后,节点还存在。

解释2:有序与无序
假设现在zookeeper现存的目录的结构如下

root->p1->p2->p3->p4->pa1->pa2

如果我们现在先建立一个无序节点(有序无序均可),路径是root/p1/t
那么现在zookeeper的节点的结构就是

root->p1->t->p2->p3->p4->pa1->pa2

因为我们是创建的无序节点,这时候如果在创建路径是root/p1/t的节点,就会创建失败,反之如果创建的有序节点,那么即使路径是root/p1/t 我们仍然可以创建成功,这时候zookeeper会自动为我们创建的节点后面追加编号 先创建的节点的名字就是root/p1/t00001 后创建的是root/p1/t00002(00001与00002是为了便于理解而我自己加的 实际上不一定是这个数字 但是理论是一样的)

客户端创建节点额构造函数的参数:路径,数据,权限,节点类型(上面的四个)

至此zookeeper的文件系统的基本原理就基本完毕了

三.通知机制

客户端注册监听自己关心的目录节点,当注册的节点发生变化的时候(数据变动,子目录节点增加 删除等)客户端就会收到通知,客户端可以获取变动的详细信息,所以就可以进行相应的处理了

四.zookeeper在分布式系统中的应用


4.1 命名服务

因为zookeeper的目录的路径是唯一的,所以就可以保证命名是不会冲突的,即可以做服务发现

4.2 配置管理

因为zookeeper的节点可以存储数据,所以我们可以把配置相关的数据存储在zookeeper的节点中,然后客户端利用zookeeper的通知机制首次启动时获取节点中的数据,其次如果节点中的配置信息变动,就会通知监听这个节点的客户端,客户端就会获取最新的配置

4.3 集群管理

集群管理主要有两点,一是否有机器加入或者退出,而master选举

对于1 我们可以让机器连接后就创建临时节点,当机器断开连接的时候,临时节点就会被删除,这样其他的机器监听这个临时节点的父节点,有变化的时候就会通知。

4.4 队列管理

队列管理主要有两点:一个是同步队列怎么实现,另一个是如何实现先进先出(FIFO)
同步队列:只有当全部成员都到齐是,队列才可以用

zookeeper 对于同步队列的实现就是在目录下创建临时节点,然后监听节点数目是否满足要求,当满足要求的时候才可以用

对于第二点我们只需要给节点编号,然后取节点编号最小的数据

总上所述:在目录下创建临时有序节点然后客户端监听这个目录中节点的数目,节点编号最小的开始出队即可实现队列管理

4.5 分布式锁

分布式锁主要有两种,排他锁与共享锁

对于排他锁:所有客户端都去创建临时无序节点a,创建成功的获取共享锁;
对于共享锁:所有客户端都去创建临时有序节点a,编号最小的获取锁;其他的节点监听前一个编号的节点是否存在,不存在的时候本节点即获取锁

五.zookeeper集群的角色

上面所说的都是单服务器的例子,加入我们的服务器很多,就不可能仅仅使用一台zookeeper服务器,这时候就需要搭建zookeeper服务器集群
zookeeper的角色一共有三种

  1. leader:负责投票的发起和决议 更新
  2. follower:接受客户端的请求并返回结果,参与leader选举过程
  3. observer:不参与leader选举过程,不参与过半写成功策略,为了提高读取效率(话句话说只可以读数据)

大概了解以上信息接下来我们讲讲分布式与数据复制(上面一些术语会在下面解释)

六.分布式与数据复制


6.1 数据复制的好处


  1. 容错:一个zookeeper服务器挂掉,其他的服务器还可以用
  2. 可扩展:可以动态的增加节点,提高整体的负载能力
  3. 提高性能:可以直接访问距离客户端租最近的节点

6.2 数据复制的方式

一般来说数据复制有两种方式:

  1. 写主:写特定的节点
  2. 写任意:数据的修改可以任意的节点
    zookeeper采用写任意的策略:原因 可扩展性和吞吐率特别高,机器增加的时候吞吐量不会下降;

6.3 zookeeper的同步流程


  1. leader选举成功后开始进行同步流程
  2. leader与follwer连接,各个follower向leader发送自己最大的事务id zxid
  3. leader根据zxid确定同步点
  4. 完成同步后,会通知follower,状态变为uptodata了
  5. follower收到uptodata这个状态后就知道已经同步完成了,就又可以为客户端提供服务了

七.zookeeper的工作原理

原理就是原子广播:
保证各个server之间的同步,同步时候使用zab协议
zab协议主要又两个模式:同步模式(数据复制)与恢复模式(重新选举leader)
为了保证事务的一致性,zookeeper使用递增的失事务id 共64位,前32位是标识这个事务是在哪个leader下的事务,后32为用来递增
所谓事务 就是每一次会影响服务端状态改变的操作:节点的创建与删除,数据更新session失败

八.zookeeper的三种状态

客户端获取连接后:服务端返回给客户端的状态:

  1. looking 当前服务器不知道谁是leader
  2. leading 当前的服务器就是leader
  3. following 当前服务器集群又leader 但是本服务器不是leader 是follower

九.zookeeper的leader选举流程

几个概念:

  1. 服务器id 越大权重越大
  2. 事务id zxid 数值越大 权重越大
  3. 逻辑始终 投票次数
  4. 选举状态 looking leading following
    选举流程:
    每次都选投自己,然后广播给其他server zookeeper集群的个数需要时单数,便于leader选举
    假设现在又五个zookeeper服务器 ABCDE
    A启动----->投票给自己----->广播----->接受BC的广播—>c的机器id大投给C
    B启动----->投票给自己---->广播------>接受AC的广播—>c的机器id大投给C
    C启动----->投票给自己----->广播----->接受AB的广播—>c的机器id大投给C

因为已经投给C的已经超过半数了,所以DE的就无所谓了,C就是leader了


推荐阅读
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • MySQL数据库锁机制及其应用(数据库锁的概念)
    本文介绍了MySQL数据库锁机制及其应用。数据库锁是计算机协调多个进程或线程并发访问某一资源的机制,在数据库中,数据是一种供许多用户共享的资源,如何保证数据并发访问的一致性和有效性是数据库必须解决的问题。MySQL的锁机制相对简单,不同的存储引擎支持不同的锁机制,主要包括表级锁、行级锁和页面锁。本文详细介绍了MySQL表级锁的锁模式和特点,以及行级锁和页面锁的特点和应用场景。同时还讨论了锁冲突对数据库并发访问性能的影响。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • 本文讨论了在使用Git进行版本控制时,如何提供类似CVS中自动增加版本号的功能。作者介绍了Git中的其他版本表示方式,如git describe命令,并提供了使用这些表示方式来确定文件更新情况的示例。此外,文章还介绍了启用$Id:$功能的方法,并讨论了一些开发者在使用Git时的需求和使用场景。 ... [详细]
author-avatar
ssben_530
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有