【问题标题】:Distributed Erlang and the CAP theorem分布式 Erlang 和 CAP 定理
【发布时间】:2011-04-20 12:40:48
【问题描述】:

对于CAP theoremdistributed Erlang system 不可能同时提供以下所有三个保证:

  • 一致性(所有 Erlang 运行时或节点,同时看到相同的数据)
  • 可用性(节点故障不会阻止幸存者继续运行)
  • 分区容限(系统在任意消息丢失的情况下继续运行)

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

使用 Erlang 和 OTP,如何实现每个保证?大多数分布式 Erlang 应用程序为更高级别的 A 和 P 做出了实际的选择,并满足于“最终一致性”。似乎 Erlang 本身旨在支持分布式 (P)、容错 (A)、软实时、不间断的应用程序。

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

【问题讨论】:

  • 您更新后的问题就像是在说:“我有一把锤子。我如何建造房屋、学校或寄宿学校?”您将获得的最佳答案将解释 CAP 理论,但实施细节远过于复杂,无法给出一组简单的说明。
  • 我明白你的意思,但我认为这更像是在说:“我有一种编程语言、运行时系统和许多用于构建分布式容错应用程序的库 (Erlang/OTP)。我该如何完成定义分布式容错应用程序的三件事?”
  • 我在 Erlang 中没有看到这个 Consistency 项目符号。仅提及 mnesia 及其由于网络延迟引起的问题。很多时候,我看到一个集群构建在处于随机状态的 FSM 之上。分区 T. - 相同。尝试合并状态或 mnesia(拆分表),通常是通过选择一个主节点并在加入节点后转储另一半来完成。矢量时钟很容易实现。我最近这样做了,但在使用真实数据的测试中,它们在合并之前就爆炸了。

标签: erlang distributed-system


【解决方案1】:

为清晰起见编辑

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

【讨论】:

  • Erlang 既是编程语言又是运行时系统。分布式 Erlang 系统由许多相互通信的 Erlang 运行时系统组成。您的回答根本没有帮助;我可以编写一个分布式系统,支持任何 Turing tarpit 中的两个保证。
  • @Rudiger,也许更好的答案是它取决于应用程序,会更清楚。
  • +1 CAP 定理与编程语言无关。与吕迪格相关的答案,你不能同时拥有它们。由开发人员为应用程序选择任意两个。
  • 我编辑了我的问题以更好地反映我想问的问题。
【解决方案2】:

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

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

这两个项目本身基于 Amazon 的 Dynamo,这是一个可增量扩展、高度可用的键值对存储系统。该技术旨在让用户能够权衡成本、一致性、耐用性和性能,同时保持高可用性。这篇论文很好读。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 为什么?我提出这个解释对于可扩展软件的新手来说是可以接受的。重点是:选两个。无论是 Erlang/OTP 还是任何其他环境,它都将始终是两个。我喜欢把它想象成尺寸,你只能覆盖三分之二。 Riak 声称可以根据请求进行调整,但事实并非如此。要获得 C,您需要有 N = no_of_machines,因此您没有 P。通常 N=something,因此我们有 P 但没有 C。此处授予 A。总会有取舍。对我来说,CAP 就像一组需求,但问题是,没有需要 C&A&P 的产品。
      猜你喜欢
      • 2014-09-05
      • 1970-01-01
      • 2013-02-26
      • 1970-01-01
      • 2011-12-07
      • 2013-05-22
      • 2014-05-20
      • 2011-10-11
      • 2014-07-05
      相关资源
      最近更新 更多