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 インデックスの失敗を引き起こす一般的な書き込み方法の概要

序文最近、古いプロジェクトから残ったいくつかの SQL 最適化の問題に対処するのに忙しくしています。...

非常に便利な CSS 開発ツール 8 つを紹介

CSS3 パターン ギャラリーこの CSS3 パターン ライブラリには、純粋な CSS3 を使用して...

Ubuntu 20.04 aptの国内ソースを変更する方法

UPD 2020.2.26 現在、Ubuntu 20.04 LTSはまだリリースされていないため、チ...

JDBC を使用して MySQL を操作するための簡単な分析では、Class.forName("com.mysql.jdbc.Driver") を追加する必要があります。

導入データベースに接続するためにJDBCを使用することに慣れている場合は、データベースに接続するため...

vue3とvue2の利点の比較

目次利点1: diffアルゴリズムの最適化利点2: ホイスト静的静的リフティング利点3: cache...

Linux で FastDFS を使用してイメージ サーバーを構築する

目次サーバー計画1. システムコンポーネントをインストールする2. fastdfsをインストールする...

dockerコンテナにvimをインストールするソリューション

目次物語の始まりvimをインストールし、hadoop-hive.envを編集します。不注意で回避しま...

CSS flex 複数列レイアウト

基本的な3列レイアウト 。容器{ ディスプレイ: フレックス; 幅: 500ピクセル; 高さ: 20...

フロントエンドにアニメーション遷移効果を実装する方法

目次導入従来のトランジションアニメーションCSS トランジションアニメーションjsアニメーション従来...

クラウドサーバーはBaotaを使用してPython環境を構築し、Djangoプログラムを実行します。

目次PagodaをインストールするPythonランタイム環境を構成するPythonをインストールする...

HTMLの基本構造を包括的に理解する

HTML入門ハイパーテキスト マークアップ言語: ハイパーテキスト マークアップ言語ハイパーテキスト...

データ URI スキームを使用して Web ページに画像を埋め込む方法の紹介

データ URI スキームを使用すると、HTML、CSS、Javascript などで使用できるインラ...

MySQL 20 の高性能アーキテクチャ設計原則 (収集する価値あり)

オープンソース データベース アーキテクチャの設計原則01. 技術の選択最も使い慣れていて、最大限に...

Baidu 入力メソッドが API を公開、自由に移植して使用できると主張

百度入力方式の担当者は、百度入力方式のオープンAPIの最大の利点は操作が便利であることであり、プラッ...

LED を使って Linux カーネルを使い始める方法を探る

目次序文LEDトリガー探索を始めるLEDデバイス登録LEDディレクトリ類推によって理解するクラスディ...