最富有的学者:“抠门”大师卡文迪许

英国化学家卡文迪许他那献身科学的平生给后人留下的印象是完美而深刻的。1783年父亲去世给他留下大年夜笔遗产。如许他的资产跨越了130万英镑。有句打趣话:"卡文迪许是18世纪英国有学问人中最富者,有钱人中最有学问者"。如许说切实其实毫不夸大。但他却衣装俭朴,接待客人也在家做饭,当时被称为"大年夜抠门";他为人低调,参加聚会,老是低着头,屈着身,双手搭在背后,静静地进入室内,让人感到性格孤介。化学家武拉斯顿对卡文迪许总结:"与卡文迪许交谈,切切不要看他,而要把头仰起,两眼望着夭,就象对空口措辞一样,如许才能听到他的。

(大年夜师卡文迪许)

然而在科学研究中,他思路坦荡,兴趣广泛,显得异常活泼。上至天文气候,下至地质采矿,抽象的数学,具体的冶金工艺,他都进行过商量。特别在化学和物理学的研究中,他有极高的成就,取得很多重要的成果。

最巨大年夜的成就之一来了。1781年,普利斯特列传播鼓吹他做了一个"毫无头绪"的实验:他将卡文迪许发明的氢气和本身发明的即氧气混和在一钳口瓶中,然后用电火花燃爆,发明瓶中有露水生成。他困惑本身的实验成果,也无法解释本身的实验。当普利斯特列将这一情况告诉卡文迪许后,引起了后者的兴趣。卡文迪许持续这一实验,最后结论:氢气和通俗空气混和进行燃爆,几乎全部氢气和1/5的通俗空气凝给成露水,这露水就是水。他又采取氧气代替通俗空气进行多次实验,同样获得了水。他还证实氢气和氧气互相化合的体积此为2.02:1。由此他确认了水是由氢气和氧气化合而成的。所以说今天水的研究发明必须归功于卡文迪许的巨大年夜供献,从而揭开了人类对最常见最要的谁进入更深刻的研究!

(水分子构造)

卡文迪许大年夜师另一重要供献是他的扭秤实验:用一个质量大年夜的铁球和一个质量小的铁球分别放在扭秤的两端。扭秤中心用一根韧性很好的钢丝系在支架上,钢丝上有个小镜子。用激光照射镜子,激光反射到一个很远的处所,标记下此时激光地点的点。 该实验得出了万有引力常量G,有了G就可以获得地球等天体的质量了。这个实验是测出地球质量的实验,为后续物理科研有里程碑的意义!

卡文迪许从事科研不图名、不牟利,他没有写一本书,这对于促进科学研究的成长是很可惜的。卡文固然平生茕居,然则科学研究所开辟的新寰宇给他的生活供给了特其余兴趣。生活规律,恬澹名利,很少生病,最后以79岁的高龄与世永别。

(卡文迪许扭秤)

作者:氕氘氚

头条号:化学科技生活

本文重要对中间化副本控制协定进行具体介绍。

中间化副本控制协定

大年夜多半的分布式存储都邑采取中间化副本控制协定,比如GFS,TFS,MongoDB

而去中间化则是说副本集中没有中间节点,所有节点的地位是平等的,大年夜家都可以接收更新请求,互相经由过程协商杀青数据的一致。去中间化副本控制协定的最大年夜好处在于可用性比较强,只要有大年夜多半节点存活就能供给办事。但缺点时协定流程复杂,尤其是须要强一致性包管的时刻。

在业界中,Dynamo,cassandra就是基于去中间化协定,固然 Dynamo 测验测验经由过程引入 Quorum 机制和 vector clock 机制解决读取数据的一致性问题,但其一致性模型依旧是一个较大年夜的问题。

在同步模式下,体系的靠得住性异常好,只要有一个节点正常,就能包管数据不损掉。然则体系的更新可用性异常差,只要有一个节点异常,就无法完成更新;并且,响应延迟比较大年夜,取决于副本集中收集延时最大年夜、处理速度最慢的节点。

中间化副本控制协定在分布式存储体系中应用非惯例范,但各家实现又有不合。这里重要集合分布式文件体系与分布式数据库来做比较分析

对于中间化副本控制协定,提出了以下疑问:

第一个问题:复制集之间数据的同步是同步模式照样异步模式。

在中间化副本控制协定中,主节点(primary)供给写入操作,数据会同步到其他节点。留意,上面语句中第一个同步是指复制集中节点间数据趋于一致的过程。

所谓同步(Synchronous replication),就是说对于客户端请求,体系壅塞到复制集中所有节点都更新完成,才能向客户端返回,即write all。而异步(Asynchronous replication)模式,只要一个或者部分节点更新则算写入操作成功,平日是write one。

上图(来源于Distributed systems for fun and profit,下同)即为同步模式,客户端的请求被发送到s1这个副本集,s1将请求转发给s2、s3,等s2、s3都操作完成之后再向客户端返回成果。

