hadoop生态圈面试精华之zookeeper(三)

hadoop生态圈面试精华之zookeeper(三)

Zookeeper的Paxos算法
问过的一些公司:字节,ebay 参考答案:
1、背景介绍
Paxos算法是分布式技术大师Lamport提出的,主要目的是通过这个算法,让参与分布式处理的每个参与 者逐步达成一致意见。用好理解的方式来说,就是在一个选举过程中,让不同的选民最终做出一致的决 定。
Lamport为了讲述这个算法,假想了一个叫做Paxos的希腊城邦进行选举的情景,这个算法也是因此而得 名。在他的假想中,这个城邦要采用民主提议和投票的方式选出一个最终的决议,但由于城邦的居民没 有 人愿意把全部时间和精力放在这种事情上,所以他们只能不定时的来参加提议,不定时来了解提议、投票 进展,不定时的表达自己的投票意见。Paxos算法的目标就是让他们按照少数服从多数的方式,最终达成 一致意见。
2、Paxos算法的具体情况

  1. 在整个提议和投票过程中,主要的角色就是“提议者”(向“接受者”提出提议)和“接受者”(收 到“提议者”的提议后,向“提议者”表达自己的意见)。

  2. 整个算法的大致过程为:
    第一阶段:因为存在多个“提议者”,如果都提意见,那么“接受者”接受谁的不接受谁的?太混乱了。 所以,要先明确哪个“提议者”是意见领袖有权提出提议,未来,“接受者”们就主要处理这个“提议 者”的提议了(这样,也可以在提出提议时就尽量让意见统一,谋求尽早形成多数派)。
    第二阶段:由上阶段选出的意见领袖提出提议,“接受者”反馈意见。如果多数“接受者”接受了一个提 议,那么提议就通过了。
    3、必须要了解的其他相关背景

  3. 怎么明确意见领袖呢?通过编号。每个“提议者”在第一阶段先报个号,谁的号大,谁就是意见领
    袖。 如果不好理解,可以想象为贿选。每个提议者先拿着钞票贿赂一圈“接受者”,谁给的钱多,第二阶段“接受者”就听谁的。(注:这里和下文提到的“意见领袖”,并不是一个新的角色,而是代表在那一 轮贿赂成功的“提议者”。所以,请把意见领袖理解为贿赂中胜出的“提议者”即可)

  4. 有个跟选举常识不一样的地方,就是每个“提议者”不会执着于让自己的提议通过,而是每个“提议 者”会执着于让提议尽快达成一致意见。所以,为了这个目标,如果“提议者”在贿选的时候,发现“接 受者”已经接受过前面意见领袖的提议了,即便“提议者”贿选成功,也会默默的把自己的提议改为前面 意见领袖的提议。所以一旦贿赂成功,胜出的“提议者”再提出提议,提议内容也是前面意见领袖的提议
    (这样,在谋求尽早形成多数派的路上,又前进了一步)。

  5. 钱的多少很重要,如果钱少了,无论在第一还是第二阶段“接受者”都不会尿你,直接拒绝。

  6. 上面2)中讲到,如果“提议者”在贿选时,发现前面已经有意见领袖的提议,那就将自己的提议默默 改成前面意见领袖的提议。这里有一种情况,如果你是“提议者”,在贿赂的时候,“接受者1”跟你 说“他见过的意见领袖的提议是方案1”,而“接受者2”跟你说“他见过的意见领袖提议是方案2”,你 该怎么办? 这时的原则也很简单,还是:钱的多少很重要!你判断一下是“接受者1”见过的意见领袖有 钱,还是“接受者2”见过的意见领袖有钱?如何判断呢?因为“接受者”在被“提议者”贿赂的时候,自 己会记下贿赂的金额。所以当你贿赂“接受者”时,一旦你给的贿赂多而胜出,“接受者”会告诉你两件 事情:a.前任意见领袖的提议内容(如果有的话),b.前任意见领袖当时贿赂了多少钱。这样,再面对刚才 的情景时,你只需要判断一下“接受者1”和“接受者2”告诉你的信息中,哪个意见领袖当时给的钱多, 那你就默默的把自己的提议,改成那个意见领袖的提议。

  7. 最后这一部分最有意思,但描述起来有点绕,如果不能一下子就理解可以先看后面的例子。在整个 选举 过程中,每个人谁先来谁后到,“接受者”什么时间能够接到“提议者”的信息,是完全不可控的。所以 很可能一个意见领袖已经产生了,但是由于这个意见领袖的第二阶段刚刚开始,绝大部分“接受者”还没 有收到这个意见领袖的提议。结果,这时突然冲进来了一个新的土豪“提议者”,那么这个土豪“提议者”也是有机会让自己的提议胜出的!这时就形成了一种博弈:
    上一个意见领袖要赶在土豪“提议者”贿赂到“接受者”前,赶到“接受者”面前让他接受自己的提议, 否则会因为自己的之前贿赂的钱比土豪少而被拒绝。
    土豪“提议者”要赶在上一个意见领袖将提议传达给“接受者”前,贿赂到“接受者”,否则土豪“提议 者”即便贿赂成功,也要默默的将自己的提议改为前任意见领袖的提议。这整个博弈的过程,最终 就看这两个“提议者”谁的进展快了。但最终一定会有一个意见领袖,先得到多数“接受者”的认可, 那他的提议就胜出了。
    4、小结
    总结一下,其实Paxos算法就下面这么几个原则:

  8. Paxos算法包括两个阶段:第一个阶段主要是贿选,还没有提出提议;第二个阶段主要根据第一阶段 的 结果,明确接受谁的提议,并明确提议的内容是什么(这个提议可能是贿选胜出“提议者”自己的提议, 也可能是前任意见领袖的提议,具体是哪个提议,见下面第3点原则)。

  9. 编号(贿赂金额)很重要,无论在哪个阶段,编号(贿赂金额)小的,都会被鄙视(被拒绝)。

  10. 在第一阶段中,一旦“接受者”已经接受了之前意见领袖的提议,那后面再来找这个“接受者”的“提议 者”,即便在贿赂中胜出,也要被洗脑,默默将自己的提议改为前任意见领袖的提议,然后他会在第二 阶段提出该提议(也就是之前意见领袖的提议,以力争让大家的意见趋同)。如果“接受者”之前没有接 受过任何提议,那贿选胜出的“提议者”就可以提出自己的提议了。

