上一章我们了解了分散式系统是什麽、为什麽要让系统分散,
也大概知道分散式系统会遇到节点死掉、网路断掉的问题。
接着将更加深入探讨,
2.1、2.2 分别介绍两个思考实验,
2.3 建立系统模型,也就是把各种情况分类,
以便未来在这些假设基础上去设计演算法。
2.4 则谈谈 容错(fault tolerance)与高可用(high availability)的衡量标准。
arm1 与 army2 需要同时出动,才能把城市攻打下来。
他们可以透过信使互相确认要出发的日期,但信使可能会被抓走。
两位将军永远不能确定另一位会在同一天出动!
试想:
这样就会形成一个无限的 sequence,每次都把全军覆没的风险抛给另一个将军,永远不能确定另一组军队会在同一天出动;就像 distributed system 中的 nodes 没办法确定其他 node 的状态。
顺带一提,这就是 [[TCP 3-way handshakes]] 的情形,基本上只要双方都收到了一次回信,那只要相信对方会出兵,就没问题了。
同样是要同时出动、以信使确认出发日期,
这次假设信使一定会送达,但将军之中有叛徒!
虽然 2.1 和 2.2 把网路和节点错误分开讨论,但现实中很常两者同时出错!
如果要设计演算法,就要对整个系统有一些假设,这里从 3 个面向来探讨:network, node behavior, timing。
link 可以透过网路协定而「升级」
这样好像只要能够一直 retry,讯息总会送达。
但现实中,节点可能会 crash,然後某个讯息就永远的消失。
在 byzantine 下,如果所有的 node 都跑同样的程序,而这些程序有同样的 bug,那这个系统是无法 tolerate 的(根据理论,叛徒要少於 1/3)。
node behavior 不像 network 可以透过 protocol 的保证来做模型之间的转换。
用 synchronous model 设计演算法会简单,但如果有一点点的差错(超过预设的 bounded latency / execution speed),就会出非常大的问题。
用 asynchronous model 设计的演算法会十分 robust,但有些问题在此模型下无法被解决。
paritially synchronous 是个 compromise。大部分状况都是 synchronous,只有当一些 timing guarantines are off 时,则切换成 async。
Networks
通常 latency 是可被预测的,但有时会增加:
Nodes
通常 node execution speed 是可被预测的,但也有暂停的时候:
node execution speed 是可被预测的?
因为 instruction 要几个 cpu clock cycle 都是可以知道的,clock speed 也不会差太多 `[note p19]`
所以实际上,使用 synchronous model 来设计演算法,很不可行。
If your assumptions are wrong, all bets are off!
“Two nines” = 99% up = down 3.7 days/year
“Three nines” = 99.9% up = down 8.8 hours/year
“Four nines” = 99.99% up = down 53 minutes/year
“Five nines” = 99.999% up = down 5.3 minutes/year
<<: [Day03 - 规划与设计] 建立 Wireframe 让你开发不迷路
>>: Re: 新手让网页 act 起来: Day03 - 再次了解React.createElement()
今天迈入第14天了,耶~~~今天的内容我也是很喜欢,尤其是自己调整背景颜色的实作,真的觉得非常有趣~...
部署及开启API服务-flask 导入套件 import base64 import datetim...
本篇详细介绍 LSTM 及如何以 LSTM 建模预测时间序列。 本日大纲 LSTM 介绍 LSTM ...
OpenCV安装之後 还需要imutils 这个主要是要用来进行影像处理 像是平移, 旋转, 缩放,...
大家好~ 我是五岁~~ 今天让我们来把哥布林完成吧~~!!! 目标是把昨天的哥布林上色卡通化~~ 第...