Docker Swarm を使用して分散クローラー クラスターを構築する例

Docker Swarm を使用して分散クローラー クラスターを構築する例

クローラーの開発プロセス中に、クローラーを複数のサーバーに展開する必要がある状況に遭遇したことがあるはずです。現時点ではどのように運営していますか?各サーバーに 1 つずつ SSH で接続し、git を使用してコードをプルダウンしてから実行しますか?コードが変更されたので、各サーバーに1つずつログインして順番に更新する必要がありますか?

クローラーを 1 台のサーバーでのみ実行する必要がある場合もあれば、200 台のサーバーで実行する必要がある場合もあります。どうやって素早く切り替えるのですか?各サーバーに 1 つずつログインしてオンとオフを切り替えますか?あるいは、Redis に変更可能なフラグを設定して、フラグに対応するサーバー上のクローラーのみが実行されるようにするのは賢明でしょうか?

クローラー A はすべてのサーバーにデプロイされています。次に、クローラー B を作成しました。各サーバーに 1 つずつログインして再度デプロイする必要がありますか?

もしそうなら、この記事をもっと早く見なかったことを後悔するはずです。この記事を読むと、次のことができるようになります。

2 分で 50 台のサーバーに新しいクローラーを展開します。

実行ファイル: docker build -t localhost:8003/spider:0.01
docker push ローカルホスト:8002/スパイダー:0.01
docker サービス作成 --name spider --replicas 50 --network ホスト 45.77.138.242:8003/spider:0.01

30 秒以内にクローラーを 50 台から 500 台のサーバーに拡張:

docker サービススケール スパイダー = 500

30 秒以内にすべてのサーバーのクローラーを一括シャットダウンします。

docker サービススケール スパイダー = 0

1 分以内にすべてのマシンのクローラーを一括更新します。

実行ファイル: docker build -t localhost:8003/spider:0.02
docker push ローカルホスト:8003/スパイダー:0.02
docker サービス更新 --image 45.77.138.242:8003/spider:0.02 スパイダー

この記事では Docker の使い方については説明しませんので、この記事を読む前に Docker の基本を理解しておいてください。

Docker Swarm とは何ですか?

Docker Swarm は、Docker に付属するクラスター管理モジュールです。 Docker クラスターを作成および管理できます。

環境構築

この記事では、デモンストレーションに 3 台の Ubuntu 18.04 サーバーを使用します。 3 つのサーバーは次のように配置されます。

マスター: 45.77.138.242

スレーブ1: 199.247.30.74

スレーブ2: 95.179.143.21

Docker Swarm は Docker をベースにしたモジュールなので、まず 3 台のサーバーに Docker をインストールする必要があります。 Docker をインストールしたら、すべての操作は Docker 内で完了します。

マスターにDockerをインストールする

次のコマンドを順番に実行して、マスター サーバーに Docker をインストールします。

apt-getアップデート
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-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
apt-getアップデート
apt-get install -y docker-ce

マネージャーノードの作成

Docker Swarm クラスターにはマネージャー ノードが必要です。次に、マスター サーバーをクラスターのマネージャー ノードとして初期化します。次のコマンドを実行します。

docker スウォーム初期化

実行が完了すると、下の図に示すように返された結果が表示されます。

この戻り結果では、コマンドが与えられます:

次のようにコードをコピーします
docker swarm に参加 --token SWMTKN-1-0hqsajb64iynkg8ocp8uruktii5esuo4qiaxmqw2pddnkls9av-dfj7nf1x3vr5qcj4cqiusu4pv 45.77.138.242:2377

このコマンドは各スレーブノードで実行する必要があります。このコマンドを記録します。

初期化が完了すると、サーバーが 1 台だけの Docker クラスターが作成されます。次のコマンドを実行します。

ドッカーノードls

次の図に示すように、クラスターの現在のステータスを確認できます。

プライベートオリジンを作成する(オプション)

プライベートオリジンを作成する必要はありません。プライベート ソースが必要な理由は、プロジェクトの Docker イメージに企業秘密が含まれている可能性があり、DockerHub などのパブリック プラットフォームにアップロードできないためです。イメージを DockerHub に公開アップロードできる場合、またはすでにプライベート イメージ リポジトリが利用可能な場合は、それを直接使用して、このセクションと次のセクションをスキップできます。

プライベート ソース自体も Docker イメージです。まずそれをプルダウンします。

docker pull レジストリ:最新

下の図の通りです。

