【问题标题】:How to use a Bloom Filter across multiple servers?如何跨多个服务器使用布隆过滤器?
【发布时间】:2015-12-31 17:08:16
【问题描述】:

我有 50 个 EC2 实例都在爬网。现在他们在后端使用 Redis 来跟踪已经被抓取的 URL;但是,ElastiCache 的成本越来越高,我一直遇到打开太多连接的问题。我一直在考虑实现一个布隆过滤器作为后端,但我不明白我该如何做到这一点,以便所有 50 台服务器共享同一个布隆过滤器。我不希望每个人都有自己独立的布隆过滤器,否则他们基本上都在做同样的任务。

【问题讨论】:

  • 我会从一个稳定的散列算法开始,比如主机名的散列。
  • 我了解如何在每个实例上实现布隆过滤器。我不明白的是如何在所有 50 个实例之间共享一个布隆过滤器,以确保即时 A 不做与实例 B 相同的工作。
  • 您对工作进行分区。这样,只有一台机器将为该机器完成工作。例如if (hostname.hashCode() & MASK % machines = thisId) /* do work */
  • 你想实现一个分布式BloomFilter吗?这不是一件容易的事。你最好使用现有的数据库
  • @DanielAmaya 制作分布式 Bloom 过滤器很可能比想出另一种方法来处理同样的问题更困难。

标签: java web-crawler bloom-filter


【解决方案1】:

您仍然可以使用 Redis 以集中方式跟踪已经处理/抓取的 url,但通过使用 RedisBloom (redisbloom.io) 的布隆过滤器来减少内存占用。 RedisBloom 是一个Redis Module,它使用多种概率数据结构扩展了 Redis。

注意事项:

  • 如果单个布隆过滤器变得太大或单个分片的吞吐量变得太高,您可以考虑为这种情况设置多个布隆过滤器,这些布隆过滤器可以分布在 Redis 集群中并计算适当的过滤器 (键)在客户端。

  • 您可能希望触发 this issue,它请求布隆过滤器中的项目随着时间的推移而过期,从而允许您在给定时间后重新访问 url。

【讨论】:

    猜你喜欢
    • 2015-10-25
    • 2013-08-29
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2019-04-27
    • 2010-10-12
    相关资源
    最近更新 更多