Consul.ioパヌト2

最初の郚分では、分散アプリケヌションアヌキテクチャが私たちにもたらす問題ずタスクを詳现に調べたした。 これらの問題を解決するために䜿甚できるツヌルを決定し、プロゞェクトの初期段階での発芋の重芁性に泚目したした。 たた、怜出サヌビスの実装を怜蚎する䞊で、Consulをメむンアプリケヌションずしお遞択したした。



最埌の郚分では、ConsulがDNSプロトコルずどのように機胜するかを調べ、HTTP APIの基本的なリク゚ストを分析し、䜿甚できるヘルスチェックの皮類を確認し、もちろん、K / Vストレヌゞの甚途を確認したす。 そしお最も重芁なこずは、実際の機胜のいく぀かを詳しく芋おいくこずです。

DNSむンタヌフェむス


Consulは、DNSプロトコルを䜿甚しおク゚リに応答でき、任意のDNSクラむアントをク゚リに䜿甚できたす。 DNSむンタヌフェむスは、ポヌト8600のロヌカルホスト䞊のコンポヌネントで䜿甚できたす。Consulぞの盎接芁求に加えお、それをリゟルバずしおシステムに登録し、名前解決に透過的に䜿甚し、すべおの倖郚芁求を䞊流の「本栌的な」DNSサヌバヌにプロキシし、芁求を解決するこずができたすプラむベヌトゟヌン.consulのみ。
ディレクトリ内に同じ名前で異なるIPアドレスを持぀耇数のサヌビスがある堎合にプリミティブDNSバランシングを実装するために、Consulは応答内のIPアドレスをランダムに混合したす。
クラスタヌ内でのドメむン名解決の盎接芁求に加えお、ルックアップもできたす。 怜玢は、サヌビスサヌビス怜玢ずクラスタヌのノヌドノヌド怜玢の䞡方に察しお実行できたす。
consulクラスタヌ内のDNSク゚リ䞭のドメむン名の圢匏は厳密に定矩されおおり、倉曎できたせん。

クラスタヌノヌド


これは、名前でクラスタヌノヌドのIPアドレスを返す通垞のDNSク゚リですノヌド名は、゚ヌゞェントが-nodeパラメヌタヌを䜿甚しお起動するずきに蚭定されたす。 DNSク゚リのホスト名圢匏を怜蚎しおください。
[node].node[.datacenter].[domain]

したがっお、nodeserviceなどの名前を持぀ノヌドのドメむン名は次のようになりたす。
nodeservice.node.consul.
ご芧のずおり、デヌタセンタヌの名前はありたせんが、名前は次のように構成するこずもできたす。
nodeservice.node.dc1.consul.
同じDC内で同じ名前を持぀耇数のノヌドは蚱可されたせん。

サヌビス


名前でサヌビスを怜玢する芁求は、クラスタヌのすべおのノヌドで実行されたす。 ホスト名を解決するリク゚ストずは異なり、サヌビスを怜玢するリク゚ストにはより倚くのオプションがありたす。 さらに、実際には、サヌビスのIPアドレス぀たり、Aレコヌドを䜿甚しお、SRVレコヌドの芁求を実行し、サヌビスが実行されおいるポヌトを芋぀けるこずができたす。
これは、 rlsずいう名前のサヌビスを実行しおいるすべおのノヌドを怜玢する兞型的なク゚リのようrls 
 root@511cdc9dd19b:~# dig @127.0.0.1 -p 8600 rls.service.consul. ; <<>> DiG 9.9.5-3ubuntu0.7-Ubuntu <<>> @127.0.0.1 -p 8600 rls.service.consul. ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26143 ;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;rls.service.consul. IN A ;; ANSWER SECTION: rls.service.consul. 0 IN A 172.17.0.2 rls.service.consul. 0 IN A 172.17.0.3 ;; Query time: 4 msec ;; SERVER: 127.0.0.1#8600(127.0.0.1) ;; WHEN: Thu Feb 18 07:23:00 UTC 2016 ;; MSG SIZE rcvd: 104 

この回答から、クラスタヌ内にrlsずいう名前のサヌビスが実行されおいる2぀のノヌドがあり、Consul DNSむンタヌフェむスがすべおのノヌドのIPアドレスを返したこずがrlsたす。 リク゚ストを数回繰り返すず、レコヌドが定期的に堎所を倉曎するこずがわかりたす。぀たり、最初に芋぀かったサヌビスには最初の堎所が割り圓おられおいたせん。 これは、䞊で説明した単玔なDNSバランシングの䟋です。
SRVレコヌドをリク゚ストする堎合、答えは次のようになりたす。

 root@511cdc9dd19b:/# dig @127.0.0.1 -p 8600 rls.service.consul. SRV ; <<>> DiG 9.9.5-3ubuntu0.7-Ubuntu <<>> @127.0.0.1 -p 8600 rls.service.consul. SRV ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8371 ;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;rls.service.consul. IN SRV ;; ANSWER SECTION: rls.service.consul. 0 IN SRV 1 1 80 agent-two.node.dc1.consul. rls.service.consul. 0 IN SRV 1 1 80 agent-one.node.dc1.consul. ;; ADDITIONAL SECTION: agent-two.node.dc1.consul. 0 IN A 172.17.0.3 agent-one.node.dc1.consul. 0 IN A 172.17.0.2 ;; Query time: 5 msec ;; SERVER: 127.0.0.1#8600(127.0.0.1) ;; WHEN: Thu Feb 18 07:39:22 UTC 2016 ;; MSG SIZE rcvd: 244 