次にプライベート ソースを起動します。

次のようにコードをコピーします
docker run -d -p 8003:5000 --name レジストリ -v /tmp/registry:/tmp/registry docker.io/registry:latest

下の図の通りです。

起動コマンドでは、開いているポートはポート8003に設定されているため、プライベートソースのアドレスは45.77.138.242:8003になります。

ヒント:

この方法で構築されたプライベート ソースは HTTP を使用し、権限検証メカニズムがないため、パブリック ネットワークに公開する場合は、ファイアウォールを使用して IP ホワイトリストを作成し、データのセキュリティを確保する必要があります。

Docker が信頼できる http プライベート オリジンを使用できるようにする (オプション)

前のセクションのコマンドを使用して独自のプライベート ソースを構築する場合、Docker はデフォルトで HTTP プライベート ソースの使用を許可しないため、それを信頼するように Docker を構成する必要があります。

次のコマンドを使用して Docker を設定します。

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

次に、次のコマンドを使用して docker を再起動します。

systemctl dockerを再起動します

下の図の通りです。

再起動が完了すると、マネージャー ノードが構成されます。

子ノードの初期化スクリプトを作成する

スレーブ サーバーの場合は、次の 3 つのことだけを実行する必要があります。

  • Dockerをインストールする
  • クラスターへの参加
  • 信頼できる情報源

今後は、他のすべてのタスクは Docker Swarm 自体によって管理され、SSH 経由でサーバーにログインする必要がなくなります。

操作を簡素化するために、バッチで実行するシェル スクリプトを作成できます。 Slave-1 サーバーと Slave-2 サーバーに次の内容のinit.shファイルを作成します。

apt-getアップデート
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-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
apt-getアップデート
apt-get install -y docker-ce
echo '{ "insecure-registries":["45.77.138.242:8003"] }' >> /etc/docker/daemon.json
systemctl dockerを再起動します 
docker swarm に参加 --token SWMTKN-1-0hqsajb64iynkg8ocp8uruktii5esuo4qiaxmqw2pddnkls9av-dfj7nf1x3vr5qcj4cqiusu4pv 45.77.138.242:2377

このファイルを使用可能にして、次を実行します:

chmod +x init.sh
./init.sh

下の図の通りです。

スクリプトが終了したら、Slave-1 と Slave-2 の SSH からログアウトできます。今後再度ご来院いただく必要はございません。

マスター サーバーに戻り、次のコマンドを実行して、クラスターに 3 つのノードがあることを確認します。

ドッカーノードls

クラスター内に 3 つのノードがあることがわかります。下の図の通りです。

これまでのところ、最も複雑で面倒なプロセスは終了しました。残っているのは、Docker Swarm がもたらす利便性を体験することだけです。

テストプログラムの作成

Redis の構築とテスト

分散クローラーの実行効果をシミュレートする必要があるため、まず Docker を使用して一時的な Redis サービスを構築します。

マスター サーバーで次のコマンドを実行します。

次のようにコードをコピーします
docker run -d --name redis -p 7891:6379 redis --requirepass "KingnameISHandSome8877"

この Redis は外部使用のためにポート7891を使用し、パスワードはKingnameISHandSome8877 、IP はマスター サーバーの IP アドレスです。

テストプログラムの作成

簡単な Python プログラムを作成します。

インポート時間
Redisをインポートする


クライアント = redis.Redis(ホスト = '45.77.138.242'、ポート = '7891'、パスワード = 'KingnameISHandSome8877')

真の場合:
  データ = client.lpop('example:swarm:spider')
  データでない場合:
    壊す
  print(f'現在取得しているデータは次のとおりです: {data.decode()}')
  時間.睡眠(10)

この Python プログラムは、10 秒ごとに Redis から数値を読み取り、それを出力します。

Dockerfileの作成

Python 3.6 イメージに基づいて独自のイメージを作成するための Dockerfile を記述します。

Python:3.6から
ラベル管理者='[email protected]'

ユーザー ルート
環境変数 PYTHONUNBUFFERED=0
環境変数 PYTHONIOENCODING=utf-8

python3 -m pip install redis を実行します。

spider.py をコピーする spider.py
cmd python3 spider.py

イメージを構築する

Dockerfile を記述した後、次のコマンドを実行して独自のイメージの構築を開始します。

実行ファイル: docker build -t localhost:8003/spider:0.01

