当前位置:   article > 正文

Zookeeper面试这一篇就够了_chroot 特性

chroot 特性

谈下你对 Zookeeper 的认识?

ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。


Zookeeper 都有哪些功能?

  1. 集群管理:监控节点存活状态、运行请求等;

  2. 主节点选举:主节点挂掉了之后可以从备用的节点开始新一轮选主,主节点选举说的就是这个选举的过程,使用 Zookeeper 可以协助完成这个过程;

  3. 分布式锁:Zookeeper 提供两种锁:独占锁、共享锁。独占锁即一次只能有一个线程使用资源,共享锁是读锁共享,读写互斥,即可以有多线线程同时读同一个资源,如果要使用写锁也只能有一个线程使用。Zookeeper 可以对分布式锁进行控制。

  4. 命名服务:在分布式系统中,通过使用命名服务,客户端应用能够根据指定名字来获取资源或服务的地址,提供者等信息。

  5. 统一配置管理:分布式环境下,配置文件管理和同步是一个常见问题,一个集群中,所有节点的配置信息是一致的,比如 Hadoop 集群、集群中的数据库配置信息等全局配置


zookeeper负载均衡和nginx负载均衡区别

Nginx是著名的反向代理服务器,zk是分布式协调服务框架,都可以做负载均衡

zk的负载均衡是可以调控,nginx只是能调权重,其他需要可控的都需要自己写插件;

但是nginx的吞吐量比zk大很多,应该说按业务选择用哪种方式


一致性协议2PC、3PC?

2PC

阶段一:提交事务请求(”投票阶段“)

当要执行一个分布式事务的时候,事务发起者首先向协调者发起事务请求,然后协调者会给所有参与者发送 prepare 请求(其中包括事务内容)告诉参与者你们需要执行事务了,如果能执行我发的事务内容那么就先执行但不提交,执行后请给我回复。然后参与者收到 prepare 消息后,他们会开始执行事务(但不提交),并将 UndoRedo 信息记入事务日志中,之后参与者就向协调者反馈是否准备好了

阶段二:执行事务提交

协调者根据各参与者的反馈情况决定最终是否可以提交事务,如果反馈都是Yes,发送提交commit请求,参与者提交成功后返回 Ack 消息,协调者接收后就完成了。如果反馈是No 或者超时未反馈,发送 Rollback 请求,利用阶段一记录表的 Undo 信息执行回滚,并反馈给协调者Ack ,中断消息

alt

优点:原理简单、实现方便。

缺点:

  • 单点故障问题,如果协调者挂了那么整个系统都处于不可用的状态了
  • 阻塞问题,即当协调者发送 prepare 请求,参与者收到之后如果能处理那么它将会进行事务的处理但并不提交,这个时候会一直占用着资源不释放,如果此时协调者挂了,那么这些资源都不会再释放了,这会极大影响性能
  • 数据不一致问题,比如当第二阶段,协调者只发送了一部分的 commit 请求就挂了,那么也就意味着,收到消息的参与者会进行事务的提交,而后面没收到的则不会进行事务提交,那么这时候就会产生数据不一致性问题

3PC

3PC,是 Three-Phase-Comimit 的缩写,即「三阶段提交」,是二阶段的改进版,将二阶段提交协议的“提交事务请求”过程一分为二。

阶段一:CanCommit

协调者向所有参与者发送 CanCommit 请求,参与者收到请求后会根据自身情况查看是否能执行事务,如果可以则返回 YES 响应并进入预备状态,否则返回 NO

阶段二:PreCommit

协调者根据参与者返回的响应来决定是否可以进行下面的 PreCommit 操作。如果上面参与者返回的都是 YES,那么协调者将向所有参与者发送 PreCommit 预提交请求,参与者收到预提交请求后,会进行事务的执行操作,并将 Undo 和 Redo 信息写入事务日志中 ,最后如果参与者顺利执行了事务则给协调者返回成功的 Ack 响应。如果在第一阶段协调者收到了 任何一个 NO 的信息,或者 在一定时间内 并没有收到全部的参与者的响应,那么就会中断事务,它会向所有参与者发送中断请求 abort,参与者收到中断请求之后会立即中断事务,或者在一定时间内没有收到协调者的请求,它也会中断事务