上图则是异步模式,客户端的写请求只要在一个节点上完成就急速向客户端返回成果。在上图中,数据被写入到s1即认为写入成功,向客户端返回,体系在后台由s1向s2、s3节点同步数据。

异步模式下,体系的吞吐量会比较好,然则存在数据损掉的风险,比如上图中,假如在数据同步到s2 s3之前s1挂掉落,那么刚才客户端的更新就损掉了,关键在于客户端认为已经写入成功了。别的,异步模式下,客户端在写入成功之后,急速从体系读取数据,有可能读不到最新的数据,比如上图中,客户端写入s1之后急速从s2 读取。

在数据同步的时刻选择同步模式照样异步模式呢,这个取决于体系对一致性、可用性、响应延迟的请求。

而在分布式数据库MongoDB中,决定权交给了用户,用户可以决定应用同步模式照样异步模式。假如w:1.那么只会写入到primary节点就急速返回,体系会在后台向secondary节点同步数据,即为异步模式。假如w:N(N为复制集节点数量),那么primary节点须要比及所有secondary都更新到最新的数据之后(或者等待超时)才向客户端返回,也就是同步模式。即使在去中间化副本控制协定,如cassandra,也供给给用户自行设定一致性等级。

前面已经提到了同步模式、异步模式各自的好坏,这里以MongoDB为例具体评论辩论,看看同步、异步模式对系同一致性、可用性的影响。

在异步模式(w: 1)下,体系的响应延迟很低,可用性异常好,但存在两个问题。第一:同一个客户端在获获成功写入的返回之后急速从secondary节点读取,有可能读不到最新的数据;第二:在主从切换的时刻(后面会具体讲解这一过程),可能产生rollback,简单来说,数据只持久化到了primary,secondary节点还未更新到最新的数据,此时假如primary故障,体系会选举出新的primary,即使旧的primary恢复正常后以secondary身份从新参加复制集,新的primary不会承认其数据,这就导致了更新损掉的问题。

