使用Docker Swarm搭建分布式爬蟲集群

在爬蟲開發(fā)過程中,你肯定遇到過需要把爬蟲部署在多個服務(wù)器上面的情況瑰妄。此時你是怎么操作的呢?逐一SSH登錄每個服務(wù)器映砖,使用git拉下代碼间坐,然后運(yùn)行?代碼修改了邑退,于是又要一個服務(wù)器一個服務(wù)器登錄上去依次更新竹宋?

有時候爬蟲只需要在一個服務(wù)器上面運(yùn)行,有時候需要在200個服務(wù)器上面運(yùn)行地技。你是怎么快速切換的呢蜈七?一個服務(wù)器一個服務(wù)器登錄上去開關(guān)?或者聰明一點(diǎn)莫矗,在Redis里面設(shè)置一個可以修改的標(biāo)記飒硅,只有標(biāo)記對應(yīng)的服務(wù)器上面的爬蟲運(yùn)行?

A爬蟲已經(jīng)在所有服務(wù)器上面部署了作谚,現(xiàn)在又做了一個B爬蟲三娩,你是不是又得依次登錄每個服務(wù)器再一次部署?

如果你確實(shí)是這么做的妹懒,那么你應(yīng)該后悔沒有早一點(diǎn)看到這篇文章雀监。看完本文以后眨唬,你能夠做到:

2分鐘內(nèi)把一個新爬蟲部署到50臺服務(wù)器上:

docker build -t localhost:8003/spider:0.01 .

docker push localhost:8002/spider:0.01

docker service create --name spider --replicas 50 --network host 45.77.138.242:8003/spider:0.01

30秒內(nèi)把爬蟲從50臺服務(wù)器擴(kuò)展到500臺服務(wù)器:

docker service scale spider=500

30秒內(nèi)批量關(guān)閉所有服務(wù)器上的爬蟲:

docker service scale spider=0

1分鐘內(nèi)批量更新所有機(jī)器上的爬蟲:

docker build -t localhost:8003/spider:0.02 .

docker push localhost:8003/spider:0.02

docker service update --image 45.77.138.242:8003/spider:0.02 spider

這篇文章不會教你怎么使用Docker会前,所以請確定你有一些Docker基礎(chǔ)再來看本文好乐。

Docker Swarm是什么

Docker Swarm是Docker自帶的一個集群管理模塊。他能夠?qū)崿F(xiàn)Docker集群的創(chuàng)建和管理回官。

環(huán)境搭建

本文將會使用3臺Ubuntu 18.04的服務(wù)器來進(jìn)行演示曹宴。這三臺服務(wù)器安排如下:

Master:45.77.138.242

Slave-1:199.247.30.74

Slave-2:95.179.143.21

Docker Swarm是基于Docker的模塊,所以首先要在3臺服務(wù)器上安裝Docker歉提。安裝完成Docker以后笛坦,所有的操作都在Docker中完成。

在Master上安裝Docker

通過依次執(zhí)行下面的命令苔巨,在Master服務(wù)器上安裝Docker

apt-get update

apt-get install -y apt-transport-https ca-certificates curl software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

apt-get update

apt-get install -y docker-ce

創(chuàng)建Manager節(jié)點(diǎn)

一個Docker Swarm集群需要Manager節(jié)點(diǎn)“胬現(xiàn)在初始化Master服務(wù)器,作為集群的Manager節(jié)點(diǎn)侄泽。運(yùn)行下面一條命令礁芦。

docker swarm init

運(yùn)行完成以后,可以看到的返回結(jié)果下圖所示悼尾。

這個返回結(jié)果中柿扣,給出了一條命令:

docker swarm join --token SWMTKN-1-0hqsajb64iynkg8ocp8uruktii5esuo4qiaxmqw2pddnkls9av-dfj7nf1x3vr5qcj4cqiusu4pv 45.77.138.242:2377

這條命令需要在每一個從節(jié)點(diǎn)(Slave)中執(zhí)行。現(xiàn)在先把這個命令記錄下來闺魏。

初始化完成以后未状,得到一個只有1臺服務(wù)器的Docker 集群。執(zhí)行如下命令:

docker node ls

可以看到當(dāng)前這個集群的狀態(tài)析桥,如下圖所示司草。

創(chuàng)建私有源(可選)

創(chuàng)建私有源并不是一個必需的操作。之所以需要私有源泡仗,是因?yàn)轫?xiàng)目的Docker鏡像可能會涉及到公司機(jī)密埋虹,不能上傳到DockerHub這種公共平臺。如果你的鏡像可以公開上傳DockerHub娩怎,或者你已經(jīng)有一個可以用的私有鏡像源搔课,那么你可以直接使用它們,跳過本小節(jié)和下一小節(jié)截亦。