阶段三:DoCommit

这个阶段其实和 2PC 的第二阶段差不多,如果协调者收到了所有参与者在 PreCommit 阶段的 YES 响应,那么协调者将会给所有参与者发送 DoCommit 请求,参与者收到 DoCommit 请求后则会进行事务的提交工作,完成后则会给协调者返回响应,协调者收到所有参与者返回的事务提交成功的响应之后则完成事务。若协调者在 PreCommit 阶段 收到了任何一个 NO 或者在一定时间内没有收到所有参与者的响应 ,那么就会进行中断请求的发送,参与者收到中断请求后则会 通过上面记录的回滚日志 来进行事务的回滚操作,并向协调者反馈回滚状况,协调者收到参与者返回的消息后,中断事务。

alt

降低了参与者的阻塞范围,且能在单点故障后继续达成一致。

但是最重要的一致性并没有得到根本的解决,比如在 PreCommit 阶段,当一个参与者收到了请求之后其他参与者和协调者挂了或者出现了网络分区,这个时候收到消息的参与者都会进行事务提交,这就会出现数据不一致性问题。


讲一讲 Paxos 算法?

Paxos 算法是基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一,其解决的问题就是在分布式系统中如何就某个值(决议)达成一致

Paxos 中主要有三个角色,分别为 Proposer提案者Acceptor表决者Learner学习者Paxos 算法和 2PC 一样,也有两个阶段,分别为 Prepareaccept 阶段。

在具体的实现中,一个进程可能同时充当多种角色。比如一个进程可能既是 Proposer 又是 Acceptor 又是Learner。Proposer 负责提出提案,Acceptor 负责对提案作出裁决(accept与否),learner 负责学习提案结果。

还有一个很重要的概念叫「提案」(Proposal)。最终要达成一致的 value 就在提案里。只要 Proposer 发的提案被半数以上的 Acceptor 接受,Proposer 就认为该提案里的 value 被选定了。Acceptor 告诉 Learner 哪个 value 被选定,Learner 就认为那个 value 被选定。

阶段一:prepare 阶段

  1. Proposer 负责提出 proposal,每个提案者在提出提案时都会首先获取到一个 具有全局唯一性的、递增的提案编号N,即在整个集群中是唯一的编号 N,然后将该编号赋予其要提出的提案,在第一阶段是只将提案编号发送给所有的表决者

  2. 如果一个 Acceptor 收到一个编号为 N 的 Prepare 请求,如果小于它已经响应过的请求,则拒绝,不回应或回复error。若 N 大于该 Acceptor 已经响应过的所有 Prepare 请求的编号(maxN),那么它就会将它已经批准过的编号最大的提案(如果有的话,如果还没有的accept提案的话返回{pok,null,null})作为响应反馈给 Proposer,同时该 Acceptor 承诺不再接受任何编号小于 N 的提案

    eg:假定一个 Acceptor 已经响应过的所有 Prepare 请求对应的提案编号分别是1、2、...5和7,那么该 Acceptor 在接收到一个编号为8的 Prepare 请求后,就会将 7 的提案作为响应反馈给 Proposer。

阶段二:accept 阶段

  1. 如果一个 Proposer 收到半数以上 Acceptor 对其发出的编号为 N 的 Prepare 请求的响应,那么它就会发送一个针对 [N,V] 提案的 Accept 请求半数以上的 Acceptor。注意:V 就是收到的响应中编号最大的提案的 value,如果响应中不包含任何提案,那么 V 就由 Proposer 自己决定
  2. 如果 Acceptor 收到一个针对编号为N的提案的Accept请求,只要该 Acceptor 没有对编号大于 N 的 Prepare 请求做出过响应,它就通过该提案。如果N小于 Acceptor 以及响应的 prepare 请求,则拒绝,不回应或回复error(当proposer没有收到过半的回应,那么他会重新进入第一阶段,递增提案号,重新提出prepare请求)
  3. 最后是 Learner 获取通过的提案(有多种方式)
alt

paxos 算法的死循环问题

其实就有点类似于两个人吵架,小明说我是对的,小红说我才是对的,两个人据理力争的谁也不让谁

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/838800
推荐阅读
相关标签