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 ファイルにファイルの内容を含める方法の概要

推薦する

MySQL無料インストール版のパスワード設定に関する詳細なチュートリアル

方法1: SET PASSWORDコマンドを使用する MySQL -u ルート mysql> ...

Dockerデーモンのセキュリティ設定項目の詳細な説明

目次1. テスト環境1.1 CentOS 7をインストールする1.2 Docker CE 19.03...

macOS での MySQL 8.0.16 のインストールと設定のグラフィック チュートリアル

この記事では、macOSでのMySQL 8.0.16のインストールと設定のチュートリアルを参考までに...

Vueはdivホイールのズームインとズームアウトを実装します

Vue プロジェクトで div ホイールのズームインとズームアウト、ドラッグ効果、キャンバス効果に似...

Linux statコマンドの使用

1. コマンドの紹介stat コマンドは、ファイルまたはファイル システムに関する詳細情報を表示する...

Vue.js プロジェクトの開始方法

目次1. Node.jsとVue 2. ローカル開発環境でフロントエンドのVueプロジェクトを実行す...

Nginx で同じドメイン名を持つ複数のプロジェクトを構成する方法

Nginx を使用して同じドメイン名で複数のプロジェクトを構成するには、次の 2 つの方法があります...

IDEAでVUEプロジェクトをデバッグするための詳細な手順

js コードをデバッグするには、コード内にデバッガーを記述するか、Chrome で毎回ブレークポイン...

MySQL データベースは何をしますか?

MySQL はリレーショナル データベース管理システムです。リレーショナル データベースは、すべて...

元のPATHを上書きしてコマンドが見つからないというメッセージが表示されるコマンド失敗の問題を解決する方法

同僚から、LINUX サーバー上の多くのコマンドが (コマンドが見つかりません) というプロンプトで...

ab ツールを使用してサーバー上で API ストレス テストを実行します。

目次1 システムスループットの簡単な紹介2 試験方法2.1 クライアントテストツール2.1.1 GE...

フォント名に従ってフォントを呼び出すと、ブラウザに必要なフォントが表示されます。

質問 1: ブラウザに必要なフォントを表示するように指示するにはどうすればよいでしょうか? フォント...

Vueはプログレスバーの変更効果を実現します

この記事ではVueを使ってプログレスバーの変更を簡単に実装してみましたので参考にしてください。具体的...

Vue要素のバックグラウンド認証プロセスの分析

序文:最近、プロジェクトで管理システムに遭遇しました。権限設定が非常に興味深いと思いました。自分の学...

収集する価値のある Linux ドキュメント編集コマンド 27 個

Linux col コマンドLinux の col コマンドは制御文字をフィルタリングするために使用...