深入浅出Zookeeper

能找到的一些zookeeper的资料一上来不是扯一通paxos算法就是一大坨一大坨的代码。很多人对zookeeper更多的是听过,所以这一篇文章就尝试用尽可能用精简的语言科普zookeeper

zookeeper是什么

网上的定义:zookeeper作为一个开源的分布式应用协调系统,作为一个正常人我看完这句话之后是——懵逼。理解一个工具最好的办法是问它解决什么问题的,举个例子:

微服务中每个服务是可以被单独部署的,为了便于Client调用,所有服务都必须在注册中心完成注册。这样Client就可以通过查询注册中心获取有哪些服务可以用(包括服务的调用地址、说明、版本之类的元数据信息)。

无论用什么方式设计注册中心最后我们都要解决一个问题——如何存放服务元数据。

  • 直接JSON序列化后存放在注册中心的硬盘上是最简单的,但是我们的注册中心不应该是单点,它挂了整个系统也就无法正常工作了。所以我们必须集中存储(这样的设计可以让注册中心去中心,变成无状态的服务更容易实现高可用)。
  • 集中存储最好的办法是数据库。比如存放在Mysql或者MongoDB中,如果用Mysql需要使用主从来提高Mysql的可用性;如果是MongoDB我们也需要通过“集群”来提高MongoDB的可用性。这两种技术都增加了系统复杂度——毕竟我只是想存放一些JSON数据而已。

Zookeeper是解决这个问题的一个简单方案,它没有提供像MongoDB的一样的查询、排序功能只提供的简单的数据读写。它的数据结构类似于文件系统,使用API也非常类似读写操作系统的文件系统。比如我们的服务元数据可以设计成这样

app├── app1│ └── metadata└── app2└── metadata

服务注册的时候都会在/app节点下生成以自己服务名称命名的节点(比如 app1)然后把自己的元数据写入到一个名称为metadata的“数据节点”。查询服务的时候只需要获取/app下的所有子节点,需要获取某个服务元数据的时候则直接查询对应目录下的metadata节点。

ZooKeeper zooKeeper = //实例化ZooKeeper//查询服务List<String> appNames = zooKeeper.getChildren("/app", false);for (String appName : appNames) {    String meta = "/app/" + appName + "/meta";     if (zooKeeper.exists(meta, false) != null) {         //查询服务元数据          byte metaBytes[] = zooKeeper.getData(meta, false, null);          //JSON反序列化          AppMetadata metaJava = mapper.readValue(metaBytes, AppMetadata.class);      }}

zookeeper的两把刷子

Zookeeper的一个重要特性是提供了去中心化的数据一致性,在一个Zookeeper集群中我们向任何一台服务器写入数据都会被“同步”到其他服务器上。实现这样的特性必须有两把刷子——选举算法和分布式事务

选举算法

很多人会把zookeeper和paxos算法联系在一起,非常负责任的说——它们没有半毛钱的关系。zookeeper的算法非常简单,比如有3台服务器,(server1的myid=1,server2的myid=2,server3的myid=3)

  • 启动的时候服务器都会向集群中其他服务器发送选举信息(zxid,myid)(相当于选自己做leader)。zxid(ZooKeeper Transaction Id)是最后一次写入的节点数据的事务编号(越大说明数据越新),myid是配置的时候分配的一个编号。比如server1发送的是(0, 1),server2发送(0, 2) 、server3发送(1, 3)
  • 收到选举信息的服务器会做一次比较:1).zxid比较大的一个作为leader(选择最新的数据)2). 如果zxid相同(数据同步)则选择myid比较大的作为leader。3). 把自己选中的leader再次发送出去。比如server1收到server3的信息后选择server3作为leader,server2也选择server3作为leader。二者选择leader之后都会再次发送(1, 3)。
  • 当一台服务器收到(n/2+1)个选举信息的时候就认为leader已经选择成功(n是集群中服务器的数据),停止发送选举信息,进入follower状态。比如3台服务器有2台服务器选择server3作为leader那么选举就成功。

在系统运行过程中如果leader死掉了,所有的follower会重新按照上面的算法选举出新的leader。如果你有过网络相关的经验不难发现这个选举算法其实是OSPF的DB、BDR选举算法。

分布式事务

Zookeeper实现的分布式事务是二两阶段提交算法。Client可以向集群中任何一台服务器发送“写入数据”请求,该请求会被转发给leader,leader会通过两阶段提交协议来保证所有的follower都写入成功。

  • leader发送写入数据命令给所有的follower
  • 所有的follower写入数据,返回leader ack确认
  • leader在收到半数的follower的ack之后向follower广播commit数据包

zookeeper的用途

用作注册中心只能算zookeeper的一个“不误正业”的用途。除此之外它还可以用来实现通知/协调。在使用zookeeper client的时候你可能已经注意到了,无论是getData还是setData你都可以传递一个Watch对象,这个对象用来监视某个节点。当节点发送变化的时候这个Watch对象会被调用。通过这个机制我们可以实现分布式系统中的通知/协调,比如当某个模块已经完成了任务就修改节点,另一个模块就会感知到这个变化,这个动作相当于“任务推送”。(和MQ有异曲同工之妙,区别是zookeeper是一个去中心的分布式系统)除了上面的用途之外zookeeper还可以用来实现心跳(比如hadoop的namenode ha)。无论哪种应用基本上都是利用zookeeper提供的数据一致性Watch这两个特性。

时间: 2024-08-09 10:42:51

深入浅出Zookeeper的相关文章

深入浅出zookeeper之一:功能及本质