同步模式下(w:N或者w:Majority),须要等待所有节点都写入成功,响应延迟会比较高,在数据库应用中一般很难接收,之前基于《经由过程一步步创建sharded cluster来熟悉MongoDB》中的复制集(一个primary、一个secondary、一个arbiter)做过实验,假如将secondary shutdown(db.shutdownServer),然后用writeConcern: {w: "majority”, wtimeout: 10}写入数据,客户端会壅塞到超时,然后给出超时信息。不过,w:majority包管了写入的数据不会损掉,即不会出现rollback的问题。

第二个问题:数据的流向

即数据是若何从Primary节点到secondary节点的。

起首是比较有意思的GFS,GFS写入流程如下:

GFS的写入将控制流与数据流分开,客户端会把数据流链式推送到各个节点,推送的过程并不关怀谁是primary、谁是secondary。须要留意的是,各节点(GFS中称之为chunkserver)只是缓存数据,比及Primary向secondary发送持久换指令(step5)的时刻再回真正持久化写入。

更一般的,数据的流向有两种,链式与主从模式。

链式就是指从一个节点推送到比来的节点,比如GFS,“比来” 可以用IP地址或者节点间心跳TTL来衡量,如图所示(图片来源于清华阿里-大年夜数据课程的PPT):

不难看出,写入过程中每个节点的带宽应用都比较均衡,可以充分应用收集资本,也不会有单点压力;然则须要经由多个节点,写入延迟会比较大年夜。

而主从模式则是指数据同时从primary节点到secondary节点,如图所示(来源)

主节点选举

MongoDB就是采取了主从模式,Secondary会从Primary拉取OPLOG并应用到本地。显然,在这种模式下Primary节点的带宽压力比较大年夜,然则写入延迟会小一些。

第三个问题:部分节点写入掉败了怎么办

不管是同步模式照样异步模式,也不管是链式推送照样主从模式推送,复制集中数据的写入都是1PC(1 phase commit)。即数据的更新只有一个commit阶段,而没有prepare阶段,假如某些节点产生故障,那么提交在故障节点上会掉败,甚至是提交了部分、不完全的数据。

所谓的中间化,就是对于副本集的更新操作有一个中间节点来调和治理,将分布式的并发操作转化为单点的并发操作,从而包管副本集内各节点的一致性。其长处在于逻辑简单,将复杂的问题(分布式并发)转换成一个有成熟解决筹划的问题(单点并发)。但缺点在于,副本集的可用性依附于中间节点,假如中间节点故障,即使有中间节点主动切换机制,也会出现数10秒的弗成用。

复制集中多个节点的更新本质上来说应当是分布式事务问题,理论上应当包管原子行:要么都更新成功,要么都不更新,而不会出现部分节点更新成功的情况。但经典解决筹划如两阶段提交价值太大年夜,是以分布式存储中的复制集更新大年夜多采取best effort 1pc,只不过不合的体系对更新掉败的处理有所差别。

在TFS中,meta server(元数据办事器)也是经由过程raft协定选举primary的,下面两个gif形象展示了primary初始选举以及当primary故障之后的从新选举(图片来源于清华阿里-大年夜数据课程的PPT)。

比如MongoDB,以第一个问题中提到的例子,writeconcern为w: majority,因为个中一个secondary挂掉落,写入操作是弗成能成功的。是以,在超不时光达到之后,会向客户端返回掉足信息。然则在这个时刻直接连接到rs的primary节点,数据是持久化到了primary节点,不会被回滚。

别的,对于分布式图片存储haystack,假如更新掉败,会重试流程,直到成功或超时,重试的话所有节点都邑重试。那么可能出现两个问题,某个节点上数据部分写入(写入部分数据就崩溃了);因为重试是对复制集中所有节点重试,是以某个节点上同一份数据可能写入了多份。对于第一个问题,因为有checksum,是以不怕部分写入掉败;第二个问题,因为有offset和元数据,反复写入也不是问题。haystack(以及GFS)经由过程这种奇妙的方法解决了分布式更新问题。

主从节点数据读取

复制集中,不合的体系在数据读取方面有两个问题。第一:secondary节点是否供给读办事;第二,假如可以从Secondary读取,那么这个接口是否开放给用户

第一个问题,假如secondary节点供给数据读取办事,那么是否会读取到过时的数据(即不是最新成功写入的数据) ?比如在异步写入的时刻,客户端获获成功写入的返回之后,急速去secondary上读取,那么有可能读到过时的数据,这对于强一致性的情况是不克不及许可的。我们知道,元数据的治理一般也是复制集,而元数据须要包管强一致性,是以,元数据的写入一般都是同步的。比如GFS中,master由一个active(也就是primary节点)、多个standby(也就是secondary节点)构成,在元数据写入到active的时刻,要包管本地和长途机械都写入成功才能返回;并且只有active供给读取办事。

第二个问题,假如复制集中的节点都能供给读取办事,那么接口是否供给给最终用户呢?在haystack中,多个在不合机械上的物理卷构成一个逻辑卷,一个逻辑卷就是一个复制集。当读取请求达到的时刻,是由haystack的元数据办事器(directory)根据负载均衡的原则选出供给办事的物理卷,即用户是不知道读取请求是落地到哪个物理节点的。而对于mongodb,用户可以在查询语句里面指定是从Primary读取,照样从Secondary读取,或者让体系来选择(Nearest)。

读取方法与用户角度的一致性异常相干,比如在MongoDB中,不合的readrefence导致一致性、可用性的差别,具体可见《CAP理论与MongoDB一致性、可用性的一些思虑》

在中间化副本控制协定中,这个中间(primary)是怎么选出来的呢?是上级指定照样平易近主选举呢?

GFS体系中,Primary节点是由master(GFS中的元数据办事器)经由过程lease机制选择的。简单说来,GFS给某个节点揭橥Lease,该节点就成为了Primary节点,Primary节点也可以在过时之前从新申请Lease,并且Lease的揭橥、申请信息都是在chunkserver与master的心跳中,是以也不会带来过多额外的开销。应用Lease机制能很好的避免在复制集中出现双主(同时有两个节点认为本身是Primary)现象。

比如在分布式文件体系GFS中,须要包管复制集内副本的强一致性,而单次读写的响应延迟并没有那么重要,是以选择了同步模式,即primary须要比及所有的secondary都写入成功才会向客户端返回。

而在Zookeeper、TFS、MongoDB中,都是通以前中间化的协定选举出Primary节点,选举出Primary节点之后,就变成了中间化的副本控制协定,当Primary出现故障之后,会从新选举过程。对于平易近主选举,两个身分异常重要:第一是强一致性,只能选举出一个Primary;第二个是可用性,选举过程要越快越好。

为了达到强一致性,须要应用分布式一致性协定,今朝较为常见的协定有Paxos协定,该协定可以实现所有备份均可以供给对外办事,并且包管强一致性,经由过程理论和实践考验可以达到分布式的请求。Raft协定则是Paxos的一种特化,在这个协定的实现中,备份间须要区分主从角色,只有主节点可以供给对外办事,协定实现简单高效,能很轻易的同各类分布式数据一致性同步场景相结合,是工程实现最好的选择。

上图展示了Primary选举过程

在mongodb3.2中,Primary选举算法改成了raft-like算法,此举的目标也是为了缩短选举的时光,具体可见Replica Set Protocol Version。

上图展示了在本来的Primary挂掉落之后(也可能仅仅是掉去响应),残剩的节点是若何选举出新的Primary。

为了防止出现双主的情况,在投票过程中至少要有跨越折半的节点赞成才能选出Primary,这也是为什么复制集中节点数量都是奇数个的原因。

中公优就业IT培训,总有你想学的:http://xue.ujiuye.com

勤工俭学筹划,0元学IT!

http://www.ujiuye.com/zt/qgjx/?wt.bd=mmxtt

找工作太难?豪杰,让我助你一臂之力!