このイメージをスレーブ サーバー上のスレーブ ノードでダウンロードできるようにプライベート ソースにアップロードするため、イメージの命名方法はlocalhost:8003/自定義名字:版本號の形式を満たす必要があることに注意することが重要です。自定義名字版本號実際の状況に応じて変更できます。この記事の例では、クローラープログラムをシミュレートしたいので、spider と名付けました。最初のビルドなので、バージョン番号は 0.01 です。

全体のプロセスを下の図に示します。

画像をプライベートリポジトリにアップロードする

イメージが構築されたら、それをプライベート ソースにアップロードする必要があります。このとき、次のコマンドを実行する必要があります。

docker push ローカルホスト:8003/スパイダー:0.01

下の図の通りです。

ビルド コマンドとアップロード コマンドは必ず覚えておいてください。今後コードを更新するたびに、この 2 つのコマンドを使用する必要があります。

サービスの作成

Docker Swarm はサービスを 1 つずつ実行するため、サービスを作成するには docker service コマンドを使用する必要があります。

次のようにコードをコピーします
docker サービス作成 --name スパイダー --network ホスト 45.77.138.242:8003/spider:0.01

このコマンドは、 spiderというサービスを作成します。デフォルトでは、1 つのコンテナが実行されます。操作は以下の図のようになります。

もちろん、 --replicasパラメータを追加することで、複数のコンテナを一度に実行することもできます。たとえば、サービスが作成されると、50 個のコンテナで実行されます。

次のようにコードをコピーします
docker サービス作成 --name spider --replicas 50 --network ホスト 45.77.138.242:8003/spider:0.01

ただし、初期コードには多くのバグがある可能性があるため、最初は 1 つのコンテナを使用して実行し、ログを観察し、問題が見つからなければ拡張することをお勧めします。

1 つのコンテナのデフォルトのケースに戻ると、このコンテナは現在 3 台のマシンのいずれかに存在する可能性があります。このデフォルト コンテナの動作を確認するには、次のコマンドを実行します。

docker サービス ps スパイダー

下の図の通りです。

ノードログを表示

上図の実行結果によると、実行中のコンテナの ID はrusps0ofwidsであることがわかります。そこで、次のコマンドを実行してログを動的に表示します。

docker サービス ログ -f コンテナ ID

現時点では、このコンテナのログは引き続き追跡されます。下の図の通りです。

水平スケーリング

現在、コンテナを実行しているサーバーは 1 つだけです。このクローラーを実行するために 3 つのサーバーを使用したいので、次の 1 つのコマンドを実行するだけです。

docker サービススケール spider=3

実行効果は下の図に示されています。

この時点で、クローラーの実行状態を再度確認すると、3 台のマシンそれぞれでコンテナーが実行されていることがわかります。下の図の通りです。

ここで、スレーブ 1 マシンにログインして、実際にタスクが実行されているかどうかを確認します。下の図の通りです。

実際にコンテナが実行されていることがわかります。これは Docker Swarm によって自動的に割り当てられます。

ここで、次のコマンドを使用して、slave-1 上の Docker を強制的にシャットダウンし、その効果を確認します。

systemctl ドッカーを停止する

マスターサーバーに戻り、下の図に示すように、クローラーの実行効果を再度確認します。

ご覧のとおり、Docker Swarm は Slave-1 がオフラインであることを検出すると、タスクを開始するための新しいマシンを自動的に検出し、常に 3 つのタスクが実行されるようにしています。この例では、Docker Swarm はマスター マシン上で 2 つのスパイダー コンテナーを自動的に起動します。

マシンのパフォーマンスが良好であれば、各マシンでさらに多くのコンテナを実行することもできます。

docker サービススケール スパイダー = 10

この時点で、これらのクローラーを実行するために 10 個のコンテナが開始されます。これら 10 個のクローラーは互いに分離されています。

すべてのクローラーを停止したい場合はどうすればよいでしょうか?非常にシンプル、コマンドは 1 つだけです。

docker サービススケール スパイダー = 0

これにより、すべてのクローラーが停止します。

複数のコンテナのログを同時に表示する

すべてのコンテナを同時に表示したい場合はどうすればよいでしょうか?次のコマンドを使用すると、すべてのコンテナの最新の 20 行のログを表示できます。

次のようにコードをコピーします
docker service ps robot | grep 実行中 | awk '{print $1}' | xargs -i docker service logs --tail 20 {}

このようにログが順番に表示されます。下の図の通りです。

クローラーの更新

コードに変更を加えた場合。次に、クローラーを更新する必要があります。

