Neo4j分片方面

28

我在研究Neo4j的可扩展性时,阅读了David Montag于2013年1月撰写的一份文档。

关于分片方面,他说2014年第一次发布将提供第一个解决方案。

有人知道是否已经完成或其状态如何吗?

谢谢!

2个回答

66

声明:我目前担任Neo Technology公司的VP产品职位,他们是Neo4j开源图数据库的赞助商。

现在我们刚刚发布了Neo4j 2.0(实际上今天发布了2.0.1!),我们正在启动一个大多数面向性能和可扩展性的2.1版本。这将使图形的上限增加到有效无限数量的实体,并改善其他各种东西。

先让我设置一些背景,然后回答你的问题。

正如您从文件中看到的那样,Neo4j的当前水平扩展架构允许进行读取缩放,而所有写入都会传送到主节点并分散出去。这将让您获得有效无限的读取缩放,以及每秒数万个写入。

实际上,生产Neo4j客户(包括Snap Interactive和Glassdoor)在其社交图形中拥有约十亿人口... 在所有情况下,都在活跃且经常受到冲击的网站后面,由相对较小的Neo4j集群(不超过5个实例)处理。因此,这是一个关键功能:Neo4j今天具有令人难以置信的计算密度,因此我们经常看到相当小的集群处理大量的生产工作负载......并且具有非常快速的响应时间。

有关当前架构的更多信息可以在此处找到:www.neotechnology.com/neo4j-scales-for-the-enterprise/ 这里可以找到客户列表(其中包括Wal-Mart和eBay等公司):neotechnology.com/customers/ 全球最大的包裹递送承运商之一使用Neo4j实时路由其所有包裹,每秒峰值达到3000个路由操作,并且零停机时间。(这可能是世界上使用图数据库和NOSQL数据库最大且最关键的用途;尽管我不知道是谁。)

因此,总的来说,如果你还没有像沃尔玛或eBay那样大,那么你可能没问题。这只是稍微简单化了一下。有1%的情况是你需要支持每秒数十万次的持续事务写入负载。然而,即使在这些情况下,将所有数据加载到实时图表中通常也不是正确的方法。我们通常建议人们进行一些聚合或过滤,仅将更重要的内容带入图表。Intuit就这个问题做了一个很好的演讲。他们将十亿个B2B交易过滤成更少的月度交易关系,并通过方向、汇总计数和货币金额进行聚合。

进入分片...分片近年来越来越流行。这在很大程度上归功于NOSQL的其他三类,其中连接是一种反模式。大多数查询涉及读取或写入单个离散数据。就像连接是键值存储和文档数据库的反模式一样,分片是图数据库的反模式。我的意思是...最好的性能将在所有数据都可用于单个实例的内存中时发生,因为在读写时在网络上跳来跳去会显著减慢速度,除非你在如何分配数据方面非常非常聪明...即使如此。我们的方法是双重的:

  1. 尽可能做出聪明的事情,以支持极高的读/写容量而无需使用分片。这将为您带来最佳和最可预测的延迟和效率。换句话说:如果我们能够在不分片的情况下满足您的要求,那将永远是最好的方法。上面的链接描述了其中一些技巧,包括部署模式,使您可以在内存中对数据进行分片,而无需在磁盘上对其进行分片(我们称之为缓存分片)。还有其他类似的技巧,更多的即将到来...
  2. 在Neo4j中添加一种支持分片的次级架构模式。为什么要这样做,如果最好避免分片?随着越来越多的人发现更多图形的用途,并且数据量不断增加,我们认为这最终将是一个重要且不可避免的事情。这将使您能够在一个Neo4j集群中运行所有Facebook(一个相当庞大的集群)...不仅是社交部分的图形,我们今天就可以处理这些。我们已经在这方面做了很多工作,并开发了一种我们认为平衡了许多考虑因素的架构。这是一个多年的努力,虽然我们可以很容易地发布一个原始的分片版本的Neo4j(那肯定会非常受欢迎),但我们可能不会这样做。我们想做对,这等于“火箭科学”。


很棒的文章。在我们的使用案例中,我们有多个基本上不同的图形。它们只接触到一些边缘,因此对于这种情况,给每个不同的图形部分分配自己的碎片并不奇怪。因此,我们将引导哪个节点进入哪个碎片。 - Wouter
在嵌入式模式中进行neo4j分片是否可行? - Abhimanyu
所以有人需要实现一个类似Facebook的独角兽的索引层;-) - zazi
11
那么,多年之后(从技术上讲,仅仅是)分片机制进展如何? - Basic
现在!如何对Neo4j进行分片? - afruzan
显示剩余2条评论

25

TL;DR 虽然2018年已经到来,但neo4j仍然不支持典型情况下的sharding

Details Neo4j仍需要所有数据适合单个节点。节点内容可以在群集中复制,但实际分片不是图片的一部分。

当neo4j谈论分片时,它们是指将数据库的各个部分缓存在内存中:不同的切片在不同的复制节点上缓存。这与mysql分片不同,其中每个节点仅包含总数据的一部分。

以下是他们关于可扩展性的“看法”摘要:他们的产品术语是“高可用性”https://neo4j.com/blog/neo4j-scalability-infographic/

enter image description here

请注意,高可用性不应该与可扩展性相同:因此它们实际上不支持后者以传统理解术语。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接