我正处于设计应用程序的早期阶段,该应用程序必须具有高可用性和可扩展性。出于多种原因,我想为此使用最终的一致性数据模型。我知道并理解为什么这是许多解决方案的不受欢迎的架构选择,但在我的情况下这很重要。
我正在寻找真实世界的建议,最佳实践以及在处理分布式/文档式数据库时要注意的问题。特别是电子商务(购物车风格)应用程序的区域,传统上更容易与关系数据库组合在一起。
我理解使用这些类型的数据库具有挑战性,但是嘿,Google和E-bay使用它们所以它们不会那么难;-)任何建议都会受到赞赏。
答案 0 :(得分:18)
如果你想拥有一个分布式系统(即“最终一致性”的东西),你需要人,建立,维护和操作它。
我发现有三类人对“最终一致性”的问题很少:
总而言之,这些人在就业市场上非常受欢迎。例如,分布式系统中75%左右的学者离开运行大型自行设计的分布式系统的机构,例如证券交易所。
使用Hardoop,SimpleDB和CouchDB等产品,整个过程变得更加简单,但在分布式系统技术上构建东西仍然是一个很大的挑战。
另一方面,RDBMS是一个非常精细的工程方法。他们很了解,就业市场上也有专业知识。有很多不错的工具,教育机会和许多高技能专家可以按小时租用。因此,三思而后行无法继续采用RDBMS方法 - 可能还会加上一些聪明的作弊行为。我通常会将学生指向Lifejournal architecture。
对于分布式数据库,经验要少得多。这正是你到目前为止找到这么少建议的原因。
如果您决定使用“最终一致性”,我认为除了不成熟的工具之外,主要的挑战是每个参与者的心态。您的API用户(编码人员)和应用程序用户(您的员工和您的客户)是否愿意并且能够接受不一致?你能从某些类别的用户中隐藏它吗?我们不习惯计算机不一致的心态。有东西有货或不是。 “也许”不是用户期望的答案。
还要记住,“最终”对算法设计者来说意味着很长时间。你能在多长时间内接受不一致?
对于购物车应用程序,您可能希望真正分发:使用客户端浏览器作为数据存储。在结账时,您可以将购物车提交到服务器端批处理系统。这意味着对于目录,您需要只读高可用性(更容易),并且购物车提交是一个非常狭窄的界面,不需要交易。后来处理订单没有(软)实时要求,因此更容易。
BTW:上次我检查过E-Bay架构时,他们在RDBMS中占据了很大的位置,但从那以后它可能已经发生了变化。 (编辑:确实发生了变化 - 请参阅评论)答案 1 :(得分:4)
解决问题的唯一方法是确定CAP theorem中哪些权衡适合您,然后开始实施。
mdorseif有一个很好的观点。有多种配置可以在多大程度上权衡一致性,可用性和分区。你有两个主要选择。这可能是一种过度简化。真正的生产就绪管道是生态系统。它至少会让你走上正轨。
Appnexus是一个使用hbase的广告平台,可实现极高的可用性和最终的一致性。他们谈论了很多关于here的事情。
article上的http://highscaleability.com概述了“纽约时报”如何在广域网上RabbitMQ与Cassandra一起实施容错和高可用性。
MongoDB在平衡可用性与写入问题的实现方面提供了极大的灵活性。他们得到了很好的documentation,它突出了如何用所有的陷阱(包括分区)来实现它。他们实现two-phase commit以维护整个网络(在他们的配置服务器上)的状态。
Google有一篇关于此主题的优秀论文,他们的photon项目使用paxos algoritm at the heart of it以及其他一些技术实现了高度可扩展,高度可靠的系统。它也恰好是非常一致的(端到端延迟大约为10秒)和容错,可以抵御区域性故障。
答案 2 :(得分:0)
如何使用关系数据库实现高可用性和可伸缩性是众所周知的,并且有大量关于如何执行此操作的知识!
Google是一个特殊情况,不适用于大多数网站,非常大量的查询,非常大量的数据,最重要的是,它与大多数用户没有服务水平协议。对于网络搜索没有正确的答案只有更好的答案,对于普通用户来说Google足够好,如果Google错过了搜索列表中的重要页面,那么用户就无法抱怨。
E-Bay是一个相当不同的案例,不知何故,他们说服那些用户和客户接受糟糕的服务以换取理论上更低的价格 - 对他们有好处,但这不是每个企业的选择。
答案 3 :(得分:0)
所有基于分布式计算模型的系统都建立在CAP和BASE之上。这里主要关注的是如果我们的系统提供可用性和分区容差,我们就不能保持真正的一致性,但我们可以保持最终的一致性。
最终一致性背后的想法是每个节点始终可用于服务请求。作为权衡,数据修改在后台传播到其他节点。这意味着系统可能在任何时候都不一致,但数据仍然很准确。
来源:http://www.techspritz.com/eventual-consistency-and-base-model/