paxos草案1
parent
fb80e24ab5
commit
cc4691bfdd
|
@ -0,0 +1,90 @@
|
|||
+++
|
||||
title="Paxos算法详解"
|
||||
date="2023-05-02"
|
||||
+++
|
||||
|
||||
## 前言
|
||||
目前主流分布式共识算法有etcd使用的raft,zookeeper使用的zab,其思想或多或少受到paxos启发。paxos算法由Leslie Lamport在《The part-time parliament》论文中首次提出。
|
||||
为描述该算法,Lamport虚构出一个paxos小岛,利用类比的手法提出共识算法,本文旨在理解该论文后并结合相关经验对该算法进行重新描述。
|
||||
|
||||
文章整体结构与论文相同:
|
||||
(1) 首先阐述Lamport提出的**三条约束**,由这三条约束推导出一致性。
|
||||
(2) 在保证约束条件情况下,导出算法。
|
||||
|
||||
## 术语
|
||||
* *一致性*:一致性是一种状态。
|
||||
* *活性*:共识算法能够保证最终达成一致性。
|
||||
* *共识*:共识是过程(节点通过何种共识算法达成一致)。
|
||||
* *决议*:分布式系统想要达成一致的值、操作等。
|
||||
* *提议*:提出决议的过程。
|
||||
* *投票*:对决议表示赞同。
|
||||
* *未决决议*:已投票的决议,能否达成一致性未知。
|
||||
* *已决决议*:通过共识算法达成一致性的决议。
|
||||
* *节点*:参与共识算法的进程。
|
||||
* *投票节点集*:对当前决议进行投票的节点。
|
||||
* *法定投票节点集*:若法定投票节点集中所有节点对当前提议进行投票,则当前决议成为已决决议。
|
||||
|
||||
<mark>例:</mark>
|
||||
存在一个256节点的集群,需要对集群管理密码进行统一配置,即所有节点密码与集群密码相同,存放在变量`password`中。一致性:任意一台功能正常节点密码相同;活性:修改密码过程能够完成,中止或者成功;共识过程:客户端进行密码修改,令`set password xxx`,发送给集群中主节点,主节点进行提议,提议后当前决议成为未决决议,集群其他节点进行投票,经过共识过程使决议成为已决决议,密码修改生效。
|
||||
|
||||
|
||||
## 条件
|
||||
1. 非拜占庭环境,节点不会伪造信息,都尽力完成任务。
|
||||
2. 消息在信道中可能存在丢失、重复、乱序。
|
||||
3. 节点可能会发生故障(掉电,磁盘损坏等)。
|
||||
|
||||
## 约束
|
||||
所有轮次提议构成的集合需要满足下列三条约束:
|
||||
> 约束Ⅰ 决议的每一轮提议都有**唯一**提议号。
|
||||
> 约束Ⅱ 任意两次提议的法定投票节点集都存在**至少一个**公共节点。
|
||||
> 约束Ⅲ **任意**一次提议的决议与该提议法定投票节点集中**所有**节点已投票决议中具有最大提议号的决议一致。
|
||||
|
||||
注意:提议号可以进行大小比较,但是一般不反应时间先后顺序。
|
||||
<div class="container" style="display: flex;justify-content: center;">
|
||||
<table>
|
||||
<tr>
|
||||
<th>提议号</th>
|
||||
<th>决议</th>
|
||||
<th>法定投票节点集</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>002</td>
|
||||
<td>123</td>
|
||||
<td>00 01 02 <mark>03</mark> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>005</td>
|
||||
<td>abc</td>
|
||||
<td>00 01 <mark>02</mark> 04</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>114</td>
|
||||
<td>123</td>
|
||||
<td> <mark>01</mark> 03 <mark>04</mark></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>127</td>
|
||||
<td>abc</td>
|
||||
<td><mark>00</mark> <mark>02</mark> <mark>03</mark> </td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>229</td>
|
||||
<td>abc</td>
|
||||
<td> <mark>01</mark> 02 03 </td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
如上是一个满足约束条件的提议集:提议号唯一,任意两次提议法定节点集都有至少一个公共节点。
|
||||
002和005号提议中法定投票节点之前都没有进行投票(<mark>投票节点</mark>标记),所以决议可以为任意值;114号提议中,03节点在002号提议中进行投票,01和04节点未进行投票,所以该轮提议的决议需与002号提议中的决议一致;127号提议中,02和03节点在之前提议中进行投票,且最大提议号为005,所以该轮提议的决议需与005号提议中的决议一致;229号提议中,01、02和03节点均在之前提议中进行投票,且最大提议号为114,所以该轮提议的决议需与114号提议中的决议一致。
|
||||
在127号提议中,法定投票节点集中所有节点进行了投票,这本次决议达成一致,成为已决决议,最终值达成一致为`abc`(01和04节点可能并不知晓该次决议,但是不影响最终对外一致性)。
|
||||
|
||||
## 一致性
|
||||
当提议形成的提议集,满足上述约束,能够保证一致性。
|
||||
> 若某轮提议达成一致,成为已决决议,则任意提议号大于该提议的决议都与其相同
|
||||
|
||||
证明(反证法):
|
||||
1.
|
||||
## 参考
|
||||
* Leslie, Lamport. "The part-time parliament." ACM Trans. on Computer Systems 16 (1998): 133-169.
|
||||
* Lamport, Leslie. "Paxos made simple." ACM SIGACT News (Distributed Computing Column) 32, 4 (Whole Number 121, December 2001) (2001): 51-58.
|
|
@ -1,181 +0,0 @@
|
|||
body {
|
||||
color: white;
|
||||
background-color: #202124;
|
||||
}
|
||||
|
||||
::-moz-selection {
|
||||
background: blue;
|
||||
color: #fff;
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
::selection {
|
||||
background: red;
|
||||
color: #fff;
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
hr {
|
||||
border-top: 3px dotted blue;
|
||||
}
|
||||
|
||||
code {
|
||||
background-color: lightblue;
|
||||
color: black;
|
||||
text-decoration: bold;
|
||||
padding: 0.1em 0.2em;
|
||||
}
|
||||
|
||||
pre {
|
||||
background-color: #272822;
|
||||
line-height: 1.4;
|
||||
overflow-x: auto;
|
||||
padding: 1em;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
border-color: blue;
|
||||
}
|
||||
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
h1::before {
|
||||
color: var(--darkMaincolor);
|
||||
content: "# ";
|
||||
}
|
||||
|
||||
h2::before {
|
||||
color: var(--darkMaincolor);
|
||||
content: "## ";
|
||||
}
|
||||
|
||||
h3::before {
|
||||
color: var(--darkMaincolor);
|
||||
content: "### ";
|
||||
}
|
||||
|
||||
h4::before {
|
||||
color: var(--darkMaincolor);
|
||||
content: "#### ";
|
||||
}
|
||||
|
||||
h5::before {
|
||||
color: var(--darkMaincolor);
|
||||
content: "##### ";
|
||||
}
|
||||
|
||||
h6::before {
|
||||
color: var(--darkMaincolor);
|
||||
content: "###### ";
|
||||
}
|
||||
|
||||
a {
|
||||
border-bottom: 3px solid var(--darkMaincolor);
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
background-color: var(--darkMaincolor);
|
||||
color: black;
|
||||
}
|
||||
|
||||
.site-description a {
|
||||
color: #ddd;
|
||||
}
|
||||
|
||||
.site-description a:hover {
|
||||
color: black;
|
||||
}
|
||||
|
||||
.tags a {
|
||||
border-bottom: 3px solid var(--darkMaincolor);
|
||||
}
|
||||
|
||||
.tags a:hover {
|
||||
background-color: var(--darkMaincolor);
|
||||
color: black;
|
||||
}
|
||||
|
||||
.site-title a {
|
||||
color: white;
|
||||
text-decoration: none !important;
|
||||
}
|
||||
|
||||
.header nav,
|
||||
.footer {
|
||||
border-color: #333;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
background-color: #333;
|
||||
}
|
||||
|
||||
.soc:hover {
|
||||
color: black;
|
||||
}
|
||||
|
||||
.draft-label {
|
||||
color: var(--darkMaincolor);
|
||||
background-color: blue;
|
||||
}
|
||||
|
||||
.highlight pre code[class=language-javaScript]::before,
|
||||
.highlight pre code[class="language-js"]::before {
|
||||
content: "js";
|
||||
background: #f7df1e;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.highlight pre code[class*='language-yml']::before,
|
||||
.highlight pre code[class*='language-yaml']::before {
|
||||
content: 'yaml';
|
||||
background: #f71e6a;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.highlight pre code[class*='language-shell']::before,
|
||||
.highlight pre code[class*='language-bash']::before,
|
||||
.highlight pre code[class*='language-sh']::before {
|
||||
content: 'shell';
|
||||
background: green;
|
||||
color: white
|
||||
}
|
||||
|
||||
.highlight pre code[class*='language-json']::before {
|
||||
content: 'json';
|
||||
background: dodgerblue;
|
||||
color: #000000
|
||||
}
|
||||
|
||||
.highlight pre code[class*='language-python']::before,
|
||||
.highlight pre code[class*='language-py']::before {
|
||||
content: 'py';
|
||||
background: blue;
|
||||
color: yellow;
|
||||
}
|
||||
|
||||
.highlight pre code[class*='language-css']::before {
|
||||
content: 'css';
|
||||
background: cyan;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.highlight pre code[class*='language-go']::before {
|
||||
content: 'Go';
|
||||
background: cyan;
|
||||
color: royalblue;
|
||||
}
|
||||
|
||||
.highlight pre code[class*='language-md']::before,
|
||||
.highlight pre code[class*='language-md']::before {
|
||||
content: 'Markdown';
|
||||
background: royalblue;
|
||||
color: whitesmoke;
|
||||
}
|
|
@ -46,6 +46,7 @@ body {
|
|||
p {
|
||||
/* font-family: 'Fira Sans', sans-serif; */
|
||||
line-height: 1.5;
|
||||
text-align: justify;
|
||||
}
|
||||
|
||||
hr {
|
||||
|
@ -61,6 +62,10 @@ blockquote {
|
|||
padding-left: 1em;
|
||||
}
|
||||
|
||||
strong {
|
||||
color: #033333;
|
||||
}
|
||||
|
||||
a {
|
||||
border-bottom: 1px dashed var(--maincolor);
|
||||
color: inherit;
|
||||
|
|
Loading…
Reference in New Issue