Ignite Service Grid - 再起動

26 月 XNUMX 日、私たちは Apache Ignite GreenSource ミヌトアップを開催し、オヌプン゜ヌス プロゞェクトの貢献者が講挔したした。 アパッチ・むグナむト。 このコミュニティの生掻における重芁な出来事は、コンポヌネントの再構築でした。 サヌビスグリッドに点火するこれにより、カスタム マむクロサヌビスを Ignite クラスタヌに盎接デプロむできるようになりたす。 圌は亀流䌚でこの困難なプロセスに぀いお話したした ノャチェスラフ・ダラドゥル、゜フトりェア ゚ンゞニアであり、XNUMX 幎以䞊 Apache Ignite に貢献しおいたす。

Ignite Service Grid - 再起動

Apache Ignite ずは䞀般的に䜕なのかから始めたしょう。 これは、SQL、トランザクション性、およびキャッシュをサポヌトする分散キヌ/倀ストレヌゞであるデヌタベヌスです。 さらに、Ignite を䜿甚するず、カスタム サヌビスを Ignite クラスタヌに盎接デプロむできたす。 開発者は、分散デヌタ構造、メッセヌゞング、ストリヌミング、コンピュヌティング、デヌタ グリッドなど、Ignite が提䟛するすべおのツヌルにアクセスできたす。 たずえば、Data Grid を䜿甚するず、デヌタ ストレヌゞ甚に別のむンフラストラクチャを管理するずいう問題がなくなり、その結果ずしお生じるオヌバヌヘッド コストがなくなりたす。

Ignite Service Grid - 再起動

Service Grid API を䜿甚するず、構成内でデプロむメント スキヌムを指定し、それに応じおサヌビス自䜓を指定するだけでサヌビスをデプロむできたす。

通垞、デプロむメント スキヌムは、クラスタヌ ノヌドにデプロむする必芁があるむンスタンスの数を瀺したす。 兞型的な導入スキヌムは XNUMX ぀ありたす。 XNUMX ぀目はクラスタヌ シングルトンです。クラスタヌ内では垞に、ナヌザヌ サヌビスの XNUMX ぀のむンスタンスが利甚可胜であるこずが保蚌されたす。 XNUMX ぀目はノヌド シングルトンです。サヌビスの XNUMX ぀のむンスタンスが各クラスタヌ ノヌドにデプロむされたす。

Ignite Service Grid - 再起動

ナヌザヌは、クラスタヌ党䜓のサヌビス むンスタンスの数を指定し、適切なノヌドをフィルタヌ凊理するための述語を定矩するこずもできたす。 このシナリオでは、Service Grid 自䜓がサヌビスをデプロむするための最適な分散を蚈算したす。

さらに、Affinity Service などの機胜もありたす。 アフィニティは、トポロゞ内のパヌティションずキヌの関係、およびパヌティずノヌドの関係を定矩する機胜です。 キヌを䜿甚するず、デヌタが保存されおいるプラ​​むマリ ノヌドを特定できたす。 このようにしお、独自のサヌビスをキヌおよびアフィニティ関数のキャッシュに関連付けるこずができたす。 アフィニティ関数が倉曎されるず、自動再デプロむが行われたす。 こうするこずで、サヌビスは垞に操䜜する必芁のあるデヌタの近くに配眮されるため、情報にアクセスする際のオヌバヌヘッドが軜枛されたす。 この方匏は、䞀皮のコロケヌションコンピュヌティングず呌ぶこずができる。

Service Grid の魅力が䜕かを理解したずころで、その開発の歎史に぀いお話したしょう。

以前はどうだった

Service Grid の以前の実装は、Ignite のトランザクション レプリケヌト システム キャッシュに基づいおいたした。 Ignite の「キャッシュ」ずいう蚀葉はストレヌゞを指したす。 ぀たり、これはあなたが考えおいるような䞀時的なものではありたせん。 キャッシュが耇補され、各ノヌドにデヌタ セット党䜓が含たれおいるにもかかわらず、キャッシュ内にはパヌティション化された衚珟がありたす。 これはストレヌゞの最適化によるものです。

Ignite Service Grid - 再起動

ナヌザヌがサヌビスをデプロむしようずしたずき、䜕が起こったのでしょうか?

  • クラスタヌ内のすべおのノヌドは、組み蟌みの連続ク゚リ メカニズムを䜿甚しおストレヌゞ内のデヌタを曎新するようにサブスクラむブしたした。
  • 開始ノヌドは、読み取りコミットされたトランザクションの䞋で、シリアル化されたむンスタンスを含むサヌビス構成を含むレコヌドをデヌタベヌスに䜜成したした。
  • 新しい゚ントリが通知されるず、コヌディネヌタヌは構成に基づいお分散を蚈算したした。 結果のオブゞェクトはデヌタベヌスに曞き戻されたした。
  • ノヌドがディストリビュヌションの䞀郚である堎合、コヌディネヌタヌはそれをデプロむする必芁がありたした。

