我打算开发一些应用程序,比如与朋友的朋友联系。它可能看起来像Facebook或Twitter,但最初我计划实现它以了解有关NOSQL数据库的更多信息。
NOSQL中有许多数据库工具。我经历了许多数据库类型,如文档存储,键值存储,列类型,图形数据库。最后我想出了两个数据库工具,即cassandra& Neo4j的。选择任何一个是否正确,如果不正确我和给我一些你宝贵的意见。
还有一件事是我选择的语言绑定是JAVA。
我的问题是, 哪种数据库工具适合我的应用程序?
等待您的宝贵意见。感谢您花费宝贵的时间。
答案 0 :(得分:4)
但要回答,首先,请在http://www.slideshare.net/benjaminblack/introduction-to-cassandra-replication-and-consistency阅读Ben Black的幻灯片。
完成?好的,现在针对具体问题:
“如何在后续阅读中协调[副本]数据状态的差异?”
最高时间戳获胜。
“所有区域是否都使用相同的系统时钟?”
时间戳由客户端(即您的应用服务器)提供。它们应与例如同步ntpd(无论如何都是好的做法),但不需要高精度,因为如果订购很重要,你应该通过使用唯一的列名或使用外部锁定来避免冲突。
例如:如果您在Twitter克隆中有一个跟随您的用户列表,您应该为每个关注者提供自己的列,无论时钟如何不同步,都无法丢失数据。
如果你的网站有一个管理工具,而且两个管理员“同时上传”一个新的网站图标,那么一个更新就会赢,而且这并不重要。在这里,你确实希望你的时钟同步,但“在几毫秒内”足够接近。
如果您正在管理用户注册,并且您希望仅在尚未存在的情况下允许创建帐户“jbellis”,则无论您的时钟有多紧密同步,都需要锁定管理器。
“过时的数据会被退回吗?”
节点(比“区域”更好的思考单位)在其停机期间不会丢失数据,直到通过读取修复,提示切换或反熵修复发送该数据为止。与此同时,它将回复带有陈旧数据的读取请求;如果您使用足够高的一致性级别,则读取请求将等待足够的其他回复以确保您始终看到最新版本,这可能意味着如果有足够的其他副本已关闭,则无法满足请求。
否则,低一致性级别(例如ONE)隐含地表示“我理解使用较低的一致性级别获得的较高可用性和较低延迟意味着我可以在停机后暂时看到过时的数据。”
答案 1 :(得分:1)
我不确定我是否了解Cassandata一致性模型对跨多个可用区域的数据协议的所有影响。
考虑到多个区域,并且考虑到Cassandra中的协调器节点使用的是不需要所有区域报告的一致性级别,而只是一个法定数量,区域数据状态的差异如何在后续读取时进行协调?
所有区域是否都使用相同的系统时钟?或者每个区域都有自己的时钟?如果它们不能在相同的时钟下工作,它们如何同步以便在“愈合”过程中比较差异时可以比较时间戳?
假设具有准确,最新数据的区域现在处于脱机状态,并且在上一次写入期间处于脱机状态的区域(因此未更新并包含过时数据)现在重新联机。陈旧数据会被退回吗?协调员是否有办法知道数据是陈旧的?
答案 2 :(得分:1)
如果您不需要在短期内进行扩展,我会使用Neo4j,因为它旨在存储您所描述的网络。 (如果你最终确实需要扩展,也许你可以把Gizzard扔在它面前或者别的什么。祝你好运!)
答案 3 :(得分:0)
你看过Riak数据库吗?它与Cassandra具有相同的背景,但您不需要关心时间戳同步(它们涉及解析数据状态的不同方法)。
我的第一个应用程序是在Cassandra数据库上构建的。但我现在正在尝试 Riak ,因为它更合适。它不仅与键(键 - 值/超级列 - 键 - 值)有所不同,而且还与文档存储功能有关。
它有一种使用MapReduce创建复杂查询的方法。 Cassandra确实使用Hadoop这个选项,但听起来很难。
此外,它在http / s中使用了众所周知且定义的访问协议,因此当您拥有大量流量时,可以轻松管理服务器。
唯一的坏处是比Cassandra慢。但通常你会阅读记录而不是写(并且Cassandra在写入时优化,而不是读取),因此最终结果应该没问题。