Erlang容错应用程序:CAP的PA或CA?

时间:2012-08-21 19:12:45

标签: erlang couchdb otp mnesia cap

我已经问过一个question关于披萨送货店的简单容错软实时网络应用程序。

enter image description here

我在那里得到了非常好的评论和答案,但我不同意这是一个真正的网络服务。它不仅仅是一种网络服务,它更像是一个实时系统来接受客户的订单,控制这些订单的调度并控制实时交付这些订单的车辆。

此外,与“真正的”网络服务不同,这个系统不是为了拥有多个用户 - 只有少数调度员(电话接线员)和一些将使用它的送货司机(因为现在我没有要求提供对实际客户的服务的直接访问;只有调度员和交付驱动程序可以直接访问)。

因此这个问题有点笼统。

我发现为了正确选择此应用程序的NoSQL数据存储选项,我首先需要做的是在CAPA和{{{{}}之间做出选择。 1}}根据CAP theorem

现在,Building Web Applications with Erlang书说“虽然它[Mnesia]不是SQL数据库,但它是一个像SQL数据库一样的CA数据库。它不会处理网络分区”。同一本书说CouchDB数据库是CP数据库。

考虑到这一点,我认为我需要对我的应用程序做的第一件事是确定“容错”术语对CAP的意义。

我的简单要求是让应用程序24/7(R1)可用。另一个是没有必要扩展,应用程序将拥有非常适量的用户(可能无法拥有数千个调度程序)(R2)。

现在,R1是否要求应​​用程序提供一致性,可用性和分区容差以及优先级?

哪种类型的数据存储选项可以更好地处理以下问题:

  1. 为调度员(接受客户电话和使用CRM的人)提供24/7可用性,以查找客户记录并将订单输入系统;
  2. 实时查看当前正在进行的服务订单及其状态(放置,烘焙,发送,交付,交付);
  3. 实时跟踪所有工作车辆的位置及其有效载荷;
  4. 在系统崩溃或网络崩溃后恢复系统的任何部分,以继续提供1,2和3;
  5. 总结一下:什么样的数据存储(CA,PA或CP)将更好地适应上述系统?哪种数据存储能更好地满足R1要求?

2 个答案:

答案 0 :(得分:3)

  • 对于您的24 /要求,您正在使用(高)可用性搜索数据库,因为您希望您的请求每次都成功(即使它们只是错误结果)。
  • 当你没有分区容忍时,netsplit会降低整个系统的负担
  • 一致性很好,但你只能有3个。

您最好的选择是PA解决方案。我强烈推荐一款受Amazon Dynamo启发的解决方案。最着名的发电机实现是riak和couchdb。 Riak甚至允许您通过调整读写副本来将PA更改为其他形式。

答案 1 :(得分:0)

首先,不要将CAP“可用性”与“高可用性”混淆。他们彼此无关。 CAP中的A仅表示“所有数据库节点都可以回答查询”。要获得高可用性,您必须位于多个数据中心,您必须拥有强大的文档化维护,扩展等程序。这些都不取决于您的CAP选择。

其次,要对你的要求保持现实。股票交易应用程序可能需要100%的正常运行时间,因为每秒停机时间可能会导致数百万美元的损失。另一方面,我猜你的披萨关节可能会因为它每一分钟都会减少数十美元。因此花费数百万美元试图保持它是没有意义的。尝试计算您的实际成本。

第三,始终评估您的选择与主流。当问题发生时,你可以去CA(MySQL)并快速故障转移到奴隶。对构建新技术的成本(和风险)要切合实际。如果确实希望您的系统在没有停机的情况下运行5年,请询问其他人在没有停机的情况下运行该数据库5年的证据。

如果您选择“AP”并拥有远程人员(司机等),那么您需要编写一个应用程序,将其数据存储在手机上并在后台发送(重试)。当然,无论您的数据库是CA还是AP,您都可以这样做。

如果你想要很高的正常运行时间,你可以:

  • 增加MTBF(平均故障间隔时间) - 购买冗余电源,购买双以太网卡等。

  • 减少MTTR(平均恢复时间) - 只需确保发生故障时您可以快速恢复。 (故障转移到奴隶)

我看到人们在MTBF上花费了数万美元,但在恢复备份时却只停留了8个小时。在攻击MTBF之前确保MTTR较低是更有意义的。