Docker マイクロサービス用の ETCD クラスターの構築に関する詳細なチュートリアル

Docker マイクロサービス用の ETCD クラスターの構築に関する詳細なチュートリアル

etcd は、主に共有構成とサービス検出に使用される、可用性の高いキー値ストレージ システムです。 etcd は CoreOS によって開発および保守されています。ZooKeeper と Doozer からヒントを得ています。Go で記述されており、強力な一貫性を確保するために Raft コンセンサス アルゴリズムを通じてログのレプリケーションを処理します。 Raft は、分散システムでのログの複製に適した、スタンフォード大学の新しい一貫性アルゴリズムです。Raft は、選挙を通じて一貫性を実現します。Raft では、どのノードもリーダーになることができます。 Google のコンテナ クラスタ管理システム Kubernetes、オープンソース PaaS プラットフォーム Cloud Foundry、CoreOS の Fleet はすべて etcd を広く使用しています。

etcdの機能

シンプル: curl でアクセス可能なユーザー API (HTTP+JSON) 明確に定義されたユーザー向け API (gRPC)

セキュリティ: オプションの SSL クライアント証明書認証

高速: インスタンスあたり毎秒1000回の書き込み操作

信頼性: 一貫性を確保するために Raft を使用する

etcdが独自の高可用性クラスタを構築するには、主に3つの形式があります。

1) 静的検出: Etcd クラスター内のノードを事前に把握し、起動時に Etcd の各ノードのアドレスを直接指定します。2) Etcd 動的検出: 既存の Etcd クラスターをデータ相互作用ポイントとして使用し、新しいクラスターを拡張するときに既存のクラスターを介してサービス検出メカニズムを実装します。3) DNS 動的検出: DNS クエリを介して他のノードのアドレス情報を取得します。

この建設の基本環境

基盤OS: Centos7
Docker バージョン: Docker バージョン 18.06.1-ce
電話番号:
サーバーA: 192.167.0.168
サーバーB: 192.167.0.170
サーバーC: 192.167.0.172
まず、各サーバーに最新のetcdイメージをダウンロードします

# docker pull quay.io/coreos/etcd

マシン リソースが限られているため、1 台のマシンに 3 つのコンテナーを構成し、そのマシンにサブネットワークを作成しました。3 つのコンテナーは 1 つのネットワークにあります。

# docker ネットワーク作成 --subnet=192.167.0.0/16 etcdnet

次に、クラスターを作成するために 2 つの方法を使用しました。1. 3 台のサーバーを 1 台ずつクラスターに追加します。2. 3 台のサーバーを同時にクラスターに追加します。次のコマンドは A でマークされ、マシン A で実行され、同様に B および C でも実行されます。

1. クラスターにサーバーを1つずつ追加する

A は、コンテナ/サーバー A 上で autumn-client0 という名前の ETCD インスタンスを実行します。ステータスが新規であり、独自の IP のみが「-initial-cluster」にあることに注意してください。

# docker run -d -p 2379:2379 -p 2380:2380 --net etcdnet --ip 192.167.0.168 --name etcd0 quay.io/coreos/etcd /usr/local/bin/etcd --name autumn-client0 -advertise-client-urls http://192.167.0.168:2379 -listen-client-urls http://0.0.0.0:2379 -initial-advertise-peer-urls http://192.167.0.168:2380 -listen-peer-urls http://0.0.0.0:2380 -initial-cluster-token etcd-cluster -initial-cluster "autumn-client0=http://192.167.0.168:2380" -initial-cluster-state new

パラメータの説明

--data-dir はノードのデータ保存ディレクトリを指定します。データには、ノード ID、クラスター ID、クラスター初期化構成、スナップショット ファイルが含まれます。--wal-dir が指定されていない場合は、WAL ファイルも保存されます。
—wal-dir は、ノードの WAL ファイルの保存ディレクトリを指定します。このパラメータを指定すると、WAL ファイルは他のデータ ファイルとは別に保存されます。
--name ノード名 --initial-advertise-peer-urls は、クラスターに他のノードの URL を通知します。
— listen-peer-urlsは他のノードとの通信のためのURLをリッスンします — Advertise-client-urlsはサービスURLであるクライアントURLを通知します
— 初期クラスタートークン クラスター ID
— 初期クラスター内のすべてのノード

