问题 用于社交网络应用的Cassandra而不是MySQL


我正在构建一个新的应用程序,它将具有与Facebook非常相似的功能,虽然显然它不需要处理400,000,000,000用户,它仍然会被大量用户群使用,而且大多数都需要它运行得非常快。

我有丰富的MySQL经验,但社交应用程序提供了MySQL不太适合的复杂性。我知道Facebook,Twitter等已经向Cassandra转移了很多他们的数据,但我不确定它会走多远。

例如,你会在Cassandra中存储用户数据 - 用户名,密码,地址等内容吗?你会在Cassandra中存储电子邮件,评论,状态更新等吗?我还读过很多像neo4j这样的东西更能代表社交应用程序使用的朋友关系,因为它是一个图形数据库。我只是刚开始使用NoSQL路线,所以非常感谢任何指导。

有人能告诉我这个吗?我希望我不是太一般!


12461
2018-04-05 22:04


起源

neo4j不支持分片,并且在大量数据中具有非常低的性能。我们测试了它 - Nasser G.


答案:


例如,你会在Cassandra中存储用户数据 - 用户名,密码,地址等内容吗?

不,因为它不保证一致性。卡桑德拉是 最终一致。当然,某个用户帐户的数据不应该是并发的,但我不想赌它。您可能不需要在全文搜索,消息收件箱等方面保持一致性,但您希望与安全相关的任何内容保持一致。

我还读过很多像neo4j这样的东西更能代表社交应用程序使用的朋友关系,因为它是一个图形数据库。

我是正确工作的合适工具的忠实粉丝。我没有使用neo4j,但我一直在使用db4o(这是一个对象数据库),并发现它非常有用。它使开发更容易使用本机支持您的需求的工具。既然你需要图表并在SQL中使用图表是一件痛苦的事情,我建议你先看一下,然后评估它是否符合你的特定需求。

只要选择是自然的(即各个数据库对特定作业有用,图形图表数据库,表格表格,ACID数据库用于任何需要交易安全的数据库等),混合数据库对我来说听起来都是个好主意。 ..)。


5
2018-04-05 23:54



我不明白为什么你不会在Cassandra中存储所有数据,除了在RDBMS中查询它们更容易。如果你需要,卡桑德拉可以保证一致性(仲裁读/写),请参阅 spyced.blogspot.com/2010/04/cassandra-fact-vs-fiction.html。如果您对可靠性感到疑惑,请参阅 thread.gmane.org/gmane.comp.db.cassandra.user/3454 - Mihai A
感谢有趣的链接。我不完全确定这一点,但从我的理解,你可以保证节点之间的一致性,但“事务”,即批量级别的写入不是原子的,是吗?如果真的出现问题则是第二个问题。我认为这种数据就是RDBMS的用途,但是在可用性/分区容差方面你得到了一点,因此在某些情况下使用Cassandra用于用户数据可能更好。 - mnemosyn


我建议用MySQL和Cassandra做一些测试。当我们在我的一个工作中不得不在PostgreSQL和MongoDB之间做出选择时,我们比较了两者中数百万条记录的查询时间,并发现有大约1000万条记录,Postgres会为我们提供足够的响应时间。

我们知道至少在几年内我们不会达到那么多的记录,而且我们有Postgres的经验(当时MongoDB还不是很成熟),所以我们选择了Postgres。

我的观点是,您可以查看MySQL基准测试,自己进行一些性能测试,估算数据集的大小以及它将如何增长,并以这种方式做出明智的决策。

至于混合关系数据库和非关系数据库,这也是我们考虑过的问题,但我认为这样做太麻烦了,因为这意味着要维护两种软件,并编写相当多的胶水代码来获得来自两者的数据。我认为Cassandra完全有能力存储您的所有数据。


4
2018-04-05 23:33





Facebook没有 移动 到卡桑德拉,他们创造了它。 :)据我所知,noSQL DBMS不需要 甚至提到 (感谢mnemosyn的纠正,Facebook使用Oracle和Cassandra)与关系数据库并行运行。 这个 是一个相反的例子(将用户信息存储在noSQL DB中)。

我想说,如果Cassandra对Facebook来说足够好,它对你的项目来说可能已经足够了。尝试抽象持久性逻辑可能没有什么坏处,这样你就有可能切换到别的东西,如果绝对的话。

免责声明:我还没有(还没有)拥有无数据库数据库的经验:我所知道的就是阅读它。


1
2018-04-05 22:21



看起来你在这里混淆了概念:NoSQL是一个非常抽象的术语,包含两个ACID数据库,它们与典型的RDBMS具有基本相同的保证(例如db4o)以及可扩展的数据库,但不提供相同的集合保证(例如cassandra)在数据一致性方面的作用。这些属性应该是决策的指南。我相信,抽象这种逻辑是不可能的:您可以信任的数据和您不能信任的数据存在显着差异。交易可能没有意义,等等。 - mnemosyn
摘要是什么样的逻辑? ACID交易? DB支持或不支持它们:我所说的基本上是提供例如数据库上方的瘦DAO层,以便DAO实现更改时(由于移动到不同的DB),DAO层上方的应用程序部分可以保持或多或少完整。至于选择哪个数据库,克里斯托弗称该项目具有“与Facebook非常相似的特征”,因此如果事实证明克里斯托弗使用与Facebook使用的数据库不同的数据库会更好。 - Tomislav Nakic-Alfirevic
Facebook不使用一个数据库。他们并行使用(至少)Oracle,Cassandra和Hadoop。 Cassandra是为在Facebook上搜索您的收件箱而开发的,而不是用于存储付款细节。您不能将相同的抽象放在不同的东西上,即使用一个DAO用于一致的数据存储,并且只使用一个最终一致的DAO。 - mnemosyn
你是对的,他们确实使用了Oracle。我会相应地更新我的答案,谢谢你的更正。 - Tomislav Nakic-Alfirevic
他们使用MySQL作为主要数据存储。他们在这里写下来: facebook.com/MySQLatFacebook - Morgan Tocker


Cassandra提供了一个很好的分布式解决方案,对于类似Facebook的平台而言可能比MySQL更好(如果它需要扩展)。但是,Cassandra不适合您需要多对多关系挑战的数据关系。与Cassandra绑定的图形数据库将提供批量卷需求,以及非常快速的关系查询功能。 我们正致力于结合这两种技术,并始终对您的平台所提出的要求类型感兴趣。如果您对如何处理我喜欢听到的某些数据相关问题有任何疑问,也许我们可以帮助解决这个问题。


0
2018-06-06 22:15



我非常不同意你的说法,即卡桑德拉不善于表达多对多的关系。要在cassandra中解决这样的问题,您只需要为两个方向的每个关系存储索引。例如,如果您需要存储用户之间的关系,例如用户A跟随用户B,则可以创建列系列,如关注和关注者。每个CF的密钥都是一个用户ID,每一行在该集合中每个用户id只有一列。您仍然可以存储这些关系,您只需要提前存储视图。 - Kyle Ambroff