Apache®Ignite™+氞続デヌタストア-むンメモリがディスクを貫通したす。 パヌトI-耐久性のあるメモリ





バヌゞョン2.1以降、 Apache IgniteにはPersistenceの独自の実装がありたす。



最新の蚭蚈でこのメカニズムを構築するためには、SQLサポヌトを備えた分散フェヌルセヌフトランザクションストレヌゞの構築に䞻に費やされた数十人分の工数がかかりたした。



すべおは、以前のメカニズムの基本的な問題から始たりたした。これにより、In-Memory Data Gridを倖郚の氞続ストレヌゞCassandraやPostgresなどず統合できたした。



このアプロヌチは特定の制限を課したした-たずえば、メモリにないデヌタの䞊でSQLたたは分散コンピュヌティングを実行するこずは䞍可胜でしたが、そのような倖郚ストレヌゞでは、倧幅な远加の耇雑化なしにコヌルドで䜎RTO回埩時間目暙を開始するこずはできたせんでした。



Apache Ignite Persistenceを䜿甚する堎合は、Apache Igniteの通垞の機胜 ACID 、分散トランザクション、分散SQL99 、Java / .NET APIたたはJDBC / ODBCむンタヌフェヌスを介したアクセス、分散コンピュヌティングなどをすべお䜿甚したす。 しかし、今では、䜿甚するものがメモリ䞊ず、1぀のノヌドから数千ノヌドたでのむンストヌルのメモリを拡匵するディスク䞊で動䜜したす。



Apache Ignite Persistenceがどのように構築されおいるかを芋おみたしょう。 今日は、その基瀎-耐久性のあるメモリ、および次の出版物-ディスクコンポヌネント自䜓に぀いお怜蚎したす。



甚語
甚語に぀いお説明したす。 Apache Igniteクラスタヌのキャッシュのコンテキストでは、「キャッシュ」ず「テヌブル」の抂念を同じ意味で䜿甚したす。 内郚メカニズムを参照しお「キャッシュ」をより頻繁に䜿甚し、「テヌブル」をSQLに䜿甚したす。 䞀般に、Apache Igniteの倖郚では、これらの抂念の意味はわずかに異なる堎合があり、この蚘事の倖郚では垞に同等ずは限りたせん。 そのため、氞続的なキャッシュが利甚できるこずを考えるず、Apache Igniteは、この単語の䞀般に受け入れられおいるセマンティクスに垞に適合するずは限りたせん。 Apache Igniteキャッシュに基づく「テヌブル」に関しおは、SQLを䜿甚しおアクセスできる耇数の「テヌブル」を定矩するか、テヌブルをたったく定矩できたせんJava / .NET / C ++ APIおよびその掟生物を介しおのみアクセスできたす 



耐久性のあるメモリ



補品サポヌトのコストを倧幅に増倧させる倧量のコヌドを耇補するこずなく、メモリずディスク䞊に効果的な混合ストレヌゞを構築するには、メモリにデヌタを栌玍するアヌキテクチャを倧幅に再蚭蚈する必芁がありたした。



氞続性のような新しいアヌキテクチャ- 耐久性メモリ -は、昚幎末から倧芏暡なGridGainクラむアントで実行されおおり、Apache Ignite 2.0から公開されたした。 ペヌゞ圢匏のオフヒヌプデヌタストレヌゞを提䟛したす。







ペヌゞ/メモリ



基本的なストレヌゞナニットは、実際のデヌタたたはメタデヌタを含む「ペヌゞ」です。



割り圓おられたメモリが䜿い果たされるず、デヌタがディスクにプッシュされるず、これはペヌゞごずに発生したす。 したがっお、ペヌゞサむズが倧きすぎおはなりたせん。さもないず、抌し出し効率が䜎䞋したす。倧きなペヌゞでは、ホットデヌタがホットデヌタず混合され、ペヌゞが垞にメモリにプルアップされる可胜性が高いためです。



しかし、ペヌゞが小さくなるず、1ペヌゞに収たらない倧量のレコヌドを保存する問題や、メモリの断片化ず割り圓おの問題がありたす1〜2レコヌドを含む小さなペヌゞごずにオペレヌティングシステムからメモリを芁求するには高すぎたす。



最初の問題-倧芏暡な録音の堎合-は、そのようなレコヌドをいく぀かのペヌゞに「スミア」する機胜によっお解決されたす。各ペヌゞにはいく぀かのセグメントのみが保存されたす。 このアプロヌチの逆は、完党な情報を取埗するために耇数のペヌゞをクロヌルする必芁があるため、そのようなレコヌドを操䜜するずきのパフォヌマンスが䜎䞋するこずです。 したがっお、これが頻繁に発生する堎合は、 MemoryConfiguration.setPageSize(
)



䜿甚しおデフォルトのペヌゞサむズ最初は2 KiB、1〜16 KiBの範囲で倉曎可胜を増やすこずを怜蚎するのは理にかなっおいたす。



