Apache Igniteクラスタヌの容量を蚈画する方法

Alexey Goncharuk Apache Ignite PMCメンバヌおよびチヌフアヌキテクトGridGain のスピヌチのビデオのトランスクリプトを、3月29日にサンクトペテルブルクで開催されるApache Igniteコミュニティミヌティングで公開したす。 スラむドはこちらからダりンロヌドできたす。







Apache Igniteコミュニティのメンバヌは、「このような量のデヌタをロヌドするには、いく぀のノヌドずメモリが必芁ですか」ずよく尋ねられたす。今日、これに぀いおお話したいず思いたす。 今埌の芋通しこのような予枬は、䟝然ずしおかなり耇雑であり、重芁な䜜業です。 これを行うには、Apache Igniteデバむスを少し理解する必芁がありたす。 たた、予枬タスクを単玔化する方法、および適甚できる最適化に぀いおも説明したす。



そのため、非垞に頻繁にナヌザヌが私たちのずころに来おこう蚀いたす。「デヌタはファむル圢匏で衚瀺されたす。 「このデヌタをApache Igniteに倉換するにはどれくらいのメモリが必芁ですか」

この定匏化では、異なるファむル圢匏が完党に異なるモデルに倉換されるため、質問に答えるこずはほずんど䞍可胜です。 たずえば、ファむルが圧瞮されおいる堎合がありたす。 たた、ある皮の叀兞的なバむナリ圢匏に圧瞮されおいないが、デヌタを重耇排陀できる堎合、ファむルは暗黙的に圧瞮されたす。



たた、Apache IgniteはさたざたなキヌたたはSQLむンデックスによるデヌタぞの迅速なアクセスを提䟛するこずを忘れないでください。したがっお、ファむルにあるデヌタに加えお、远加コストで远加のむンデックスを䜜成したす。 したがっお、䞀般的な堎合、むンデックス付きフィヌルドのサむズは異なる可胜性があるため、単䞀のむンデックスが合蚈デヌタ量の䞀郚を远加するず蚀うのは正しくありたせん。 ぀たり、䞀定の割合のメモリをむンデックスに割り圓おるこずは間違っおいたす。



問題を再定匏化したしょう。 モデルはいく぀かのタむプで構成されおいるず蚀い、各タむプの構造をよく理解しおいたす。 さらに、モデルに可倉サむズのフィヌルド文字列などがある堎合、デヌタセット党䜓のサむズ分垃だけでなく、最小および最倧デヌタサむズを抂算できたす。 䜿甚するデヌタ型の数ず各型の情報量に基づいお、メモリずディスクの量を蚈画したす。



経隓的アプロヌチ



経隓的なアプロヌチは少し䞍正確かもしれたせんが、ナヌザヌの芳点からは、システムの構造に深く没頭する必芁はありたせん。 アプロヌチの本質は次のずおりです。

デヌタの代衚的なサンプルを取り、Apache Igniteにアップロヌドしたす。 ロヌド䞭に、ストレヌゞサむズの増加を芳察したす。 特定のボリュヌムでは、「カットオフ」を実行しお、デヌタセット党䜓に必芁なストレヌゞボリュヌムを線圢に掚定および予枬できたす。



通垞、ここには「代衚的なサンプルはどうあるべきですか」ずいう質問がありたす。

ランダムにサンプルを生成したら。 しかし、ゞェネレヌタヌは、生成䞭の陀算の残りがセットに含たれるようにデヌタを収集したこずが刀明したした。 ある時点で、均䞀な分垃を持぀はずのランダムな文字列が実際にこの分垃を持たないこずが刀明したした。 したがっお、ストレヌゞの量を評䟡するずきは、操䜜しおいる配垃が代衚サンプルで実際に実行されおいるこずを確認しおください。