まずコードを変更して再構築し、新しいイメージをプライベート ソースに再送信します。下の図の通りです。

次に、サービス内のイメージを更新する必要があります。画像を更新するには 2 つの方法があります。 1 つは、まずすべてのクローラーを閉じてから更新することです。

docker サービススケール スパイダー = 0
docker サービス更新 --image 45.77.138.242:8003/spider:0.02 スパイダー
docker サービススケール spider=3

2 つ目は、更新コマンドを直接実行することです。

docker サービス更新 --image 45.77.138.242:8003/spider:0.02 スパイダー

それらの違いは、更新コマンドを直接実行すると、実行中のコンテナが 1 つずつ更新されることです。

実行効果は下の図に示されています。

Docker Swarmを使えばもっと多くのことができる

この記事ではシミュレートされたクローラーの例を使用していますが、当然ですが、バッチで実行できるプログラムであれば、Redis や Celery を使用して通信するかどうか、通信が必要かどうかに関係なく、バッチで実行できる限り、Docker Swarm を使用できます。

同じ Swarm クラスター内で、互いに影響を与えることなく複数の異なるサービスを実行できます。 Docker Swarm クラスターを一度構築すれば、その後は心配する必要がなくなります。今後のすべての操作は、マネージャー ノードが配置されているサーバー上でのみ実行する必要があります。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker Swarm クラスタ管理の使用と原理の分析
  • Docker Swarmを使用してWordPressを構築する方法
  • Docker Swarmを使用してクラスターを構築する方法
  • Docker 1.12 を使用してマルチホスト Docker Swarm クラスターを構築する詳細な説明
  • Docker をインストールして Docker Swarm モードで使用する方法
  • Docker swarm の簡単なチュートリアル

<<:  js 実行コンテキストとスコープの概要

>>:  mysql 5.6.21 のインストールと設定の詳細な手順

推薦する

カレンダー効果を実現するための Bootstrap+JQuery

この記事では、カレンダー効果を実現するためのBootstrap+Jqueryの具体的なコードを参考ま...

Nginx10m+の高並列カーネル最適化に関する簡単な説明

高い同時実行性とは何ですか?デフォルトの Linux カーネル パラメータは、最も一般的なシナリオ向...

よく使われるnginxの書き換えルールの詳細な説明

この記事では、Web ページのリンクを美しくするためによく使用される書き換えルールをいくつか紹介しま...

Reactフックの仕組み

目次1. React フックと純粋関数2. シンプルなmyUseState 3. myUseStat...

MyCat を使用して Linux で MySQL マスター/スレーブの読み取り/書き込み分離を実装する方法

目次Linux - MyCat を使用して MySQL マスター スレーブの読み取り書き込み分離を実...

Ubuntu Linuxシステムをインストールするときにハードディスクをパーティション分割する最も合理的な方法の詳細な説明

Windows または Linux オペレーティング システムをインストールするかどうかに関係なく、...

JS で CSS 変数を使用する方法

JS で CSS 変数を使用する方法:export キーワードを使用して、js オブジェクトを le...

Vueフィルターとカスタム命令の使用

目次フィルター01.とは02. やり方(1)フィルターを定義する(2)使用方法(3)フィルタパラメー...

MySQL 5.7 および 8.0 データベースのルート パスワードを忘れた場合の解決策

注: MySQL5.7 で root パスワードをクラックするには、パスワード認証をスキップしてデー...

CentOS 6.5 の設定 ssh キーフリーログインで pssh コマンドを実行する方法の説明

1. psshを確認してインストールします。yum list pssh 2. キーレスログインが設定...

MySQL SELECT実行順序の簡単な理解

SELECT ステートメントの完全な構文は次のとおりです。 (7)選択 (8) DISTINCT ...

Vueはログイン時に画像認証コードを実装します

この記事では、Vueログイン用画像認証コードの具体的なコードを例として紹介します。具体的な内容は以下...

Nest.js 環境変数の設定とシリアル化の詳細な説明

環境変数の設定の簡単な説明プログラムは、環境によって異なる環境変数を必要とします。たとえば、実稼働環...

Linux システムが VMware にインストールされているかどうかを確認する方法

現在の Linux システムが VMware にインストールされているかどうかを確認する方法を教えて...

Reactプロジェクトで画像を導入するいくつかの方法

imgタグは画像を導入しますreactは実際にはjsリーダー関数を介してページをレンダリングするため...