Distributed Erlang and the CAP theorem
根据cap定理,分布式Erlang系统不可能同时提供以下三种保证:
- 一致性(所有Erlang运行时或节点同时查看相同的数据)
- 可用性(节点故障不会阻止幸存者继续操作)
- 分区容限(尽管任意消息丢失,系统仍继续运行)
分布式Erlang系统可以支持零、一或两个保证。
使用Erlang和OTP,如何实现每个保证?大多数分布式Erlang应用程序都为更高级别的A和P做出了实际选择,并解决了"最终一致性"问题。似乎Erlang本身就是为支持分布式(P)、容错(A)、软实时、不间断的应用而设计的。
编程语言(erlang)、运行时系统(erts)和一组库(otp)是为构建分布式容错应用程序而设计的;如何定义分布式容错应用程序的三件事?
为了清晰起见而编辑
它取决于应用程序的设计,而不是实现它的平台。您可以使用几乎任何语言或平台组合实现任意2个保证。
我发现的一个很好的例子是Riak,它是一个基于Amazon的Dynamo的分布式键值商店,使用Erlang和OTP构建。可调的cap控件允许您动态地"选择"一致性和可用性级别;它选择关注cap的a和p,这使得它最终保持一致。RIAK是开放源码的,有很多关于它的实现的好文章。
另一个很好的例子是Dynomite,Powerset在二郎的Dynamo克隆版。虽然这个项目已经死机一段时间了,但是它是关于如何构建一个发电机克隆的有用的功能设计文档。
这两个项目本身是基于亚马逊的Dynamo,一个增量可扩展的、高度可用的关键价值存储系统。该技术旨在让用户在保持高可用性的同时,能够权衡成本、一致性、耐用性和性能。这篇论文读得很好。
Erlangs的优势应该是选择A&P,但和任何系统一样,可以选择任意两个或更少。这部分是由于Erlangs的编程模型,所有通信都是通过消息传递的。如果使用好的Erlang样式,则不会使用共享内存在进程之间进行通信。
我认为这个定理应该只在一层中考虑。什么是层?它类似于OSI-ISO层,但用于数据库:应用程序/DB、操作系统、磁盘/硬件。在一层中不能满足所有的盖条件。erlang/otp在应用程序层运行,因此用erlang(由于erlang的灵活性,您可以选择)覆盖其中的2个,最后一个覆盖OS(即文件系统)或硬件层(raid)。