私有源本身也是一個Docker的鏡像辣辫,先將拉取下來:

docker pull registry:latest

如下圖所示。

現(xiàn)在啟動私有源:

docker run -d -p 8003:5000 --name registry -v /tmp/registry:/tmp/registry docker.io/registry:latest

如下圖所示魁巩。

在啟動命令中急灭,設(shè)置了對外開放的端口為8003端口,所以私有源的地址為:45.77.138.242:8003

提示:

這樣搭建的私有源是HTTP方式谷遂,并且沒有權(quán)限驗(yàn)證機(jī)制葬馋,所以如果對公網(wǎng)開放,你需要再使用防火墻做一下IP白名單,從而保證數(shù)據(jù)的安全畴嘶。

允許docker使用可信任的http私有源(可選)

如果你使用上面一個小節(jié)的命令搭建了自己的私有源蛋逾,由于Docker默認(rèn)是不允許使用HTTP方式的私有源的,因此你需要配置Docker窗悯,讓Docker信任它区匣。

使用下面命令配置Docker:

echo '{ "insecure-registries":["45.77.138.242:8003"] }' >> /etc/docker/daemon.json

然后使用下面這個命令重啟docker。

systemctl restart docker

如下圖所示蒋院。

重啟完成以后亏钩,Manager節(jié)點(diǎn)就配置好了。

創(chuàng)建子節(jié)點(diǎn)初始化腳本

對于Slave服務(wù)器來說欺旧,只需要做三件事情:

安裝Docker

加入集群

信任源

從此以后姑丑,剩下的事情全部交給Docker Swarm自己管理,你再也不用SSH登錄這個服務(wù)器了辞友。

為了簡化操作栅哀,可以寫一個shell腳本來批量運(yùn)行。在Slave-1和Slave-2服務(wù)器下創(chuàng)建一個?init.sh?文件称龙,其內(nèi)容如下留拾。

apt-get update

apt-get install -y apt-transport-https ca-certificates curl software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

apt-get update

apt-get install -y docker-ce

echo '{ "insecure-registries":["45.77.138.242:8003"] }' >> /etc/docker/daemon.json

systemctl restart docker

docker swarm join --token SWMTKN-1-0hqsajb64iynkg8ocp8uruktii5esuo4qiaxmqw2pddnkls9av-dfj7nf1x3vr5qcj4cqiusu4pv 45.77.138.242:2377

把這個文件設(shè)置為可自行文件,并運(yùn)行:

chmod +x init.sh

./init.sh

如下圖所示鲫尊。

等待腳本運(yùn)行完成以后痴柔,你就可以從Slave-1和Slave-2的SSH上面登出了。以后也不需要再進(jìn)來了马昨。

回到Master服務(wù)器,執(zhí)行下面的命令扛施,來確認(rèn)現(xiàn)在集群已經(jīng)有3個節(jié)點(diǎn)了:

docker node ls

看到現(xiàn)在集群中已經(jīng)有3個節(jié)點(diǎn)了鸿捧。如下圖所示。

到止為止疙渣,最復(fù)雜最麻煩的過程已經(jīng)結(jié)束了匙奴。剩下的就是體驗(yàn)Docker Swarm帶來的便利了。

創(chuàng)建測試程序

搭建測試Redis

由于這里需要模擬一個分布式爬蟲的運(yùn)行效果妄荔,所以先使用Docker搭建一個臨時的Redis服務(wù):

在Master服務(wù)器上執(zhí)行以下命令:

docker run -d --name redis -p 7891:6379 redis --requirepass "KingnameISHandSome8877"

這個Redis對外使用?7891?端口泼菌,密碼為?KingnameISHandSome8877?,IP就是Master服務(wù)器的IP地址啦租。

編寫測試程序

編寫一個簡單的Python程序:

import time

import redis

client = redis.Redis(host='45.77.138.242', port='7891', password='KingnameISHandSome8877')

while True:

? ? data = client.lpop('example:swarm:spider')

? ? if not data:

? ? ? ? break

? ? print(f'我現(xiàn)在獲取的數(shù)據(jù)為:{data.decode()}')

? ? time.sleep(10)

這個Python每10秒鐘從Redis中讀取一個數(shù)哗伯,并打印出來超升。

編寫Dockerfile

編寫Dockerfile捷沸,基于Python3.6的鏡像創(chuàng)建我們自己的鏡像:

