一、前言
作为一名Java拧螺丝选手,不必要掌握造火箭的能力就可以工作,但是面试官偏偏要难为兄弟们,这我就有点看不下去了,我只能带上家里的火箭当场向面试官证明自己。
虽然我这个二踢脚可能算不上火箭,但是跟火箭的原理差不多,都是点火往天上发射的,我掌握了这个就相当于掌握了造火箭的能力。
关键是我这玩意它好使呀,往面试官桌子上一摆,面试官直接跟我谈薪资了,会造火箭就是不一样。
至于你问为什么面试官明明只招拧螺丝的选手,但是却问火箭的底层原理、火箭的集群怎么搭建,怎么保证火箭的投递可靠性(发射失败我就再发射一颗),怎么保证火箭的幂等性(同一颗火箭发射多次和发射一次是一样的效果)
这个问题就不需要你去问面试官啦,我上次已经问过了,面试官的回答让我哑口无言。。。
我:面试官您好,请问为什么招我进去拧螺丝,却问我火箭的底层原理呢?
面试官:这特么还不都怪你们。。。
我:我们?我们怎么了。。。
面试官:十年前我面试员工,那个时候只有一部分人说会拧螺丝,我面试一个录取一个。
面试官:八年前我面试员工,所有人都说会拧螺丝了,我不知道该录取谁了,然后有一两个人说他会造摩托,我一听这俩人不错呀,毕竟我也刚刚只会造摩托就这俩吧,花拧螺丝的钱招了两个造摩托的。
面试官:五年前我面试员工,所有人都说会造摩托了,我又不知道该录取谁了,然后有一两个人说会造汽车,我心想这不错呀,我这的老员工没有会造汽车的,你既然会就来吧,工资给你比老员工高点。
面试官:三年前我面试员工,所有人都说会造汽车了,我又又不知道该录取谁了,然后有一两个人说会造火箭,我特么只能录取这两个会造火箭的了。。。,并且为了面试我还去学了一些火箭的原理,我们这个摩托车修理店根本用不到这些原理,但是没办法,谁让这些人这么卷呢。
面试官:今天,我只能面试会造火箭的人了,虽然他们进来也只会拧螺丝。。。
我:那既然说会造火箭的人也只会拧螺丝,那你为什么不直接录取只会拧螺丝的选手呢?
面试官:你以为我没有招收面试只会拧螺丝的吗,我招收了,结果。。。
我:结果怎么样?
面试官:他把公司唯一的火箭给拆了。。。
二、面试
在一个晴朗的周二,我来到了“决战天通苑、生死西二旗”中著名的西二旗桥下。
我怀着一颗忐忑的心走向即将要去赴约面试的公司,一路上我忐忑不安,不知道今天的面试会不会顺利,一会面试官会不会刁难我,接待我的hr小姐姐好不好看。。。
不知不觉我来到了公司楼下,打电话给hr,她说给你留门了,门没锁,直接上来吧。。。
HR:小奇是吧,带简历了吗?
我:带,带,带了。。。(吸溜),我把简历交给了HR,并急切的询问什么时候开始呢,我等不及了。。。
HR:别急嘛,先做一套笔试题
我:哦,我领取了一份笔试题,并来到了做题的会议室,这个会议室不大,但是坐满了人。。。
我:我做完了题后发现好基友微信群里问我在干嘛,我就随手拍了一张照片发给了他们,我不是故意拍答案的呀,但是这桌子太小人太多,毕竟0.8平米的桌子围着坐了8个人。。。
我:后来公司里人要开会,差点把我们正在做题的人撵走,我也是服了这个公司了,看我一会虐不虐他们的面试官就完了。
面试官:做一个自我介绍吧。
我:面试官你好,我本科毕业于山东翔蓝,精通挖掘机技术,研究生进入华清大学学习火箭研发技术,博士进入大北大学学习在火箭高并发发射情况下如何保证火箭一致性问题,不会造成误发射了其它队友的火箭。
三、Zookeeper集群模式与集群角色
面试官:可以呀小伙子,那你说说zookeeper集群有哪些模式吧
我:zookeeper集群无非有三种搭建方式,一是单机模式、二是伪分布模式、三是分布式模式。
面试官:嗯。zookeeper集群中都有哪些角色呢
我:有三种角色,一是Leader角色,可以处理读写请求,集群中只能有一个Leader角色,二是Follower角色,只能处理读请求,同时也是Leader的候选节点,如果Leader节点挂了,Follower节点就可以选举为Leader节点,三是Observer节点,该节点只能处理读请求,不能参与Leader的选举。
四、Zookeeper集群搭建方式
面试官:嗯,那你说说zookeeper集群搭建的具体步骤吧
我:首先我们下在zookeeper后有一个配置文件为zoo_sample.cfg,我们可以修改为zoo1.cfg这样更好记一些,然后我们编辑配置文件
dataDir=[保存数据的目录]
clientPort=[客户端连接zookeeper服务器的端口]
server.[数字表示第几台服务器]=[服务器的ip][服务器与集群中其他服务器通信的端口][表示如果Leader服务器挂了,用这个备用端口来进行选举][表示服务器的角色]
我这里配置好后就是一个集群的节点了,这里我们再将zoo1.cfg复制三个出来,表示另外三个集群节点,我这里是在一台机器上建立四个节点来搭建一个伪集群,真实的集群只要对应上ip地址和端口就可以了。
现在我们有四个cfg文件,分别为zoo1.cfg、zoo2.cfg、zoo3.cfg、zoo4.cfg,这四个文件只有clientPort不相同即可,因为客户端连接不同的服务器要有指定的端口号,这里我们在一台机器上搭建的伪集群,所以dataDir数据存储路径也应该设置为不同的。
这个时候我们来根据这四个配置文件来启动四个zookeeper实例。
这个时候我们会发现启动失败,因为需要我们设置标识ID,这个时候我们找到我们dataDir目录下,在我们的zookeeper1目录下新建一个myid文件,并且在里面写上1,然后在zookeeper2目录下也新建一个myid文件,并且在里面写上2,以此类推,然后我们再启动这四个配置文件。
这个时候我们发现启动成功了,我们可以使用status命令来查看各个节点的角色情况。
这个时候我们可以看到每个节点的角色了。
五、Zookeeper羊群效应
面试官:嗯,小伙子非常棒,你能说一下zookeeper羊群效应是怎么回事吗,如何避免呢
我:zookeeper用来实现分布式锁的时候,如果有一个客户端A拿到了锁,那么客户端B、C、D都会监听A有没有变化,如果A处理完业务释放了锁,那么这个时候B、C、D都监听到了消息,都会去抢锁,假如有一百个正在等待的,那么就会有100个上去抢锁,像羊群一样蜂拥而至。
我:这样的话就会造成资源的浪费,因为这么多节点被惊动了,但是拿到锁的只有一个节点,为何不只惊动一个节点呢。这里的话我们就要使用zookeeper的公平锁了。
六、Zookeeper公平锁怎么实现
面试官:嗯。那zookeeper公平锁怎么实现的呢
我:在上一次面试的时候我回答了zookeeper有哪些特性,其中就有一个临时顺序节点的特性,这个时候我们可以每一次都建立一个临时顺序节点,然后后一个节点监听前一个节点的变化,只有前一个节点有变化他才能感知到,再往前的节点变化他无法感知到,也就不存在抢锁的问题。
我:这样的话就可以通过临时顺序节点来实现公平锁。
面试官:小伙子真厉害啊,我这边没有什么要问的了,你还有什么问题要问(面试官两眼放光)
我:额。。。咱们公司的会议室就那一个吗,那里面的餐桌是不是有点小了。。。
面试官:哎呀,现在公司正在高速发展阶段,钱都用在了二手电脑的购买上,这样,你进来干两年,给公司挣了钱了咱们换个超大的桌子
我:(电脑还是二手的。。。)这样吧,我考虑考虑吧,我现在手上还有几个预约好的面试没有面呢,等我面完了再答复你吧。
面试官:行,你平时怎么学习呀,这么厉害
我:我通过看小奇的趣学编程系列,干货很多又非常有趣。
面试官:那你再给我推荐几个小奇趣学编程系列的读者过来吧,我急需人才
我:那你先买个大点的桌子吧放在会议室吧,人才也需要桌子才能办公(说罢我夺门而出,留下了潇洒的背影)
七、总结
这里关于zookeeper还没有整理完毕,文章后面持续更新,建议收藏。
文章中涉及到的命令大家一定要像我一样每个都敲几遍,只有在敲的过程中才能发现自己对命令是否真正的掌握了。