扩展数据库绑定的系统?

时间:2009-11-03 12:43:43

标签: database scalability

以下是场景和一些建议的解决方案。 有没有更好的解决方案?

有一个系统A必须“分析”大量的URL。 另一个系统B生成这些URL - 目前在数据库中大约有1000万个URL。 示例模式:

id URL has_extracted
1 abc.com 0
2 bit.ly  1

我的解决方案如下:

天真的解决方案:有一个perl脚本/进程将URL(从数据库)提供给系统B并更新has_extracted列 这种方法的问题在于它不能很好地扩展。

解决方案2:将数据库拆分为五个(或n个)表。 (我打算删除has_extracted列,因为在这种情况下它似乎是一个可伸缩性的瓶颈。)

解决方案3: 删除has_extracted列 创建另一个表来维护/跟踪每个进程跟踪的最后一个URL。

批评/提出的解决方案要求。提前谢谢。

3 个答案:

答案 0 :(得分:1)

为什么你的幼稚解决方案不能很好地扩展?如果您正在使用批量更新并且不经常提交,则可以在任何数据库上每秒更新100万行,而无需进行任何调整。

如果要运行系统A的多个实例,可以使用哈希函数将输入数据分成组,其中系统A的每个实例仅消耗一个组。

如果系统A的实例数量恒定,例如17,您可以使用函数id%17作为哈希函数。

答案 1 :(得分:0)

我认为这可以如下:

  1. URL生成器(1个或多个PCS)
  2. 网址堆栈(1个)
  3. 网址处理器(多台个人计算机)
  4. URL生成器生成URL并将所有URL推送到堆栈中,例如,在数据库中。或者在记忆中或你想要的地方。

    URL处理器查询URL堆栈,为其提供下一个要处理的URL。 URL Stack为它们提供URL并将其标记为给定或删除它。当URL处理器处理完URL后,它再次查询URL堆栈并说它已完成处理URL1并想要处理URL2。然后,URL Stack可以从其列表中标记/删除URL1并提供URL2。

    如果URL堆栈变得狭窄,您可以只对数据库进行聚类。

答案 2 :(得分:0)

我不知何故觉得我的问题类似于link上发布的问题(下面提供的摘录)。前面提到的链接和link - “数据库很难用于消息传递”的解决方案为我提供了更好的方向来实现更好的解决方案。

提取:因此,您希望构建一个可以完成工作的系统。您希望作业能够并行运行以提高速度,同时也需要冗余。需要协调此系统,例如,相同的作业不会进行两次,每个作业的状态都很容易看到,多个服务器只需查询中央源就可以运行作业。