• 售前

  • 售后

热门帖子
入门百科

使用Docker Swarm搭建分布式爬虫集群的方法示例

[复制链接]
卢云i 显示全部楼层 发表于 2021-10-25 19:10:34 |阅读模式 打印 上一主题 下一主题
在爬虫开发过程中,你肯定遇到过需要把爬虫摆设在多个服务器上面的情况。此时你是怎么操纵的呢?逐一SSH登录每个服务器,使用git拉下代码,然后运行?代码修改了,于是又要一个服务器一个服务器登录上去依次更新?
偶然候爬虫只需要在一个服务器上面运行,偶然候需要在200个服务器上面运行。你是怎么快速切换的呢?一个服务器一个服务器登录上去开关?大概智慧一点,在Redis内里设置一个可以修改的标志,只有标志对应的服务器上面的爬虫运行?
A爬虫已经在所有服务器上面摆设了,如今又做了一个B爬虫,你是不是又得依次登录每个服务器再一次摆设?
如果你确实是这么做的,那么你应该痛恨没有早一点看到这篇文章。看完本文以后,你可以或许做到:
2分钟内把一个新爬虫摆设到50台服务器上:
  1. docker build -t localhost:8003/spider:0.01 .
  2. docker push localhost:8002/spider:0.01
  3. docker service create --name spider --replicas 50 --network host 45.77.138.242:8003/spider:0.01
复制代码
30秒内把爬虫从50台服务器扩展到500台服务器:
  1. docker service scale spider=500
复制代码
30秒内批量关闭所有服务器上的爬虫:
  1. docker service scale spider=0
复制代码
1分钟内批量更新所有呆板上的爬虫:
  1. docker build -t localhost:8003/spider:0.02 .
  2. docker push localhost:8003/spider:0.02
  3. docker service update --image 45.77.138.242:8003/spider:0.02 spider
复制代码
这篇文章不会教你怎么使用Docker,以是请确定你有一些Docker基础再来看本文。
Docker Swarm是什么

Docker Swarm是Docker自带的一个集群管理模块。他可以或许实现Docker集群的创建和管理。
情况搭建

本文将会使用3台Ubuntu 18.04的服务器来举行演示。这三台服务器安排如下:
Master:45.77.138.242
Slave-1:199.247.30.74
Slave-2:95.179.143.21
Docker Swarm是基于Docker的模块,以是起首要在3台服务器上安装Docker。安装完成Docker以后,所有的操纵都在Docker中完成。
在Master上安装Docker

通过依次执行下面的下令,在Master服务器上安装Docker
  1. apt-get update
  2. apt-get install -y apt-transport-https ca-certificates curl software-properties-common
  3. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
  5. apt-get update
  6. apt-get install -y docker-ce
复制代码
创建Manager节点
一个Docker Swarm集群需要Manager节点。如今初始化Master服务器,作为集群的Manager节点。运行下面一条下令。
  1. docker swarm init
复制代码
运行完成以后,可以看到的返回结果下图所示。

这个返回结果中,给出了一条下令:
复制代码 代码如下:docker swarm join --token SWMTKN-1-0hqsajb64iynkg8ocp8uruktii5esuo4qiaxmqw2pddnkls9av-dfj7nf1x3vr5qcj4cqiusu4pv 45.77.138.242:2377
这条下令需要在每一个从节点(Slave)中执行。如今先把这个下令记录下来。
初始化完成以后,得到一个只有1台服务器的Docker 集群。执行如下下令:
  1. docker node ls
复制代码
可以看到当前这个集群的状态,如下图所示。

创建私有源(可选)

创建私有源并不是一个必需的操纵。之以是需要私有源,是由于项目的Docker镜像大概会涉及到公司秘密,不能上传到DockerHub这种公共平台。如果你的镜像可以公开上传DockerHub,大概你已经有一个可以用的私有镜像源,那么你可以直接使用它们,跳过本小节和下一小节。
私有源自己也是一个Docker的镜像,先将拉取下来:
  1. docker pull registry:latest
复制代码
如下图所示。

如今启动私有源:
复制代码 代码如下:docker run -d -p 8003:5000 --name registry -v /tmp/registry:/tmp/registry docker.io/registry:latest
如下图所示。

在启动下令中,设置了对外开放的端口为8003端口,以是私有源的地址为:45.77.138.242:8003
提示:
这样搭建的私有源是HTTP方式,而且没有权限验证机制,以是如果对公网开放,你需要再使用防火墙做一下IP白名单,从而包管数据的安全。
答应docker使用可信任的http私有源(可选)