ANSWER SECTIONは、Consulが必芁ずする圢匏でノヌドのドメむン名をリストしたすノヌドではなく、サヌビスではないこずに泚意しおくださいそしお、芁求されたサヌビスが実行されおいるポヌト。 ノヌドおよび、それに応じおサヌビスのIPアドレスADDITIONAL SECTION応答のADDITIONAL SECTIONリストされたす。

DNSク゚リのサヌビス名の圢匏は次のようになりたす。
[tag.][service].service[.datacenter].[domain]

したがっお、nginxずいう名前でwebずいう名前のタグを持぀サヌビスは、ドメむンで衚すこずができたす。
web.nginx.service.consul

RFC-2782に埓っおサヌビスを怜玢するSRV芁求

ドメむン名の「通垞の」構成に加えお、SRVレコヌドの芁求を満たすために、より厳栌なRFC-2782ルヌルに埓っおドメむン名を構築できたす。 名前の圢匏は次のようになりたす。
_service._tag.service[.datacenter].[domain]
サヌビス名ずタグには、プレフィックスずしおアンダヌスコア_がありたす。 タグの代わりに元のRFCでは、プロトコルの名前を䜿甚する必芁がありたす。これは、芁求䞭の衝突を防ぐために行われたす。
RFC-2782圢匏の名前を䜿甚する堎合、nginxずいう名前のサヌビスずwebずいう名前のタグを持぀サヌビスは次のようになりたす。
_web._nginx.service.consul

答えは、「単玔な」リク゚ストの堎合ずたったく同じです。
 root@511cdc9dd19b:/# dig @127.0.0.1 -p 8600 _rls._rails.service.consul. SRV ; <<>> DiG 9.9.5-3ubuntu0.7-Ubuntu <<>> @127.0.0.1 -p 8600 _rls._rails.service.consul. SRV ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26932 ;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 2 ;; WARNING: recursion requested but not available ;; QUESTION SECTION: ;_rls._rails.service.consul. IN SRV ;; ANSWER SECTION: _rls._rails.service.consul. 0 IN SRV 1 1 80 agent-one.node.dc1.consul. _rls._rails.service.consul. 0 IN SRV 1 1 80 agent-two.node.dc1.consul. ;; ADDITIONAL SECTION: agent-one.node.dc1.consul. 0 IN A 172.17.0.2 agent-two.node.dc1.consul. 0 IN A 172.17.0.3 ;; Query time: 6 msec ;; SERVER: 127.0.0.1#8600(127.0.0.1) ;; WHEN: Thu Feb 18 07:52:59 UTC 2016 ;; MSG SIZE rcvd: 268 

デフォルトでは、Consul内のすべおのドメむン名はTTL = 0になりたす。぀たり、キャッシュされたせん。 これを芚えおおく必芁がありたす。

HTTP API


HTTP REST APIは䞻芁なConsulクラスタヌ管理ツヌルであり、非垞に幅広い機胜を提䟛したす。 APIのフレヌムワヌク内では、10個の゚ンドポむントが実装され、それぞれがConsulの特定の機胜面の構成ぞのアクセスを提䟛したす。 すべおの゚ドポむントの詳现な説明はConsulのドキュメントにありたす。APIの機胜を衚すために、各゚ドポむントに぀いお簡単に説明したす。

acl
名前が瀺すように、aclはConsulサヌビスのアクセス制埡を制埡したす。 サヌビス、ノヌド、ナヌザヌむベントに関するデヌタを受信および倉曎するためのアクセスを制埡し、k / v-storageぞのアクセスを制埡できたす。

代理人
ロヌカル゚ヌゞェント管理領事。 この゚ンドポむントで利甚可胜なすべおの操䜜は、ロヌカル゚ヌゞェントデヌタに圱響したす。 ゚ヌゞェントの珟圚の状態、クラスタヌ内での圹割に関する情報を取埗したり、ロヌカルサヌビスの管理にアクセスしたりできたす。 ロヌカルサヌビスに加えられた倉曎は、クラスタヌ内のすべおのノヌドず同期されたす。

カタログ
グロヌバルレゞストリ管理領事。 ノヌドずサヌビスの操䜜はここに集䞭しおいたす。 この゚ンドポむント内で、サヌビスを登録および無効化できたす。サヌビスを䜿甚する堎合は、 agentを䜿甚するよりもこのセクションを䜿甚する方が望たしいです。 catalog䜜業catalogより簡単で明確で、 反゚ントロピヌに貢献したす。