設定ファイルの説明、例:

# [メンバー]
# ノード名 ETCD_NAME=node1
#データ保存場所 ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
#ETCD_SNAPSHOT_COUNT="10000"
#ETCD_ハートビート間隔="100"
#ETCD_ELECTION_TIMEOUT="1000"
#他の Etcd インスタンスのアドレスをリッスンする ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
# クライアントアドレスをリッスンする ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
#ETCD_CORS=""
#
#[クラスタ]
# 他の Etcd インスタンスのアドレスに通知する ETCD_INITIAL_ADVERTISE_PEER_URLS="http://node1:2380"
# 別の ETCD_NAME (例: test) を使用する場合は、この名前の ETCD_INITIAL_CLUSTER 値を設定します (例: "test=http://...")
# クラスター内のノードアドレスを初期化します ETCD_INITIAL_CLUSTER="node1=http://node1:2380,node2=http://node2:2380,etcd2=http://etcd2:2380"
# クラスターのステータスを初期化します。new は新しい ETCD_INITIAL_CLUSTER_STATE="new" を作成することを意味します。
# クラスタートークンを初期化する
ETCD_INITIAL_CLUSTER_TOKEN="mritd-etcd-cluster"
# クライアントアドレスに通知 ETCD_ADVERTISE_CLIENT_URLS=http://node1:2379,http://node1:4001

A サーバーAのetcdサービスで、APIを呼び出して新しいノードを追加します: 192.167.0.170

# curl http://127.0.0.1:2379/v2/members -XPOST -H "Content-Type: application/json" -d '{"peerURLs": ["http://192.167.0.170:2480"]}'

B は、コンテナ/サーバー B 上で autumn-client1 という名前の ETCD インスタンスを実行します。そのステータスは既存であり、以前の IP と独自の IP は「-initial-cluster」にあることに注意してください。

#docker run -d -p 2479:2479 -p 2480:2480 ---name etcd1 quay.io.io.io.io.io.io.io.io.io.io.io.io.io. -advertise -client -urls http:///192.167.0. 79 -Initial-Advertise-Peer-urls http://192.167.0.170:2380 -Listen-Peer-Urls http://0.0.0.0:2480 -Initial-Cluster-Token etcd etcd-Cluster-Cluster-Cluster0 = autumn-Client0 = htp://192.0 .1667.16 = http://192.167.0.170:2480 " -  initial-cluster-stateが存在します

A サーバーAのetcdサービスで、APIを呼び出して新しいノードを追加します: 192.168.7.172

# curl http://127.0.0.1:2379/v2/members -XPOST -H "Content-Type: application/json" -d '{"peerURLs": ["http://192.167.0.172:2580"]}'

C サーバー C で autumn-client2 という名前の ETCD インスタンスを実行します。そのステータスが既存であることに注意してください。"-initial-cluster" には、以前のすべてのノードの IP アドレスとそれ自身の IP アドレスが含まれています。

#docker run -d -p 2579:2579 -p 2580:2580  -  name etd quay.io.io.io.io.io.io.name-client-urls http://192.167.0.172:2579 -Listen-Client-url ls http://192.167.0.172:2580 -Listen-Peer-urls http://0.0.0.0:2380-Initial-Cluster-Token etcd-Cluster-Cluster "autumn-client0 = http://192.167.0.0.168:2380:2380 7.0.170:2480、autumn-client2 = http://192.167.0.172:2580 "-Initial-Cluster-state既存

2. クラスターにサーバーを追加する

(「-initial-cluster」にはすべてのノードのIPアドレスが含まれており、ステータスは新規です)

Aで実行

#docker run -d -p 2379:2379 -p 2380:2380  -  restart = altion -net etdnet -ip 192.167.0.168  -  name etcd0 quay.io/coreos/etcd ISTEN-CLIENT-URLS http://0.0.0.0:2379 -Initial-Advertise-Peer-Urls http:///192.167.0.168:2380 -Listen-Peer-Urls http://0.0.0.0:2380 -intial-gruster-tekented-cluster-tekented-cluster-tekented eetteentなど//192.167.0.168:2380、autumn-client1=http://192.167.0.170:2480,Autumn-Client2=http:///192.167.0.172:2580 -initial-Cluster-State New

