pyspider: swarm分布式爬虫

目录


  • 起点
  • 搭建swarm
  • 编写docker-compose.yml
  • 部署服务
  • 感想

1. 起点


学习爬虫有一段时间了,使用过Scrapy, 就想试试其它的爬虫框架,选择pyspider也是因为想通过pyspider了解一下分布式爬虫,由于docker技术的成熟,也就顺理成章的选择docker来完成这件事。

2. 搭建swarm


创建节点

创建三个docker machine:

$ docker-machine create --driver virtualbox manager1
$ docker-machine create --driver virtualbox worker1
$ docker-machine create --driver virtualbox worker2

执行如下命令可查看新创建的docker machine, 以及docker machine对用的IP地址

$ docker-machine ls
NAME       ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
default    *        virtualbox   Running   tcp://192.168.99.100:2376           v17.05.0-ce
manager1   -        virtualbox   Running   tcp://192.168.99.101:2376           v17.05.0-ce
worker1    -        virtualbox   Running   tcp://192.168.99.102:2376           v17.05.0-ce
worker2    -        virtualbox   Running   tcp://192.168.99.103:2376           v17.05.0-ce

创建swarm

登陆 manager1:

$ docker-machine ssh manager1

执行如下命令,创建一个新的swarm

docker@manager1:~$ docker swarm init --advertise-addr 192.168.99.101

Swarm initialized: current node (wpf2jcvhhvfosv3c9ac6c50dh) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-69wvyxsrnjtm11z38eus20tm0z9cof2ks9khzyv7fdo8it0dln-drdoszuykjp1uvhmn2spaa8vj \
    192.168.99.101:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

将节点加入swarm

登陆worker1, 将worker1加入swarm:

docker@worker1:~$ docker swarm join \
>     --token SWMTKN-1-69wvyxsrnjtm11z38eus20tm0z9cof2ks9khzyv7fdo8it0dln-drdoszuykjp1uvhmn2spaa8vj \
>     192.168.99.101:2377
This node joined a swarm as a worker.

登陆worker2, 将worker2加入swarm:

docker@worker2:~$ docker swarm join \
>     --token SWMTKN-1-69wvyxsrnjtm11z38eus20tm0z9cof2ks9khzyv7fdo8it0dln-drdoszuykjp1uvhmn2spaa8vj \
>     192.168.99.101:2377
This node joined a swarm as a worker.

查看当前swarm状态

docker@manager1:~$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS
k926754fhudg5tu51rnlp2fdj     worker2             Ready               Active
q1seyrwugtdceqd515tmp8ph3     worker1             Ready               Active
wpf2jcvhhvfosv3c9ac6c50dh *   manager1            Ready               Active              Leader

至此,三个节点的swarm已经创建完成。

3. 编写docker-compose.yml


docker-compose.yml请参考

docker-compose.yml

注意事项

  • compose file使用version: 3
  • 部署多replicas时,不需要使用HAproxy的Load Balance,swarm服务本身自带VIP,如:
pyspider: swarm分布式爬虫_第1张图片
  • command中需要连接其它服务时,配置参数不可写在文件中,如scheduler需要连接mysql, redis等,不能使用config.json文件

    command: -c config.json scheduler
    
  • 在使用stack deploy时,docker-compose file中 link, depends_on等命令被忽略,具体信息请参考compose file版本3

  • 所有服务使用同一网络段,如cars

  • 如果需要连接远端mysql, redis修改连接地址即可,如

    command: '--taskdb "mysql+taskdb://root:[email protected]:3306/taskdb" --resultdb "mysql+resultdb://root:[email protected]:3306/resultdb" --projectdb "mysql+projectdb://root:[email protected]:3306/projectdb" --message-queue "redis://10.208.20.94:6379/db" webui --max-rate 10 --max-burst 3 --scheduler-rpc "http://scheduler:23333/" --fetcher-rpc "http://fetcher/"'
    

4. 部署服务


部署

登陆manager1, 执行如下命令:

docker@manager1:~$ docker stack deploy -c docker-compose.yml myspider

注意事项

swarm服务部署没有严格的顺序,所以会出现mysql, redis服务启动较晚,在service部署要设置restart_policy, 如

docker@manager1:~$ docker stack deploy -c docker-compose.yml myspider
Creating network myspider_cars
Creating service myspider_fetcher
Creating service myspider_processor
Creating service myspider_result-worker
Creating service myspider_webui
Creating service myspider_redis
Creating service myspider_mysql
Creating service myspider_scheduler
Creating service myspider_phantomjs

5. 感想


由于本身对swarm stack缺乏经验,中途一度想放弃swarm, 转而采用k8s,还好坚持下来,所以也就有了这篇记录,列出了当前踩的一些坑。

你可能感兴趣的:(pyspider: swarm分布式爬虫)