Zookeeper面试总结,年后涨薪轻而易举
此文不是入门教程,是需要一定的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机制可以实现分布式锁。
- 首先定义一个节点/Lock作为某个资源的锁
- 所有需要用到该资源的服务器在/Lock节点下去创建临时顺序节点
- 顺序最小的节点代表相应服务器获取到了锁
- 服务器主动释放或服务器挂掉都会引起对应节点的删除,从而其他服务器利用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面试总结,年后涨薪轻而易举的更多相关文章
- 《提升能力,涨薪可待》—Java并发之Synchronized
Synchronized简介 线程安全是并发编程中的至关重要的,造成线程安全问题的主要原因: 临界资源, 存在共享数据 多线程共同操作共享数据 而Java关键字synchronized,为多线程场景下 ...
- 开发小白可以一年涨薪10w?这份java文档功不可没,学透你也可以
靠这份文档,跳槽涨薪10K 金九银十的时候我分享了一份面试文档给我的兄弟,没想到这哥们2个月之内斩获数个BAT的offer, 最后选择了一个他最想要去的公司,既然有这么好的效果,我就打算把这份文档分享 ...
- java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪
前言 前两天和一个同学吃饭的时候同学跟我说了一件事,说他公司有个做了两年的人向他提出要涨薪资,他就顺口问了一个问题关于spring依赖注入的,那个要求涨薪的同学居然被问懵了...事后回家想了想这一块确 ...
- 国外互联网大企业(flag)的涨薪方式
国外互联网大企业(flag)指的是:Facebook,Google,Amazon,LinkedIn 至于 A 代表哪家公司存在争议:有人说是Amazon,也有说是Apple,现在更有人说应该是AirB ...
- 每人涨10%的工资,涨的前一共不超过5万,从低工资往高工资的人涨,超过5W则停止涨,问涨的钱花了多少,多少人获得了涨薪。
;with test(CID,money,NewAmount) as ( SELECT Row_Number() over ( order by money ) as CID ,money ,mone ...
- Zookeeper面试专题
Zookeeper面试专题 1. Zookeeper是什么框架 分布式的.开源的分布式应用程序协调服务,原本是Hadoop.HBase的一个重要组件.它为分布式应用提供一致性服务的软件,包括:配置维护 ...
- 配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽
专注Java领域分享.成长,拒绝浅尝辄止.关注公众号[BAT的乌托邦]开启专栏式学习,拒绝浅尝辄止.本文 https://www.yourbatman.cn 已收录,里面一并有Spring技术栈.My ...
- 2022 跳槽涨薪必不可少面试通关宝典 —— css 篇
生于忧患死于安乐!已经居家隔离 23 天了,解封以后估计就得找工作了,提前准备起来!需要的赶紧收藏起来 一.谈谈你对 BFC 的理解及作用. BFC 是 Block Formatting Contex ...
- Github上可以涨薪30k的Java教程和实战项目终于可以免费下载了
写在前面 大家都知道 Github 是一个程序员福地,这里有各种厉害的开源框架.软件或者教程.这些东西对于我们学习和进步有着莫大的进步,所以我有了这个将 Github 上非常棒的 Java 开源项目整 ...
随机推荐
- ubuntu18.10 安装pycurl
sudo apt-get install libcurl3 sudo apt-get install libcurl4-openssl-devsudo apt-get install python3 ...
- hdu 6197 2017 ACM/ICPC Asia Regional Shenyang Online array array array【最长不上升子序列和最长不下降子序列】
hdu 6197 题意:给定一个数组,问删掉k个字符后数组是否能不减或者不增,满足要求则是magic array,否则不是. 题解:队友想的思路,感觉非常棒!既然删掉k个后不增或者不减,那么就先求数组 ...
- spring的父子关系
1.父容器不能拿子容器的资源 2.子容器可以拿到父容器的资源
- qt 中lineEdit->setText()输出double
在qt中需要将获取到的double 值在ui界面上显示出来,便于观察.但是lineEdit控件的setText()要求的参数是string. 所以我们先要进行转化,将double 转化为string. ...
- PHPExcel 设置表格边框
//设置单元格边框 $style_array = array( 'borders' => array( 'allborders' => array( 'style' => \PHPE ...
- mysql 忘记root密码的处理办法
参考地址: https://blog.csdn.net/vv19910825/article/details/82979563 1.修改配置文件mysql\bin\my.ini 在文本 [mysql ...
- 输出Excel文件
/** * * 功能描述: <br> * 〈功能详细描述〉输出excle * * @param titles 标题 * @param contents 内容 * @param fileNa ...
- kubernetes API 访问控制在阿里云容器服务(ACK)上的实践
提起K8s API的访问控制,很多同学应该都会想到RBAC,这是K8s用来做权限控制的方法,但是K8s对API的访问控制却不止于此,今天我们就来简单介绍下K8s的访问控制以及ACK如何利用这套方法提供 ...
- SVN更换新的svn链接
输入新的SVN地址即可:
- 学习layui框架
Layui是一款功能齐全的前端框架,需要引入对应的CSS文件和JS文件,附属官网链接:Layui官网