from python:3.6

label mantainer='[email?protected]'

user root

ENV PYTHONUNBUFFERED=0

ENV PYTHONIOENCODING=utf-8

run python3 -m pip install redis

copy spider.py spider.py

cmd python3 spider.py

構(gòu)建鏡像

編寫完成Dockerfile以后,執(zhí)行下面的命令新症,開始構(gòu)建我們自己的鏡像:

docker build -t localhost:8003/spider:0.01 .

這里需要特別注意,由于我們要把這個鏡像上傳到私有源供Slave服務(wù)器上面的從節(jié)點(diǎn)下載虐块,所以鏡像的命名方式需要滿足?localhost:8003/自定義名字:版本號?這樣的格式俩滥。其中的?自定義名字?和?版本號?可以根據(jù)實(shí)際情況進(jìn)行修改。在本文的例子中贺奠,我由于要模擬一個爬蟲的程序霜旧,所以給它取名為spider,由于是第1次構(gòu)建儡率,所以版本號用的是0.01挂据。

整個過程如下圖所示。

上傳鏡像到私有源

鏡像構(gòu)建完成以后喉悴,需要把它上傳到私有源棱貌。此時需要執(zhí)行命令:

docker push localhost:8003/spider:0.01

如下圖所示。

大家記住這個構(gòu)建和上傳的命令箕肃,以后每一次更新代碼婚脱,都需要使用這兩條命令。

創(chuàng)建服務(wù)

Docker Swarm上面運(yùn)行的是一個一個的服務(wù)勺像,因此需要使用docker service命令創(chuàng)建服務(wù)障贸。

docker service create --name spider --network host 45.77.138.242:8003/spider:0.01

這個命令創(chuàng)建了一個名為?spider?的服務(wù)。默認(rèn)運(yùn)行1個容器吟宦。運(yùn)行情況如下圖所示篮洁。

當(dāng)然也可以一創(chuàng)建就用很多容器來運(yùn)行,此時只需要添加一個?--replicas?參數(shù)即可殃姓。例如一創(chuàng)建服務(wù)就使用50個容器運(yùn)行:

docker service create --name spider --replicas 50 --network host 45.77.138.242:8003/spider:0.01

但是一般一開始的代碼可能會有不少bug袁波,所以建議先使用1個容器來運(yùn)行,觀察日志蜗侈,發(fā)現(xiàn)沒有問題以后再進(jìn)行擴(kuò)展篷牌。

回到默認(rèn)1個容器的情況下,這個容器可能在目前三臺機(jī)器在的任何一臺上面踏幻。通過執(zhí)行下面的命令來觀察這一個默認(rèn)的容器運(yùn)行情況:

docker service ps spider

如下圖所示枷颊。

查看節(jié)點(diǎn)Log

根據(jù)上圖執(zhí)行結(jié)果,可以看到這個運(yùn)行中的容器的ID為?rusps0ofwids?该面,那么執(zhí)行下面的命令動態(tài)查看Log:

docker service logs -f 容器ID

此時就會持續(xù)跟蹤這一個容器的Log夭苗。如下圖所示。

橫向擴(kuò)展

現(xiàn)在隔缀,只有1臺服務(wù)器運(yùn)行了一個容器题造,我想使用3臺服務(wù)器運(yùn)行這個爬蟲,那么我需要執(zhí)行一條命令即可:

docker service scale spider=3

運(yùn)行效果如下圖所示猾瘸。

此時晌梨,再一次查看爬蟲的運(yùn)行情況桥嗤,可以發(fā)現(xiàn)三臺機(jī)器上面會各自運(yùn)行一個容器。如下圖所示仔蝌。

現(xiàn)在泛领,我們登錄slave-1機(jī)器上,看看是不是真的有一個任務(wù)在運(yùn)行敛惊。如下圖所示渊鞋。

可以看到確實(shí)有一個容器在上面運(yùn)行著。這是Docker Swarm自動分配過來的瞧挤。

現(xiàn)在我們使用下面的命令強(qiáng)行把slave-1上面的Docker給關(guān)了锡宋,再來看看效果。

systemctl stop docker

回到master服務(wù)器特恬,再次查看爬蟲的運(yùn)行效果执俩,如下圖所示。

可以看到癌刽,Docker Swarm探測到Slave-1掉線以后役首,他就會自動重新找個機(jī)器啟動任務(wù),保證始終有3個任務(wù)在運(yùn)行显拜。在這一次的例子中衡奥,Docker Swarm自動在master機(jī)器上啟動了2個spider容器。

