你可能并不真正了解分布式系统

分块财经/2018-03-16/ 分类:热点新闻/阅读:
这个题目对互联网从业者来说,看着可笑,谁敢说自己不了解分布式系统啊?然而,如果你只是躲在 load balancer 后面做些 stateless 的 service,而没有真正去面对 ...

半年前,一个谁也没见过的日本浪人推出的理财产品突然在七侠镇火爆起来,据说买上点屯着,不出几月就能把同福客栈,甚至龙门镖局都盘下。我们家小六的七舅老爷,卖掉祖宅也嚷嚷着要 all in。我觉得这事吧很是蹊跷,好歹也是自家人嘛,不能让老人家上当受骗 —— 所以 … 放着我来。我用我无双的智慧,和堪比丞相的三寸不烂之舌给七舅老爷拦下来,让他打消了念头。没出半年,小六七舅老爷全家就和我们斩了联系,死生不复相见。 – 摘自《无双日记》 2018.1.1

最近一个多月,谈论 blockchain 的人如此之多,以至于连菜头叔都写了篇文章「韭菜席地而坐」。我在朋友圈里转了这篇文章,评论说:

区块链是对此钻研的技术人,场内人士,以及为所有参与者提供服务的人的盛宴,因为他们对此深思熟虑,并且有金钱以外的付出。那些听风就是雨的参与者,仅仅花费时间在 telegram 里打听小道消息,盯盘讨论涨跌的人,都是韭菜,大小而已。

有朋友问,那做技术的,怎么入行?

我虽不算入行,但知道技术是一脉相承的 —— blockchain 不是像孙猴子凭空从石头里蹦出来的,它有它的根。如果把一门门技术看做一棵棵拔地而起,随时间渐渐丰腴而枝繁叶茂的榕树,那么 blockchain 是若干棵已然成年的榕树交织而成的新枝(branch) —— 它快速成长,活力无限,树冠已然盖住了其它 branch 的锋芒。如果你直接爬到它的树冠上,想要抓其脉络,在纷繁复杂面前,会迷失方向;但若你从根部细细往上捋,线索就如钱老笔下的「真理」,赤裸裸而一览无遗。

今天我们先寻其最重要的一个根:分布式系统。这个题目对互联网从业者来说,看着可笑,谁敢说自己不了解分布式系统啊?然而,如果你只是躲在 load balancer 后面做些 stateless 的 service,而没有真正去面对分布式系统那种让人愉悦并忧伤着的不确定性,那么,你可能并不真正了解分布式系统,因而本文还是值得一读。

依旧例,我们还是先看 wikipedia,把概念先熟络起来:

A distributed system is a model in which components located on networked computers communicate and coordinate their actions by passing messages.[1] The components interact with each other in order to achieve a common goal. Three significant characteristics of distributed systems are: concurrency of componentslack of a global clock, and independent failure of components. - Wikipedia

其中的的关键词我已经勾勒出来:communication / coordinate,message passing,concurrency,lack of global clock,independent failure。我们看看这些东西,是如何引发不确定性的。

global clock

我们先说说全局时钟 —— global clock。它是分布式系统诸多难题的根源之一。

在单机系统里,无论是 SMP 还是 NUMA,有且只有唯一的全局时钟,这个很容易办到。

时间是什么?抛开相对论,在狭义的局部时空中,时间是因果的表象 —— 一个 cause 引发了一个 effect,这种因果产生了时间的概念:用时间(过去,现在,未来)可以更好地描绘因果。我们在 t0 执行一条指令,t1 得到结果,这结果不可能出现在指令执行之前,这便是时间带给我们的确定性。所以,一个系统有一致的,大家都认可和遵循的时间,非常重要。

在分布式系统里,每个系统都有自己的时钟,即便用 NTP(Network Time Protocol)同步,大家也无法严格步调一致;就算时钟的差异小到可以忽略不计,但取决于带宽,当时的拥塞程度,CPU 的繁忙程度,多个系统互相之间发送消息的延迟还是非常地不确定。就跟一个团队去会议室开会一样,如果都根据自己的手表来决定进入会议室的时间,那么肯定会不一致;即便手表时间一致,大家的走路的速度不同,最终进入会议室的时间,也是不一致。这种不一致会带来很多问题,比如说 out of sync —— 大家都散会了,Alice 才抵达会场,所以她缺失了很多状态的更新,于是她不知道手上的下一件事该做还是不该做。所以在分布式系统里很多时候我们需要一致性,来确保某些东西是有序的,大家在同一个 page,否则这个系统会走入歧途。

要解决因为时钟不同,步调不一致而导致的 out of sync 的问题,我们需要设法形成一个逻辑上的「时钟」,让大家都认可这个「时钟」而不是自己的时钟。这个逻辑时钟的第一个实现是 Lamport timestamps(请记住 Lamport 这位图灵奖获得者,分布式系统的先驱,下文他还会上镜)。Lamport timestamps 学术价值大于实际价值,并没有系统实际使用,然而在它之上演进出的 vector clock 广泛被 AWS S3,DynamoDB,Riak 等系统采用,用于确保同一个 object 的因果关系。我们看看 vector clock 的实现:

你可能并不真正了解分布式系统

这个算法的思想很简单:所有 node 都有一个包含所有 timestamp 的 vector,这是个逻辑「时钟」。每个独立的 node 自行处置属于自己的 timestamp,使其有序;但当需要 coordinate 的时候(A 发消息给 B),node A 要发送自己对「时钟」的掌握情况,node B 收到后,更新 vector 里所有比自己已知更大的 timestamp。算法如下(请自行 wiki 以获得更准确的信息):

每个 node 都有一个 timestamp vector,初始化为全 0。

如果某个 node k发生了某个事件,将其对应的 vector[k] + 1。

如果 node k 给 node j 发消息,那么先将 node k 自己的 vector[k] + 1,然后将整个 vector 连同 message 一起发给 node j,node j 将自己原有的 vector[j] + 1,再把 node k 发来的 vector 和自己合并(找最大值)。

通过 vector clock,虽然没有绝对的 global clock,但是我们在分布式系统里能够保证因果,从而消灭了在这个维度上的不确定性(还有其他不确定性!)。

我们可以看到,vector clock 的算法严重依赖于节点间的信任,所以它只适用于一个可信赖的分布式环境。而作为运行在节点间互相并不信任的 P2P 网络上的 bitcoin,无法确保这一点。那么,类似 bitcoin 这样的分布式系统,是怎么决定时间(因果)的呢?中本聪在 bitcoin 的设计中,巧妙地应用了 PoW 的产物,block 来作为系统的逻辑时间:

The solution we propose begins with a timestamp server. A timestamp server works by taking a hash of a block of items to be timestamped and widely publishing the hash, such as in a newspaper or Usenet post [2-5]. The timestamp proves that the data must have existed at the time, obviously, in order to get into the hash. Each timestamp includes the previous timestamp in its hash, forming a chain, with each additional timestamp reinforcing the ones before it.

所以,blockchain 不但承载了 ledger 的功能,chain 上的一个个 block 还是一个个 timestamp,代表着这个系统的过去,现在,以及未来,从而协调整个分布式系统步调一致地前进(且让我再奶一下聪哥)。

广告 330*360

推荐文章

Recommend article
广告 330*360

热门文章

HOT NEWS
  • 周榜
  • 月榜
广告 330*360
分块财经-分布式区块链,财经媒体资讯!
微信二维码微信二维码微信二维码微信二维码
Copyright © 2018 分块财经 版权所有
二维码
意见反馈 二维码