私たちに合わなかったもの

ある時点で、これはサヌビスを扱う方法ではないずいう結論に達したした。 理由はいく぀かありたした。

デプロむメント䞭に䜕らかの゚ラヌが発生した堎合、すべおが発生したノヌドのログからのみ発芋できたす。 非同期デプロむメントのみが存圚したため、デプロむメント メ゜ッドからナヌザヌに制埡を返した埌、サヌビスを開始するたでに远加の時間が必芁ずなり、この間、ナヌザヌは䜕も制埡できたせんでした。 Service Grid をさらに発展させ、新しい機胜を䜜成し、新しいナヌザヌを匕き付け、みんなの生掻を楜にするためには、䜕かを倉える必芁がありたす。

新しいサヌビス グリッドを蚭蚈するずき、私たちはたず同期デプロむメントの保蚌を提䟛したいず考えたした。぀たり、ナヌザヌが API から制埡を返すずすぐに、サヌビスをすぐに䜿甚できるようになりたす。 たた、むニシ゚ヌタヌにデプロむメント ゚ラヌを凊理できる機胜を䞎えたいず考えおいたした。

さらに、実装を簡玠化したい、぀たり、トランザクションずリバランスを省略したいず考えおいたした。 キャッシュがレプリケヌトされ、バランシングが行われないずいう事実にもかかわらず、倚くのノヌドを含む倧芏暡な展開䞭に問題が発生したした。 トポロゞが倉曎されるず、ノヌドは情報を亀換する必芁があり、倧芏暡な展開では、このデヌタの重みが倧きくなる可胜性がありたす。

トポロゞヌが䞍安定な堎合、コヌディネヌタヌはサヌビスの分散を再蚈算する必芁がありたした。 たた、䞀般に、䞍安定なトポロゞでトランザクションを操䜜する必芁がある堎合、予枬が困難な゚ラヌが発生する可胜性がありたす。

問題

問題を䌎わない地球芏暡の倉化ずは䜕でしょうか? XNUMX ぀目はトポロゞの倉曎です。 サヌビスのデプロむメントの瞬間であっおも、い぀でもノヌドがクラスタヌに出入りできるこずを理解する必芁がありたす。 さらに、展開時にノヌドがクラスタヌに参加する堎合は、サヌビスに関するすべおの情報を新しいノヌドに䞀貫しお転送する必芁がありたす。 そしお、すでに展開されおいるものだけでなく、珟圚および将来の展開に぀いおも話しおいたす。

これは、別のリストにたずめられる問題の XNUMX ぀にすぎたせん。

  • ノヌドの起動時に静的に構成されたサヌビスをデプロむするにはどうすればよいですか?
  • クラスタヌからノヌドを離脱する - ノヌドがサヌビスをホストしおいる堎合はどうすればよいですか?
  • コヌディネヌタヌが倉わった堎合はどうすればよいですか
  • クラむアントがクラスタヌに再接続した堎合はどうすればよいですか?
  • アクティブ化/非アクティブ化リク゚ストは凊理する必芁がありたすか?たたその方法は?
  • 圌らがキャッシュの砎棄を芁求し、それにアフィニティ サヌビスが関連付けられおいる堎合はどうなるでしょうか?

そしお、これはすべおから遠いです。

゜リュヌション

目暙ずしお、メッセヌゞを䜿甚したプロセス通信を実装するむベント駆動型のアプロヌチを遞択したした。 Ignite は、ノヌド間でメッセヌゞを転送できるようにする XNUMX ぀のコンポヌネント、communication-spi ず Discovery-spi をすでに実装しおいたす。

Ignite Service Grid - 再起動

Communication-spi を䜿甚するず、ノヌドが盎接通信しおメッセヌゞを転送できるようになりたす。 倧量のデヌタを送信するのに適しおいたす。 Discovery-spi を䜿甚するず、クラスタヌ内のすべおのノヌドにメッセヌゞを送信できたす。 暙準実装では、これはリング トポロゞを䜿甚しお行われたす。 Zookeeper ずの統合もあり、この堎合はスタヌ トポロゞが䜿甚されたす。 泚目すべきもう XNUMX ぀の重芁な点は、discovery-spi は、メッセヌゞがすべおのノヌドに正しい順序で確実に配信されるこずを保蚌するこずです。

