此文不是入门教程,是需要一定的zookeeper基础的

zookeeper应用

同意命名服务

在分布式系统中,各个系统都有可能做为服务提供者,可以向外提供服务,这个时候就需要对服务的名字进行统一规划,比如"应用+组+服务名+版本号",而Zookeeper的目录式结构存储特点,则正好提供了这种命名方式的支持。比如Dubbo里在用Zookeeper做注册中心时就利用了Zookeeper的这一特性。

配置中心

在分布式系统中,特别是集群环境下,配置是一个公共资源,其最重要的一个特征是配置的变化需要通知使用配置的变化需要通知使用者,Zookeeper可以作为公共资源存储的数据库,Zookeeper的数据会持久化,但同时也会在内存中存在,数据的读操作是直接读取的内存数据,配置的使用量肯定是读>写的,所以性能方面是没有问题的,并且自带的Watch机制正好提供了数据发布与订阅数据发布与订阅功能,Zookeeper上存储的配置信息发生了改变,使用该配置的应用程序是可以接收到相应的变化通知的。

集群管理

利用Zookeeper可以对集群进行监控,比如每台服务器对应一个Zookeeper中的临时节点,这些节点的父节点为/WatchNode,那么监控平台可以监听/WatchNode下节点的变化,增加一台机器,或挂掉一台机器都可以反应到Zookeeper节点的变化,从而达到监控的目的。

集群中的服务器,通常是处理相同的业务,但是可能有些业务是IO比较重或CPU比较重,这个时候可以利用Zookeeper来实现一个领导者选举,从集群中选出一个领导者,这个领导者是唯一的,所以将由它来执行这个特殊的任务,这里说的领导者选举并不是指Zookeeper实现原理中的领导者选举,Zookeeper实现原理中的领导者选举是比较复杂的,是对算法的一个代码实现,而上面的说的利用Zookeeper来实现一个领导者选举是比较容易的,其实核心就是选出一个唯一点,比如,集群中的服务器可以同时去创建同一个名字的节点,由于Zookeeper的一致性,最终只会有一个客户端创建成功,谁成功了谁就是领导,这是一种方法,还有一种就是,集群中的服务器也是去Zookeeper中创建节点,每个服务器都将会创建成功,只是创建的节点是顺序节点,从这些顺序节点中按一个简单的规则(比如最大,最小)选出一个节点,该节点为领导。

分布式锁

在分布式系统中,某些公共资源是需要具有独占性的,这个时候就需要用到分布式锁,利用Zookeeper的临时顺序节点以及Watch机制可以实现分布式锁。

    1. 首先定义一个节点/Lock作为某个资源的锁
    1. 所有需要用到该资源的服务器在/Lock节点下去创建临时顺序节点
    1. 顺序最小的节点代表相应服务器获取到了锁
    1. 服务器主动释放或服务器挂掉都会引起对应节点的删除,从而其他服务器利用Watch机制重新比较节点的大小判断自己是否获取到了锁

zookeeper底层原理

一致性

Zookeeper利用ZAB算法实现了强一致性,Zookeeper在接收到客户端请求后,会先将请求放入一个队列中,然后再以单线程从队列中拿出请求进行处理,这样就避免的并发的问题,对于类似写、更新、删除等事务性操作,在Zookeeper集群中都会交由Leader节点进行处理,Leader节点在处理事务性请求时,会进行类似两阶段提交,先询问,再提交,在Zookeeper中Leader并不会等待所有节点都告诉Leader可提交,而是会进行一个过半机制的验证,只要超过半数的节点认为可提交,Leader就会向所有节点发送提交事务的请求,其他所有节点就会进行提交。

从Zookeeper底层原理上来讲,可以把Zookeeper看做是一个数据库,类似Mysql,每一次数据库操作都会存日志,所以Zookeeper也是一样,服务器在接收到事务性请求时,会先持久化一份事务日志,再更新内存数据,所以对于Zookeeper中的两阶段分别是:1. 持久化事务日志,2.更新内存。实际上,只有更新了内存,Zookeeper客户端才会真正获取到最新的数据。

watch机制

