我正在寻求实现一个可以在地理上广泛分布的数据库,并且每个节点都可以读/写,并且最终与所有其他节点保持一致。我应该在哪里寻找?
由于其他原因,我认为 MongoDB 似乎是一个不错的选择,直到我遇到这个问题。显然所有 MongoDB 节点都是可读的,但只有一个主节点是可写的?有没有办法解决这个问题?我不能允许写入数据库的单点故障。
我正在寻求实现一个可以在地理上广泛分布的数据库,并且每个节点都可以读/写,并且最终与所有其他节点保持一致。我应该在哪里寻找?
由于其他原因,我认为 MongoDB 似乎是一个不错的选择,直到我遇到这个问题。显然所有 MongoDB 节点都是可读的,但只有一个主节点是可写的?有没有办法解决这个问题?我不能允许写入数据库的单点故障。
我刚刚完成了对几个类似数据库的审查。由于不同的原因,我最终选择了 Mongo。Riak 和 Cassandra 都是亚马逊 Dynamo 的实现,它们都可以做得很好。在Riak 站点,他们对 Riak 和其他一些数据库进行了很好的比较。对于您的具体问题,我认为 Riak 和 Cassandra 都使用 Riak 提交的矢量时钟和 Cassandra 处理冲突的时间戳来处理任何节点上的写入。
除此之外,您还有其他一些可能有意义的选择:
我不确定这是一个完整的答案。我的搜索花了几个星期和大约 50 页的笔记,但如果大的、分布式的和安全的写入是主要标准,那应该会让你继续前进。
您可以使用 CloudTran 之类的产品来处理跨常见数据库(如 MySQL、Oracle、SQL Server 等)的非常快速的分布式事务。
取决于您希望如何分发您的写入。
分片:如果您希望在键上分配写入,MongoDB 有一个很棒的自动分片功能。为了冗余,您将创建多个副本(主从)对,然后通过中央服务(mongos)为每个副本分配一个键范围。读取将按键范围静态分布。
多主:
如果您的系统足够小(GB,而不是 TB),CouchDB 具有更复杂的合并复制方案之一,并且可以在节点故障时快速、可靠地恢复。使用 CouchDB,每个节点都有一个完整的数据副本,并且集群中的所有节点都可以读写。
如果您每小时读取数百万行,Cassandra 使用基于对等的复制方案,如果您愿意在读取性能上付出一点点,它将允许您将写入扩展到远远超出 CouchDB。
HBase 还可以扩展写入和读取,但更适合面向批处理的写入功能(加载日志文件),因为它位于 HDFS 上并且写入需要接近最小块大小(64MB、128MB...)之前可以将写入提交到磁盘。
希望这可以帮助。
如果您担心单点故障:MongoDB 使用副本集来分发读取,使用分片来分发写入。为了实现您正在寻找的内容,您可以对系统进行分片,每个分片都是一个副本集。如果您在分片中的主节点死亡,则会自动选出一个新的主节点,因此不会出现单点故障。注意:MongoDB 不支持多主复制
抱歉,我还没来得及展开讨论就被打断了。
1)首先,沙发很容易在地理上分布——你通过 http 与它交谈,这对于分布式项目非常有用。
2) Couch 内置了复制功能。
更好的是,您可能会发现bigcouch更合适,因为它是专门为集群设计的。
我花了几个星期评估 Mongo / Cassandra / Couch 等人,并决定总的来说,对于广泛的应用程序,Couch 非常适合。
我想您还应该查看Amazon Simple DB。当谈到分布式最终一致的数据库时,它当然符合要求。几年来,我一直在许多项目中使用它,并且它确实做到了它在锡上所说的那样。我唯一担心的是,您基本上是将所有数据放入第三方的黑匣子......但它确实有效,可以扩展和勾选您所有的盒子。
希望这有助于充实一些事情。
这是 NuoDB 的设计目标之一,今天的产品就是这样做的。
您可以跨多个数据中心读取 (QUERY)、写入 (INSERT、UPDATE、DELETE) 或执行任何其他事务,就好像数据库位于单个位置一样。NuoDB 是真正一致的,而不是最终一致的。它使用乐观异步消息传递和分布式版本控制来保证 ACID 事务。而且 NuoDB 对标准 SQL 有丰富的支持。