此文不是入门教程,是需要一定的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. Mybatis通过工具类根据用户名查找用户列表

    抽取SqlSessionFactoryUtils工具类,共享SqlSessionFactory创建过程 /** * SqlSessionFactory工具类 * @author:Mr.Tan * @C ...

  2. 2016年中国的SaaS服务商企业研究

    近年来,随着中国人口红利的消退及移动互联网红利的凸显,让中国的To C创业,尤其是O2O领域的创业经历了一波高潮.2015年末,一场"资本寒冬"让O2O创业趋于理性,但SaaS及T ...

  3. HUD-1708_FatMouse and Cheese

    FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...

  4. 突破!阿里云CDN实现毫秒级全网刷新

    通常在某网站使用了CDN节点来实现内容分发加速后,当源站内容更新的时候,CDN刷新系统会通过提交刷新请求将CDN节点上的指定缓存内容强制过期.当用户访问的时候,CDN节点将回源获取最新内容返回给用户, ...

  5. behavior planning——11 create a cost function speed penalty

    A  key part of getting transitions to happen when we want  them to is the design of reasonable cost ...

  6. ORACLE内部操作

    当执行查询时,ORACLE采用了内部的操作. 下表显示了几种重要的内部操作. ORACLE Clause 内部操作 ORDER BY SORT ORDER BY UNION UNION-ALL MIN ...

  7. supersockets支持热更新的服务器实例配置选项

    SuperSocket 支持以下配置选项的热更新: * logCommand * idleSessionTimeOut * maxRequestLength * logBasicSessionActi ...

  8. JavaScript跨域问题

    通过实现Ajax通信的主要限制,来源于跨域安全策略.默认情况下,XHR对象只能访问与包含它的页面位于同一个域中的资源.这种安全策略可以预防某些恶意行为.但是,实现合理的跨域请求对于开发某些浏览器应用程 ...

  9. Python--day19--random模块

    random模块 >>> import random #随机小数 >>> random.random() # 大于0且小于1之间的小数 0.766433866365 ...

  10. HDU 1251 裸的字典树、入门题

    裸的字典树还是挺简单的. 四个基本操作建立.查找.插入.删除 建立新结点我是用的c++中 new操作.当然也可以用malloc,都方便 不过指针阿.地址阿.这其中关系什么的我貌似还不是很清楚阿. 因为 ...