在Zookeeper中,客户端进行定义监听器,并绑定到某个节点,客户端自己负责存储某个节点对应了哪些监听器这个信息,服务端不需要存储这个信息,服务端只需要抛出对节点的操作事件,而不关心有哪些客户端监听了这个事件,客户端收到这个事件后,根据之前保存的节点监听器对应关系,触发相应的监听器,这里需要注意Zookeeper的原生客户端的Watch是一次性的,也就是说节点的监听器在被触发了一次之后就会被原生客户端自动删除掉,而Zkclient以及Curator都是做了处理的,可以重复使用。

领导者选举

首先领导者选举并不是独立的,它是属于ZAB协议中的一个步骤,因为ZAB协议主要是用来保证集群的一致性,而保证一致性最关键的一步是需要有一个Leader来对集群进行统一管理,这样集群的一致性才能得到保证,所以领导者选举就是为了选出这个Leader。

领导者选举一般发生在整个集群启动,或者说Leader挂掉的时候,或者说Follower挂掉后Leader发现已经没有过半的Follower跟随自己了从而重新开始选举。

领导者选举的过程实际上就是比较哪台服务器比较强,比较规则是:1. 谁的数据比较新谁当领导(zxid),2.据都一样则看谁的服务器Id(myid)比较大谁就是领导;这个过程是通过各个服务器之间相互投票来进行的,每台服务器会接收其他服务器的投票,在投票信息里就会包含上面说的两个信息zxid, myid,然后进行PK,选出谁比较强,而PK中弱的那一方修改自己的投票,改为投刚刚和自己PK赢的一方,所以按照这个规则,每台服务器都会有一个自己认为最强的那个人,而在整个投票的过程中,每台服务器内部都会存在一个投票箱,该投票箱内存放了其他服务器当前投给了谁,所以每台服务器可以根据这个投票箱内的数据来看是否有超过半数的服务器和我当前投的最强者是同一台服务器,如果超过了则认为选出了Leader(自己当前所投的那个最强者即为Leader),如果发现自己就是这个最强者,则进行领导,如果自己不是,则进行跟随(Follower)。

观察者

观察者(Observer)是不参与选举的,也不参与过半机制的验证,所以Leader在处理事务性请求时,只需要验证是否有超过一半的Follower同意这次请求,而不用判断观察者是否同意,观察者只需最后去同步数据即可。

如果想提高Zookeeper集群的读性能,需要去增加节点,如果增加的是Follower节点,虽然提高了读性能,但是因为Follower需要进行过半机制的验证,所以会导致Leader在接收Follower的反馈时,需要等待更多的Follower的结果,这个过程不管是领导者选举,还是在进行事务性请求时都是存在的,都会增加耗时。比如领导者选举时,需要等待更多节点的投票结果,需要去跟更多节点进行相互投票;比如在进行写操作时,Leader需要等待更多Follower节点的能否提交的反馈,从而影响写操作的性能。

而如果增加的是Observer节点,则不会影响过半机制,同时可以提高读性能,虽然会在同步数据的消耗一点性能,但是优点是比缺点大很多的。

本文由博客一文多发平台 OpenWrite 发布!

