我已经问过一个question关于披萨送货店的简单容错软实时网络应用程序。
我在那里得到了非常好的评论和答案,但我不同意这是一个真正的网络服务。它不仅仅是一种网络服务,它更像是一个实时系统来接受客户的订单,控制这些订单的调度并控制实时交付这些订单的车辆。
此外,与“真正的”网络服务不同,这个系统不是为了拥有多个用户 - 只有少数调度员(电话接线员)和一些将使用它的送货司机(因为现在我没有要求提供对实际客户的服务的直接访问;只有调度员和交付驱动程序可以直接访问)。
因此这个问题有点笼统。
我发现为了正确选择此应用程序的NoSQL数据存储选项,我首先需要做的是在CA
,PA
和{{{{}}之间做出选择。 1}}根据CAP theorem。
现在,Building Web Applications with Erlang书说“虽然它[Mnesia]不是SQL数据库,但它是一个像SQL数据库一样的CA数据库。它不会处理网络分区”。同一本书说CouchDB数据库是CP
数据库。
考虑到这一点,我认为我需要对我的应用程序做的第一件事是确定“容错”术语对CAP的意义。
我的简单要求是让应用程序24/7(R1)可用。另一个是没有必要扩展,应用程序将拥有非常适量的用户(可能无法拥有数千个调度程序)(R2)。
现在,R1是否要求应用程序提供一致性,可用性和分区容差以及优先级?
哪种类型的数据存储选项可以更好地处理以下问题:
总结一下:什么样的数据存储(CA,PA或CP)将更好地适应上述系统?哪种数据存储能更好地满足R1要求?
答案 0 :(得分: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较低是更有意义的。