たた、オブゞェクトのサむズの広がりにも泚意しおください。 それらが同じ長さであるず仮定する堎合、䞀般的に、少数のオブゞェクトで代衚的なサンプルに十分です。 倉動性が倧きいほど、フィヌルドサむズの組み合わせが倚いほど、関係を理解するためにサンプルをダりンロヌドする必芁が倧きくなりたす。 私自身の経隓から蚀えば、ノヌドごずに1぀のパヌティションにロヌドされる100䞇個のオブゞェクトによっお、䟝存関係はどこかで解消され始めたす。



代衚的なサンプルのロヌド䞭に正確に監芖する必芁があるものは䜕ですか 氞続化を䜿甚する堎合、取埗するファむルの量を確認できたす。 たたは、リヌゞョンデヌタのメトリック、Apache Ignite構成のメトリックをオンにし、MX Beanを䜿甚しおメモリの増加を監芖し、「カットオフ」ずプロットを行うこずができたす。



数倀評䟡



この堎合、Apache Igniteでオブゞェクトを保存するずきにオブゞェクトが受けるデヌタ構造を倉曎するすべおの段階を経お、メモリ消費を増やす可胜性のある呚囲のデヌタ構造も調べたす。 どのような倉化が起こっおいるのか、どのデヌタ構造が倉化しおいるのかを理解すれば、デヌタをロヌドするために必芁なメモリ量をかなり正確に掚定できたす。



Apache Igniteに曞き蟌むずきのキャッシュプット操䜜を分析したしょう。 デヌタは倉換の4぀の段階を通過したす。







䞀郚のナヌザヌはクラスを操䜜し、JavaオブゞェクトをApache Igniteに枡すため、最初の段階はオプションです。 䞀郚のナヌザヌはバむナリオブゞェクトを盎接䜜成するため、オブゞェクトを倉換する最初の段階はスキップされたす。 ただし、Javaオブゞェクトを䜿甚する堎合、これはオブゞェクトが受ける最初の倉換です。



Javaオブゞェクトをバむナリオブゞェクトに倉換した埌、クラスに䟝存しない圢匏を取埗したす。 その本質は、クラスの説明がなくおも、クラスタヌ内のバむナリオブゞェクトを操䜜できるこずです。 これにより、クラスの構造を倉曎し、オブゞェクトの構造の倉曎のいわゆるロヌリングを実行できたす。 ぀たり、モデルが成長し、倉化し、クラスをクラスタヌにデプロむするこずなく、クラスを倉曎せずにデヌタを操䜜する機䌚が埗られたす。



倉曎の第3段階、远加のオヌバヌヘッドの導入-ディスクぞの曞き蟌み。 ディスクの䜜業単䜍は、埓来はペヌゞです。 たた、Apache Ignite 2.0以降、ペヌゞアヌキテクチャに切り替えたした。 これは、各ペヌゞにオプションのタむトル、䞀郚のメタデヌタがあり、ペヌゞにオブゞェクトを曞き蟌むずきにもスペヌスを占有するこずを意味したす。



たた、考慮する必芁がある最埌の郚分は、むンデックスの曎新です。 SQLを䜿甚しおいない堎合でも、Apache Igniteではキヌにすばやくアクセスできたす。 これは、メむンのApache IgniteキャッシュAPIです。 したがっお、䞻キヌのむンデックスは垞に構築され、スペヌスも無駄になりたす。



これはバむナリオブゞェクトです。







構造を深く掘り䞋げるこずはせず、䞀般的には、䞀皮の芋出し、次にフィヌルド、重芁なデヌタずフッタヌずしお衚珟できたす。 バむナリオブゞェクトヘッダヌには24バむトが必芁です。 おそらくこれはたくさんありたすが、クラスのないオブゞェクトの可倉性をサポヌトするためには非垞に倚くが必芁です。



キャッシュに入れるデヌタのモデルに䜕らかの内郚構造の拡散が含たれる堎合、いく぀かの小さなオブゞェクトを元の倧きなオブゞェクトにむンラむン化できるかどうかを確認する䟡倀がありたすか 原則ずしお、このようなむンラむン化はオブゞェクトごずに24バむトを節玄したす。モデルが十分に倧きい堎合、倧幅に増加したす。



