管理平台可以实现在多个节点上跑爬虫任务的需求,也就是在分布式节点上管理爬虫。例如有多台服务器,需要在这些服务器集群上运行、监控、操作相关爬虫脚本,并集中统一查看和管理,这种应用场景就非常适合天生支持分布式管理的爬虫管理平台Crawlab。要让各个节点运行的Crawlab服务协同工作在同一个网络,只需要让这些服务连接到MongoDB和Redis数据库,而不需要暴露自己的IP和端口。

    下图是一个多节点部署的示意图,展示了Crawlab分布式集群是如何工作的。分布式节点部署爬虫管理平台

 

每一个Crawlab服务都在一台服务器上,而处于中心位置的MongoDB和Redis数据库作为它们的通信媒介,连接着主节点(Master)和各个工作节点(Worker)。目前来说主节点只能有一个。这样的一个Crawlab分布式节点网络,形成一个多节点的集群,可以让爬虫在任意个节点上运行;运行的数据可以通过Redis传输回主节点,再呈现给前端界面;主节点也可以通过Redis对工作节点“发号施令”;而MongoDB也储存着各个节点的相关信息,供前端界面使用。

1.准备工作:部署MongoDB和Redis

在生产环境中分布式节点部署,我们推荐将MongoDB和Redis分开部署,也就是说数据库将单独成为一个服务,而不与Crawlab服务耦合在一起。

MongoDB和Redis的安装不赘述,网上查找相关文档进行安装,在启动MongoDB和Redis过程中,需要将其端口暴露给其他Crawlab节点所以需要置密码。

2.部署主节点

不管是Docker部署还是Kubernetes,都需要首先部署一个主节点。

  1. Docker

上月文档中有Docker部署介绍,主节点的启动只需要注明一个环境变量,CRAWLAB_SERVER_MASTER为Y。同时,需要在environment中配置MongoDB和Redis的连接信息。

  1. 直接部署

直接部署是之前没有Docker时的部署方式,相对于Docker部署来说有些繁琐。要注意的是,在./backend/conf/config.yml里需要将server.master对应的值设置为Y。同时,需要在mongo.*和redis.*下配置MongoDB和Redis的连接信息。

  1. Kubernetes

主节点的启动只需要注明一个环境变量,CRAWLAB_SERVER_MASTER为Y。

3.部署工作节点

需要在另一台或多台服务器上部署工作节点。总的来说不难,但需要注意的是能在这些服务器上顺利连接到之前部署的MongoDB和Redis(确保MongoDB和Redis端口暴露出来)。

  1. Docker

如何通过直接部署来启动一个Crawlab节点请参考之前的部署文档。工作节点的启动只需要注明一个环境变量,CRAWLAB_SERVER_MASTER为N。同时,需要在environment中配置MongoDB和Redis的连接信息,请保证您连接的数据库和主节点连接的是同一个数据库。

  1. 直接部署

要注意的是,在./backend/conf/config.yml里需要将server.master对应的值设置为N。同时,需要在mongo.*和redis.*下配置MongoDB和Redis的连接信息,请保证您连接的数据库和主节点连接的是同一个数据库。具体配置请参考配置章节。

  1. Kubernetes

对于Kubernetes来说,部署工作节点非常简单,只需要在K8S主节点上运行以下代码。

kubectlapply-fhttps://raw.githubusercontent.com/crawlab-team/crawlab/master/k8s/crawlab-worker.yaml

4.节点信息

每个节点都会在Redis中储存信息来保持在线状态。

如何知道节点已经启动了呢?一个办法是在Crawlab界面的节点页面上查看,另一个更为准确的办法是在Redis中查看。方法是执行HKEYSnodes命令。然后根据列出来的key,执行HGETnodes<key>来查看信息。信息类似如下内容:

{

"key":"hostname",

"mac":"ac:de:48:00:11:22",

"ip":"192.168.0.2",

"hostname":"hostname",

"master":true,

"update_ts":"2020-06-28T16:44:20.035637+09:00",

"update_ts_unix":1593333860

}

这里是用了hostname作为节点key,也就是唯一识别符,当然也可以指定mac或ip来作为唯一识别符。

注意:在Docker多节点部署中,不推荐使用mac,因为这可能不是唯一的;相反更推荐使用ip或hostname。在Kubernetes部署中,推荐使用hostname来作为唯一识别符。

注意一下update_ts和update_ts_unix这两个字段,它们表示信息更新的时间。如果这个时间与当前时间差距60秒以上,则表示该节点已经处于离线状态;反之,如果差距60秒以内,则是在线状态。

5.其他问题

有时候可能会发现工作节点启动一段时间之后就异常退出了。而检查了数据库配置以及主节点是否已启动,均未发现异常。这时,有很大可能是因为工作节点与主节点的时间不同步导致的。这时需要根据节点信息的update_ts_unix来查看工作节点的时间戳与主节点的时间戳是否一致(相差60秒以内)。

如果有较大差异,这属于时间漂移问题。这时需要对每一台服务器做时间同步。可以利用ntp这个模块来解决时间同步的问题。

相关文章: