領事原理

いくつかの姿勢サービス検出を行う領事を使用します

https://www.cnblogs.com/bossma/p/9756809.html

2016年には、コンタクト領事に入って来たので、主な目的は、サービス・ディスカバリを利用することで、以降徐々に本番環境に適用される、と経験を少しまとめました。ほとんどの領事は、QQグループを作成した交換を容易にするためには、数人で始めたマイクロは2年より多くの火を果たす、より多くの人々の領事の使用は、グループは現在、400人以上を持って、よく聞かれます次のようないくつかの問題、

サービスノードに登録した後、他のノードはなぜ同期?
クライアントがしているのですか?(クライアントの役割はどのようなものですか?)
Serverに直接登録することができませんか?(サーバーは、ノードが十分にある場合にのみ?)
サービスの情報はどこに保存されていますか?
ノードは、健康診断にリンクされている場合は別のノードに転送することはできませんか?
一部の人々は、サービスが登録していない見つけ、そしてコンセプトも、一部の人は、このような飼育係、etcdなどの他のサービス、で見つかったツールを使用している場合があり、いくつかの既成の経験があるでしょう。この記事では、サービス発見領事を作るフレームワークと、特定の開発言語のテキストに依存しないようにしてくださいする方法について話をし、領事公式文書や、自分の実践的な経験を結合します、トップ問題のいくつかをクリアすることを望んで、原則的に説明。

利用サービスの発見は、なぜ
、ハードコーディングされた災害復旧、水平スケーリング能力を防止するために、運用・保守の効率を向上させるというように、限り、あなたは常に正しいの理由を見つけることができるサービス探索を使用したいと。

一般的にはマイクロサービスアーキテクチャを使用するので、それをされる話します。変化に適応するのに十分な柔軟性の伝統的な単一のアーキテクチャはよくないので、多数のサービスを伴うマイクロサービスアーキテクチャへの移行は、運用、保守管理が非常に不便である、いくつかの自動化戦略に従事し始めた、サービスの発見が登場。あなたがサービス探索を使用する必要があるのであれば、あなたは、サービスのガバナンスのためのいくつかの痛みのポイントを持っている必要があります。

しかし、サービス・ディスカバリの導入は、あなたがそのような10以下であり、より少ないビジネスの変化としてのみいくつかのサービスが、ある場合には、システムの全体的な複雑さを増す、いくつかのテクノロジ・スタックを導入することができる、スループットが非常に安定していることが予想され、それは必要ではないかもしれませんサービス検出。

領事内部原則
下の写真は、最初に簡単に見て、領事の公式サイト、動作原理領事の良い説明から来ています。

最初の領事は、二つのデータセンターがある上に、彼らはインターネットを介して相互に接続され、画像内に複数のデータセンターをサポートしていますが、通信効率、データセンター間の通信を追加する前にのみ、サーバーノードを向上させるためにそれを注意してください。

単一のデータセンタにおいて、領事クライアントとサーバは、ノードの二種類に分けられる(すべてのノードもエージェントと呼ばれる)、サーバノードの格納データ、及びクライアントは、サーバへのデータヘルスチェック要求を転送する責任があり、サーバー・ノードは、リーダーの複数を有し、フォロワーは、リーダーノードデータは、フォロワーに同期されるリーダーハングは、新しいリーダーを生成する際に、サーバーの推奨事項の数が3または5である、選挙メカニズムを開始します。

ゴシップ(ゴシッププロトコル)によって、クラスター保守契約の領事ノードのメンバーシップは、そのクラスタ内のノードは、現在のクライアントまたはサーバである他のどのノードで、理解しています。噂TCPとUDPプロトコル通信の両方を使用して単一のデータセンタ、及びポート8301を使用します。データセンター全体の噂契約は、ポート8302を使用して、TCPおよびUDPトラフィックを使用しています。

クラスタデータ書き込み要求サーバに直接的に送信することができ、また、RPCサーバーを使用してクライアントに転送することができ、要求が最終的にリーダーノードに到着する、わずかな古いデータを可能に、読み出し要求は、従来のサーバー・ノードにおいてもを行うことができます、読み取りと書き込み、クラスタ内のデータをコピーすることは、TCPポート8300を介して行われます。

