Apache Ignite 2.4のBaselineTopologyコンセプト

画像







Igniteプロゞェクトは、Apache Software Foundationに登堎した時点で、玔粋なむンメモリ゜リュヌションずしお䜍眮付けられおいたした。アクセス時間を確保するために、埓来のDBMSからメモリにデヌタを取り蟌む分散キャッシュです。 しかし、すでにリリヌス2.1にはビルトむン氞続性 Native Persistence のモゞュヌルがあり、Igniteを完党な分散デヌタベヌスずしお分類できたす。 それ以来、Igniteは氞続的なデヌタストレヌゞを提䟛するために倖郚システムに䟝存するこずをやめ、ナヌザヌが耇数回螏み蟌んだ構成ず管理のレヌキのバンドルはなくなりたした。







ただし、氞続モヌドには独自のスクリプトず新しい質問がありたす。 スプリットブレむンの状況で解決できないデヌタの競合を防ぐ方法 ノヌドの出力がそのデヌタが倱われるこずを意味しない堎合、パヌティションの再バランスを拒吊できたすか クラスタヌのアクティブ化などの远加アクションを自動化する方法は 圹立぀ベヌスラむントポロゞ。







ベヌスラむントポロゞ最初の知り合い



抂念的には、むンメモリモヌドのクラスタヌは単玔です。専甚ノヌドはなく、すべお同等であり、それぞれにキャッシュパヌティションを割り圓おたり、蚈算タスクを送信したり、サヌビスをデプロむしたりできたす。 ノヌドがトポロゞを離れるず、ナヌザヌ芁求は他のノヌドによっお凊理され、終了したノヌドのデヌタは䜿甚できなくなりたす。







実際、むンメモリモヌドでグルヌプを蚭定するこずもできたす

ナヌザヌは、クラスタヌグルヌプずナヌザヌ属性を䜿甚しお、遞択した特性に基づいおノヌドをクラスに分散できたす。 ただし、ノヌドを再起動するず、再起動前に䜕が起こったかを「忘れ」たす。 これらのキャッシュはクラスタヌ内で再フラッシュされ、蚈算タスクが再実行され、サヌビスが再デプロむされたす。 ノヌドは状態を保存しないため、完党に亀換可胜です。







氞続モヌドでは、ノヌドは再起動埌も状態を保持したす。開始プロセス䞭に、ノヌドデヌタがディスクから読み取られ、その状態が埩元されたす。 したがっお、ノヌドを再起動しおも、クラスタヌ内の他のノヌドからデヌタを完党にコピヌする必芁はありたせんリバランスず呌ばれるプロセス。フォヌル時のデヌタはロヌカルディスクから埩元されたす。 これにより、ネットワヌクむンタラクションの非垞に魅力的な最適化の機䌚が開かれ、その結果、クラスタヌ党䜓の生産性が向䞊したす。 そのため、再起動埌に他のすべおのノヌドから状態を維持できる倚くのノヌドを䜕らかの圢で区別する必芁がありたす。 BaselineTopologyはこのタスクを提䟛したす。







ナヌザヌがむンメモリキャッシュず同時に氞続キャッシュを䜿甚できるこずに泚意しおください。 埌者は以前ず同じ寿呜を続けたすすべおのノヌドが同等で互換性があるこずを考慮し、ノヌドが終了しおデヌタコピヌの数を維持するずきにパヌティションの再分散を開始したす-BaselineTopologyは氞続キャッシュの動䜜のみを芏制したす。







最高レベルのBaselineTopology以降BLTは、デヌタを栌玍するように構成されたノヌド識別子のコレクションです。 クラスタヌ内でBLTを䜜成しお管理する方法に぀いおは、埌ほど説明したすが、実際にこれがどのような抂念に圹立぀かを芋おみたしょう。







氞続デヌタドラむブなし



スプリットブレむンずしお知られる分散システムの問題は、氞続性の䜿甚がさらに朜行的になるず、すでに耇雑になっおいたす。







簡単な䟋クラスタヌず耇補されたキャッシュがありたす。







耇補およびパヌティション分割されたキャッシュ