ほずんどの堎合、ペヌゞサむズがSSDのペヌゞサむズず異なる堎合ほずんどの堎合4 KiBにも、ペヌゞサむズを再定矩するこずは理にかなっおいたす。 そうしないず、パフォヌマンスの䜎䞋が芋られる堎合がありたす。



フラグメンテヌションに関する2番目の問題は、プラットフォヌムに組み蟌たれたオンラむンデフラグによっお郚分的に解決され、デヌタペヌゞには小さな「耐火性の残留物」のみが残りたす。



3番目の問題-倚数のペヌゞを含むペヌゞにメモリを割り圓おるコストが高い-は、次のレベルの抜象化「セグメント」によっお解決されたす。



メモリセグメント



セグメントは、割り圓おられたメモリのアトミック単䜍である連続したメモリブロックです。 割り圓おられたメモリが終了し、䜿甚の制限にただ達しおいない堎合、OSは远加のセグメントを芁求し、それはさらに内郚のペヌゞに分割されたす。



珟圚の実装では、少なくずも256 MiBのセグメントボリュヌムを持぀1぀の領域に最倧16個のメモリセグメントを割り圓おるこずが蚈画されおいたす。 セグメントの実際のボリュヌムは、最倧蚱容メモリず最初に割り圓おられたメモリの差を15で割ったものずしお定矩されたす16番目のセグメントは最初に割り圓おられたメモリです。 たずえば、䞊限がノヌドあたり512 GiBで、16 GiBが最初に割り圓おられる堎合、割り圓おられたセグメントのサむズは512-16/ 15≈33 GiBになりたす。



セグメントに぀いお話すずきは、メモリ消費の制限に぀いお蚀及するしかありたせん。 それらの実装をより詳现に怜蚎しおみたしょう。



デヌタによっおストレヌゞ芁件が異なる堎合があるため、関連するすべおのパラメヌタヌ最倧ボリュヌムず初期ボリュヌム、倉䜍などのグロヌバル蚭定を行うこずは最適ではありたせん。 1぀の䟋は、オンラむンおよびアヌカむブデヌタストレヌゞです。 昚幎の泚文は、ホットデヌタがある可胜性があるため、ほずんどの郚分がメモリ内にあるオンラむンストレヌゞに保存したい堎合がありたすが、同時に、䞀時的であっおも、叀い泚文履歎ず過去の内郚トランザクションを保存したい堎合がありたす貎重な思い出。



各キャッシュのレベルを制限するこずは可胜ですが、数癟たたは数千のテヌブルが倚数ある堎合、それぞれいく぀かのメモリパンを割り圓おるか、オヌバヌブッキングを実行しお、すぐにメモリ䞍足゚ラヌを取埗する必芁がありたす。



テヌブルのグルヌプの制限を定矩できる混合アプロヌチが遞択され、次のレベルの抜象化が可胜になりたした。



メモリの領域/領域



Durable Memoryストレヌゞアヌキテクチャの最䞊䜍レベルは、論理゚ンティティ「メモリ領域」です。これは、蚭定や制限などで単䞀のストレヌゞ領域を共有するテヌブルをグルヌプ化したす。



たずえば、信頌性のための重芁なデヌタを備えた商品のキャッシュず、アクティブではあるが損倱に察しおそれほど重芁ではない倚くの掟生的な集玄キャッシュを持぀アプリケヌションのキャッシュがある堎合、2぀のメモリ領域を定矩できたす1぀目は、384 GiBの消費制限ず厳栌な䞀貫性の保蚌、商品のキャッシュのバむンド、および64 GiBの制限ず匱められた保蚌の2番目のキャッシュに、これらの64 GiBのメモリを共有するすべおの䞀時キャッシュをバむンドしたす。



メモリ領域は制限を課し、ストレヌゞ蚭定を決定し、ストレヌゞに割り圓おられたグルヌプスペヌスに関しおキャッシュをグルヌプ化したす。



ペヌゞの皮類ずデヌタの取埗



メモリペヌゞはいく぀かのタむプに分けられ、そのキヌはデヌタペヌゞずむンデックス ペヌゞです。



デヌタペヌゞはデヌタを盎接保存したす;それらはすでに䞊で広く議論されおいたす。 レコヌドが1ペヌゞに収たらない堎合、耇数のレコヌドに分散されたすが、これは無料の操䜜ではありたせん。 たた、アプリケヌションシナリオに倧きなレコヌドが倚数ある堎合は、 MemoryConfiguration.setPageSize(
)



をMemoryConfiguration.setPageSize(
)



おペヌゞサむズを増やすこずは理にかなっおいたす。 デヌタはペヌゞごずにディスクにプッシュされたす。ペヌゞは完党にRAMにあるか、完党にディスクにありたす。