領事サービスの検出原理を
以下の画像は、基本的には、第1簡単に見て、サービスの発見のプロセス全体を説明し、自分自身を描いています。

まず、通常の領事クラスタを持ってそこにサーバーを必要とし、リーダーがあります。ここでは、サーバーのServer1、Server2の上、サーバ3は、それらがリーダーとしてServer2の上の領事Serverノードを選出仮定し、領事サーバーを展開しました。これらのサーバーは領事サーバーの安定性を維持しようとするだけの最高の領事プログラムに配備されています。

そして、登録された領事クライアントサービスA、B、Cの各サービスは、サービスの問題のシングルポイントを回避するために、二つのサーバ上に展開されているサーバーとそれぞれServer2 Server5、上にあります。サービスは、HTTP API(8500ポート)、領事の設定ファイルを渡すことができる方法によって、領事に登録することができます。領事クライアントは、それが領事サーバにRPCによって転送された情報を登録する、ステートレスと考えることができ、サービス情報は、各ノード・サーバに格納され、ラフトは強い整合性を介して達成されます。

最後のserver6サーバは、HTTP APIプログラムDまず領事クライアントにアクセスするには、この時間は、ネイティブ、ネイティブクライアントは、現在の情報サービスB決勝を返すために領事サーバー、領事Serverクエリへの要求を転送提供し、プログラムDサービスBにアクセスする必要がありますプログラムDは、IPとポートのすべての展開サービスBを得、その後、あなたはサービスBさんを展開することを選択することができ、それらの要求を開始しました。サービスは、DNS検出モードを使用している場合は、プログラムDは、サービスBは、ドメイン名は、ドメイン名解決要求はローカルDNSプロキシに到達するために最初であることを発見し、直接サービスで使用して、ネイティブの領事クライアントに転送、Native Clientが領事サーバーに要求を転送します、領事Serverクエリは、現在の情報サービスBを返すために、プログラムDは最終的にサービスBさんの展開のIPとポートを得ました。

図展開アーキテクチャライターは、最も普遍的な最も単純なシナリオとして記述いくつかのデフォルトの構成や設計の観点だけでなく、関係者から、当然のことながら、いくつかの学生が同意しない、などのデフォルトポート8500など、ユーザーによって採用されたプログラムが127.0.0.1を聞くことを願っていますバックは、他のプログラムに言及します。

領事実際の使用
、その使用の原則に速くおなじみのための領事の下では、それは彼らの実際の試験に最高です。

領事のインストールでは、仮想マシンを使用すると、1機の上に重いです、非常にシンプルですが、テストのためにクラスタを設定するのは不便なので、ここではドッキングウィンドウを選択しました。ここではWindowsの10で、プロフェッショナル・エディションは、ドッカーは、WindowsのHyper-Vに依存しているため、必要に応じて、プロのバージョンをサポートする必要があることです。あなたが検索に関連する問題が発生した場合ドッカーについてここでは、あまりにも多くの説明を行うことはありません。

ドッカーのインストール
、ダウンロードによると、このアドレスをインストールします。

https://store.docker.com/editions/community/docker-ce-desktop-windows

インストールが完了した後、Windows PowerShellのオープン、ドッキングウィンドウの-versionを入力して、それの通常の出力ドッキングウィンドウのバージョン場合です。

クラスタ領事開始
領事ミラーは、Windows PowerShellのコマンドを実行し、最新バージョンを引っ張っ:

ドッキングウィンドウプル領事

そして、あなたはクラスタを起動することができ、ここでは4つの領事エージェント、3 Geのサーバー(リーダーを選出する)、1 Geのクライアントを起動します。

コードをコピー

サーバノードのスタート、ポート8900のホストへのコンテナポート8500をマップするために、3サーバーを持つことが必要なクラスタ、およびオープンな管理インタフェース

ドッキングウィンドウの実行-d --name = consul1 -p 8900:8500 -e CONSUL_BIND_INTERFACE = eth0の領事エージェント--server =真--bootstrap-期待= 3 --client = 0.0.0.0 -ui

第二Serverノードを起動し、クラスタに参加

ドッキングウィンドウで実行-d --name = consul2 -e CONSUL_BIND_INTERFACE = eth0の領事エージェント172.17.0.2 --join --server =真--client = 0.0.0.0

