我计划开发一些应用程序,比如与朋友的朋友的朋友联系。它可能看起来像Facebook或Twitter,但最初我计划实现它,以了解更多关于NOSQL数据库的知识。
NOSQL中有许多数据库工具。我已经经历了许多数据库类型,如文档存储、键值存储、列类型、图形数据库。最后,我提出了两个数据库工具,分别是cassandra和Neo4J。选择任何一个都是对的,如果不能纠正我的话,请给我一些宝贵的意见。
还有一件事是我选择的语言绑定是JAVA。
我的问题是,哪种数据库工具适合我的应用程序?
期待您的宝贵意见。感谢您抽出宝贵的时间。
发布于 2011-01-31 23:15:22
蒂姆,你真的应该单独发布你的问题,而不是作为对OP的回答,而事实并非如此。
但要回答这个问题,首先,请到http://www.slideshare.net/benjaminblack/introduction-to-cassandra-replication-and-consistency上阅读本·布莱克的幻灯片。
完成了吗?好的,现在是具体的问题:
“如何在后续读取时协调副本数据状态中的差异?”
时间戳最高者获胜。
“所有区域都使用相同的系统时钟吗?”
时间戳由客户端(即您的应用服务器)提供。它们应该与例如ntpd同步(这是一个很好的实践),但是不需要很高的精度,因为如果排序很重要,你应该通过使用唯一的列名或使用外部锁来避免冲突。
例如:如果你在Twitter克隆中有一个关注你的用户列表,你应该为每个追随者提供自己的列,无论时钟多么不同步,都不会丢失数据。
如果你的网站有一个管理工具,两个管理员“同时”上传了一个新的收藏图标,那么只有一个更新会赢,哪一个更新并不重要。在这里,你确实想要同步你的时钟,但是“几毫秒之内”已经足够接近了。
如果您正在管理用户注册,并且您希望仅当帐户"jbellis“不存在时才允许创建该帐户,那么无论您的时钟多么同步,您都需要一个锁管理器。
“会返回过时的数据吗?”
一个节点(一个比“区域”更好的单元)将不会有它在停机期间丢失的数据,直到它通过读取修复、暗示切换或反熵修复来发送该数据。同时,它将回复带有陈旧数据的读取请求;如果您使用足够高的一致性级别读取请求,则读取请求将等待足够多的其他回复,以确保您始终看到最新的版本,这可能意味着如果有足够多的其他副本关闭,则无法满足请求。
否则,较低的一致性级别(例如1)隐含地意味着“我知道,这种较低的一致性级别具有更高的可用性和更低的延迟,这意味着我可以在停机后暂时看到陈旧的数据。”
发布于 2011-01-31 21:01:12
我不确定我是否理解Cassandata一致性模型关于跨多个可用区的数据协议的所有含义。
假设有多个区域,并且Cassandra中的协调器节点使用的一致性级别不需要所有区域都报告,而只需要一个仲裁,那么在随后的读取中如何协调区域数据状态的差异?
所有区域都使用相同的系统时钟吗?或者每个区域都有自己的时钟?如果它们不是在同一个时钟下工作,那么如何同步它们,以便在“修复”过程中比较时间戳?
假设具有准确、最新数据的区域现在处于离线状态,而在上一次写入期间处于离线状态的区域(因此它没有得到更新,并且包含过时的数据)现在又恢复在线。会返回过时的数据吗?协调器有没有办法知道数据已经过时了?
发布于 2011-02-01 03:21:42
如果您在短期内不需要扩展,我会选择Neo4j,因为它旨在存储您所描述的网络。(如果你最终确实需要扩展,也许你可以把Gizzard放在它前面或者别的什么地方。祝你好运!)
https://stackoverflow.com/questions/4850695
复制相似问题