【ZOOKEEPER系列】Paxos、Raft、ZAB

2018-07-11 12:09:49 wangzy-nice 阅读数 2428更多

分类专栏: zookeeper
 
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

ZOOKEEPER系列

Paxos、Raft、ZAB

  • Paxos算法

莱斯利·兰伯特(Leslie Lamport)这位大牛在1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。如果你不知道这个人,那么如果你发表过Paper,就一定用过Latex,也是这位大牛的创作, 
具体背景直接维基百科就可以,不深入讲解,直接讲Paxos算法。

分布式系统对fault tolorence 的一般解决方案是state machine replication。准确的描述Paxos应该是state machine replication的共识(consensus)算法。

Leslie Lamport写过一篇Paxos made simple的paper,没有一个公式,没有一个证明,这篇文章显然要比Leslie Lamport之前的关于Paxos的论文更加容易理解,但是,这篇文章是助于理解的,只到理解这一个层面是不够的。

在Leslie Lamport 的论文中,主要讲了三个Paxos算法 
1. Basic Paxos 
2. Multi Paxos 
3. Fast Paxos

那么我们应该先从Basic Paxos学起

在Basic paxos算法中,分为4种角色:

  1. Client: 系统外部角色,产生议题者,像民众

  2. Proposer :接收议题请求,像集群提出议题(propose),并在冲突发生时,起到冲突调节的作用,像议员

  3. Acceptor:提议的投票者和决策者,只有在形成法定人数(一般是majority多数派)时,提议才会被最终接受,像国会

  4. Learner:最终提议的接收者,backup,对集群的已执行没有什么影响,像记录员

  1. 客户端给出一个提议,Proposer接收
  2. Proposer提交法案给Acceptor
  3. Acceptor把结果给Proposer,
  4. Proposer告诉Acceptor 议题已经被全部通过了,请求通过
  5. Acceptor 通过议题告诉Acceptor 和Learner,议题通过
  6. Learner返回给客户端,你的议题被通过了

这是一个正常的通过的情况

  1. 客户端给出一个提议,Proposer接收
  2. Proposer提交法案给Acceptor
  3. Acceptor把结果给Proposer,其中有一个Acceptor没有通过
  4. Proposer告诉Acceptor 议题已经被大多数通过了,请求通过
  5. Acceptor 通过议题告诉Acceptor 和Learner,议题通过
  6. Learner返回给客户端,你的议题被通过了

  1. 客户端给出一个提议,Proposer接收
  2. Proposer提交法案给Acceptor
  3. Acceptor把结果给Proposer,全部通过
  4. Proposer节点挂掉了,这个时候议案不会被通过
  5. 选举新的Proposer(leader)
  6. 新的Proposer提交2号法案给Acceptor
  7. Acceptor把结果给Proposer,全部通过
  8. Acceptor 通过议题告诉Acceptor 和Learner,议题通过
  9. Learner返回给客户端,你的议题被通过了

潜在问题 

就是在新旧的leader在争抢通过法案,旧的leader法案被pass后,新的leader法案在提交,准备阶段,这个时候旧的leader发现自己的法案被pass了,然后提出一个新的法案,序号加1,Acceptor看到这个法案是最新的,那新的leader发来的法案就被pass掉了,来看旧的leader发来的法案,这个时候新的leader发现自己的法案被pass了,也回在序号上加1,然后提交申请,Acceptor看到新的leader才是最新的法案,把旧的leader法案pass了,这个时候就会发生活锁现象,实际上都是一个法案,但是最后导致机器无线循环

Basic Paxos问题

难实现,效率低(两轮RPC)、活锁

  • Multi Paxos

新概念,Leader:唯一的proposer,所有的请求都需要经过此Leader

首先先做一下Proposer的Leader选举 
Proposer提出的议案,所有的Acceptor需要通过 
这个时候就有些像我们所说的一些模式了

Multi Paxos 还做了一个简化操作 如下图

