基于linux和php的稳定的分布式数据采集架构

数据采集对于一些网站至关重要,在开发这种采集程序时会遇到如下一些问题:
一、单进程采集慢,采集任务的间隔时间无法控制。
二、数据下载部分和分析部分不分离导致可移植性不强,调试困难。
三、采集程序受机器性能瓶颈和网速瓶颈限制。
四、遭受数据源的封锁。
等等。。。。
这就要求采集程序必须足够智能化,有如下几点要求:
一、可以多机器分布运行,以适应大量数据的采集。
二、能够多并发采集,使采集任务的运行周期可控。
三、下载程序和分析程序分离,不仅是程序上的分离,也需要机器上的分离。
四、能够很容易的加入新的采集任务,很容易的调试。
五、对采集页面内容的分析能够模糊匹配。
六、下载时能够调用代理。
七、长期自动维护一个有效的代理列表
经过几次大的改动,我现在设计的基于linux和php的采集程序架构如下:
Snatch(主目录)
   |-Lib(类库、函数、配置的目录)
   |   |-Config.inc.php(主程序变量配置)
   |   |-OtherConfig.inc.php(其他配置文件若干)
   |   |-Functions.inc.php(函数文件若干)
   |   |-Classes.inc.php(类库文件若干)
   |   |-ClassLocalDB.inc.php(连接本地数据库的操作类)
   |   |-ClassRemoteDB.inc.php(连接远程数据库的操作类)
   |   |-ClassLog.inc.php(写下载分析的日志)
   |-Paser(分析器程序目录)
   |   |-WebSite1(针对WebSite1的分析程序目录)
   |   |   |-WebSite1Paser1.php(针对WebSite1的分析程序1)
   |   |   |-WebSite1Paser2.php(针对WebSite1的分析程序2)
   |   |-WebSite2(针对WebSite2的分析程序目录)
   |   |-ProxyWebSite1(分析代理服务器列表的站点1,取得代理服务器地址并入库)
   |   |-ProxyWebSite2(分析代理服务器列表的站点2,取得代理服务器地址并入库)
   |   |-... ...
   |-Log(日志目录)
   |   |-WebSite1.log(WebSite1的下载及数据分析日志)
   |   |-WebSite2.log(WebSite2的下载及数据分析日志)
   |   |-... ...
   |-Files(下载后的文件保存目录)
   |-Main.php(主入口程序,分配下载任务)
   |-Assign.php(取得下载任务,分配给Down.php执行)
   |-Down.php(进行下载并将下载保存的文件调出来分析)
   |-DelOvertimeData.php(清除很老的下载文件)
   |-ErrorNotice.php(监控下载程序,在其出错时发信通知相关人)
   |-Proxy.php(校验数据库中的代理列表,分析其有效性及连接速度)
   |-Fork(钩子程序,使下载和分析并发)
   |-Main.sh(封装Main.php,使其在shell下运行不出现包含路径错误)
   |-Assign.sh(封装Assign.php)
   |-DelOvertimeData.sh(封装DelOvertimeData.php)
   |-ErrorNotice.sh(封装ErrorNotice.php)
   |-Proxy.sh(封装Proxy.php)
   