如果你使用上面一个小节的下令搭建了自己的私有源,由于Docker默认是不答应使用HTTP方式的私有源的,因此你需要设置Docker,让Docker信任它。
使用下面下令设置Docker:
  1. echo '{ "insecure-registries":["45.77.138.242:8003"] }' >> /etc/docker/daemon.json
复制代码
然后使用下面这个下令重启docker。
  1. systemctl restart docker
复制代码
如下图所示。

重启完成以后,Manager节点就设置好了。
创建子节点初始化脚本

对于Slave服务器来说,只需要做三件事变:
      
  • 安装Docker  
  • 加入集群  
  • 信任源
今后以后,剩下的事变全部交给Docker Swarm自己管理,你再也不消SSH登录这个服务器了。
为了简化操纵,可以写一个shell脚原来批量运行。在Slave-1和Slave-2服务器下创建一个
  1. init.sh
复制代码
文件,其内容如下。
  1. apt-get update
  2. apt-get install -y apt-transport-https ca-certificates curl software-properties-common
  3. curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  4. add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
  5. apt-get update
  6. apt-get install -y docker-ceecho '{ "insecure-registries":["45.77.138.242:8003"] }' >> /etc/docker/daemon.jsonsystemctl restart docker docker swarm join --token SWMTKN-1-0hqsajb64iynkg8ocp8uruktii5esuo4qiaxmqw2pddnkls9av-dfj7nf1x3vr5qcj4cqiusu4pv 45.77.138.242:2377
复制代码
把这个文件设置为可自行文件,并运行:
  1. chmod +x init.sh
  2. ./init.sh
复制代码
如下图所示。

等候脚本运行完成以后,你就可以从Slave-1和Slave-2的SSH上面登出了。以后也不需要再进来了。
回到Master服务器,执行下面的下令,来确认如今集群已经有3个节点了:
  1. docker node ls
复制代码
看到如今集群中已经有3个节点了。如下图所示。

到止为止,最复杂最贫困的过程已经结束了。剩下的就是体验Docker Swarm带来的便利了。
创建测试步调
搭建测试Redis
由于这里需要模仿一个分布式爬虫的运行结果,以是先使用Docker搭建一个临时的Redis服务:
在Master服务器上执行以下下令:
复制代码 代码如下:docker run -d --name redis -p 7891:6379 redis --requirepass "KingnameISHandSome8877"
这个Redis对外使用
  1. 7891
复制代码
端口,密码为
  1. KingnameISHandSome8877
复制代码
,IP就是Master服务器的IP地址。
编写测试步调

编写一个简单的Python步调:
  1. import time
  2. import redis
  3. client = redis.Redis(host='45.77.138.242', port='7891', password='KingnameISHandSome8877')
  4. while True:
  5.   data = client.lpop('example:swarm:spider')
  6.   if not data:
  7.     break
  8.   print(f'我现在获取的数据为:{data.decode()}')
  9.   time.sleep(10)
复制代码
这个Python每10秒钟从Redis中读取一个数,并打印出来。
编写Dockerfile

编写Dockerfile,基于Python3.6的镜像创建我们自己的镜像:
  1. from python:3.6
  2. label mantainer='[email protected]'
  3. user root
  4. ENV PYTHONUNBUFFERED=0
  5. ENV PYTHONIOENCODING=utf-8
  6. run python3 -m pip install redis
  7. copy spider.py spider.py
  8. cmd python3 spider.py
复制代码
构建镜像
编写完成Dockerfile以后,执行下面的下令,开始构建我们自己的镜像:
  1. docker build -t localhost:8003/spider:0.01 .
复制代码
这里需要特别留意,由于我们要把这个镜像上传到私有源供Slave服务器上面的从节点下载,以是镜像的定名方式需要满足
  1. localhost:8003/自定义名字:版本号
复制代码
这样的格式。此中的
  1. 自定义名字
复制代码
  1. 版本号
复制代码
可以根据现实情况举行修改。在本文的例子中,我由于要模仿一个爬虫的步调,以是给它取名为spider,由于是第1次构建,以是版本号用的是0.01。
整个过程如下图所示。

上传镜像到私有源

镜像构建完成以后,需要把它上传到私有源。此时需要执行下令:
  1. docker push localhost:8003/spider:0.01