首先servers先竞选leader,2.3步骤,选举好leader,选举好leader后,leader的每一个法案或者议题,都要被通过,然后返回给Client更像我们现实当中的流程了

  • raft 简化版的Multi Paxos 
    划分了三个子问题

    1. Leader Electtion
    2. Log Replication
    3. Safety

    重定义了三个角色

    1. eader
    2. Fllower
    3. Candidate

这个解释的非常明白 
原理动画解释:https://http://thesecretlivesofdata.com/raft/

这个是怎样选举的leader,某个节点宕机了怎么解决的详细动画演示 
场景测试:http://raft.github.io

Candidate是一个中间状态,Candidate的状态才能够竞选Leader 
机器之间与leader之间发送心跳,其中心跳包里可以夹杂着具体的业务数据,每个节点都有自己的超时的时间,每次心跳发送过来了,超时的时钟会重新刷新加载重新走超时,如果真正的超时了那么,就会重新竞选Leader

如果出现网络分区的话怎么办?

一般来说,分布式的机器都是奇数的,那么出现脑裂,一定会有多于一般的机器和少于一半的机器,Raft执行Accept的时候,在大多数机器,也就是半数以上机器通过后,才会执行通过,那么就会出现,两个小集群都会接收到propose,但是数量少的集群没有大多数通过,也就不会执行Accept,数量多的集群会执行Accept,所以不会出现重复执行的脑裂问题。

一致性并不能代表一定是正确的

三个可能的结果:

  1. 成功
  2. 失败
  3. unknown

Client 向Server 发送请求 Leader 向Follower 发送同步日志,此时集群中有三个节点失败,2个节点存活,那么应该是什么样的情况?

会写入记录,但是不会提交执行,因为5个机器,最少三个是多数情况,现在只有两个几点存活,那么不会执行Accept操作

如果集群中的leader发送follower请求,共5台机器,3台宕机,这个时候不是多数派的情况,不会执行请求,但是会记录请求,这个时候leader挂掉,启动其他3台已经宕机的follower,这时,会重新选举leader,然后新的leader会发送新的请求给follower,此时,大多数机器同意,事务被执行,但是上一个leader发送的请求会被覆盖掉,这个时候事务发生丢失现象,所以Raft会存在这样的问题,但是整个系统的一致性和共识是没有问题的。

  • ZAB算法

基本与Raft相同,在一些名词叫起来是有区别的

ZAB将Leader的一个生命周期叫做epoch,而Raft称之为term

实现上也有些许不同,如raft保证日志的连续性,心跳是Leader向Follower发送,而ZAB方向与之相反 
暂时先讲这么多吧,有时间再进行补充