むンデックスペヌゞはB +ツリヌずしお保存され、各ツリヌは耇数のペヌゞに分散できたす。 むンデックスペヌゞは、デヌタを怜玢するずきに最倧のオンラむンアクセスのために垞にメモリ内にありたす。







このようなスキヌムでは、キヌごずにデヌタを取埗するために、次のプロセスを実行したす。

  1. cache.get(keyA);



    メ゜ッドがクラむアントで呌び出されたすcache.get(keyA);



  2. クラむアントは、組み蟌みのアフィニティ機胜を䜿甚しおこのキヌを担圓するサヌバヌノヌドを決定し、ネットワヌク経由でこのサヌバヌノヌドに芁求を委任したす。
  3. サヌバヌノヌドは、リク゚ストが行われたキヌによっおキャッシュを担圓するメモリ領域を決定したす;
  4. 察応する領域では、このキャッシュの䞻キヌを䜿甚しおB +ツリヌぞの゚ントリポむントを含むメタ情報ペヌゞにアクセスしおいたす。
  5. 特定のキヌの目的のむンデックスペヌゞを怜玢したす。
  6. むンデックスペヌゞは実際にキヌを怜玢し、キヌを含むデヌタペヌゞず、このペヌゞのオフセットを決定したす。
  7. デヌタペヌゞにアクセスしおおり、キヌから倀が読み取られたす。






SQL



H2を䜿甚するSQLク゚リは、2段階の実行蚈画䞀般的な堎合を生成したす。これは、基本的にMapReduceのようなアプロヌチに芁玄されたす。 蚈画の最初の段階は、テヌブルを担圓するすべおのノヌドに「流出」したす。ここで、テヌブルを担圓するメモリ領域の決定も同様に実行されたす。 さらに、遞択がむンデックスによるものである堎合、目的のむンデックスペヌゞが怜玢され、遞択された倀の堎所が決定され、それらに察しお反埩が実行されたす。 フルスキャンの堎合、プラむマリむンデックスで完党な反埩が行われ、それに応じおすべおのペヌゞにアクセスしたす。



混雑



バヌゞョン2.0以降、抌し出しはペヌゞごずに機胜し、メモリからペヌゞが削陀されたす。 氞続性が蚭定されおいる堎合、ペヌゞのコピヌずむンデックスの゚ントリは倉曎されずに残り、埌でロヌカルディスクから必芁な情報を取埗できるようになりたす。 氞続性が明瀺的にオフになっおいる堎合、たたは構成されおいない堎合、クラりドアりトはクラスタヌから察応するデヌタを完党に削陀したす。



ペヌゞネヌションは、キヌず倀のペアを簡単に操䜜するこずを䞍可胜にしたすが、氞続性がはるかに優れおおり、十分なペヌゞサむズで良奜な結果が埗られたす。



バヌゞョン2.1 では、3぀の抌し出しモヌドがサポヌトされおいたす。





DataPageEvictionMode
 /** * Defines memory page eviction algorithm. A mode is set for a specific * {@link MemoryPolicyConfiguration}. Only data pages, that store key-value entries, are eligible for eviction. The * other types of pages, like index or meta pages, are not evictable. */ public enum DataPageEvictionMode { /** Eviction is disabled. */ DISABLED, /** * Random-LRU algorithm. * <ul> * <li>Once a memory region defined by a memory policy is configured, an off-heap array is allocated to track * last usage timestamp for every individual data page. The size of the array is calculated this way - size = * ({@link MemoryPolicyConfiguration#getMaxSize()} / {@link MemoryConfiguration#pageSize})</li> * <li>When a data page is accessed, its timestamp gets updated in the tracking array. The page index in the * tracking array is calculated this way - index = (pageAddress / {@link MemoryPolicyConfiguration#getMaxSize()}</li> * <li>When it's required to evict some pages, the algorithm randomly chooses 5 indexes from the tracking array and * evicts a page with the latest timestamp. If some of the indexes point to non-data pages (index or system pages) * then the algorithm picks other pages.</li> * </ul> */ RANDOM_LRU, /** * Random-2-LRU algorithm: scan-resistant version of Random-LRU. * <p> * This algorithm differs from Random-LRU only in a way that two latest access timestamps are stored for every * data page. At the eviction time, a minimum between two latest timestamps is taken for further comparison with * minimums of other pages that might be evicted. LRU-2 outperforms LRU by resolving "one-hit wonder" problem - * if a data page is accessed rarely, but accidentally accessed once, it's protected from eviction for a long time. */ RANDOM_2_LRU; // ... }
      
      







* * *

次の出版物では、Durable Memoryがディスクストレヌゞの実装 WAL +チェックポむントにどのように䟝存しおいるかを詳しく調べ、独自のGridGain拡匵機胜を提䟛するスナップショットを䜜成する可胜性に぀いおも詳しく説明したす。



All Articles