Zookeeper面试总结,年后涨薪轻而易举的更多相关文章

  1. 《提升能力,涨薪可待》—Java并发之Synchronized

    Synchronized简介 线程安全是并发编程中的至关重要的,造成线程安全问题的主要原因: 临界资源, 存在共享数据 多线程共同操作共享数据 而Java关键字synchronized,为多线程场景下 ...

  2. 开发小白可以一年涨薪10w?这份java文档功不可没,学透你也可以

    靠这份文档,跳槽涨薪10K 金九银十的时候我分享了一份面试文档给我的兄弟,没想到这哥们2个月之内斩获数个BAT的offer, 最后选择了一个他最想要去的公司,既然有这么好的效果,我就打算把这份文档分享 ...

  3. java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪

    前言 前两天和一个同学吃饭的时候同学跟我说了一件事,说他公司有个做了两年的人向他提出要涨薪资,他就顺口问了一个问题关于spring依赖注入的,那个要求涨薪的同学居然被问懵了...事后回家想了想这一块确 ...

  4. 国外互联网大企业(flag)的涨薪方式

    国外互联网大企业(flag)指的是:Facebook,Google,Amazon,LinkedIn 至于 A 代表哪家公司存在争议:有人说是Amazon,也有说是Apple,现在更有人说应该是AirB ...

  5. 每人涨10%的工资,涨的前一共不超过5万,从低工资往高工资的人涨,超过5W则停止涨,问涨的钱花了多少,多少人获得了涨薪。

    ;with test(CID,money,NewAmount) as ( SELECT Row_Number() over ( order by money ) as CID ,money ,mone ...

  6. Zookeeper面试专题

    Zookeeper面试专题 1. Zookeeper是什么框架 分布式的.开源的分布式应用程序协调服务,原本是Hadoop.HBase的一个重要组件.它为分布式应用提供一致性服务的软件,包括:配置维护 ...

  7. 配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽

    专注Java领域分享.成长,拒绝浅尝辄止.关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.My ...

  8. 2022 跳槽涨薪必不可少面试通关宝典 —— css 篇

    生于忧患死于安乐!已经居家隔离 23 天了,解封以后估计就得找工作了,提前准备起来!需要的赶紧收藏起来 一.谈谈你对 BFC 的理解及作用. BFC 是 Block Formatting Contex ...

  9. Github上可以涨薪30k的Java教程和实战项目终于可以免费下载了

    写在前面 大家都知道 Github 是一个程序员福地,这里有各种厉害的开源框架.软件或者教程.这些东西对于我们学习和进步有着莫大的进步,所以我有了这个将 Github 上非常棒的 Java 开源项目整 ...

随机推荐

  1. Extended Traffic

    题目链接 题意:有n个路口,m条通路,如果经过一条路则会得到(终点 - 起点)^3的权值,求从1点到其他点的最小权值,如果权值小于3或无法到达输出'?'. 题解:因为权值可能为负,所以用SPFA来解题 ...

  2. Maven中央存储库 和 如何从Maven远程存储库下载?

    当你建立一个 Maven 的项目,Maven 会检查你的 pom.xml 文件,以确定哪些依赖下载.首先,Maven 将从本地资源库获得 Maven 的本地资源库依赖资源,如果没有找到,然后把它会从默 ...

  3. jquery的操作

    jQuery jQuery介绍 jQuery是一个轻量级的.兼容多浏览器的JavaScript库. jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方便地进行 ...

  4. oracle函数 RAWTOHEX(c1)

    [功能]将一个二进制构成的字符串转换为十六进制 [参数]c1,二进制的字符串 [返回]字符串 [示例] select RAWTOHEX('A123')  from dual;

  5. 重磅开源|AOP for Flutter开发利器——AspectD

    https://github.com/alibaba-flutter/aspectd 问题背景 随着Flutter这一框架的快速发展,有越来越多的业务开始使用Flutter来重构或新建其产品.但在我们 ...

  6. 18-2 djanjo中间件和orm多对多操作,以及ajax

    一  中间件 0 怎样使用中间件 在setting配置文件里面注册你的中间件,如下: 'mymiddleware.MD1', 前面是文件名,后面是类名 然后在你的mymiddleware文件里导入: ...

  7. java基础-内存分配

    1.java运行时的数据区:程序计数器.方法区.虚拟机栈.本地方法栈.堆 ①.程序计数器:一块较小的内存空间,可看作当前线程所执行的字节码的行号指示器 ②.java虚拟机栈:与程序计数器一样,也是线程 ...

  8. 从DataTable中删除不被控件支持的字段类型

    DataTable dt = DB.GetDataTable(sql);                        //从dt中删除不被控件支持的字段类型            for (int ...

  9. @codeforces - 418D@ Big Problems for Organizers

    目录 @description@ @solution@ @accepted code@ @details@ @description@ n 个点连成一棵树,经过每条边需要花费 1 个单位时间. 现给出 ...

  10. CSS长度单位:px和pt的区别

    先搞清基本概念:px就是表示pixel,像素,是屏幕上显示数据的最基本的点:而pt就是point,是印刷行业常用单位,等于1/72英寸. 这样很明白,px是一个点,它不是自然界的长度单位,谁能说出一个 ...