クローラーの開発プロセス中に、クローラーを複数のサーバーに展開する必要がある状況に遭遇したことがあるはずです。現時点ではどのように運営していますか?各サーバーに 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 Swarm 自体によって管理され、SSH 経由でサーバーにログインする必要がなくなります。 操作を簡素化するために、バッチで実行するシェル スクリプトを作成できます。 Slave-1 サーバーと Slave-2 サーバーに次の内容の 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 は外部使用のためにポート テストプログラムの作成 簡単な 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 このイメージをスレーブ サーバー上のスレーブ ノードでダウンロードできるようにプライベート ソースにアップロードするため、イメージの命名方法は 全体のプロセスを下の図に示します。 画像をプライベートリポジトリにアップロードする イメージが構築されたら、それをプライベート ソースにアップロードする必要があります。このとき、次のコマンドを実行する必要があります。 docker push ローカルホスト:8003/スパイダー:0.01 下の図の通りです。 ビルド コマンドとアップロード コマンドは必ず覚えておいてください。今後コードを更新するたびに、この 2 つのコマンドを使用する必要があります。 サービスの作成 Docker Swarm はサービスを 1 つずつ実行するため、サービスを作成するには docker service コマンドを使用する必要があります。 次のようにコードをコピーします。 docker サービス作成 --name スパイダー --network ホスト 45.77.138.242:8003/spider:0.01 このコマンドは、 もちろん、 次のようにコードをコピーします。 docker サービス作成 --name spider --replicas 50 --network ホスト 45.77.138.242:8003/spider:0.01 ただし、初期コードには多くのバグがある可能性があるため、最初は 1 つのコンテナを使用して実行し、ログを観察し、問題が見つからなければ拡張することをお勧めします。 1 つのコンテナのデフォルトのケースに戻ると、このコンテナは現在 3 台のマシンのいずれかに存在する可能性があります。このデフォルト コンテナの動作を確認するには、次のコマンドを実行します。 docker サービス ps スパイダー 下の図の通りです。 ノードログを表示 上図の実行結果によると、実行中のコンテナの ID は 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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
>>: mysql 5.6.21 のインストールと設定の詳細な手順
今日、VMware を使用してマシンに新しい仮想マシンをインストールしていたところ、次のように「この...
誰もが色にとても敏感だと思います。私たちの目が見るところにはどこにでも色があります。では、CSS で...
序文今日、nginx で非常に奇妙な問題に遭遇しました。フロントエンドの tomcat がページにジ...
仮想マシンに独自の LAN IP を持たせたいので、テストを容易にするためにブリッジを使用します。 ...
問題現象最近、sysbench を使用して MySQL をテストしました。テストに長い時間がかかった...
MySQLをインストールした後、ターミナルでmysql -u root -pと入力してEnterを押...
私は数年間 vi エディタを使ってきましたが、実用的な用途で使ったことはありませんでした。今日 Py...
最も一般的に使用されるレイアウト要素として、DIV は Web 開発において重要な役割を果たします。...
目次1. Dockerファイル2. pom 構成3. イメージプッシュ4. k8s デプロイメント前...
この記事の例では、ボタンをクリックすることで4桁のランダムな検証コードを生成するjsの具体的なコード...
CSS は、スクロールを許可しながらスクロール バーを非表示にするために Overflow を設定し...
今日、redis をインストールしたところ、今までになかったいくつかのエラーが発生しました。ここで記...
はじめに: すべてのブラウザには、「ユーザー エージェント スタイル シート」と呼ばれる、すべてのペ...
一つの要求一般的に、企業には複数のプロジェクトがあります。SVN サーバーを設定した後は、プロジェク...
(1)はじめに: clipboard.js は、テキストをクリップボードにコピーする機能を実装する軽...