2010-10-03 24 views
1

通过CAP theorem,这是不可能的distributed Erlang system同时提供所有三个以下保证的:分布式Erlang和在CAP定理

  • 一致性(所有的Erlang运行时间,或节点,请参见在同一数据同一时间)
  • 可用性(节点故障不会妨碍幸存者持续经营)
  • 分区容忍性(系统继续,尽管任意消息亏本经营)

分布式Erlang系统可以支持,一个两个的保证。

使用Erlang和OTP,每个保证如何实现?大多数分布式Erlang应用程序为A级和P级的更高级别做出了实际选择,并解决了“最终一致性”问题。看来Erlang本身被设计为支持分布式(P),容错(A),软实时,不间断的应用程序。

编程语言(Erlang),运行时系统(ERTS)和一组库(OTP)用于构建分布式容错应用程序;我该如何做定义的分布式容错应用程序的三件事?

+5

您更新的问题,就像是说:“我有一把锤子,我怎么能盖房子,学校或寄宿学校?”你将得到的最佳答案将解释CAP理论,但是实施细节很难给出一套简单的指令。 – mikerobi 2010-10-03 18:28:50

+0

我明白了你的意思,但我认为它更像是说:“我有一种编程语言,运行时系统和许多用于构建分布式容错应用程序的库(Erlang/OTP)。 _define_分布式容错应用程序?“ – Rudiger 2010-10-04 16:37:55

+0

我没有在Erlang中看到这个一致性项目符号。只是提到由于网络延迟造成的mnesia及其问题。很多时候,我看到一个cluseter建立在随机状态的FSM上。分区T. - 同样的。尝试合并状态或mnesia(拆分表),它通常是通过选择主节点并在加入节点后转储另一半来完成的。矢量时钟很容易实现。我最近做了它,但在测试中,他们在合并之前爆炸了真实数据。 – user425720 2010-10-04 20:07:45

回答

3

我发现的一个非常好的例子是Riak,这是一个基于Amazon的Dynamo并使用Erlang和OTP构建的分布式键值存储。 tunable CAP controls可让您动态“选择”您的一致性和可用性级别;它选择专注于CAP的A和P,这使得它最终一致。 Riak是开源的,在线上有很多关于它的实现的好文章。

另一个很好的例子是Dynomite,PowerSet的Dynamo-clone-in-Erlang。虽然该项目已经死了一段时间,但它作为一个有用的功能设计文档,介绍如何构建Dynamo克隆。

这两个项目本身基于亚马逊的Dynamo,这是一个增量扩展的高可用性键值存储系统。该技术旨在为用户提供在保持高可用性的同时权衡成本,一致性,耐用性和性能的能力。这篇论文是一个很好的阅读。

5

编辑的清晰度

这取决于你的应用程序中,你实现它的设计,而不是平台。您可以使用任何语言或平台组合来实现任何2项担保。

+0

Erlang既是编程语言又是运行时系统。一个分布式的Erlang系统由许多相互通信的Erlang运行时系统组成。你的回答根本没有帮助;我可以编写一个分布式系统,支持任何Turing tarpit中的两个保证。 – Rudiger 2010-10-03 17:31:27

+0

@Rudiger,或许一个更好的答案会是它依赖于应用程序,会更清晰。 – mikerobi 2010-10-03 17:33:37

+0

+1 CAP定理与编程语言无关。 Rudiger与答案联系在一起,你不能同时拥有这些。开发人员可以选择任意两个应用程序。 – Jonas 2010-10-03 17:35:55

0

我认为这个定理应该只在一层考虑。什么是图层?它类似于OSI-ISO层,但对于数据库:应用程序/数据库,操作系统,磁盘/硬件。所有CAP条件都不能满足一个层次。 Erlang/OTP在应用程序层中运行,因此使用Erlang(由于Erlang的灵活性,您可以选择其中的两种)以及OS(即文件系统)或硬件层(raid)的最后一种封面。

+0

这不是CAP的工作原理... – Rudiger 2010-10-04 16:38:45

+0

为什么?我提出这个解释是可以接受的可伸缩软件中的新人。重点是:选择两个。无论是Erlang/OTP还是任何其他环境,它总是两个。我喜欢像维度一样考虑它,你只能覆盖三个。 Riak声称每个请求都可调,但事实并非如此。为了得到C,你需要有N = no_of_machines,所以你没有P.定期N =某事,所以我们有P但没有C.在这里被授予。总是存在折衷。对我来说,CAP就像是一套要求,但事实是,没有产品需要C&A&P。 – user425720 2010-10-04 20:01:12

0

爱尔兰的实力应该与选择A & P,但是与任何系统一样,可以选择任意两个或更少。这部分是由于erlangs编程模型和所有通过消息传递的通信。如果您使用良好的Erlang风格,则不使用共享内存在进程之间进行通信。