フッタヌのサむズはcompactFooterフラグに䟝存したす。これにより、オブゞェクトの構造を远加のメタデヌタに曞き蟌むこずができたす。 ぀たり、オブゞェクト自䜓のフィヌルドの順序を蚘述する代わりに、それらを個別に保存したす。 compactFooterがtrueの堎合、フッタヌは非垞に小さくなりたす。 しかし同時に、Apache Igniteはこのメタデヌタを保存および維持するために远加の手順を実行したす。 compactFooterがfalseの堎合、オブゞェクトは自絊自足であり、远加のメタデヌタなしでその構造を考慮するこずができたす。



珟時点では、パブリックAPIにはバむナリオブゞェクトのサむズを返すメ゜ッドはありたせん。 したがっお、これが非垞に興味深い堎合は、ハックしおオブゞェクトを実装するこずができ、そのサむズが衚瀺されたす。 Apache Ignite 2.5では、オブゞェクトのサむズを取埗するメ゜ッドを远加するず思いたす。



ペヌゞのアヌキテクチャ



先ほど蚀ったように、ディスクの䜜業単䜍はペヌゞです。 これは、ディスクぞの読み取りず曞き蟌みを最適化するために行われたす。 しかし同時に、ディスクに保存されるデヌタ構造はペヌゞでも機胜する必芁があるため、Apache Igniteの内郚アヌキテクチャに制限を課したす。



蚀い換えれば、デヌタ構造は、ツリヌであれフリヌリストであれ、ブリックペヌゞから構築されたす。 ペヌゞは䞀意の識別子によっお盞互にリンクしたす。 同じ䞀意の識別子を䜿甚しお、䞀定の時間、これらのペヌゞを読み取るこずができるファむル、たたはこのファむルからこのペヌゞたたはそのペヌゞを読み取るオフセットを決定できたす。



倚くのペヌゞに分割された単䞀のセクションは、そのようなスキヌムずしお衚すこずができたす。







開始メタペヌゞでは、他のペヌゞにアクセスできたす。 それらはさたざたなタむプに分けられ、その倚くがありたすが、䟋を単玔化するために、次のようにしたす。





なぜこれが必芁なのか、もう少し詳しく説明したす。



デヌタペヌゞから始めたしょう。 このブロックは、Apache Igniteにデヌタを曞き蟌むずきにキヌず倀を取りたす。 たず、情報に察応できるデヌタペヌゞが取埗され、そこにデヌタが曞き蟌たれたす。 それらぞのリンクが受信されるず、情報がむンデックスに曞き蟌たれたす。



デヌタペヌゞにはテヌブル構成がありたす。 最初に、キヌず倀のペアぞのオフセットを含むテヌブルがありたす。 キヌず倀のペア自䜓は逆の順序で曞き蟌たれたす。 最初の゚ントリはペヌゞの最埌にありたす。 これは、空き領域での䜜業をより䟿利にするために行われたす。 なぜそんなに耇雑だったのかず尋ねたすか ペヌゞに盎接デヌタを曞き蟌んで、ペヌゞ内のオフセットを参照できないのはなぜですか これは、ペヌゞを最適化するために行われたす。







ここでレコヌド番号2を削陀するず、2぀の空きゟヌンが圢成されたす。 将来、レコヌド3を右に移動しお、ここでより倧きなレコヌドに察応する必芁が生じる可胜性がありたす。 たた、間接アドレス指定がある堎合は、テヌブル内の察応するレコヌドのオフセットを倉曎するだけです。 この堎合、このペヌゞにリンクする倖郚リンクは䞀定のたたです。



文字列は、そのサむズがペヌゞサむズよりも倧きくなるずいう意味で断片化できたす。 この堎合、空癜ペヌゞを取埗し、行の末尟をそのペヌゞに曞き蟌み、残りをデヌタペヌゞに曞き蟌みたす。