第三Serverノードを起動し、クラスタに参加

ドッキングウィンドウで実行-d --name = consul3 -e CONSUL_BIND_INTERFACE = eth0の領事エージェント172.17.0.2 --join --server =真--client = 0.0.0.0

クライアントは、最初の4つのノードを起動し、クラスタに参加します

ドッキングウィンドウで実行-d --name = consul4 -e CONSUL_BIND_INTERFACE = eth0の領事エージェント--server = falseを--client = 0.0.0.0 --join 172.17.0.2
重複したコード

172.17.0.3,172.17.0.4,172.17.0.5:最初のものは、IPであろういくつかのコンテナの行の後ろに開始、一般172.17.0.2容器IPを開始します。

コンサルドッカー容器内のこれらのノードは相互接続、それらが通信モードによって架橋されます。あなたは、コンテナ内のホストのネットワークにアクセスしたい場合でも、ポートマッピングが行われる必要があります。あなたは簡単にホストブラウザを介してクラスタ情報を表示できるように、あなたは、第一の容器、8500 8900にホストポートのポートマッピング領事を起動すると。

コンテナconsul1へ:

ドッキングウィンドウのexec -it consul1 / binに/ shを

LSを実行した後、ルートディレクトリに領事を見ることができます

LSの
入力は、コンテナの外に出ることができます。

サービスが登録された
最も身近な開発言語で、Webサービスを記述するだけで罰金が、容器の中にまで実行できるようにする必要があり、あなたは、SDKおよびWebサーバは、あなたが注意を払う必要があるなどのpython、Javaや.NETのコアとして、オペレーティング環境をインストールする必要があるかもしれませんドッキングウィンドウの領事は、高山システム上でミラーリングされている、特定のオペレーティング環境をインストールし、検索してください。

ここでは、設定ファイル、サービスに関する情報を経由して領事に登録ハローサービスを、書くこと:

名前:こんにちは、サービスの名前、異なるビジネスサービスを区別できるようにする必要があり、あなたは複数のコピーを展開し、登録された同じ名前を使用することができます。
ID:hello1、サービスID、のみ各ノードに必要なは、重複がある場合は上書きされます。
アドレス:172.17.0.5、機械のサービスアドレス。
ポート:5000、ポートサービス。
します。http:// localhost:健康、アドレスチェック5000 /を 、 10秒ごとに1回領事要求保健サービスの代わりにリターン200のHTTPステータスコードを、場合、要求タイムアウトは1秒です。
ファイルservices.jsonに以下の内容を保存し、コンテナ/領事/ configディレクトリにアップロードしてください。

复制代码
{
"サービス":[
{
"ID": "hello1"、
"名": "こんにちは"、
"タグ":
"一次"
]、
"住所"、 "172.17.0.5"、
"ポート":5000 、
"チェック":[
{
"HTTP": "のhttp:// localhostを:5000 /"、
"tls_skip_verify":偽、
"方法"を"取得"、
"間隔": "10S"、
"タイムアウト":「1 "
}
]
}
]
}
复制代码

領事のconfigディレクトリにコピー:

ドッカーCPはconsul4 {ここでローカルパスservices.jsonを置き換える} /領事/コンフィグ

領事の設定を再ロードします。

領事のリロード

そして、サービスは正常に登録されています。このサービスは、このようなconsul1とconsul4の展開など、複数のノードに配備され、同時に実行することができます。

サービス検出
に成功登録サービスの後、発信者が対応するサービスのアドレスは、サービスディスカバリプロセスである得ます。領事は、さまざまな方法を提供します。

HTTP APIメソッド:

http://127.0.0.1:8500/v1/health/service/hello?passing=falseカール

領事ノード情報、サービス情報およびサービスの登録を含むヘルスチェック情報が返されます。本明細書中で使用されるパラメータの受け渡しは= falseの場合、自動的に自身が不健康と不健康領事ノード、設計時にはこの状態領事サービスは、ノードの状態にバインドされているから見ることができるサービスなど、不健康なサービスを、除外されます。