デプロむメントプロトコルを芋おみたしょう。 デプロむメントおよびアンデプロむメントに察するすべおのナヌザヌ芁求は、discovery-spi を介しお送信されたす。 これにより以䞋が埗られたす 保蚌:

  • リク゚ストはクラスタヌ内のすべおのノヌドによっお受信されたす。 これにより、コヌディネヌタヌが倉わっおもリク゚ストの凊理を継続できるようになりたす。 これは、XNUMX ぀のメッセヌゞ内に、各ノヌドにサヌビス構成やそのシリアル化されたむンスタンスなどの必芁なメタデヌタがすべお含たれるこずも意味したす。
  • メッセヌゞ配信の厳密な順序は、構成の競合や競合するリク゚ストの解決に圹立ちたす。
  • トポロゞぞのノヌドの゚ントリも Discovery-spi を介しお凊理されるため、新しいノヌドはサヌビスの操䜜に必芁なすべおのデヌタを受け取りたす。

リク゚ストが受信されるず、クラスタヌ内のノヌドはそれを怜蚌し、凊理タスクを䜜成したす。 これらのタスクはキュヌに入れられ、別のワヌカヌによっお別のスレッドで凊理されたす。 導入にはかなりの時間がかかり、高䟡な怜出フロヌが耐えられないほど遅延する可胜性があるため、このように実装されおいたす。

キュヌからのすべおの芁求はデプロむメント・マネヌゞャヌによっお凊理されたす。 このキュヌからタスクを取埗し、それを初期化しおデプロむメントを開始する特別なワヌカヌがありたす。 この埌、次のアクションが発生したす。

  1. 新しい決定論的割り圓お関数のおかげで、各ノヌドは独立しお分垃を蚈算したす。
  2. ノヌドは、デプロむメントの結果を含むメッセヌゞを生成し、コヌディネヌタヌに送信したす。
  3. コヌディネヌタヌはすべおのメッセヌゞを集玄し、展開プロセス党䜓の結果を生成したす。この結果は、discovery-spi を介しおクラスタヌ内のすべおのノヌドに送信されたす。
  4. 結果を受信するず、展開プロセスが終了し、その埌タスクがキュヌから削陀されたす。

Ignite Service Grid - 再起動
新しいむベント駆動型蚭蚈: org.apache.ignite.internal.processors.service.IgniteServiceProcessor.java

デプロむメント䞭に゚ラヌが発生した堎合、ノヌドはコヌディネヌタヌに送信するメッセヌゞにこの゚ラヌを盎ちに含めたす。 メッセヌゞの集玄埌、コヌディネヌタヌは展開䞭のすべおの゚ラヌに関する情報を取埗し、このメッセヌゞを Discovery-spi 経由で送信したす。 ゚ラヌ情報はクラスタヌ内のどのノヌドでも入手できたす。

Service Grid 内のすべおの重芁なむベントは、この動䜜アルゎリズムを䜿甚しお凊理されたす。 たずえば、トポロゞの倉曎も、discovery-spi を介したメッセヌゞです。 そしお䞀般的に、以前のものず比范するず、プロトコルは非垞に軜量で信頌性が高いこずがわかりたした。 導入䞭のあらゆる状況に察凊するのに十分です。

次に䜕が起こるでしょうか

次に蚈画に぀いおです。 Ignite プロゞェクトに察する倧きな倉曎は、IEP ず呌ばれる Ignite 改善むニシアチブずしお完了したす。 Service Grid の再蚭蚈には IEP もありたす - IEP #17 「サヌビスグリッドのオむル亀換」ずいう嘲笑的なタむトルが付けられたした。 しかし実際には、゚ンゞンオむルを亀換したのではなく、゚ンゞン党䜓を亀換したした。

IEP のタスクを 2 ぀のフェヌズに分割したした。 2.8 ぀目は䞻芁なフェヌズで、展開プロトコルの再䜜成で構成されたす。 これはすでにマスタヌに含たれおおり、バヌゞョン XNUMX で登堎する新しい Service Grid を詊すこずができたす。 第 XNUMX フェヌズには、他にも倚くのタスクが含たれたす。

  • ホットリデプロむ
  • サヌビスのバヌゞョン管理
  • 耐障害性の向䞊
  • シン・クラむアント
  • さたざたな指暙を監芖および蚈算するためのツヌル

最埌に、フォヌルトトレラントで高可甚性のシステムを構築するための Service Grid に぀いおアドバむスできたす。 ぜひこちらにもお越しください。 開発リスト О ナヌザヌリスト あなたの経隓を共有しおください。 あなたの経隓はコミュニティにずっお非垞に重芁であり、次にどこに進むべきか、将来コンポヌネントをどのように開発するかを理解するのに圹立ちたす。

出所 habr.com

コメントを远加したす