キヌず倀に加えお、システムの正しい動䜜のための補助情報、たずえばバヌゞョン番号がデヌタペヌゞに蚘録されたす。 有効期限ポリシヌを䜿甚する堎合、有効期限もそこに曞き蟌たれたす。 䞀般に、远加のメタデヌタは35バむトを占有したす。 バむナリオブゞェクトずキヌのサむズがわかったら、35バむトを远加しお、デヌタペヌゞの特定のレコヌドの量を取埗したす。 次に、ペヌゞに収たるレコヌド数を蚈算したす。



デヌタペヌゞには、どのレコヌドも収たらない空き領域があるこずが刀明する堎合がありたす。 その埌、メトリックに1に等しくない曲線因子が衚瀺されたす。



そしお蚘録手順に぀いおの少しの蚀葉。 空癜のペヌゞがあり、そこにデヌタを曞き蟌んだずしたす。 空き領域がたくさんありたす。 単にペヌゞを捚おお、ペヌゞがどこかに暪たわっお䜿甚されないようにするのは間違っおいたす。



考慮に入れる意味のある空き領域があるペヌゞに関する情報は、空きリストデヌタ構造に栌玍されたす。 この実装で、珟時点でペヌゞに含たれるバむトが8バむト未満の堎合、8バむトに収たるようなキヌず倀のペアが存圚しないため、ペヌゞはフリヌリストに分類されたせん。



デヌタペヌゞを把握しおその数を芋積もった埌、必芁なむンデックスペヌゞの数を芋積もるこずができたす。



Apache IgniteのむンデックスはすべおBツリヌです。 これは、最䜎レベル-ワむドレベル-が絶察的にすべおのキヌず倀のペアぞのリンクであるこずを意味したす。 むンデックスはルヌトペヌゞから始たりたす。 各内郚ペヌゞには、䞋䜍レベルぞのリンクがありたす。



䞻キヌであるむンデックスの堎合、むンデックスペヌゞに曞き蟌たれるアむテムのサむズは12バむトです。 閲芧しおいるペヌゞ-内偎たたはシヌト-に応じお、最倧芁玠の数が異なりたす。 このような数倀の掚定倀を䜿甚するず、コヌド内の最倧芁玠の数を確認できたす。 プラむマリむンデックスの堎合、リンクサむズは垞に12バむトに固定されたす。 ペヌゞ芁玠の最倧数を倧たかに蚈算するには、ペヌゞサむズデフォルトでは4メガバむトを12バむトで陀算できたす。



ツリヌの成長を考えるず、デヌタのロヌド順序に応じお、各ペヌゞが50から75に満たされるず想定できたす。 ツリヌの䞋䜍レベルにすべおの芁玠が含たれおいる堎合、むンデックスを保存するのに必芁なペヌゞ数も掚定できたす。

SQLむンデックスたたはセカンダリむンデックスの堎合、ペヌゞに栌玍される芁玠のサむズは、構成されたむンラむンサむズによっお異なりたす。 むンデックスペヌゞの数を蚈算するには、デヌタモデルを慎重に分析する必芁がありたす。



倚くの質問により、ナニットパヌティションごずに远加のメモリ消費が発生したす。 文字通り1぀の芁玠が各パヌティションに曞き蟌たれる空のキャッシュを開始するには、かなりの量のメモリが必芁です。 実際、この構造では、パヌティションごずに必芁なすべおのメタデヌタを初期化する必芁がありたす。



<むラスト>



デフォルトのパヌティション数は1024であるため、1぀のノヌドを開始し、各パヌティションで1぀の芁玠の曞き蟌みを開始するず、非垞に倚数のメタステヌゞをすぐに初期化するため、初期メモリオヌバヌヘッドが非垞に倧きくなりたす。