Bで実行

#docker run -d -p 2479:2479 -p 2480:2480  -  restart = altion -net etdnet-ip 192.167.0.170 ISTEN-CLIENT-URLS http://0.0.0.0:2479 -Initial-Advertise-Peer-Urls http:///192.167.0.170:2480 -Listen-Peer-Urls http://0.0.0.0:2480-Ininitial-Cluster-Tekentedted-cluster-tekented eetteentなど//192.167.0.168:2380、autumn-client1=http://192.167.0.170:2480,Autumn-Client2=http:///192.167.0.172:2580 -initial-Cluster-State New

Cで実行

#docker run -d -p 2579:2579 -p 2580:2580  -  restart = altion -net etdnet -ip 192.167.0.172  -  name etcd2 quay.io/coreos/etcd ISTEN-CLIENT-URLS http://0.0.0.0:2579 -Initial-Advertise-Peer-Urls http:///192.167.0.172:2580 -Listen-Peer-Urls http://0.0.0.0:2580-Ininitial-Cluster-Tekented-Cluster-Tekented eetteentなど//192.167.0.168:2380、autumn-client1=http://192.167.0.170:2480,Autumn-Client2=http:///192.167.0.172:2580 -initial-Cluster-State New

クラスターの検証。 2 つの方法で作成されたクラスターは、次の方法で検証できます。

1. クラスター メンバーを確認します。クラスター内の各マシンのメンバーをチェックすると、結果は同じになるはずです。

