3

我正计划开发一些应用程序,例如与朋友的朋友的朋友联系。它可能看起来像 Facebook 或 Twitter,但最初我计划实现它以了解有关 NOSQL 数据库的更多信息。

NOSQL 中有许多数据库工具。我经历过许多数据库类型,如文档存储、键值存储、列类型、图形数据库。最后我想出了两个数据库工具,分别是 cassandra 和 Neo4J。选择任何一个是否正确,如果不纠正我并提供一些您的宝贵意见。

还有一件事是我选择的语言绑定是 JAVA。

我的问题是,哪种数据库工具适合我的应用程序?

期待您的宝贵意见。感谢您花费宝贵的时间。

4

4 回答 4

4

蒂姆,你真的应该单独发布你的问题,而不是作为对 OP 的回答,但事实并非如此。

但要回答,首先请阅读 Ben Black 在http://www.slideshare.net/benjaminblack/introduction-to-cassandra-replication-and-consistency上的幻灯片。

完毕?好的,现在针对具体问题:

“[副本]数据状态的差异如何在随后的读取中得到协调?”

时间戳最高者获胜。

“所有区域都使用相同的系统时钟工作吗?”

时间戳由客户端(即您的应用服务器)提供。它们应该与例如 ntpd 同步(无论如何这是一个很好的做法),但不需要高精度,因为如果排序很重要,您应该通过使用唯一的列名或使用外部锁定来避免冲突。

例如:如果您在 Twitter 克隆中有一个关注您的用户列表,您应该为每个关注者提供自己的列,并且无论时钟多么不同步,都不会丢失数据。

如果您的网站有一个管理工具,并且两个管理员“同时”上传了一个新的网站图标,那么一个更新将会获胜,而这并不重要。在这里,您确实希望您的时钟同步,但“在几毫秒内”已经足够接近了。

如果您正在管理用户注册,并且希望仅当帐户“jbellis”不存在时才允许创建它,那么无论您的时钟多么紧密地同步,您都需要一个锁管理器。

“过时的数据会被退回吗?”

一个节点(比“区域”更值得考虑的单元)在停机期间不会丢失数据,直到通过读取修复、提示切换或反熵修复发送该数据。同时,它会回复带有陈旧数据的读取请求;如果您使用足够高的一致性级别,则读取请求将等待足够多的其他回复以确保您始终看到最新版本,这可能意味着如果有足够多的其他副本关闭,则无法满足请求。

否则,低一致性级别(例如 ONE)隐含地意味着“我明白,我通过这种低一致性级别获得的更高可用性和更低延迟意味着我可以在停机后暂时看到陈旧的数据。”

于 2011-01-31T15:15:22.330 回答
1

I'm not sure I understand all of the implications of the Cassandata consistency model with respect to data-agreement across multiple availability zones.

Given multiple zones, and given that the coordinator node in Cassandra has used a consistency level that does not require all zones to report back, but only a quorum, how would differences in zone data-state be reconciled on a subsequent read?

Do all zones work off the same system clock? Or does each zone have its own clock? If they don't work off the same clock, how are they synchronized so that timestamps can be compared during the "healing" process when differences are reconciled?

Let's say that a zone that does have accurate, up-to-date data is now offline, and a zone that was offline during a previous write (so it didn't get updated and contains stale data) is now back online. Would stale data get returned? Would the coordinator have any way to know the data were stale?

于 2011-01-31T13:01:12.330 回答
1

如果您不需要在短期内进行扩展,我会选择 Neo4j,因为它旨在存储您所描述的网络。(如果你最终确实需要扩展,也许你可以把 Gizzard 扔到它前面或其他东西。祝你好运!)

于 2011-01-31T19:21:42.090 回答
0

你看过Riak数据库吗?它与 Cassandra 具有相同的背景,但您无需关心时间戳同步(它们涉及解析数据状态的不同方法)。

我的第一个应用程序是在 Cassandra 数据库上构建的。但我现在正在尝试Riak,因为它更合适。它不仅是键(键 - 值/超级列 - 键 - 值)的差异,而且还与文档存储功能有进一步的区别。

它有一种使用 MapReduce 创建复杂查询的方法。Cassandra 在使用 Hadoop 时确实有这个选项,但听起来很难。

此外,它在 http/s 中使用众所周知且已定义的访问协议,因此当您有大量流量时可以轻松管理服务器。

唯一的缺点是它比 Cassandra 慢。但通常你会读比写更多的记录(Cassandra 在写而不是读方面进行了优化)所以最终结果应该没问题。

于 2011-01-31T20:12:36.800 回答