复制代码
如下图所示。

大家记着这个构建和上传的下令,以后每一次更新代码,都需要使用这两条下令。
创建服务

Docker Swarm上面运行的是一个一个的服务,因此需要使用docker service下令创建服务。
复制代码 代码如下:docker service create --name spider --network host 45.77.138.242:8003/spider:0.01
这个下令创建了一个名为
  1. spider
复制代码
的服务。默认运行1个容器。运行情况如下图所示。

固然也可以一创建就用很多容器来运行,此时只需要添加一个
  1. --replicas
复制代码
参数即可。例如一创建服务就使用50个容器运行:
复制代码 代码如下:docker service create --name spider --replicas 50 --network host 45.77.138.242:8003/spider:0.01
但是一样寻常一开始的代码大概会有不少bug,以是发起先使用1个容器来运行,观察日记,发现没有题目以后再举行扩展。
回到默认1个容器的情况下,这个容器大概在如今三台呆板在的任何一台上面。通过执行下面的下令来观察这一个默认的容器运行情况:
  1. docker service ps spider
复制代码
如下图所示。

查看节点Log

根据上图执行结果,可以看到这个运行中的容器的ID为
  1. rusps0ofwids
复制代码
,那么执行下面的下令动态查看Log:
  1. docker service logs -f 容器ID
复制代码
此时就会持续跟踪这一个容器的Log。如下图所示。

横向扩展

如今,只有1台服务器运行了一个容器,我想使用3台服务器运行这个爬虫,那么我需要执行一条下令即可:
  1. docker service scale spider=3
复制代码
运行结果如下图所示。

此时,再一次查看爬虫的运行情况,可以发现三台呆板上面会各自运行一个容器。如下图所示。

如今,我们登录slave-1呆板上,看看是不是真的有一个任务在运行。如下图所示。

可以看到确实有一个容器在上面运行着。这是Docker Swarm主动分配过来的。
如今我们使用下面的下令强行把slave-1上面的Docker给关了,再来看看结果。
  1. systemctl stop docker
复制代码
回到master服务器,再次查看爬虫的运行结果,如下图所示。

可以看到,Docker Swarm探测到Slave-1掉线以后,他就会主动重新找个呆板启动任务,包管始终有3个任务在运行。在这一次的例子中,Docker Swarm主动在master呆板上启动了2个spider容器。
如果呆板性能比较好,乃至可以在3每台呆板上面多运行几个容器:
  1. docker service scale spider=10
复制代码
此时,就会启动10个容器来运行这些爬虫。这10个爬虫之间相互隔离。
如果想让所有爬虫全部停止怎么办?非常简单,一条下令:
  1. docker service scale spider=0
复制代码
这样所有爬虫就会全部停止。
同时查看多个容器的日记

如果想同时看所有容器怎么办呢?可以使用如下下令查看所有容器的最新的20行日记:
复制代码 代码如下:docker service ps robot | grep Running | awk '{print $1}' | xargs -i docker service logs --tail 20 {}
这样,日记就会按顺序显示出来了。如下图所示。

更新爬虫

如果你的代码做了修改。那么你需要更新爬虫。
先修改代码,重新构建,重新提交新的镜像到私有源中。如下图所示。

接下来需要更新服务中的镜像。更新镜像有两种做法。一种是先把所有爬虫关闭,再更新。
  1. docker service scale spider=0
  2. docker service update --image 45.77.138.242:8003/spider:0.02 spider
  3. docker service scale spider=3
复制代码
第二种是直接执行更新下令。
  1. docker service update --image 45.77.138.242:8003/spider:0.02 spider
复制代码
他们的区别在于,直接执行更新下令时,正在运行的容器会一个一个更新。
运行结果如下图所示。

你可以用Docker Swarm做更多事变

本文使用的是一个模仿爬虫的例子,但是显然,任何可以批量运行的步调都可以或许用Docker Swarm来运行,无论你用Redis还是Celery来通信,无论你是否需要通信,只要能批量运行,就能用Docker Swarm。
在同一个Swarm集群内里,可以运行多个差别的服务,各个服务之间互不影响。真正做到了搭建一次Docker Swarm集群,然后就再也不消管了,以后的所有操纵你都只需要在Manager节点所在的这个服务器上面运行。
以上就是本文的全部内容,希望对大家的学习有所资助,也希望大家多多支持草根技术分享。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作