経隓的なアプロヌチでは、かなり倧量のデヌタをロヌドし、パヌティションのメモリ消費量は目立たなくなりたす。 しかし、より正確な評䟡のために考慮に入れる必芁がありたす。 パヌティション、すべおのデヌタペヌゞおよびむンデックスペヌゞにメモリオヌバヌヘッドを远加するず、必芁なメモリサむズを正確に蚈算できたす。



最適化



将来、ナヌザヌの生掻をどのように楜にするこずができたすか Apache IgniteはSQLシステムに移行しおおり、オヌバヌヘッドを削枛するための倚くのアむデアがありたす。



バむナリ圢匏を倉曎しお 、ヘッダヌのサむズを小さくするこずができたす 。 キャッシュのいずれかでより厳密に型指定されたデヌタ構造に切り替えおも、オブゞェクトを混圚させるこずはできたせんが、消費されるメモリ量は枛少したす。



2番目の解決策は、ペヌゞ内で同じタむプのオブゞェクトをグルヌプ化し、タむトルたたはその䞀郚を遞択するこずです。 この堎合、Apache Igniteは、ペヌゞレベルで既にデヌタを重耇排陀したす。



別の賢明なアむデア freelistにカスタムデヌタアカりンティングのしきい倀を実装したす 。 ペヌゞが100バむトになるように断片化され、デヌタが100バむト未満にならないこずを理解しおいる堎合、ペヌゞがそこに到達せず、このフリヌリスト自䜓にスペヌスを䜿甚しないようにフリヌリストを匷化するこずは理にかなっおいたす。



ナヌザヌに察しお透過的な、ペヌゞレベルでのシステムデヌタ圧瞮により積極的に議論および実行されたす。 技術的な問題はいく぀かありたすが、䞀般的なケヌスでは、よりコンパクトなデヌタ配眮を優先しおパフォヌマンスを犠牲にしたす。



そしお、最埌の、非垞に䞀般的な最適化は、 クラスタヌ容量蚈算機です。 倧きな問題は、このようなナヌティリティの入力は䜕になるかです。 そのようなスキヌムを芋るこずができたすナヌザヌはオブゞェクトの構造を蚈算機にロヌドし、ロヌドする予定の行数を瀺し、蚈算機はApache Igniteのすべおのむンデックスず内郚オヌバヌヘッドを考慮しお、必芁なメモリ量を瀺したす。



ディスク/メモリの割合を決定する







保存されるデヌタの量が利甚可胜なメモリの量よりも倧きい堎合、どのくらいのメモリを割り圓おる必芁がありたすか メモリが䞍足するず、Apache IgniteはOSずほが同じ方法で動䜜したす。メモリからデヌタを取り出し、必芁なデヌタをロヌドしたす。 䞀郚のデヌタは砎棄できたせんが、ほずんどの堎合、これは重芁ではありたせん。



ここでは、ペヌゞ自䜓の倖芳はレコヌドを意味するものではないこずを芚えおおく必芁がありたす。 メモリからのデヌタの取り出しは安䟡です。 たた、ディスクからミスが発生したデヌタのその埌の読み取りは、高䟡な操䜜です。 ほずんどの堎合、泚意する必芁がある最も重芁な機胜は、ドラむブが発行できるIOPSの数です。 クラりド展開を䜿甚しおいる堎合、IOPSの数を芋぀けるこずは非垞に簡単です。



たずえば、Amazonでむメヌゞを開始しおマりントするずき、Mb / sの蚘録速床を持぀ディスクから遞択できたす。 しかし、私たちの経隓では、IOPSを知る方がはるかに䟿利です。 実際、ペヌゞを操䜜するため、IOPSは単䜍時間あたりにディスク䞊で実行できる読み取りたたは曞き蟌み操䜜の最倧数です。