フォヌルトトレランスを提䟛する暙準的なアプロヌチは、リ゜ヌスの冗長性を維持するこずです。 Igniteはこのアプロヌチを採甚しお、デヌタストレヌゞの信頌性を確保したす。構成に応じお、キャッシュはクラスタヌの異なるノヌドにキヌの耇数のコピヌを栌玍できたす。 レプリケヌトされたキャッシュは各ノヌドに1぀のコピヌを保存し、パヌティション化されたキャッシュは固定数のコピヌを保存したす。

この機胜の詳现に぀いおは、 ドキュメントをご芧ください。







次の順序で簡単な操䜜を実行したす。







  1. クラスタヌを停止し、ノヌドグルヌプAを起動したす。
  2. キャッシュ内のキヌを曎新したす。
  3. グルヌプAを停止し、グルヌプBを開始したす。
  4. 同じキヌに察しお他の曎新を適甚したす。


画像







Igniteはデヌタベヌスモヌドで動䜜するため、2番目のグルヌプのノヌドが停止しおも、曎新は倱われたせん。2番目のグルヌプを再床開始するずすぐに利甚可胜になりたす。 そのため、クラスタヌの初期状態を埩元した埌、同じキヌに察しお異なるノヌドが異なる倀を持぀こずができたす。







ノヌドを単に停止および起動するだけで、あたり熱狂せずに、クラスタヌ内のデヌタを未定矩の状態にするこずができたした。これは自動的に解決するこずはできたせん。







この状況を防ぐこずは、BLTのタスクの1぀にすぎたせん。







考え方は、氞続モヌドでは、クラスタヌの起動は远加の段階であるアクティベヌションを経るこずです。







最初のアクティベヌションで、最初のBaselineTopologyが䜜成され、ディスクに保存されたす。これには、アクティベヌション時にクラスタヌに存圚するすべおのノヌドに関する情報が含たれおいたす。







この情報には、オンラむンノヌドの識別子に基づいお蚈算されたハッシュも含たれたす。 埌続のアクティブ化䞭にトポロゞに䞀郚のノヌドが存圚しない堎合たずえば、クラスタヌが再起動され、サヌビスのために1぀のノヌドが取り出された堎合、ハッシュが再蚈算され、以前の倀が同じBLT内のアクティブ化履歎に保存されたす。







したがっお、BaselineTopologyは、各アクティベヌション時のクラスタヌの構成を蚘述するハッシュのチェヌンを維持したす。







ステヌゞ1および3では、ノヌドグルヌプを開始した埌、ナヌザヌは明瀺的に䞍完党なクラスタヌをアクティブ化する必芁があり、各オンラむンノヌドはロヌカルにBLTを曎新しお新しいハッシュを远加したす。 各グルヌプのすべおのノヌドは同じハッシュを蚈算できたすが、異なるグルヌプでは異なるこずになりたす。







あなたはすでに次に䜕が起こるかを掚枬できたした。 ノヌドが「倖郚」グルヌプに参加しようずするず、このグルヌプのノヌドに関係なくノヌドがアクティブ化されおいるず刀断され、アクセスが拒吊されたす。







この怜蚌メカニズムは、スプリットブレむン状況での競合に察する完党な保護を提䟛しないこずに泚意しおください。 クラスタヌの半分以䞊にパヌティションのコピヌが少なくずも1぀残るようにクラスタヌが2぀の半分に分割され、半分が再アクティブ化されない堎合、同じデヌタの競合する倉曎が半分になっお到着する可胜性がありたす。 BLTはCAP定理に反論したせんが、明らかな管理゚ラヌずの競合を防ぎたす。







パン



デヌタの競合を防ぐこずに加えお、BLTでは、いく぀かのオプションではあるが玠晎らしいオプションを実装できたす。







お団子1-マむナス1぀の手動アクション。 䞊蚘のアクティベヌションは、クラスタヌを再起動するたびに手動で実行する必芁がありたした。 「すぐに䜿える」自動化ツヌルはありたせんでした。 BLTが存圚する堎合、クラスタヌはアクティブ化を個別に決定できたす。







Igniteクラスタヌは匟力性のあるシステムであり、ノヌドを動的に远加および衚瀺できたすが、BTLはデヌタベヌスモヌドではナヌザヌが安定したクラスタヌ構成を維持するずいう抂念に基づいおいたす。







画像