本地数据库表结构如下(简单介绍):
   DownloadList表:
      `ID` int(10) unsigned NOT NULL auto_increment,   自增ID
      `ParentID` int(11) NOT NULL default ‘0‘,         父ID,也就是该记录由哪个下载记录衍生来的
      `SiteName` char(32) NOT NULL default ‘‘,         采集网站的名称或代号
      `LocalServerName` char(32) NOT NULL default ‘‘,  该采集任务由本地若干台机器里的哪一台来完成
      `URL` char(255) NOT NULL default ‘‘,             需要下载的数据页地址
      `FileName` char(64) NOT NULL default ‘‘,         下载后保存的文件名
      `FileSize` int(11) NOT NULL default ‘0‘,         下载后文件的大小
      `Handler` char(64) NOT NULL default ‘‘,          分析器的php文件路径,如./Paser/WebSite1/Paser1.php
      `Status` enum(‘Wait‘,‘Download‘,‘Doing‘,‘Done‘,‘Dead‘) NOT NULL default ‘Wait‘,      该任务的状态
      `ProxyID` int(11) NOT NULL default ‘0‘,          该任务使用的代理ID,为0则不使用代理下载
      `Remark` char(100) NOT NULL default ‘‘,          备注字段
      `WaitAddTime` datetime NOT NULL default ‘0000-00-00 00:00:00‘,     记录加入进行等待的时间
      `DownloadAddTime` datetime NOT NULL default ‘0000-00-00 00:00:00‘,  记录开始下载的时间
      `DoingAddTime` datetime NOT NULL default ‘0000-00-00 00:00:00‘,     记录开始分析的时间
      `DoneAddTime` datetime NOT NULL default ‘0000-00-00 00:00:00‘,      记录完成的时间
      
   ProxyList表:
      `ID` int(11) NOT NULL auto_increment,       自增ID
      `Proxy` char(30) NOT NULL default ‘‘,       代理地址,如: 127.0.0.1:8080
      `Status` enum(‘Bad‘,‘Good‘,‘Perfect‘) NOT NULL default ‘Bad‘,    该代理状态
      `SocketTime` float NOT NULL default ‘3‘,                         本地连接该代理socket时间
      `UsedCount` int(11) NOT NULL default ‘0‘,                        被使用的次数
      `AddTime` datetime NOT NULL default ‘0000-00-00 00:00:00‘,       代理被加入列表的时间
      `LastTime` datetime NOT NULL default ‘0000-00-00 00:00:00‘,      代理被最后一次验证的时间
      
   其它相关表:(略)
   
介绍几个文件(只介绍,不贴代码):
一、Main.php
close();
?>
    
二、Assign.php
/dev/null"; 
}
$LocalDB->close();
?>
三、Down.php
四、Proxy.php (维护有效的代理列表)
    方法有两种:
    1、对代理地址的代理端口进行socket连接。设定连接超时为3秒(3秒仍旧连不上的代理就别要了)
       如果连接上了,计算连接时间,并更新该代理记录的数据SocketTime字段,判断其Status是Bad, Good,还是Perfect
    2、对于非Bad的代理,进行下载文件的实验,如果没使用代理下载的文件和使用代理下载的文件一样,则该代理真实有效。
    
    程序略
    
多台机器分布式采集:
只有一台运行Main.sh,2分钟运行一次。
其他机器运行Assign.sh,1分钟一次,Assign.php会根据DownloadList表里的LocalServerName字段来取回任务并完成它。
LocalServerName值由Main.php加载采集任务时分配。这个也可以根据各采集机器负载情况来自动调整。
日志:
采集分析的日志写如Log目录,以便方便的查看到是否采集到数据,分析程序是否有效,在出现错误时也可以找到错误的可能地点和时间。

有点复杂,我只写了大体思路,页面分析部分没有涉及,但是也非常重要。
后台管理也没谈。
架起来之后很爽,只要你采集的机器多,建一个qihoo没问题。
以前公司做的采集就是这个架构,采集sina, tom, 163等等一共143个频道的内容。
对某几个网站收费数据的精确采集和分析也用的这个(当然,需要模拟登录)。
还是相当稳定的

时间: 2024-08-25 17:51:47

基于linux和php的稳定的分布式数据采集架构的相关文章

基于linux实现keepalived高可用的集群网站架构