複数のサービスの展開がある場合、サービスは、情報の断片を返し、呼び出し側は、共通のランダムまたはポーリングを展開するために使用するかを決定する必要があります。キャッシュサービスの展開が使用できなくなる可能性があるため、サービスのスループットを改善し、ストレス領事を減らすために、あなたはまた、キャッシュサービスノード情報を得ることができますが、フォールトトレラントソリューションを作成します。耐障害性を決定するために独自のビューとルールと組み合わせて、特定のニーズをキャッシュするかどうか。

デフォルトを渡すトップパラメータは、それは、不健康なノードも返しますが、すべてのサービスのリアルタイムな健康状態、および不健康なアラーム処理サービスを行うために得ることができるすべてのサービスノードを、得るために組み合わせる方法であり、falseです。

DNSの通り:

こんにちは、ドメインネームサービスは、次のとおりです。hello.service.dc1.consul、固定サービス、背後にあるサービス担当; DC1がデータセンターの名前で、あなたが設定することができ、最後の領事も設定することができます。

公式には、多くの場合、テストにDNSのdigコマンドを導入する際に使用されるが、高山システムはコマンドを掘るしない、該当するパッケージがインストールすることはできませんがありますが、それはbinディレクトリに解凍し、ダウンロード、達成されました。

-L https://github.com/sequenceiq/docker-alpine-dig/releases/download/v9.10.2/dig.tgz|tar -xzv -Cは/ usr / local / binにカール

そして、digコマンドを実行します。

@ 127.0.0.1 -p 8600 hello.service.dc1.consulを掘ります。どれか

エラー場合:/etc/resolv.confのの解析に失敗し、その行を削除し、検索ではresolv.confしてください。

不健康な展開が自動的に(不健康なノードの展開を含む)を除去する場合には、複数のデプロイメントがより多くのを見ることができますがある場合、その後、あなたはIP情報サービスの展開を見ることができ、通常の状態に戻ります。このようにポート情報サービスを返さないことに注意してください。

あなたのプログラムでのDNSリゾルバライブラリを統合するためにDNSの方法を使用して、あなたはまた、ローカルのDNSサーバーをカスタマイズすることができます。カスタムローカルDNSサーバーが.consul領事エージェントへのすべての要求を転送するドメインを指し、エージェントがWindows上であっDNS、dnsmasqのは、Linux上であり、非領事が提供するサービスのためのオリジナルのDNSを要求し続け、DNSサーバーを使用するときに領事がランダムに返します。特定のサービスの複数の展開は、単純な負荷分散を提供することができます。

DNSキャッシュの問題:DNSキャッシュは通常、ネットワーク・データベース・アプリケーションでローカルのDNSクライアントまたはエージェントを存在し、領事自体を切断がキャッシュされないと考えることができます(スループットを向上させるためにDNSクラスタは、一般的なサーバー上の古いデータを使用して設定することができますが、一般的には影響は、DNSキャッシュは、圧力領事サーバーへのアクセスを削減するだけでなく、利用できないサービスへのアクセスにつながることができます)ではありません。使用時に実際のトラフィックと耐障害性に基づいて、DNSキャッシュ・スキームを決定する必要があります。

領事テンプレート

領事領事テンプレートは、厳密には道を見つけるための標準的なサービスではない、公式によって提供されているツールです。このツールは、変更してから、テンプレートで使用されるタグを交換し、領事・モニター・データを交換することにより、指定したディレクトリにファイルを公開します。特に有用ななど、nginxのWebサーバをリバースプロキシとロードバランシングを行うとき。

ドッキングウィンドウミラーの領事は、このツールを統合されていません、あなたは比較的単純な、自分自身をインストールする必要があります。

-L https://releases.hashicorp.com/consul-template/0.19.5/consul-template_0.19.5_linux_amd64.tgz|tar -xzv -Cは/ usr / local / binにカール

次に、ファイルの作成:in.tplを、こう述べています。

{{範囲サービス"ハロー"}}
サーバー{{.NAME}}、{{.Address}}:{{.Port}}、{{終了}}

このタグは、すべてのデプロイメントハローサービスを反復処理し、指定された出力フォーマットに従ってまします。このファイルのディレクトリで実行します。

nohupを領事・テンプレート-template "in.tpl:out.txtを" &

今、あなたはテンプレート猫out.txtを生産、新しいサービスやシャットダウンの内容を表示することができ、ファイルが自動的に更新されます。

私は、詳細な訪問を使用して、本番環境でこのツールを使用していないがします。https://github.com/hashicorp/consul-template

