html5自适应手机网站模板,教育网网站建设规范,logo在线生成器免费,松原做招聘的网站有哪些来源 | 捡田螺的小男孩【前言】一线大厂ZooKeeper的十二连问#xff0c;你顶得了嘛#xff1f;本文已经收录到github#xff1a;https://github.com/whx123/JavaHome什么是Zookeeper面试官#xff1a;工作中使用过Zookeeper嘛#xff1f;你知道它是什么#xff0c;有什么… 来源 | 捡田螺的小男孩【前言】一线大厂ZooKeeper的十二连问你顶得了嘛本文已经收录到githubhttps://github.com/whx123/JavaHome什么是Zookeeper面试官工作中使用过Zookeeper嘛你知道它是什么有什么用途呢「小菜鸡的我」有使用过的使用ZooKeeper作为「dubbo的注册中心」使用ZooKeeper实现「分布式锁」。ZooKeeper它是一个开放源码的「分布式协调服务」它是一个集群的管理者它将简单易用的接口提供给用户。可以基于Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列「等功能」。Zookeeper的「用途」命名服务、配置管理、集群管理、分布式锁、队列管理用途跟功能不是一个意思咩给我一个眼神让我自己体会。命名服务、配置管理、集群管理面试官说下什么是命名服务什么是配置管理又什么是集群管理吧。「小菜鸡的我(幸好我刷过面试题)无所畏惧」「命名服务就是」命名服务是指通过「指定的名字」来获取资源或者服务地址。Zookeeper可以创建一个「全局唯一的路径」这个路径就可以作为一个名字。被命名的实体可以是「集群中的机器服务的地址或者是远程的对象」等。一些分布式服务框架RPC、RMI中的服务地址列表通过使用命名服务客户端应用能够根据特定的名字来获取资源的实体、服务地址和提供者信息等。「配置管理」 实际项目开发中我们经常使用.properties或者xml需要配置很多信息如数据库连接信息、fps地址端口等等。因为你的程序一般是分布式部署在不同的机器上如果你是单机应用当我没说如果把程序的这些配置信息「保存在zk的znode节点」下当你要修改配置即znode会发生变化时可以通过改变zk中某个目录节点的内容利用「watcher通知给各个客户端」从而更改配置。「集群管理」集群管理包括集群监控和集群控制其实就是监控集群机器状态剔除机器和加入机器。zookeeper可以方便集群机器的管理它可以实时监控znode节点的变化一旦发现有机器挂了该机器就会与zk断开连接对用的临时目录节点会被删除其他所有机器都收到通知。新机器加入也是类似酱紫所有机器收到通知有新兄弟目录加入啦。znode节点面试官你提到了znode节点那你知道znode有几种类型呢zookeeper的数据模型是怎样的呢「小菜鸡的我我先想想」zookeeper的数据模型ZooKeeper的视图数据结构很像Unix文件系统也是树状的这样可以确定每个路径都是唯一的。zookeeper的节点统一叫做「znode」它是可以通过「路径来标识」结构图如下znode的4种类型根据节点的生命周期znode可以分为4种类型分别是持久节点PERSISTENT、持久顺序节点PERSISTENT_SEQUENTIAL、临时节点EPHEMERAL、临时顺序节点EPHEMERAL_SEQUENTIAL。持久节点PERSISTENT这类节点被创建后就会一直存在于Zk服务器上。直到手动删除。持久顺序节点PERSISTENT_SEQUENTIAL它的基本特性同持久节点不同在于增加了顺序性。父节点会维护一个自增整性数字用于子节点的创建的先后顺序。临时节点EPHEMERAL临时节点的生命周期与客户端的会话绑定一旦客户端会话失效非TCP连接断开那么这个节点就会被自动清理掉。zk规定临时节点只能作为叶子节点。临时顺序节点EPHEMERAL_SEQUENTIAL基本特性同临时节点添加了顺序的特性。znode节点存储面试官你知道znode节点里面存储的是什么吗每个节点的数据最大不能超过多少呢「小菜鸡的我」znode节点里面存储的是什么Znode数据节点的代码如下public class DataNode implements Record {byte data[]; Long acl; public StatPersisted stat; private SetString children null;
}
哈哈Znode包含了「存储数据、访问权限、子节点引用、节点状态信息」如图「data:」 znode存储的业务数据信息「ACL:」 记录客户端对znode节点的访问权限如IP等。「child:」 当前节点的子节点引用「stat:」 包含Znode节点的状态信息比如「事务id、版本号、时间戳」等等。每个节点的数据最大不能超过多少呢为了保证高吞吐和低延迟以及数据的一致性znode只适合存储非常小的数据不能超过1M最好都小于1K。Zookeeper watch机制面试官你知道znode节点上的监听机制嘛讲下Zookeeper watch机制吧「小菜鸡的我」Watcher机制监听机制的工作原理Watcher特性总结Watcher监听机制Zookeeper 允许客户端向服务端的某个Znode注册一个Watcher监听当服务端的一些指定事件触发了这个Watcher服务端会向指定客户端发送一个事件通知来实现分布式的通知功能然后客户端根据 Watcher通知状态和事件类型做出业务上的改变。可以把Watcher理解成客户端注册在某个Znode上的触发器当这个Znode节点发生变化时增删改查就会触发Znode对应的注册事件注册的客户端就会收到异步通知然后做出业务的改变。Watcher监听机制的工作原理ZooKeeper的Watcher机制主要包括客户端线程、客户端 WatcherManager、Zookeeper服务器三部分。客户端向ZooKeeper服务器注册Watcher的同时会将Watcher对象存储在客户端的WatchManager中。当zookeeper服务器触发watcher事件后会向客户端发送通知 客户端线程从 WatcherManager 中取出对应的 Watcher 对象来执行回调逻辑。Watcher特性总结「一次性:」 一个Watch事件是一个一次性的触发器。一次性触发客户端只会收到一次这样的信息。「异步的」 Zookeeper服务器发送watcher的通知事件到客户端是异步的不能期望能够监控到节点每次的变化Zookeeper只能保证最终的一致性而无法保证强一致性。「轻量级」 Watcher 通知非常简单它只是通知发生了事件而不会传递事件对象内容。「客户端串行」 执行客户端 Watcher 回调的过程是一个串行同步的过程。注册 watcher用getData、exists、getChildren方法。触发 watcher用create、delete、setData方法。Zookeeper的特性面试官你对Zookeeper的数据结构都有一定了解那你讲下Zookeeper的特性吧。「小菜鸡的我我背过书啊哈哈」Zookeeper 保证了如下分布式一致性特性「顺序一致性」从同一客户端发起的事务请求最终将会严格地按照顺序被应用到 ZooKeeper 中去。「原子性」所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的也就是说要么整个集群中所有的机器都成功应用了某一个事务要么都没有应用。「单一视图」无论客户端连到哪一个 ZooKeeper 服务器上其看到的服务端数据模型都是一致的。「可靠性」 一旦服务端成功地应用了一个事务并完成对客户端的响应那么该事务所引起的服务端状态变更将会被一直保留下来。「实时性最终一致性」 Zookeeper 仅仅能保证在一定的时间段内客户端最终一定能够从服务端上读取到最新的数据状态。zookeeper是如何保证事务的顺序一致性面试官你刚提到顺序一致性那zookeeper是如何保证事务的顺序一致性的呢「小菜鸡的我完蛋了这题不会」这道题可以看下这篇文章本题答案来自该文章聊一聊ZooKeeper的顺序一致性[1] https://time.geekbang.org/column/article/239261需要了解事务ID即zxid。ZooKeeper的在选举时通过比较各结点的zxid和机器ID选出新的主结点的。zxid由Leader节点生成有新写入事件时Leader生成新zxid并随提案一起广播每个结点本地都保存了当前最近一次事务的zxidzxid是递增的所以谁的zxid越大就表示谁的数据是最新的。ZXID的生成规则如下ZXID有两部分组成任期完成本次选举后直到下次选举前由同一Leader负责协调写入事务计数器单调递增每生效一次写入计数器加一。ZXID的低32位是计数器所以同一任期内ZXID是连续的每个结点又都保存着自身最新生效的ZXID通过对比新提案的ZXID与自身最新ZXID是否相差“1”来保证事务严格按照顺序生效的。Zookeeper 服务器角色面试官你提到了Leader你知道Zookeeper的服务器有几种角色嘛Zookeeper下Server工作状态又有几种呢「小菜鸡的我」Zookeeper 服务器角色Zookeeper集群中有Leader、Follower和Observer三种角色「Leader」Leader服务器是整个ZooKeeper集群工作机制中的核心其主要工作事务请求的唯一调度和处理者保证集群事务处理的顺序性。集群内部各服务的调度者。「Follower」Follower服务器是ZooKeeper集群状态的跟随者其主要工作处理客户端非事务请求转发事务请求给Leader服务器。参与事务请求Proposal的投票。参与Leader选举投票。「Observer」Observer是3.3.0 版本开始引入的一个服务器角色它充当一个观察者角色——观察ZooKeeper集群的最新状态变化并将这些状态变更同步过来。其工作处理客户端的非事务请求转发事务请求给 Leader 服务器。不参与任何形式的投票。Zookeeper下Server工作状态服务器具有四种状态分别是 LOOKING、FOLLOWING、LEADING、OBSERVING。LOOKING寻找Leader状态。当服务器处于该状态时它会认为当前集群中没有 Leader因此需要进入 Leader 选举状态。FOLLOWING跟随者状态。表明当前服务器角色是Follower。LEADING领导者状态。表明当前服务器角色是Leader。OBSERVING观察者状态。表明当前服务器角色是Observer。ZooKeeper集群部署图面试官你说到服务器角色是基于ZooKeeper集群的那你画一下ZooKeeper集群部署图吧ZooKeeper是如何保证主从节点数据一致性的呢「小菜鸡的我」ZooKeeper集群部署图ZooKeeper集群是一主多从的结构如果是写入数据先写入主服务器主节点再通知从服务器。如果是读取数据既读主服务器的也可以读从服务器的。ZooKeeper如何保证主从节点数据一致性我们知道集群是主从部署结构要保证主从节点一致性问题无非就是两个主要问题「主服务器挂了或者重启了」「主从服务器之间同步数据」Zookeeper是采用ZAB协议Zookeeper Atomic BroadcastZookeeper原子广播协议来保证主从节点数据一致性的ZAB协议支持「崩溃恢复和消息广播」两种模式很好解决了这两个问题崩溃恢复Leader挂了进入该模式选一个新的leader出来。消息广播把更新的数据从Leader同步到所有Follower。Leader服务器挂了所有集群中的服务器进入LOOKING状态首先它们会选举产生新的Leader服务器接着新的Leader服务器与集群中Follower服务进行数据同步当集群中超过半数机器与该 Leader服务器完成数据同步之后退出恢复模式进入消息广播模式。Leader 服务器开始接收客户端的事务请求生成事务Proposal进行事务请求处理。ZooKeeper选举机制面试官Leader挂了进入崩溃恢复是如何选举Leader的呢你讲一下ZooKeeper选举机制吧「小菜鸡的我」服务器启动或者服务器运行期间Leader挂了都会进入Leader选举我们来看一下~假设现在ZooKeeper集群有五台服务器它们myid分别是服务器1、2、3、4、5如图服务器启动的Leader选举zookeeper集群初始化阶段服务器myid1-5「依次」启动开始zookeeper选举Leader~服务器1myid1启动当前只有一台服务器无法完成Leader选举。服务器2myid2启动此时两台服务器能够相互通讯开始进入Leader选举阶段。每个服务器发出一个投票服务器1 和 服务器2都将自己作为Leader服务器进行投票投票的基本元素包括服务器的myid和ZXID我们以myidZXID形式表示。初始阶段服务器1和服务器2都会投给自己即服务器1的投票为1,0服务器2的投票为2,0然后各自将这个投票发给集群中的其他所有机器。接受来自各个服务器的投票每个服务器都会接受来自其他服务器的投票。同时服务器会校验投票的有效性是否本轮投票、是否来自LOOKING状态的服务器。 3. 处理投票收到其他服务器的投票会将别人的投票跟自己的投票PKPK规则如下优先检查ZXID。ZXID比较大的服务器优先作为leader。如果ZXID相同的话就比较myidmyid比较大的服务器作为leader。服务器1的投票是1,0它收到投票是2,0两者zxid都是0因为收到的myid2大于自己的myid1所以它更新自己的投票为2,0然后重新将投票发出去。对于服务器2呢即不再需要更新自己的投票把上一次的投票信息发出即可。统计投票每次投票后服务器会统计所有投票判断是否有过半的机器接受到相同的投票信息。服务器2收到两票少于3n/21,n为总服务器5所以继续保持LOOKING状态。服务器3myid3启动继续进入Leader选举阶段。跟前面流程一致服务器1和2先投自己一票因为服务器3的myid最大所以大家把票改投给它。此时服务器为3票大于等于n/21,所以服务器3当选为Leader。服务器12更改状态为FOLLOWING服务器3更改状态为LEADING服务器4启动发起一次选举。此时服务器123已经不是LOOKING状态不会更改选票信息。选票信息结果服务器3为3票服务器4为1票。服务器4并更改状态为FOLLOWING服务器5启动发起一次选举。同理服务器也是把票投给服务器3服务器5并更改状态为FOLLOWING投票结束服务器3当选为Leader服务器运行期间的Leader选举zookeeper集群的五台服务器myid1-5正在运行中突然某个瞬间Leader服务器3挂了这时候便开始Leader选举~变更状态Leader 服务器挂了之后余下的非Observer服务器都会把自己的服务器状态更改为LOOKING然后开始进入Leader选举流程。每个服务器发起投票每个服务器都把票投给自己因为是运行期间所以每台服务器的ZXID可能不相同。假设服务1,2,4,5的zxid分别为333,666,999,888则分别产生投票1,33326664,999和5,888然后各自将这个投票发给集群中的其他所有机器。接受来自各个服务器的投票处理投票投票规则是跟Zookeeper集群启动期间一致的优先检查ZXID大的优先作为Leader所以显然服务器zxid999具有优先权。统计投票改变服务器状态zk分布式锁的实现原理面试官你前面提到在项目中使用过Zookeeper的分布式锁讲一下zk分布式锁的实现原理吧「小菜鸡的我」Zookeeper就是使用临时顺序节点特性实现分布式锁的。获取锁过程 创建临时节点检查序号最小释放锁 删除临时节点监听通知获取锁过程当第一个客户端请求过来时Zookeeper客户端会创建一个持久节点/locks。如果它Client1想获得锁需要在locks节点下创建一个顺序节点lock1.如图接着客户端Client1会查找locks下面的所有临时顺序子节点判断自己的节点lock1是不是排序最小的那一个如果是则成功获得锁。这时候如果又来一个客户端client2前来尝试获得锁它会在locks下再创建一个临时节点lock2。客户端client2一样也会查找locks下面的所有临时顺序子节点判断自己的节点lock2是不是最小的此时发现lock1才是最小的于是获取锁失败。获取锁失败它是不会甘心的client2向它排序靠前的节点lock1注册Watcher事件用来监听lock1是否存在也就是说client2抢锁失败进入等待状态。此时如果再来一个客户端Client3来尝试获取锁它会在locks下再创建一个临时节点lock3。同样的client3一样也会查找locks下面的所有临时顺序子节点判断自己的节点lock3是不是最小的发现自己不是最小的就获取锁失败。它也是不会甘心的它会向在它前面的节点lock2注册Watcher事件以监听lock2节点是否存在。释放锁我们再来看看释放锁的流程zookeeper的「客户端业务完成或者故障」都会删除临时节点释放锁。如果是任务完成Client1会显式调用删除lock1的指令。如果是客户端故障了根据临时节点得特性lock1是会自动删除的。lock1节点被删除后Client2可开心了因为它一直监听着lock1。lock1节点删除Client2立刻收到通知也会查找locks下面的所有临时顺序子节点发下lock2是最小就获得锁。同理Client2获得锁之后Client3也对它虎视眈眈啊哈哈~dubbo和Zookeeper的关系面试官好的最后一道题你说说dubbo和Zookeeper的关系吧为什么选择Zookeeper作为注册中心小菜鸡的我答了这么多道题不会还不给我过吧dubbo的注册中心可以选Zookeepermemcachedredis等。为什么选择Zookeeper因为它的功能特性咯~命名服务服务提供者向Zookeeper指定节点写入url完成服务发布。负载均衡注册中心的承载能力有限而Zookeeper集群配合web应用很容易达到负载均衡。zk支持监听事件特别适合发布/订阅的场景dubbo的生产者和消费者就类似这场景。数据模型简单数据存在内存可谓高性能。Zookeeper其他特点都可以搬出来讲一下~参考与感谢从Paxos到Zookeeper 分布式一致性原理与实践zookeeper面试题[2]28道进阶必备ZooKeeper面试真题建议收藏[3]漫画什么是ZooKeeper[4]聊一聊ZooKeeper的顺序一致性[5]Zookeeper——一致性协议:Zab协议[6]Zookeeper的选举机制原理图文深度讲解[7]漫画如何用Zookeeper实现分布式锁Reference[1]聊一聊ZooKeeper的顺序一致性: https://time.geekbang.org/column/article/239261[2]zookeeper面试题: https://segmentfault.com/a/1190000014479433[3]28道进阶必备ZooKeeper面试真题建议收藏: https://zhuanlan.zhihu.com/p/102168788[4]漫画什么是ZooKeeper: https://juejin.im/post/6844903608685707271[5]聊一聊ZooKeeper的顺序一致性: https://time.geekbang.org/column/article/239261[6]Zookeeper——一致性协议:Zab协议: https://www.jianshu.com/p/2bceacd60b8a[7]Zookeeper的选举机制原理图文深度讲解: https://blog.csdn.net/wx1528159409/article/details/84622762更多阅读推荐“蚂蚁漫步”背后的定位原理思考
可怕公司部署了一个东西悄悄盯着你……
在容器上构建持续部署这份超详细实践指南不要错过
CSDN 创始人蒋涛解读鸿蒙对开发者究竟意味着什么
英伟达收购ARM也要变美国公司国产芯出路几何