【问题标题】:Partitioning a weighted directed graph (over key/value database)对加权有向图进行分区(通过键/值数据库)
【发布时间】:2011-09-18 04:47:54
【问题描述】:

我们想对加权有向图进行分片,

用户可以动态添加节点和边,起初DB/Graph是空的。

我们将节点和边保存在一个键/值数据库中(可能是Redis):对于每个节点,我们将 nodeId 作为键,引用节点的键的 sortedset 是 sortedSet 中每个 nodeId 的分数是边的权重。

(请参阅此处的问题:Redis: Implement Weighted Directed Graph

我们没有平衡约束,图上最常见的动作是 Dijkstra,我们希望最小化 I/O(在我们的例子中是网络)

可能的解决方案:每个数据库服务器都包含一个具有 IP 的其他服务器的列表:

键:server1,值:....250.1

键:server2,值:....250.2

键:server3,值:....250.3

每个nodeId都是serverX.originalNodeId

决定哪个节点去哪里的算法是什么?我们应该支持重新定位节点吗?

我想最简单的方法是,将节点 A 添加到 serverX,其中 argmax(服务器 X 中与节点 A 有边的节点数),只要 serverX 没有被完全占用..

【问题讨论】:

标签: database-design graph nosql redis distributed-computing


【解决方案1】:

由于处理发生在客户端,这种图形数据的分片并不难——每一步您只需要一个排序集,因此从哪个节点加载该集并不重要。让实际数据与节点一起发生是最后一步 - 如果您只有一个节点,这将是一个简单的 MGET,并且很容易拆分到多个节点。

要确定密钥将存储在哪个节点上,您应该使用哈希而不是尝试手动跟踪它们。我使用一个表将一系列哈希映射到特定节点。它存储在 redis 中以实现长期持久性,但实际上是客户端的一部分。要访问特定密钥,您只需获取密钥的哈希值,在表中查找它,然后连接到该节点。使用具有数千个插槽的表可以轻松地将数据移动到另一个节点 - 更新表并且对特定插槽的请求将转到不同的节点。这与 redis 集群中使用的方法非常相似,但并不完全相同。

也就是说,我设置分片的原因不是图形数据。仅包含 ID 的小型排序集不会占用太多内存 - 您应该能够在单个节点上处理 1 亿条边而不会带来太多麻烦。

【讨论】:

  • 这里的主要问题是我希望尽可能将连接的图形节点保持在同一台机器上,哈希方式没有考虑到它......
  • 你在使用redis脚本吗?否则,将节点保持在一起并不重要。此外,如果连接的节点有时只在同一台服务器上,您可能会发现选择服务器的复杂过程的开销比经常去容易识别的不同服务器更糟糕。
  • 只有在不知道第一个结果的情况下发送所有命令的情况下才能获得更好的性能——我认为这里不是这种情况,即使是这样,你也可以获得相同的结果/通过将命令并行发送到多个节点来提高性能。
  • 缩小规模有点困难,因为您无法轻松合并节点,但在一台服务器上运行多个节点可以让您相当接近
猜你喜欢
  • 2017-06-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 2015-06-04
  • 2012-07-14
相关资源
最近更新 更多