Zookeeper的协议有哪些?
问过的一些公司:网易
参考答案:
ZAB协议:Zab是一个高性能的广播协议,主要用于主备系统,它是专门为ZooKeeper设计的。

Zookeeper如何保证数据的一致性?
可回答:Zookeeper的一致性协议问过的一些公司:字节x2,网易参考答案:
依赖于ZAB协议来保证数据一致性,ZAB协议是伪分布式协调服务Zookeeper专门设计的一种崩溃恢复的 原子广播协议。
两种基本的模式:
崩溃恢复消息广播
这两个模式是相辅相成的。
消息广播模式就是zookeeper不出现任何问题,并且正常工作的模式。崩溃恢复看字面意思就是当zookeeper 出现故障时用于恢复的。
保证数据的一致性有两种情况:第一是故障恢复阶段的数据同步,即新leader选举之后的数据同步;第 二是leader处理完事务请求与follower保持数据同步。
故障恢复阶段的数据同步:leader为每个follower准备一个队列,将没有被同步的事务以proposal请求形 式放入队列,然后对每个事务请求追加一个commit请求,表示该事务被提交,完成数据的同步。
leader处理事务请求与follower保持数据同步:leader收到事务请求之后,将事务转化为proposal,由leader为每个follower创建一个队列,将事务请求按顺序放入请求队列当中,之后按事务请求向follower 发出消息广播该提案,follower收到后会以事务的形式写入本地日志,并且向leader发送ack请求,leader 收到一半以上的follower响应,会向其他follower发出commit消息,同时leader提交这个提案。

Zookeeper的数据存储在什么地方?
问过的一些公司:字节x2 参考答案:
1、内存数据
Zookeeper的数据模型是树结构,在内存数据库中,存储了整棵树的内容,包括所有的节点路径、节点 数据、ACL信息,Zookeeper会定时将这个数据存储到磁盘上。

DataTree
DataTree是内存数据存储的核心,是一个树结构,代表了内存中一份完整的数据。DataTree不包含任何 与网络、客户端连接及请求处理相关的业务逻辑,是一个独立的组件。

DataNode
DataNode是数据存储的最小单元,其内部除了保存了结点的数据内容、ACL列表、节点状态之外,还记 录了父节点的引用和子节点列表两个属性,其也提供了对子节点列表进行操作的接口。

ZKDatabase
Zookeeper的内存数据库,管理Zookeeper的所有会话、DataTree存储和事务日志。ZKDatabase会定时向 磁盘dump快照数据,同时在Zookeeper启动时,会通过磁盘的事务日志和快照文件恢复成一个完整的内 存数据库。

2、事务日志
在配置Zookeeper集群时需要配置dataDir目录,其用来存储事务日志文件。也可以为事务日志单独分配 一个文件存储目录:dataLogDir。若配置dataLogDir为/home/admin/zkData/zk_log,那么Zookeeper在运 行过程中会在该目录下建立一个名字为version-2的子目录,该目录确定了当前Zookeeper使用的事务日 志格式版本号,当下次某个Zookeeper版本对事务日志格式进行变更时,此目录也会变更,即在version- 2子目录下会生成一系列文件大小一致(64MB)的文件。

3、snapshot-数据快照
数据快照是Zookeeper数据存储中非常核心的运行机制,数据快照用来记录Zookeeper服务器上某一时刻 的全量内存数据内容,并将其写入指定的磁盘文件中。
与事务文件类似,Zookeeper快照文件也可以指定特定磁盘目录,通过dataDir属性来配置。若指定dataDir为/home/admin/zkData/zk_data,则在运行过程中会在该目录下创建version-2的目录,该目录确 定了当前Zookeeper使用的快照数据格式版本号。在Zookeeper运行时,会生成一系列文件。

Zookeeper从三台扩容到七台怎么做?
问过的一些公司:蘑菇街参考答案:
1)先检查三台设备的状态,两台为follower,一台为leader; 2)修改节点数量,由三台增加到七台,修改相应的zoo.cfg文件;
3)完成相关配置后,启动对应zk实例,确认启动ok,节点四到七依次验证实例状态; 4)在leader节点上查看目前状态同步的follower数,确认新增节点已经成功加入集群;
5)确认新增节点加入集群后,滚动更新原有集群的配置,并重启,这里需要注意,在重启follwer节点 的时候并无任何影响,不过在重启leader节点的时候,这个时候会触发一次新的leader选举,zxid最新的 默认优先当选新的leader,当zxid相同,myid最大的优先当选新的leader。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据小理

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值