设为首页 加入收藏

TOP

干货:分布式系统详解(一)
2019-09-17 18:52:59 】 浏览:163
Tags:干货 分布式 系统 详解

先讲个黑色笑话:

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

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

我虽不算入行,但知道技术是一脉相承的 —— 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 以获得更准确的信息):

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

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

  3. 如果 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 additio

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇计算机组成与配置 下一篇微服务架构所要迎接的挑战!你,..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目