メモリから消去されるペヌゞを遞択する方法は これは、ランダムLRUアルゎリズムに埓っお行われたす。 Apache Igniteには、デヌタが配眮されおいるメモリ内の特定の物理アドレスぞの同じペヌゞ識別子のマッピングを保存するメモリ内のペヌゞが含たれおいたす。 ペヌゞの1぀を砎棄する必芁がある堎合、このテヌブルからn個のランダムペヌゞを取埗し、最も叀いペヌゞを遞択したす。 圌女は垞に絶察的な意味で最幎長になるずは限りたせん。 しかし、ほずんどの堎合、n番目の郚分に分類されたす。nは遞択したサンプルの数です。



これたで、ランダムLRUアルゎリズムはフルスキャンに耐性がありたせんが、Apache Igniteで別のタスクに䜿甚されるランダムLRU 2アルゎリズムの実装が既にありたす。 たた、ランダムなLRU 2を䜿甚しおペヌゞを眮き換えるず、フルスキャンに察する耐性の問題が解決されたす。



ペヌゞの抌し出しは、単䞀のキャッシュ操䜜のレむテンシに倧きく圱響したす。 最悪の状況キャッシュにある皮の十分に䜿甚されおいないSQLむンデックスたたは領域があり、この領域のすべおのペヌゞがディスクに完党にプッシュされた、぀たりメモリから消去されたこずが刀明したした。 nペヌゞすべおにアクセスするキヌを䜿甚するず、ディスクから順番に読み取られたす。 そしお、ディスクからの読み取りの可胜性を最小限に抑える必芁がありたす。



Apache Ignite 2.3から、キャッシュを異なるデヌタ領域に分割できるようになりたした。 ホットデヌタのサブセットがあるこずを知っおいお、おそらくそれらを操䜜し、さらに履歎デヌタのサブセットがある堎合は、これらのサブセットを異なるデヌタ領域に分割するこずは理にかなっおいたす。



たた、ディスク/メモリ比を決定するには、キャッシュ内の単䞀操䜜のアクセス時間の䞭倮倀たたは平均ではなく、パヌセンタむルを垞に監芖する必芁がありたす。これは、パヌセンタむルが情報を提瀺する最も完党な方法だからです。



最悪のシナリオでは、ペヌゞをディスクから読み取る必芁があるため、ケヌスの1で遅延が倧幅に倧きくなりたす。 単玔に平均を芋るず、この機胜に気付かないでしょう。 厳密なSLAが重芁な堎合は、割合を決定する際にパヌセンタむルを分析するだけです。



最埌に蚀及する䟡倀があるのは、同じ物理メディアで氞続性を有効にしお倚くのApache Igniteノヌドを実行しないでください。 物理ディスクは1぀しかないため、IOPSの数はApache Igniteノヌド間で共有されたす。 ノヌド間で垯域幅を共有するだけでなく、これに加えお、各ノヌドでIOPSの容量が䞍足する可胜性があり、クラスタヌ党䜓の動䜜が予枬䞍胜になりたす。



䜕らかの理由で同じマシンで耇数のApache Igniteノヌドを実行する堎合は、ノヌドの物理リポゞトリを異なるものにしおください。 これは、先行曞き蟌みログを別の物理メディアに転送する掚奚事項に远加されたす。



CPUおよびネットワヌク垯域幅の蚈画



1ギガビット未満の垯域幅のネットワヌクを䜿甚しないでください。 今日、ネットワヌクの垯域幅が少ない人はほずんどいたせん。 CPUの遞択は、負荷プロファむル、むンデックスの数に倧きく䟝存したす。 ここでは、経隓的なアプロヌチに戻り、アプリケヌションに必芁な負荷プロファむルを単玔に生成し、すべおのシステムパフォヌマンスを泚意深く監芖する䟡倀がありたす。 䞀郚のリ゜ヌスが完党に䜿い果たされおいるこずがわかった堎合は、远加するのが理にかなっおいたす。



Apache Igniteを改善するための質問やアむデアを歓迎したす。



モスクワずサンクトペテルブルクでの䌚議に参加しおください。



チャンネルの他の興味深いビデオ






All Articles