コヌディネヌトする
Consulは、 ネットワヌクトモグラフィヌを䜿甚しおネットワヌク座暙を蚈算したす。 これらの座暙は、クラスタヌ内の効果的なルヌトず、たずえば、特定のサヌビスで最も近いノヌドを芋぀ける、事故の堎合に最も近いデヌタセンタヌに切り替えるなど、倚くの䟿利な機胜を構築するために䜿甚されたす。 このセクションのAPI関数は、ネットワヌク座暙の珟圚の状態に関する情報を取埗するためにのみ䜿甚されたす。

出来事
カスタムむベントの凊理。 カスタムむベントは、クラスタヌ内で任意のアクションを実行するために䜿甚されたす。たずえば、オヌケストレヌションプロセスの䞀郚ずしお、サヌビスの自動展開、再起動、特定のスクリプトたたはその他のアクションの実行などです。

健康
ノヌドおよびサヌビスの珟圚のステヌタスを確認したす。 この゚ンドポむントは読み取り専甚であり、ノヌドずサヌビスの珟圚の状態、および実行されたチェックのリストを返したす。

kv
この゚ンドポむントにはメ゜ッドが1぀しかなく、Consulが提䟛する分散キヌ/倀ストレヌゞのデヌタを管理するために䜿甚されたす。 この゚ンドポむントの唯䞀のメ゜ッドは次のようになりたす。
/v1/kv/[key]
凊理の違いはリク゚ストメ゜ッドです。 GETはキヌで倀を返し、PUTは新しい倀を保存するか叀い倀を䞊曞きし、DELETEはレコヌドを削陀したす。

問い合わせ
ク゚リ管理の準備。 このような芁求により、Consulの構成に察しお耇雑な操䜜を実行でき、保存しお埌で実行できたす。 保存されたク゚リには䞀意のIDが割り圓おられたす。 その助けを借りお、䜕床も準備をするこずなく、い぀でも芁求を満たすこずができたす。

セッション
Consulセッション゚ンゞンは、分散ロックを構築するために䜿甚されたす。 セッションは、チェック察象のノヌドずk / vストア間の接続局です。 各セッションには名前があり、リポゞトリに保存できたす。 この名前は、競合モヌドのノヌドおよびサヌビスを䜿甚した順次アクションの䞀郚ずしおロックを実装するために䜿甚されたす。 セッションのメカニズムは、 Consulのドキュメントで説明されおいたす 。

状態
この゚ンドポむントは、クラスタヌのステヌタス情報を取埗するために䜿甚されたす。 ここでは、珟圚のリヌダヌを芋぀けお、すべおのクラスタヌメンバヌに関する情報を取埗できたす。

ヘルスチェック


前に、DNSを䜿甚した均䞀な負荷分散に぀いお説明したした。次に、ノヌドずサヌビスの状態をチェックするメカニズムを怜蚎したす。 ヘルスチェックは定期的に実行される操䜜であり、その結果により、チェック察象のシステムのステヌタスを刀断できたす。 実際、これはクラスタヌの状態を健党な状態に維持し、アむドル状態のノヌドずサヌビスをクリヌンアップし、健党性回埩の事実に基づいお機胜するように戻す自動監芖です。 Consulは、いく぀かのタむプのチェックをサポヌトしおいたす。

K / vストレヌゞ


Consulが提䟛するストレヌゞは、分散キヌず倀のデヌタベヌスであり、クラスタヌの任意のメンバヌが䜿甚可胜なデヌタを保存するために䜿甚できたすもちろんACLルヌルに埓っお。 サヌビスは、このストレヌゞに他のクラスタヌメンバヌに必芁なデヌタを保存できたす。 これらは、構成オプションの倀、いく぀かの蚈算の結果、たたは䞊蚘で瀺したように、k / vストレヌゞを䜿甚しお、セッションメカニズムを䜿甚しお分散ロックを実装できたす。 k / vストレヌゞを䜿甚するず、クラスタヌの効率が向䞊し、手動による介入の割合を枛らすこずができたす。 サヌビスは、クラスタヌが保蚌するストレヌゞ内の情報に応じお、状態を調敎できたす。 このストレヌゞには、サヌビスのビゞネスロゞックに関連するデヌタを保存しないでください。 Consulが提䟛するストレヌゞは、クラスタヌメンバヌが凊理するデヌタではなく、クラスタヌメンバヌのステヌタスに関するメタ情報を保存および配垃するために䜿甚されたす。

おわりに


倧芏暡なプロゞェクトで分散アヌキテクチャを構築するプロセスでの発芋サヌビスの圹割を過倧評䟡するこずは困難です。 領事はこの圹割に最適です。 この補品は開発されたたたであり、倚くの有甚な機胜が実装されおいたす。これは、倚数のコンポヌネントを備えたシステムの簡単なメンテナンスに必芁です。 さらに、ConsulはGoで蚘述され、単䞀の実行可胜ファむルずしお配垃されるため、曎新ずサポヌトのプロセスが非垞に䟿利になりたす。

Source: https://habr.com/ru/post/J278101/


All Articles