如果機(jī)器性能比較好远荠,甚至可以在3每臺機(jī)器上面多運(yùn)行幾個容器:

docker service scale spider=10

此時矮固,就會啟動10個容器來運(yùn)行這些爬蟲。這10個爬蟲之間互相隔離譬淳。

如果想讓所有爬蟲全部停止怎么辦档址?非常簡單,一條命令:

docker service scale spider=0

這樣所有爬蟲就會全部停止邻梆。

同時查看多個容器的日志

如果想同時看所有容器怎么辦呢守伸?可以使用如下命令查看所有容器的最新的20行日志:

docker service ps robot | grep Running | awk '{print $1}' | xargs -i docker service logs --tail 20 {}

這樣,日志就會按順序顯示出來了确虱。如下圖所示含友。

更新爬蟲

如果你的代碼做了修改替裆。那么你需要更新爬蟲校辩。

先修改代碼,重新構(gòu)建辆童,重新提交新的鏡像到私有源中宜咒。如下圖所示。

接下來需要更新服務(wù)中的鏡像把鉴。更新鏡像有兩種做法故黑。一種是先把所有爬蟲關(guān)閉儿咱,再更新。

docker service scale spider=0

docker service update --image 45.77.138.242:8003/spider:0.02 spider

docker service scale spider=3

第二種是直接執(zhí)行更新命令场晶。

docker service update --image 45.77.138.242:8003/spider:0.02 spider

他們的區(qū)別在于混埠,直接執(zhí)行更新命令時,正在運(yùn)行的容器會一個一個更新诗轻。

運(yùn)行效果如下圖所示钳宪。

你可以用Docker Swarm做更多事情

本文使用的是一個模擬爬蟲的例子,但是顯然扳炬,任何可以批量運(yùn)行的程序都能夠用Docker Swarm來運(yùn)行吏颖,無論你用Redis還是Celery來通信,無論你是否需要通信恨樟,只要能批量運(yùn)行半醉,就能用Docker Swarm。

在同一個Swarm集群里面劝术,可以運(yùn)行多個不同的服務(wù)缩多,各個服務(wù)之間互不影響。真正做到了搭建一次Docker Swarm集群夯尽,然后就再也不用管了瞧壮,以后的所有操作你都只需要在Manager節(jié)點(diǎn)所在的這個服務(wù)器上面運(yùn)行。

歡迎工作一到五年的Java工程師朋友們加入Java架構(gòu)開發(fā): 855835163

群內(nèi)提供免費(fèi)的Java架構(gòu)學(xué)習(xí)資料(里面有高可用匙握、高并發(fā)咆槽、高性能及分布式、Jvm性能調(diào)優(yōu)圈纺、Spring源碼秦忿,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點(diǎn)的架構(gòu)資料)合理利用自己每一分每一秒的時間來學(xué)習(xí)提升自己蛾娶,不要再用"沒有時間“來掩飾自己思想上的懶惰灯谣!趁年輕,使勁拼蛔琅,給未來的自己一個交代胎许!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市罗售,隨后出現(xiàn)的幾起案子辜窑,更是在濱河造成了極大的恐慌,老刑警劉巖寨躁,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穆碎,死亡現(xiàn)場離奇詭異,居然都是意外死亡职恳,警方通過查閱死者的電腦和手機(jī)所禀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門方面,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人色徘,你說我怎么就攤上這事恭金。” “怎么了褂策?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵蔚叨,是天一觀的道長。 經(jīng)常有香客問我辙培,道長蔑水,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任扬蕊,我火速辦了婚禮搀别,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尾抑。我一直安慰自己歇父,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布再愈。 她就那樣靜靜地躺著榜苫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翎冲。 梳的紋絲不亂的頭發(fā)上垂睬,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音抗悍,去河邊找鬼驹饺。 笑死,一個胖子當(dāng)著我的面吹牛缴渊,可吹牛的內(nèi)容都是我干的赏壹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼衔沼,長吁一口氣:“原來是場噩夢啊……” “哼蝌借!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起指蚁,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤菩佑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后欣舵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體擎鸠,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缀磕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年缘圈,在試婚紗的時候發(fā)現(xiàn)自己被綠了劣光。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡糟把,死狀恐怖绢涡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情遣疯,我是刑警寧澤雄可,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站缠犀,受9級特大地震影響数苫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辨液,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一虐急、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧滔迈,春花似錦止吁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谈山,卻和暖如春俄删,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奏路。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工抗蠢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人思劳。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓迅矛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親潜叛。 傳聞我的和親對象是個殘疾皇子秽褒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容