[转帖]【ZOOKEEPER系列】Paxos、Raft、ZAB的更多相关文章

  1. Paxos、ZAB、RAFT协议

    这三个都是分布式一致性协议,ZAB基于Paxos修改后用于ZOOKEEPER协议,RAFT协议出现在ZAB协议之后,与ZAB差不多,也有很大区别. 1. Paxos 分布式节点分为3种角色, Prop ...

  2. 【分布式】Zookeeper与Paxos

    一.前言 在学习了Paxos在Chubby中的应用后,接下来学习Paxos在开源软件Zookeeper中的应用. 二.Zookeeper Zookeeper是一个开源的分布式协调服务,其设计目标是将那 ...

  3. 从Paxos到ZooKeeper-二、ZooKeeper和Paxos

    ZooKeeper为分布式应用提供了高效且可靠的分布式协调服务,提供了诸如tong'yi统一命名服务.配置管理和分布式锁等分布式的基础服务.在解决分布式数据一致性方面,ZooKeeper并没有直接采用 ...

  4. 【Zookeeper系列】ZooKeeper一致性原理(转)

    原文链接:https://www.cnblogs.com/sunddenly/p/4138580.html 一.ZooKeeper 的实现 1.1 ZooKeeper处理单点故障 我们知道可以通过Zo ...

  5. 【Zookeeper系列】ZooKeeper管理分布式环境中的数据(转)

    原文地址:https://www.cnblogs.com/sunddenly/p/4092654.html 引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...

  6. ZooKeeper系列(7):ZooKeeper一致性原理

    一.ZooKeeper 的实现 1.1 ZooKeeper处理单点故障 我们知道可以通过ZooKeeper对分布式系统进行Master选举,来解决分布式系统的单点故障,如图所示. 图 1.1 ZooK ...

  7. ZooKeeper系列(5):管理分布式环境中的数据

    引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法.Zab协议.通信协议等相关知 识,理解起来比较抽象所以还需要借助一些应用场景,来帮我 ...

  8. Zookeeper一致性协议原理Zab

    ZooKeeper为高可用的一致性协调框架,自然的ZooKeeper也有着一致性算法的实现,ZooKeeper使用的是ZAB协议作为数据一致性的算法, ZAB(ZooKeeper Atomic Bro ...

  9. Zookeeper 系列(一)基本概念

    Zookeeper 系列(一)基本概念 https://www.cnblogs.com/wuxl360/p/5817471.html 一.分布式协调技术 在给大家介绍 ZooKeeper 之前先来给大 ...

随机推荐

  1. (尚034)Vue_案例_数据存储优化(代码优化!!!)

    最好能将上述代码抽取成一个模块(读json数据+写json数据) 1.在src下新建文件夹util(util文件夹用于放入工具的模块) 2.*使用localStorage存储数据的工具模块* 一个模块 ...

  2. Hibernate的级联保存、级联删除

    级联操作: 属性:cascade 值:save-update(级联保存) delete(级联删除) all(级联保存+级联删除) 优点:虽然,不用级联操作也能解决问题.但是级联操作可以减少代码量,使得 ...

  3. minio gataway 模式快速提供s3 兼容的文件服务

    实际很多场景我们已经有了遗留系统的文件存储方式(ftp,或者共享目录),但是这个方式可能不是很好,对于web 不是很友好 实际上minio 也提供了gateway 的模式,可以方便快速的将遗留系统的存 ...

  4. JS的ES5的扩展内容

    JS的ES5 1.严格模式: (1)什么是严格模式: 在全局或函数的第一条语句定义为:  'use strict' 如果浏览器不支持, 只解析为一条简单的语句, 没有任何副作用 (2)严格模式作用: ...

  5. Apache ServiceComb Pack 微服务分布式数据最终一致性解决方案

    https://github.com/OpenSagas-csharp/servicecomb-pack-csharp Saga基本使用指南 使用前置条件说明 如果还有同学对Saga还不甚了解的同学, ...

  6. connect via ssh to virtualbox guest vm without knowing ip address

    cat ssh-vm HOSTIP=`ip route get 1 | awk '{match($0, /.+src\s([.0-9]+)/, a);print a[1];exit}'` HOST_N ...

  7. Centos7 U盘安装&命令大全

    软件下载 1.centos下载,下载地址https://www.centos.org/download/ 我选择的镜像是:CentOS-7-x86_64-DVD-1804.iso 2.UltraISO ...

  8. .NETCore websocket

    .NETCore websocket 实现简易.高性能.集群即时通讯组件,支持点对点通讯.群聊通讯.上线下线事件消息等众多实用性功能. https://github.com/2881099/im

  9. 咏南跨平台中间件REST API

    主旨 1)为了中间件支持跨操作系统部署,客户端支持跨操作系统.跨设备.跨开发语言,特制订本REST API规约. 2)所有接口均支持HTTP GET\POST调用. 3)调用示例为DELPHI代码,其 ...

  10. 【转】Android Fastboot 与 Recovery 和刷机

    1. 首先来看下Android系统的分区:   Android系统的分区.jpg   Android分区解释.png 安卓系统一般把rom芯片分成7个区,如果再加上内置sd卡这个分区,就是8个: hb ...