ノードとサービスのキャンセル
のノードとサービスのキャンセルは、HTTP APIを使用することができます。

任意のノードとサービスのキャンセル:/カタログ/登録解除
現在のノードのサービスの解約を:/エージェント/サービス/登録解除/ :service_idの
ノードが使用することを継続していない場合、あなたはまた、機械で領事のleaveコマンドを使用することができ、または他のノードの領事で力脱退ノードID。

領事のヘルスチェック
領事がサービスを行うには専門的であることが判明し、ヘルスチェックは、ように、さまざまな方法スクリプト/ TCP / HTTP +間隔、およびTTLとを提供して基本的な機能の一つです。サービスによる保健サービスに対処するために、エージェントの登録を確認するために、これは、のいずれかとすることができるクライアントエージェントはサーバの役割を果たすこともあります。

多くの学生は、サービス発見、サービスの発見は、領事を使用したときの状態ノードが使用不能になったハングんZooKeeperのかetcdを使用するので、サービスが各ノード同期の間ではありません、なぜ一部の学生は尋ねましたか?根本的な理由は、サービス・ディスカバリの原則とは異なる実装です。

ZooKeeperの、のetcdと領事差

これら2つのツールの後ろにキーと値のストアサービスの登録と発見によって達成されます。

一時的なサービスノードのサービス開始を作成するために、一時的なメカニズムを使用してZooKeeperのノードは、ノードのサービスにおけるサービスノードが存在しない存在しません。
サービスはビジネス、定期的に更新TTLを開始したときに、キーと値のペアを作成するためにetcd利用TTLメカニズムは、TTLは、サービスが利用できない期限切れ。
キーと値のストアのZooKeeperのとetcdは、キーと値のペアが自動的に複数のノードに同期されること、強い一貫性である限り、一つのノード上に存在するように、対応するサービスが利用可能であると考えることができます。

領事のデータ同期は、サービス登録情報の強い一貫性がサービスを展開するために利用できない場合でも、保存されたサーバ・ノード、etcd、情報サービスや持続性の間ZKに比べて、同期されますし、あなたはまだサービスに問い合わせることができます展開。しかし、エージェントによって利用可能な状態ビジネス登録サービスは、エージェントが正常に動作していない場合は、サービスの真のステータスを確認することができない、と領事は非常に安定しており、大規模な状態のサーバーケースの確率もエージェントをハング、維持することができますその後、このノード上のサービスを遮断することは合理的である、悪いかもしれません。領事は確かにそうHTTP APIはまた、そのハングサービスがノードに渡していないと信じて、自動的にノード上でハングアップ遮蔽するDNSサービス・インターフェース、設計されています。

このメカニズムコンサルヘルスチェックの観点では、単一障害点を回避しながら、すべてのビジネスサービスは、複数のコピー、領事と異なるノードへの登録を展開する必要があります。おそらく、セッションが矛盾した状態のシェアでこれを発生しないので、複数のサービスインスタンスへの呼び出し側の同時アクセスが可能性があるため、多くの実績のあるソリューションがありますが、あなたのデザインにいくつかの課題をもたらすでしょう問い合わせに行くことができるよりも多くの配備、ここで説明されていません。

ヘルスチェックは、フェールオーバーをサポートすることはできませんか?

トップヘルスチェックは、エージェントサービスによって参照されて処理するために登録エージェントは、それをチェックし、他のエージェントヘルスを引き継ぐ必要があります場合は、ハングアップ?答えはノーです。

問題の原因の観点から、本番環境の前に、確かに様々なシナリオのためにテストする必要があり、何ら問題はライン上できなくなりますので、明白な疑問をマスクすることができ、それがある場合にBUGの領事の新しいバージョンは、この時に生じますあなたはダウングレードする必要があり、このバグが散発的である場合には、唯一の再領事そう単純で、それをプルアップする必要があり、それは、ハードウェア、ネットワークやオペレーティングシステムの障害であれば、そのノード上のサービスの可用性も保護することが困難であり、必要はありません。ヘルスチェックのエージェント買収。