[root@localhost ~]# curl -L http://127.0.0.1:2379/v2/members
{"メンバー":[{"id": "1A661F2B997BA39"、 "name": "autumn-client0"、 "Peerurrs":["h。 : "4932C8EA462E079C"、 "name": "autumn-client2"、 "peerurls":[http://192.167.0 "]、" clienturls ":[" http://192.167.0.172:2579 " 1741e "、" name ":" Autumn-Client1 "、" Peerurls ":[" http://192.167.0.170:2480:2480 "]、「clienturls」:[http://192.167.0.170:2479]}}}}

2. 1台のマシンでデータを追加し、他のマシンでデータを確認します。結果は同じになるはずです。Aで実行

[root@localhost ~]# curl -L http://127.0.0.1:2379/v2/keys/message -XPUT -d value="Hello autumn"
{"action":"set","node":{"key":"/message","value":"こんにちは秋","modifiedIndex":13,"createdIndex":13},"prevNode":{"key":"/message","value":"こんにちは世界1","modifiedIndex":11,"createdIndex":11}}

BとCを実行する

[root@localhost ~]# curl -L http://127.0.0.1:2379/v2/keys/message
{"action":"get","node":{"key":"/message","value":"こんにちは秋","modifiedIndex":13,"createdIndex":13}}

etcd API インターフェース

  基本操作 API: https://github.com/coreos/etcd/blob/6acb3d67fbe131b3b2d5d010e00ec80182be4628/Documentation/v2/api.md
 
  クラスター構成 API: https://github.com/coreos/etcd/blob/6acb3d67fbe131b3b2d5d010e00ec80182be4628/Documentation/v2/members_api.md
 
  認証 API: https://github.com/coreos/etcd/blob/6acb3d67fbe131b3b2d5d010e00ec80182be4628/Documentation/v2/auth_api.md
 
  設定項目: https://github.com/coreos/etcd/blob/master/Documentation/op-guide/configuration.md
  
  https://coreos.com/etcd/docs/latest/runtime-configuration.html
  クラスタリング
  https://coreos.com/etcd/docs/latest/runtime-configuration.html
  https://coreos.com/etcd/docs/latest/
  https://coreos.com/etcd/docs/latest/admin_guide.html#災害復旧
  標準の RESTful インターフェースを使用し、http プロトコルと https プロトコルの両方をサポートします。

サービスの登録と検出


従来のサービス呼び出しは、通常、構成ファイルからIPアドレスを読み取ることによって行われます。柔軟性がないこと、サービスの状態を認識できないこと、サービス呼び出しの負荷分散が複雑であることなど、多くの制限があります。etcdの導入後、この問題は大幅に簡素化されます。いくつかの手順を次に示します。

サービスが開始されると、etcd に登録され、リスニング ポート、現在の重み係数などの情報が報告され、この情報の ttl 値が設定されま す。

サービスは、TTL 期間内に重み係数などの情報を定期的に報告します。

クライアントがサービスを呼び出すと、etcd から情報を取得し、呼び出しを行って、サービスが変更されたかどうかを監視します (watch メソッドを通じて実装されます)。
新しいサービスが追加されると、watch メソッドは変更を監視し、サービスを代替リストに追加します。サービスがハングアップすると、ttl は無効になります。クライアントは変更を検出し、サービスを呼び出しリストから追い出すことで、サービスの動的な拡張を実現します。

一方、クライアント側では、各変更から取得した重み係数を使用して、クライアント側で重み付け呼び出し戦略を実装し、バックエンド サービスの負荷分散を保証します。

上記は、Docker マイクロサービスの ETCD クラスターの設定に関するチュートリアルの詳細な内容です。Docker マイクロサービスの ETCD クラスターの設定の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • 10分でDockerを使ったマイクロサービスのデプロイ方法を学ぶ
  • Dapr を使用してマイクロサービスをゼロから簡素化する例

<<:  トランザクション分離レベルのMySQLケース分析

>>:  HTML ファイルにファイルの内容を含める方法の概要

推薦する

SpringBoot でマイクロサービスを構築するために Docker を使用した実際の記録を分析する

それは何ですか? Spring Boot は、Spring オープンソース組織のサブプロジェクトであ...

Vuexはシンプルなショッピングカートを実装します

この記事では、参考までに、Vuex の具体的なコードを共有して、簡単なショッピングカートを実装します...

Dockerはnginxをデプロイし、フォルダとファイル操作をマウントします

この間、私は docker を勉強していたのですが、nginx をデプロイするときに行き詰まりました...

Vue SPA ファースト スクリーン最適化ソリューション

目次序文最適化ソ連オンデマンドインポート1. ルーティングファイルでコンポーネントをオンデマンドでイ...

Linuxにグラフィカルインターフェースをインストールする方法

1. Linuxのインストール(rootユーザー操作) 1. vncserver をインストールしま...

Dockerを使用してJenkinsをインストールする方法

目次1. イメージをプルする2. ローカルデータボリュームを作成する3. コンテナを作成する4. J...

ブラウザでのjsのイベントループイベントキューの詳細な説明

目次序文スタックと2つのキューを理解する実行プロセス簡単な例より難しい例要約する序文以下の内容はブラ...

MySQL で高性能なインデックスを作成するための完全な手順

目次1. インデックスの基本1. インデックスの種類1.1 Bツリーインデックス1.2 ハッシュイン...

Hadoop を使用せずに Linux 環境に Spark のスタンドアロン バージョンをインストールする方法

ビッグデータはますます注目を集めており、ビッグデータのいくつかの構成要素に精通していないと、自慢でき...

iframe ページで js 関数を呼び出すには js を使用します

最近、私は毎日論文提案に取り組んでいます。自分のスキルを発揮して、再びWebをデザインしたくてうずう...

Docker CPU 制限の実装

1. --cpu=<値> 1) コンテナが使用できるCPUリソースの量を指定しますが、コ...

MySQL 5.7.20 Green Edition のインストールの詳細なグラフィックチュートリアル

まず、MySQL とは何かを理解しましょう。 MySQL は、スウェーデンの会社 MySQL AB ...

Dockerリポジトリの一般的なコマンドの詳細な説明

ログイン dockerログインdocker login コマンドを実行し、ユーザー名、パスワード、メ...

W3C チュートリアル (2): W3C プログラム

W3C 標準化プロセスは 7 つの異なるステップに分かれています。 W3C 標準化プロセスは 7 つ...

HTML でのアンカータグの使用例の共有

アンカータグの使用法:同じドキュメント内の特定の場所にリンクすることをアンカー リンクと呼びます。ア...