zookeeper(下文简写为zk)大家都不陌生.但是,看到很多同学对zookeeper的理解过于程式化,有些地方甚至需要背,是大可不必的.把本质理解了,概念性和功能介绍都可以推出来的,而且架构要活学活用,透过现象看本质,才能对技术和技术领悟有大的提升.下面来看下zk的功能及本质. zookeeper的定义及用途 我们先了解官方的定义. Apache ZooKeeper is an effort to develop and maintain an open-source server whic

图解zookeeper FastLeader选举算法【转】

转自:http://codemacro.com/2014/10/19/zk-fastleaderelection/ zookeeper配置为集群模式时,在启动或异常情况时会选举出一个实例作为Leader.其默认选举算法为FastLeaderElection. 不知道zookeeper的可以考虑这样一个问题:某个服务可以配置为多个实例共同构成一个集群对外提供服务.其每一个实例本地都存有冗余数据,每一个实例都可以直接对外提供读写服务.在这个集群中为了保证数据的一致性,需要有一个Leader来协调一些

图解zookeeper FastLeader选举算法

zookeeper配置为集群模式时,在启动或异常情况时会选举出一个实例作为Leader.其默认选举算法为FastLeaderElection. 不知道zookeeper的可以考虑这样一个问题:某个服务可以配置为多个实例共同构成一个集群对外提供服务.其每一个实例本地都存有冗余数据,每一个实例都可以直接对外提供读写服务.在这个集群中为了保证数据的一致性,需要有一个Leader来协调一些事务.那么问题来了:如何确定哪一个实例是Leader呢? 问题的难点在于: 没有一个仲裁者来选定Leader 每一个

Hadoop企业级完整训练:Rocky的16堂课(HDFS&amp;MapReduce&amp;HBase&amp;Hive&amp;Zookeeper&amp;Sqoop&amp;Pig&amp;Flume&amp;Project) - 0515

Hadoop是云计算的事实标准软件框架,是云计算理念.机制和商业化的具体实现,是整个云计算技术学习中公认的核心和最具有价值内容. 如何从企业级开发实战的角度开始,在实际企业级动手操作中深入浅出并循序渐进的掌握Hadoop是本课程的核心.   云计算学习者的心声: 如何从企业级开发的角度,不断动手实际操作,循序渐进中掌握Hadoop,直到能够直接进行企业级开始,是困惑很多对云计算感兴趣的朋友的核心问题,本课程正是为解决此问题而生,学习者只需要按照一步步的跟着视频动手操作,即可完全无痛掌握Hadoo

升级版:深入浅出Hadoop实战开发(云存储、MapReduce、HBase实战微博、Hive应用、Storm应用)

      Hadoop是一个分布式系统基础架构,由Apache基金会开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序.充分利用集群的威力高速运算和存储.Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS.HDFS有着高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上.而且它提供高传输率(high throughput)来访问应用程序的数据,适合那些有着超大数据集(large data set)的应用程序

深入浅出Docker(四):Docker的集成测试部署之道

1. 背景 敏捷开发已经流行了很长时间,如今有越来越多的企业开始践行敏捷开发所提倡的以人为中心.迭代.循序渐进的开发理念.在这样的场景下引入Docker技术,首要目的就是使用Docker提供的虚拟化方式,给开发团队建立一套可以复用的开发环境,让开发环境可以通过Image的形式分享给项目的所有开发成员,以简化开发环境的搭建.但是,在没有Docker技术之前就已经有类如Vagrant的开发环境分发技术,软件开发者一样可以创建类似需求的环境配置流程.所以在开发环境方面,Docker技术的优势并不能很好

Hadoop企业级完整训练:HDFS&amp;MapReduce&amp;HBase&amp;Hive&amp;Zookeeper&amp;Pig&amp;Project)

Hadoop是云计算的事实标准软件框架,是云计算理念.机制和商业化的具体实现,是整个云计算技术学习中公认的核心和最具有价值内容. 如何从企业级开发实战的角度开始,在实际企业级动手操作中深入浅出并循序渐进的掌握Hadoop是本课程的核心. 云计算学习者的心声: 如何从企业级开发的角度,不断动手实际操作,循序渐进中掌握Hadoop,直到能够直接进行企业级开始,是困惑很多对云计算感兴趣的朋友的核心问题,本课程正是为解决此问题而生,学习者只需要按照一步步的跟着视频动手操作,即可完全无痛掌握Hadoop企

深入浅出Mesos(三):持久化存储和容错

[编者按]Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核.Mesos最初是由加州大学伯克利分校的AMPLab开发的,后在Twitter得到广泛使用.InfoQ接下来将会策划系列文章来为读者剖析Mesos.本文是整个系列的第一篇,简单介绍了Mesos的背景.历史以及架构. 注:本文翻译自Cloud Architect Musings,InfoQ中文站在获得作者授权的基础上对文章进行了翻译. 在深入浅出Mesos系列的第一篇文章中,我对相关的技术做了简要概述,在第二篇

深入浅出Hadoop实战开发教程

升级版深入浅出Hadoop实战开发(云存储.MapReduce.HBase实战微博.Hive应用.Storm应用)http://www.ibeifeng.com/goods-488.html咨询QQ2110053820课程讲师:明义(robby) 课程分类:Hadoop适合人群:初级课时数量:35课时用到技术:hadoop.MapReduce.hbase.hive涉及项目:云存储.微博应用等 课程简介:Hadoop 是一个能够对大量数据进行分布式处理的软件框架.但是 Hadoop 是以一种可靠.