実装の観点からは、リアルタイムまたは各ノードのリアルタイム同期の負荷状況の近くを要する問題で、あるノードを選択すると、理由は負荷がノードを選択することは比較的容易である場合でも、実行中のビジネスサービスの状態変化のため、タスクは、一定の期間を保証することはできませんそれが負担になり、新しい、より大きな範囲の崩壊を引き起こす可能性があります。元のノードも起動した場合、それは撤回すべきかどうかの健康チェックを引き継ぐ、あなたがしたい場合、あなたは彼らの最初の登録されたサービスノードを記録しておく必要があり、その後、監視するためのトリガー機構が存在しない場合、それはサービスの発見を通じて多くを取得します冗長な情報、および時間の経過と共に、このデータは、より多くのシステムが不規則になるであろう。

実用的なアプリケーションから、両方のノード上のサービスを見つけることができるだけでなく、ノードのみ実際に使用されるか、またはされていないサービスの機能を提供するために見出される、ハングアップした場合、他のサービスを発見しました。もちろん、あなたはまた、他のサービスは、マシンノードは間違いなく新しい技術スタックを導入領事nginxのは、達成ノード数、の負荷分散をアクセスすることによって達成することができます使用していません見つけることができます。

分散システムの同期の状況が複雑であるため、問題は上に記載されていない場合、またはあなたが健康診断の買収を達成するために、いくつかの方法を介してこれらの問題を解決することができますが、より複雑なものにバインドされています。そして、システムに影響を与えるべきではない急速な回復をハングアップする、複数のコピー展開サービスを忘れてはいけないので、これを実行する必要が引き継ぐないように。

領事他の展開アーキテクチャ
あなたが本当に各ホスト上の領事クライアントを展開したくない場合は、から選択するには、複数の登録オプションがあり、これは、取得したアイデア交換基です。

専用サーバ上で、展開コンサルクライアント、および各サービスは、図に提供されるプログラムをロードするために、単一ポイントのサービスは、各サービスの展開のコピーを回避または複数するために、サービス発見が必要なクライアントの複数、登録します。バランスの取れたプログラムは、プログラムが領事クライアントに要求を転送し、要求を開始します。このようなプログラムは、プライベートネットワークのIPへの8500ポート結合領事に注意を払うだけ127.0.0.1をデフォルトにする必要があります。

利点のアーキテクチャ:

領事・ノード・サーバーとアプリケーションサーバーの分離、互いの干渉が少ない、
各ホスト領事を展開していない、集中管理の領事、
特定の状況下で領事Clientがハングアップ、まだ彼らのサービスを登録する機会を持っているが上でアクセス可能である。
しかし、また、その欠点に注意を払う必要があります。

より多くのテクノロジ・スタックを紹介:ロード・バランシングを実現するために、領事クライアントの負荷分散を考慮するだけでなく、自分自身のバランスをとるシングルポイントロードの問題を検討していないだけ。
ノードクライアントの数:クライアントもしあまりにも多くの単一の登録サービス、重い負荷、各クライアント上のサービスの数の合理的な配分、並びにクライアントの全体数を決定する(例えば、ハッシュ契約など)アルゴリズムのための必要性。
複数のノードへの登録がより展開(DNSインターフェイスは、この問題は発生しません)とみなされますので、重複登録をフィルタリングするためのサービス発見。
実際には、このプログラムは、関連する要求がサーバーノードに転送されるため、サービスの発見は直接、ロードバランシングのプロキシサーバーノードで使用することができ、最適化することができ、サーバーに直接送信することをお勧めします。

唯一のサーバーはできますか?

答えは、この質問に関連したサービスの問題の数である第一のノードサーバのすべての数のことができず、3または5が推奨数、より低速のデータ同期プロセス(強い整合)の数であり、各サービスノードの数を登録することができ、これはハードウェアとソフトウェアの能力によって制限され、キャップされます。だから、あなたはたったの約10のサービスであれば、問題は唯一のサーバーではありませんが、この時間領事は何を使用する必要はありませんか?そのため、通常の使用または抗エントロピーの設計領事と一致しているクライアントの領事たちが行く、持っています。

それを共有してください私たちは彼らのために、より適しているかを確認するには、前述のコントラストでユニバーサル展開アーキテクチャの枠組みの下ですることができ、またはあなたがよりよい解決策を持っています。

おすすめ

転載: www.cnblogs.com/igoodful/p/11545191.html