【发布时间】:2019-10-20 02:18:57
【问题描述】:
情况是我们有多个服务器(40+)同时抓取一个相同的 URL(以确保我们有最小的遗留)并将数据保存到数据库 (MySQL)。
现在的问题是:数据来回切换。例如,由于爬虫/数据库遗留问题,内容将在几秒钟内变为 A B A B A。
有什么好的方法可以预防吗?我们正在使用 Perl 编写爬虫,但任何语言都适合我们,因为我们可以借用背后的想法。
任何提示将不胜感激。雷迪斯?零MQ?
谢谢
【问题讨论】:
-
这些应用程序服务器是共享同一个数据库,还是运行自己的数据库?如果存储是集中式的,那么您的一致性问题是爬虫进程需要不同的时间才能完成,因此进程 A 可能会启动,然后 B 启动并完成,然后 A 完成,然后您会得到过时的数据。如果数据有时间戳,您可以使用它来存储它以保持最新版本,或者您可以在获取完成后直接附加时间戳(以毫秒为单位)并使用它。您使用什么技术或存储并不重要。
-
它共享同一个数据库。是的,情况是爬虫 X 可能会获取过时的数据。并且数据没有时间戳。当它完成时,我们只有那个服务器的 time() 。那么用 MySQL 存储那一秒的最佳解决方案是什么?现在我们正在使用 INSERT INTO .. ON DUPLICATE KEY UPDATE ...谢谢
-
您正在覆盖数据,而不是单独存储每条记录?我会使用微秒的整数字段。使用 Time::HiRes 获取
microtime并在您的 LWP 上为respone_headers或response_done安装 a handler 并将 microtime 粘贴在那里。然后用它来检测哪个是最新的。
标签: mysql perl redis web-crawler data-consistency