Skip to content

Commit

Permalink
增加文档
Browse files Browse the repository at this point in the history
  • Loading branch information
entropy-cloud committed Oct 15, 2024
1 parent 1753984 commit 236760c
Showing 1 changed file with 35 additions and 0 deletions.
35 changes: 35 additions & 0 deletions docs/theory/paxos-for-kids.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
在建立时间静止的图像之后不需要任何超过小学生认知程度的推理能力就可以完全理解Paxos算法

1. 我们要解决的是一个最简单的共识问题:如何让分散在多个地方的人共同选择一个同样的值。
例如我们如何让A,B,C三个人都同意选择值为X。困难在于,你刚让人送信给A,B,C让他们选择值1,他们的回信还在路上,不知道什么人找上了A,告诉他值应该是2,导致A将自己的决定改成了2。因为A,B,C不在同一个地方,你只能逐一写信去和他们说,但是每次接到信,再给你回信的过程中,都可能有意外情况发生,总有其他人也试图写信说服A,B,C选择其他的值。因为A,B,C对所有人都是一视同仁的,所以他们如果能接受你的意见,肯定也就能接受后来的其他人的意见,导致他们的意见总是变来变去,无法统一。
(理解共识问题是什么,以及它有什么难度,应该只需要小学文化)

2. 如果你会魔法,要避免其他人的干扰就很简单。可以施展时间静止魔法,让所有人的时间都静止下来,停在t0时刻,然后你直接找到A,和他说值是1, 说完你再去找B,和他说值是1。因为时间静止的过程中,只有你是自由活动的,其他人的活动都被冻结了,所以不会有任何干扰的存在。当你和A,B,C都说完之后,再让时间流动起来,这样A,B,C就在t0时刻统一了认识,认为值是1。
(理解这一点也只需要小学文化,看过魔法相关的动画片可能会有帮助)

3. 虽然我们的世界并没有魔法,但是我们可以模拟魔法的实现。你可以写信给ABC(第一阶段),信的内容是:请假装时间静止在9点钟。ABC接到信后给你回复:同意。然后他们将自己的钟的指针拨到9点钟。你从ABC接收到回信后,发出第二阶段的信:如果时间还静止在9点钟,则设置值为1,同时时间前进到9点01秒。如果ABC都回复了你的第二阶段的信件,反馈说9点钟的时候设置值为1成功,你就知道时间静止成功了,而且ABC的值都设置为了1。
(模拟时间静止魔法需要分为两个步骤:一是请求时间静止,二是验证时间确实是静止的。时间静止之后我们才能干活,干完活才能验证。这个逻辑非常简单,小学生肯定可以理解)

4. 为了保证模拟的真实性,ABC需要主动维护时间的概念,避免破坏时间的内在特性。首先,时间是单向流动的,如果时间已经来到了9点,所有9点前发生的事情应该都已经发生过了,不可能在9点之后再发生8点的事情,因此ABC如果已经同意时间静止在9点,就不可能再同意时间静止在9点之前,比如在8点静止。第二,如果时间静止了,则只有发起时间静止魔法的人可以活动,其他人的活动都会被冻结。所以如果ABC已经同意你的要求将时间静止在9点了,就不会再同意另外一个同样时间的时间静止要求,否则意味着在时间静止的时候还存在着两个活动者,这和时间静止的定义不符合。ABC通过忽略那些违背时间特性的事实,从而实现了想象中的时间的单向流动,这可以帮助我们排除很多混乱的情况。
(ABC每次接收到信件都会导致时间前进,因此接收到第二阶段信件的时候如果发现时间没变,则表示在请求时间静止到设置值的过程中,没有任何事情发生,也就没有其他人要求设置值。时间的这个特性小学生应该可以理解)

5. ABC在同意时间静止在9点之后,如果有人写信请求时间静止在10点钟,则ABC也会同意这一请求,这是因为ABC对所有人都是一视同仁的,他们只是维护时间概念的单向性,并不会专门支持你的选择。如果ABC做出了这样的选择,则表示前一轮的时间静止魔法模拟被自动结束了,并没有完成设置值的过程,而且因为时间已经移动到10点钟,9点钟的设值请求会被拒绝。为什么ABC在接收你的时间静止请求后,不坚持等待你的第二封信的到来?这是为了系统的容错性。如果你的信中途丢失了或者你信写了一半干别的去了,那ABC死等你的第二封信岂不是有点冤。所以为了避免中间过程出错后无法继续下去,ABC最好的选择就是接受其他人的第一封信,重新开始新一轮的尝试。需要注意的是,如果ABC曾经同意过时间静止,那么这就意味着在9点钟曾经发生过时间静止,即使最后被意外结束,也只是说此次时间静止没有成功设置值。前一个时间静止被自动终止是为了保证时间静止不会交错,只能先后执行。
(毕竟是模拟魔法,必然需要考虑到模拟失败的情况,失败后只要不产生矛盾,不要有两个人同时实现时间静止就可以。一次模拟失败后可以重新尝试,小学生也可以理解真正的魔法和模拟的魔法之间的区别)

6. 如果你成功模拟了9点钟的时间静止,通知ABC设置值为1,那会不会有其他人后面会再次成功模拟一次10点钟的时间静止,将值又改为2?因为我们要实现的是一个最基本的共识算法,它有个额外的技术要求,就是一旦值达成共识,就不允许再被修改。因此我们还需要设计一个额外的机制,来避免上面说的情况。避免的方法也很简单,就是接收到第一封请求时间静止的信件的时候,如果ABC发现自己此前已经接受过值了,除了回复同意之外,还把这个值和接受它的时间告诉新一轮的时间静止发起者,而发起者如果发现ABC都已经接受了值为1,那么他不能改变这个值,只能是用值1去继续完成时间静止模拟的第二阶段。ABC在不同的时刻反复设置值为1不会产生任何矛盾。
(两个时间静止魔法T1和T2肯定不会交错,一定是先后执行。那么执行T2的时候只要主动看一下T1的结果,如果T1成功设置了值为1,那么T2就也要采用值为1,这样就不会产生T2覆盖T1结果的情况。写之前看一下上次读的情况,这是小学生也能理解的避免冲突的策略)

7. 如果ABC都成功同意在t时刻时间静止,在t时刻都成功设置同样的值,都返回说t时刻设置了同样的值,那么我们是很容易做出判断的。复杂的情况在于,如果ABC响应的时候出现不一致怎么办?

答疑:
1. 为什么要写信通知A,B,C,不能打电话或者搞个聊天群吗?
想象一下我们是在古代,没有这些设施,只能用原始的方法去做。Paxos是一个底层算法,只能用最原始的手段去实现。

2. 如果信丢了怎么办?
整个Paxos算法有一定的容错性,发出三封信有两封收到就可以继续下去。如果只有一封收到或者一封都没收到,或者我们等回信一直等不到,则我们可以向前推进时间戳,重新再写一封发起时间静止的信,就当这一轮的时间静止魔法失败了。只有当接到多数派的成功回信后,我们才能继续时间静止魔法。

3. 为什么ABC同意在9点钟时间静止之后,不坚持等待第二封信的到来,而是在接收到静止在10点钟的请求后。

4. ABC每次接到信都会推进它本地的时钟。成功接收第一阶段的请求信,需要信中请求的静止时间大于当前时钟的时间。成功接收到第二阶段的设值信,则意味着信中的静止时间与自己的时钟相匹配,而且一旦接收这封信,时钟就会向前推进。


0 comments on commit 236760c

Please sign in to comment.