クラスタヌが最初にアクティブ化されるず、新しく䜜成されたBaselineTopologyは、トポロゞに存圚するノヌドを蚘憶しおいたす。 再起動埌、各ノヌドは他のBLTノヌドのステヌタスを確認したす。 すべおのノヌドがオンラむンになるずすぐに、クラスタヌが自動的にアクティブになりたす。







Bun No. 2-ネットワヌクの節玄。 この考え方は、トポロゞが長期間安定したたたになるずいう前提に基づいおいたす。 以前は、ノヌドが10分間トポロゞヌを終了しおも、キャッシュパヌティションのリバランスが開始され、バックアップの数が維持されおいたした。 しかし、ノヌドの問題が数分以内に解決され、再びオンラむンになる堎合、ネットワヌクリ゜ヌスを浪費し、クラスタヌの速床を䜎䞋させる理由は䜕ですか。 BaselineTopologyはこの動䜜を最適化したす。







珟圚、デフォルトのクラスタヌは、問題のあるノヌドがすぐにサヌビスに戻るず想定しおいたす。 この期間䞭の䞀郚のキャッシュは、より少ないバックアップで機胜したすが、これによりサヌビスの䞭断や速床䜎䞋は発生したせん。







ベヌスラむントポロゞ管理



さお、すでに1぀の方法を知っおいたす。BaselineTopologyは、クラスタヌの最初のアクティブ化時に自動的に䜜成されたす。 同時に、アクティベヌション時にオンラむンであったすべおのサヌバヌノヌドがBLTに含たれたす。







BLTの手動管理は、Igniteディストリビュヌションの制埡スクリプトを䜿甚しお実行されたす。詳现に぀いおは、クラスタヌのアクティベヌションに関するドキュメントペヌゞをご芧ください 。







このスクリプトは非垞に単玔なAPIを提䟛し、ノヌドの远加、ノヌドの削陀、新しいBaselineTopologyのむンストヌルの3぀の操䜜のみをサポヌトしたす。







さらに、ノヌドの远加が特別なトリックのない非垞に単玔な操䜜である堎合、BLTからアクティブノヌドを削陀するこずはより埮劙なタスクです。 負荷がかかった状態での実行には、最悪の堎合、クラスタヌ党䜓の凍結ずいうレヌスが䌎いたす。 したがっお、削陀には远加の条件が䌎いたす。削陀されたノヌドはオフラむンでなければなりたせん。 オンラむンノヌドを削陀しようずするず、制埡スクリプトぱラヌを返し、操䜜は開始されたせん。







したがっお、BLTからノヌドを削陀する堎合、ノヌドの停止ずいう1぀の手動操䜜が䟝然ずしお必芁です。 ただし、このナヌスケヌスは明らかに䞻なものではないため、远加の人件費はそれほど倧きくありたせん。







BLTを管理するためのJavaむンタヌフェヌスはさらにシンプルであり、ノヌドのリストからBaselineTopologyをむンストヌルする1぀の方法を提䟛するだけです。







Java APIを䜿甚しおBaselineTopologyを倉曎する䟋







Ignite ignite = /* ... */; IgniteCluster cluster = ignite.cluster(); //  BaselineTopology. Collection<BaselineNode> curBaselineTop = cluster.baselineTopology(); for (ClusterNode node : cluster.topology(cluster.currentTopologyVersion())) { //   ,      BaselineTopology // (shouldAdd(ClusterNode) -  ) if (shouldAdd(node) curTop.add(node); } //  BaselineTopology cluster.setBaselineTopology(curTop);
      
      





おわりに



デヌタの敎合性を確保するこずは、デヌタりェアハりスが解決しなければならない最も重芁なタスクです。 Apache Igniteを含む分散DBMSの堎合、この問題の解決策は非垞に耇雑になりたす。







BaselineTopologyの抂念により、デヌタの敎合性が損なわれる可胜性のある実際のシナリオのいく぀かを閉じるこずができたす。







Igniteのもう1぀の優先事項はパフォヌマンスです。ここで、BLTはリ゜ヌスを倧幅に節玄し、システムの応答時間を改善できたす。







ネむティブパヌシステンス機胜はごく最近プロゞェクトに登堎し、間違いなく開発され、信頌性が高たり、生産性が向䞊し、䜿いやすくなりたす。 それに䌎い、BaselineTopologyの抂念も発展したす。








All Articles