模拟场景: 随着业务的发展,网站的访问量越来越大,网站访问量已经从原来的1000QPS,变为3000QPS,目前业务已经通过集群LVS架构可做到随时拓展,后端节点已经通过集群技术(ldirectord)保障了可用性,但对于前端负载均衡器来说,是个比较大的安全隐患,因为当前端负载均衡器出现故障时,整个集群就处于瘫痪状态,因此,负载均衡器的可用性也显得至关重要,那么怎么来解决负载均衡器的可用性问题呢?(当然是用keepalived的arrp实现地址偏移来实现最简单啦~) 技术说明: 群(cluste

基于Linux的智能家居的设计(2)

1  系统整体设计方案 智能家居系统的是一个实时查询家庭的温湿度.照明控制.自己主动控制的设定.集家庭娱乐.智能安防为一体,大量数据快处理.可靠的系统,因此在硬件和软件上都有非常大的要求,因此在这里进行了多方面的考虑有下面两个实现方案: 方案一:利用STM32单片机作为手持终端的控制器,使用按键和12864液晶屏作为人机交互的接口.利用51单片机作为房子内部的电灯.空调.门禁等家电的控制器,利用串口实现STM32单片机和51单片机作为传输数据的通道.这个能够实现.可是.机械按键和12864在智能

DIOCP开源项目-利用队列+0MQ+多进程逻辑处理,搭建稳定,高效,分布式的服务端

最近头脑里面一直在想怎么样让能让大家基于DIOCP上写出稳定的服务端程序.很多朋友问我,你DIOCP稳定吗,我可以用他来做三层服务器吗? 当时我是这样回答的,我只能保证DIOCP底层通信的稳定. 说实话,服务端要稳定,并不容易,写过服务端的程序员都清楚.特别是这种可以直接操作指针,自己分配内存和释放内存的语言(想C++, C, Delphi),一不小心就一个坑,一个坑可能就会引发,内存的释放越界,访问非法地址.导致整个进程的直接奔溃. 经过一些研究和咨询,我可以利用多进程来实现通信层和逻辑层的彻

Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台 Seesaw

负载均衡系统 Seesaw Seesaw是由我们网络可靠性工程师用 Go 语言开发的基于 Linux 虚拟服务器的负载平衡平台,就像所有好的项目一样,这个项目也是为了解决实际问题而产生的. Seesaw发布的博客中这样写道:“我们需要能够处理单播(unicast)和任播(anycast)虚拟 IP (VIPs) 流量,使用 NAT 和 DSR (也被称为 DR) 执行负载均衡,执行针对后端的健康检查.特别是,我们需要一个容易管理的平台,可以自动部署配置的变化.在评估了一些包括现有的开源项目的平台

基于Linux的智能家居的设计(1)

写在前面:做了半年的毕业设计,找到的工作与这个完全无关,发现自己现在有写不甘心,但是我还是在关注这方面的发展,自己的摸索和前人的帮助我完成了智能家居的一部分,希望这个能够给一些初学者 能够一些便利,毕竟技术是一个开放的,不属于某一个人的. 摘要 本课题主要目的是设计和实现一个基于Linux开发平台的智能家居系统.本系统主要使用PVC板做成的家居模型.本系统硬件使用基于ARM架构的samsung S3C6410芯片做成的OK6410开发板为手持终端,利用Zigbee实现网络通讯,并结合各种电子元器

基于Linux环境Tomcat-MySQL的服务器搭建

在开发日趋激烈的今天,我们可不能再只会编码了,这样搞不好,就成了一辈子的码奴!所以这里简单的分享一下服务器的搭建,由于Linux的安全性等一切因素让它成为了服务器平台的首选环境!今天跟大家分享的是Java项目的服务器搭建,好啦,步骤来了: 1.下载jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 2.下载tomcat wget http://apache.etoak.co

基于linux的web服务器的iptables防火墙安全优化设置

安全规划:开启 80  22 端口并 打开回路(回环地址 127.0.0.1) #iptables –P INPUT ACCEPT #iptables –P OUTPUT ACCEPT #iptables –P FORWARD ACCEPT 以上几步操作是为了在清除所有规则之前,通过所有请求,如果远程操作的话,防止远程链接断开. 接下来清除服务器内置规则和用户自定义规则: #iptables –F #iptables -X 打开ssh端口,用于远程链接用: #iptables –A INPUT

基于linux 的2048

在 debian 下写了一个 2048, 效果如下: 感兴趣的朋友可以在这里(http://download.csdn.net/download/kamsau/7330933)下载. 基于linux 的2048,布布扣,bubuko.com

基于Linux的物联网操作系统

提到物联网操作系统,就不能不提Linux,因为Linux可能是目前在物联网设备中应用最广的操作系统了.本文和大家分享的就是目前常用的基于Linux的物联网操作系统,一起来看看吧. 在传统Linux内核基础上,经过裁剪,就可以移植到嵌入式系统上运行.不过,还有很多开源组织和商业公司对Linux进行了一番改造,使其更符合嵌入式系统或物联网应用的需求,比如改为实时操作系统. RTLinux RTLinux(Real-Time Linux)是Linux中的一种实时操作系统.它由新墨西哥矿业及科技学院的V