Upgrade to Pro — share decks privately, control downloads, hide ads and more …

consensus_made_simple.pdf

 consensus_made_simple.pdf

2PC, 3PC and Paxos

Avatar for wuzongyuan

wuzongyuan

April 21, 2013

Other Decks in Programming

Transcript

  1. 一致性协议 • 应用场景 – 数据库事务提交 – 时钟同步 – leader选举 –

    … • 形式定义 – 一致性(agreement) – 有效性(validity) – 可终止性(termination)
  2. 2PC P1 P2 P3 C 如果C在第一阶段之后挂了,P3也挂了,C’来接 管,该如何继续? 如果commit, 则因为P3可能是反对的,违反协议. 如果abort,

    但是P3可能已经committed了,状态 又不一致了. C’ 如果C挂了,让C’接管它的工作, 可以继续正确运行 P2 P3 C C’ P1
  3. 3PC • 问题 – 脑裂 – 无法处理fail-recovery P1 P2 P3

    C C’ 超时,接管 询问状态 暂停心跳
  4. 3PC • 问题 – 脑裂 – 无法处理fail-recovery P1 P2 P3

    C C’ 超时,接管 询问状态 命令commit 暂停心跳
  5. 3PC • 问题 – 脑裂 – 无法处理fail-recovery P1 P2 P3

    C C’ 超时,接管 询问状态 命令commit 暂停心跳 恢复
  6. 3PC • 问题 – 脑裂 – 无法处理fail-recovery P1 P2 P3

    C C’ 超时,接管 询问状态 命令commit 暂停心跳 恢复 命令abort
  7. paxos • 系统角色 – proposer – acceptor – learner •

    问题定义 – 决议只有在被 proposers 提出后才能被批准 – 提议被大多数acceptor接受后成为决议 – 在一次 执行实例中只批准一个 决议 – learners 只能获得被批准的决议
  8. paxos P2b. 一旦一个具有value v的提案被批准,那么所有proposer后续提出的 提案也必须具有value v 提了就不能拒绝,那就别提不同的提案了。 P2c. 如果一个编号为n的提案具有value v,

    那么存在一个多数派, 要么他们当中所有人都没有接受编号小于n的任何提案, 要么他们已经接受的所有编号小于n的提案中编号最大的提案具有value v
  9. paxos P2b. 一旦一个具有value v的提案被批准,那么所有proposer后续提出的 提案也必须具有value v 提了就不能拒绝,那就别提不同的提案了。 P2c. 如果一个编号为n的提案具有value v,

    那么存在一个多数派, 要么他们当中所有人都没有接受编号小于n的任何提案, 要么他们已经接受的所有编号小于n的提案中编号最大的提案具有value v 证明一下P2c  P2b?
  10. paxos • proposer – prepare请求n • 希望acceptor回应 – 不再接受比n小的提案的承诺 –

    若已经接受过提案了,告知比n小的最大序号的提案value – accept请求 • 得到大多数acceptor回应后才提出自己的提案 • 提案内容(n, v) – value的选择
  11. paxos • 完整算法 第一阶段: a. 一个proposer选择一个序号n, 向一个多数acceptor集合发出prepare请 求 b. 如果一个acceptor接收到一个比自己所有已经响应的序号都大的

    prepare请求n, 则回应该proposer, 承诺不会再接受比n小的提案,并且 告知自己已经接受过的序号最大的提案value v(假如有的话). 第二阶段: a. 如果一个proposer收到了大多数acceptor的响应, 那么它可以向这些 acceptor发出一个提案(n, v). 其中v是所有响应中序号最大的提案value 或者自己的value(如果没有响应). b. 当一个acceptor收到一个序号为n的提案时,如果它没有响应过序号比 n大的prepare请求,那么可以接受该提案。
  12. paxos sample1(1) Acceptor1 latest_preped: null latest_acpted: null Acceptor1 latest_preped: null

    latest_acpted: null Acceptor1 latest_preped: null latest_acpted: null Proposer1 Proposer2
  13. paxos sample1(2) Acceptor1 latest_preped: null latest_acpted: null Acceptor1 latest_preped: null

    latest_acpted: null Acceptor1 latest_preped: null latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1
  14. paxos sample1(3) Acceptor1 latest_preped: #1p1 latest_acpted: null Acceptor1 latest_preped: #1p1

    latest_acpted: null Acceptor1 latest_preped: null latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null>
  15. paxos sample1(4) Acceptor1 latest_preped: #1p1 latest_acpted: null Acceptor1 latest_preped: #1p1

    latest_acpted: null Acceptor1 latest_preped: null latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1
  16. paxos sample1(5) Acceptor1 latest_preped: #1p1 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #1p1

    latest_acpted: null Acceptor1 latest_preped: null latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted>
  17. paxos sample1(6) Acceptor1 latest_preped: #1p1 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #1p1

    latest_acpted: null Acceptor1 latest_preped: null latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2
  18. paxos sample1(7) Acceptor1 latest_preped: #2p2 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #1p1

    latest_acpted: null Acceptor1 latest_preped: #2p2 latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2 <ok, <#1p1,v1>> <ok, null>
  19. paxos sample1(8) Acceptor1 latest_preped: #2p2 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #1p1

    latest_acpted: null Acceptor1 latest_preped: #2p2 latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2 <ok, <#1p1,v1>> <ok, null> accept, #1p1, v1
  20. paxos sample1(9) Acceptor1 latest_preped: #2p2 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #1p1

    latest_acpted: #1p1,v1 Acceptor1 latest_preped: #2p2 latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2 <ok, <#1p1,v1>> <ok, null> accept, #1p1, v1 <accepted>
  21. paxos sample1(10) Acceptor1 latest_preped: #2p2 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #1p1

    latest_acpted: #1p1,v1 Acceptor1 latest_preped: #2p2 latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2 <ok, <#1p1,v1>> <ok, null> accept, #1p1, v1 <accepted> ok
  22. paxos sample1(11) Acceptor1 latest_preped: #2p2 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #1p1

    latest_acpted: #1p1,v1 Acceptor1 latest_preped: #2p2 latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2 <ok, <#1p1,v1>> <ok, null> accept, #1p1, v1 <accepted> ok accept, #2p2, v1 accept, #2p2, v1
  23. paxos sample1(12) Acceptor1 latest_preped: #2p2 latest_acpted: #2p2,v1 Acceptor1 latest_preped: #1p1

    latest_acpted: #1p1,v1 Acceptor1 latest_preped: #2p2 latest_acpted: #2p2,v2 Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2 <ok, <#1p1,v1>> <ok, null> accept, #1p1, v1 <accepted> ok accept, #2p2, v1 <accepted> accept, #2p2, v1 <accepted>
  24. paxos sample1(13) Acceptor1 latest_preped: #2p2 latest_acpted: #2p2,v1 Acceptor1 latest_preped: #1p1

    latest_acpted: #1p1,v1 Acceptor1 latest_preped: #2p2 latest_acpted: #2p2,v1 Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2 <ok, <#1p1,v1>> <ok, null> accept, #1p1, v1 <accepted> ok accept, #2p2, v1 <accepted> accept, #2p2, v1 <accepted> ok
  25. paxos sample2(1) Acceptor1 latest_preped: null latest_acpted: null Acceptor1 latest_preped: null

    latest_acpted: null Acceptor1 latest_preped: null latest_acpted: null Proposer1 Proposer2
  26. paxos sample2(2) Acceptor1 latest_preped: null latest_acpted: null Acceptor1 latest_preped: null

    latest_acpted: null Acceptor1 latest_preped: null latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1
  27. paxos sample2(3) Acceptor1 latest_preped: #1p1 latest_acpted: null Acceptor1 latest_preped: #1p1

    latest_acpted: null Acceptor1 latest_preped: null latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null>
  28. paxos sample2(4) Acceptor1 latest_preped: #1p1 latest_acpted: null Acceptor1 latest_preped: #1p1

    latest_acpted: null Acceptor1 latest_preped: null latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1
  29. paxos sample2(5) Acceptor1 latest_preped: #1p1 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #1p1

    latest_acpted: null Acceptor1 latest_preped: null latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted>
  30. paxos sample2(6) Acceptor1 latest_preped: #1p1 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #1p1

    latest_acpted: null Acceptor1 latest_preped: null latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2
  31. paxos sample2(7) Acceptor1 latest_preped: #1p1 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #2p2

    latest_acpted: null Acceptor1 latest_preped: #2p2 latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2 <ok, null> <ok, null>
  32. paxos sample2(8) Acceptor1 latest_preped: #1p1 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #2p2

    latest_acpted: null Acceptor1 latest_preped: #2p2 latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2 <ok, null> <ok, null> accept, #1p1, v1
  33. paxos sample2(9) Acceptor1 latest_preped: #1p1 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #2p2

    latest_acpted: null Acceptor1 latest_preped: #2p2 latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2 <ok, null> <ok, null> accept, #1p1, v1 <rejected, #2p2>
  34. paxos sample2(10) Acceptor1 latest_preped: #1p1 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #2p2

    latest_acpted: null Acceptor1 latest_preped: #2p2 latest_acpted: null Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2 <ok, null> <ok, null> accept, #1p1, v1 <rejected, #2p2> accept, #2p2, v2 accept, #2p2, v2
  35. paxos sample2(11) Acceptor1 latest_preped: #1p1 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #2p2

    latest_acpted: #2p2,v2 Acceptor1 latest_preped: #2p2 latest_acpted: #2p2,v2 Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2 <ok, null> <ok, null> accept, #1p1, v1 <rejected, #2p2> accept, #2p2, v2 accept, #2p2, v2 accepted accepted
  36. paxos sample2(12) Acceptor1 latest_preped: #1p1 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #2p2

    latest_acpted: #2p2,v2 Acceptor1 latest_preped: #2p2 latest_acpted: #2p2,v2 Proposer1 Proposer2 prepare, #1p1 prepare, #1p1 <ok, null> <ok, null> accept, #1p1, v1 <accepted> prepare, #2p2 prepare, #2p2 <ok, null> <ok, null> accept, #1p1, v1 <rejected, #2p2> accept, #2p2, v2 accept, #2p2, v2 accepted accepted ok
  37. paxos sample2(13) Acceptor1 latest_preped: #1p1 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #2p2

    latest_acpted: #2p2,v2 Acceptor1 latest_preped: #2p2 latest_acpted: #2p2,v2 Proposer1 Proposer2 prepare, #3p1 prepare, #3p1 prepare, #2p2 prepare, #2p2 <ok, null> <ok, null> accept, #2p2, v2 accept, #2p2, v2 accepted accepted ok
  38. paxos sample2(14) Acceptor1 latest_preped: #3p1 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #3p1

    latest_acpted: #2p2,v2 Acceptor1 latest_preped: #2p2 latest_acpted: #2p2,v2 Proposer1 Proposer2 prepare, #3p1 prepare, #3p1 <ok, <#1p1,v1>> <ok,<#2p2,v2> prepare, #2p2 prepare, #2p2 <ok, null> <ok, null> accept, #2p2, v2 accept, #2p2, v2 accepted accepted ok
  39. paxos sample2(15) Acceptor1 latest_preped: #3p1 latest_acpted: #1p1,v1 Acceptor1 latest_preped: #3p1

    latest_acpted: #2p2,v2 Acceptor1 latest_preped: #2p2 latest_acpted: #2p2,v2 Proposer1 Proposer2 prepare, #3p1 prepare, #3p1 <ok, <#1p1,v1>> <ok,<#2p2,v2> accept, #3p1, v2 prepare, #2p2 prepare, #2p2 <ok, null> <ok, null> accept, #3p1, v2 accept, #2p2, v2 accept, #2p2, v2 accepted accepted ok
  40. paxos sample2(16) Acceptor1 latest_preped: #3p1 latest_acpted: #3p1,v2 Acceptor1 latest_preped: #3p1

    latest_acpted: #3p1,v2 Acceptor1 latest_preped: #2p2 latest_acpted: #2p2,v2 Proposer1 Proposer2 prepare, #3p1 prepare, #3p1 <ok, <#1p1,v1>> <ok,<#2p2,v2> accept, #3p1, v2 <accepted> prepare, #2p2 prepare, #2p2 <ok, null> <ok, null> accept, #3p1, v2 <accepted> accept, #2p2, v2 accept, #2p2, v2 accepted accepted ok
  41. paxos sample2(17) Acceptor1 latest_preped: #3p1 latest_acpted: #3p1,v2 Acceptor1 latest_preped: #3p1

    latest_acpted: #3p1,v2 Acceptor1 latest_preped: #2p2 latest_acpted: #2p2,v2 Proposer1 Proposer2 prepare, #3p1 prepare, #3p1 <ok, <#1p1,v1>> <ok,<#2p2,v2> accept, #3p1, v2 <accepted> prepare, #2p2 prepare, #2p2 <ok, null> <ok, null> accept, #3p1, v2 <accepted> accept, #2p2, v2 accept, #2p2, v2 accepted accepted ok ok
  42. paxos • learner – 正常情况 • 每个acceptor接受到都告诉所有的learner – 消息量大 •

    选一个learner, 只告诉它,它知道决议后再告诉其它人 – 消息量小,但是这个learner成了单点 • 选一个learners集合 – 在性能和可靠性之间权衡 – 异常 • 如果有acceptor挂了,可能导致无法推断出决议 – learner同机的proposer 发起针对该提案新一轮的决议
  43. 参考文献 • http://www.wikipedia.org/ – 2pc & 3pc & paxos &

    Byzantine_failure • << paxos made simple >> • http://the-paper-trail.org/blog/tag/consensus/