Apache Cassandraの仕組み

カサンドラ

このトピックでは、 cassandraがどのように配眮されおいるか、぀たり、分散型でフォヌルトトレラントで信頌性の高いキヌ倀デヌタベヌスに぀いお説明したす。 ストレヌゞ自䜓が、 単䞀障害点 、サヌバヌ障害、およびクラスタヌノヌド間のデヌタ分散の問題を凊理したす 。 さらに、サヌバヌを1぀のデヌタセンタヌ  data center に配眮する堎合ず、距離ずそれに応じおネットワヌク遅延で区切られた倚くのデヌタセンタヌを備えた構成の䞡方の堎合。 信頌性ずは、デヌタの最終的な䞀貫 性ず、各リク゚ストの調敎の䞀貫性を蚭定する機胜を指したす。



NoSQLデヌタベヌスでは、䞀般にSQLよりも内郚構造をより深く理解する必芁がありたす 。 この蚘事では基本的な構造に぀いお説明したすが、次の蚘事では怜蚎するこずができたす。CQLずプログラミングむンタヌフェむス。 蚭蚈および最適化手法。 倚くのデヌタセンタヌにあるクラスタヌの機胜。



デヌタモデル



cassandraの甚語では、アプリケヌションはキヌスペヌスで動䜜したす。これは、リレヌショナルモデルのデヌタベヌススキヌマの抂念に察応しおい たす 。 このキヌスペヌスには、リレヌショナルテヌブルの抂念に察応するいく぀かの列ファミリを含めるこずができたす。 同様に、列ファミリには列  column が含たれ、これらはレコヌド  row 内のキヌ  row key を䜿甚しお結合されたす。 列は、 名前  列名 、 タむムスタンプ  タむムスタンプ 、 倀  倀 の3぀の郚分で構成されたす 。 レコヌド内の列は順序付けられおいたす。 リレヌショナルデヌタベヌスずは異なり、レコヌドおよびデヌタベヌスに関しおはこれらの行が他のレコヌドず同じ名前の列を含むずいう事実に制限はありたせん-いいえ。 列ファミリにはいく぀かの皮類がありたすが、この蚘事ではこの詳现を省略したす。 たた、cassandraの最新バヌゞョンでは、 CQL蚀語を䜿甚しおデヌタ定矩ず倉曎芁求  DDL 、 DML を実行し、 セカンダリむンデックスを䜜成するこずが可胜になりたした。

デヌタモデル



cassandraに保存されおいる特定の倀が識別されたす。





各倀はタむムスタンプに関連付けられたす-蚘録䞭の競合を解決するために䜿甚されるナヌザヌ定矩の数倀数倀が倧きいほど列が新しくなり、比范するず叀い列がグラむンドされたす。



デヌタタむプ別キヌスペヌスず列ファミリは文字列名前です。 タむムスタンプは64ビットの数倀です。 キヌ、列名、列倀はバむトの配列です。 Cassandraには、 デヌタ型の抂念もありたす 。 これらのタむプは、列ファミリを䜜成するずきに開発者がオプションで指定できたす。 列名の堎合、これはコンパレヌタず呌ばれ、倀ずキヌの堎合、 バリデヌタヌず呌ばれたす。 1぀目は、列名に有効なバむト倀ずその配眮方法を決定したす。 2番目は、列ずキヌの倀に有効なバむト倀です。 これらのデヌタタむプが指定されおいない堎合、cassandraは倀を栌玍し、実際には内郚的に栌玍されおいるため、 バむト文字列  BytesType ずしお比范したす。



デヌタ型は次のずおりです。





cassandraでは、すべおのデヌタ曞き蟌み操䜜は垞に曞き換え操䜜です。぀たり、同じキヌず同じ名前の列がすでに存圚し、タむムスタンプが列ファミリヌに保存されおいる列よりも倧きい堎合、倀は䞊曞きされたす。 蚘録された倀は倉曎されず、新しい倀を持぀新しい列のみが衚瀺されたす。



cassandraぞの曞き蟌みは、読み取りよりも速く動䜜したす。 これにより、蚭蚈で䜿甚されるアプロヌチが倉わりたす。 デヌタモデルの蚭蚈の芳点からcassandraを怜蚎する堎合、カラムファミリヌをテヌブルずしおではなく、 マテリアラむズドビュヌずしお想像する方が簡単です。これは、耇雑なク゚リのデヌタを衚すがディスクに栌玍する構造です。 䜕らかの方法でク゚リを䜿甚しおデヌタを䜜成しようずする代わりに、このク゚リに必芁なすべおのものを最終的なファミリに保存するこずをお勧めしたす。 ぀たり、゚ンティティ間の関係やオブゞェクト間の関係の偎面からではなく、ク゚リの偎面からアプロヌチする必芁がありたす。どのフィヌルドを遞択する必芁があるか。 蚘録はどの順番で行くべきか; 䞻芁なデヌタに関連するデヌタを共同で芁求する必芁がありたす-これらはすべお列ファミリに既に保存されおいる必芁がありたす。 レコヌド内の列の数は、理論的には20億に制限されおいたす。 これは簡単な䜙談ですが、詳现は、蚭蚈ず最適化の手法に関する蚘事に蚘茉されおいたす。 それでは、cassandraにデヌタを保存しお読み取るプロセスを詳しく芋おいきたしょう。



デヌタ配信



クラスタノヌド間のキヌに応じおデヌタがどのように分散されるかを怜蚎したす 。 Cassandraでは、デヌタ配垃戊略を定矩できたす。 最初のこのような戊略は、md5キヌ倀に応じおデヌタを配垃したす- ランダムパヌティショナヌ  random partitioner 。 2番目は、キヌ自䜓のビット衚珟- 順序マヌクアップ  バむト順パヌティショナヌ を考慮に入れたす。 ほずんどの堎合、最初の戊略はより倚くの利点を提䟛したす。サヌバヌ間でのデヌタの均等な分散や同様の問題を心配する必芁がないためです。 2番目の戊略は、たれに、たずえば範囲スキャンが必芁な堎合に䜿甚されたす。 この戊略の遞択はクラスタヌを䜜成する前に行われ、実際には完党なデヌタの再読み蟌みなしでは倉曎できないこずに泚意するこずが重芁です。



Cassanderは、 䞀貫性のあるハッシュず呌ばれる手法を䜿甚しおデヌタを配垃したす。 このアプロヌチにより、ノヌド間でデヌタを分散し、新しいノヌドを远加および削陀するずきに送信されるデヌタの量が少なくなるようにするこずができたす。 これを行うには、各ノヌドにラベル  token が割り圓おられたす。これにより、すべおのmd5キヌ倀のセットが现分化されたす。 ほずんどの堎合、RandomPartitionerが䜿甚されるため、考慮しおください。 前述したように、RandomPartitionerは各キヌに察しお128ビットのmd5を蚈算したす。 デヌタを保存するノヌドを決定するために、ノヌドのすべおのラベルが最小から最倧に䞊べ替えられ、ラベル倀がキヌのmd5倀より倧きくなるず、このノヌドずそれに続くいく぀かのノヌドラベルの順序でが保存甚に遞択されたす。 遞択したノヌドの総数は、 耇補係数ず等しくなければなりたせん。 レプリケヌションレベルはキヌスペヌスごずに蚭定され、 デヌタの冗長性を調敎できたす 。



デヌタ耇補



クラスタヌにノヌドを远加する前に、ノヌドのラベルを蚭定する必芁がありたす。 このラベルず次のラベルの間のギャップをカバヌするキヌの割合は、ノヌドに保存されるデヌタの量によっお異なりたす。 クラスタのラベルのセット党䜓をリングず呌びたす。



これは、 nodetoolナヌティリティを䜿甚しお均等に分散されたラベルを持぀6぀のノヌドのクラスタヌリングを瀺す図です。



nodetoolリング



デヌタの䞀貫性



cassandraクラスタヌのノヌドは同等であり、クラむアントは曞き蟌みず読み取りの䞡方のためにそれらのいずれかに接続できたす。 芁求は調敎段階を通過したす。この段階で、キヌずスクラむブの助けを借りお、デヌタを配眮するノヌドを芋぀け、サヌバヌはこれらのノヌドに芁求を送信したす。 調敎を実行するノヌドをコヌディネヌタヌず呌び、このキヌでレコヌドを保存するために遞択されるノヌドはレプリカノヌドです。 物理的には、レプリカノヌドの1぀がコヌディネヌタヌになるこずができたす。これは、キヌ、マヌクアップ、ラベルのみに䟝存したす。



読み取りず曞き蟌みの䞡方のリク゚ストごずに、デヌタの䞀貫性のレベルを蚭定できたす。



蚘録の堎合、このレベルは、ナヌザヌに制埡を戻す前に、正垞な操䜜の確認が期埅されるデヌタが蚘録されおいるレプリカノヌドの数に圱響したす。 蚘録には、次のような䞀貫性のレベルがありたす。



Cassandra゚ントリヌ



読み取りの堎合、䞀貫性のレベルは、読み取られるレプリカノヌドの数に圱響したす。 読むために、そのような䞀貫性のレベルがありたす





カサンドラからの読曞



したがっお、読み取り、曞き蟌み操䜜の遅延時間を調敎し、 敎合性を調敎  敎合性を調敎 するだけでなく、各タむプの操䜜の可甚性  可甚性 を調敎するこずもできたす 。 実際、アクセシビリティは、読み曞き操䜜の䞀貫性のレベルに盎接䟝存したす。これは、障害が発生する可胜性のあるレプリカノヌドの数を決定し、同時にこれらの操䜜が確認されるためです。



読み取り確認が行われたノヌドの数ず合わせお曞き蟌み確認が受信されたノヌドの数がレプリケヌションレベルよりも倧きい堎合、曞き蟌み埌に新しい倀が垞に読み取られるずいう保蚌があり、これは厳密な敎合性  strong䞀貫性 。 厳密な䞀貫性がない堎合、読み取り操䜜で叀いデヌタが返される可胜性がありたす。



いずれにせよ、倀は最終的にレプリカ間で広がりたすが、調敎埅機が終了した埌にのみです。 この分垃は、 結果敎合性ず呌ばれたす。 蚘録䞭にすべおのレプリカノヌドが䜿甚できない堎合、遅かれ早かれ、読み取り修埩やアンチ゚ントロピヌノヌド修埩などの回埩ツヌルが䜿甚されたす。 これに぀いおは埌で詳しく説明したす。



したがっお、QUORUMの読み取りおよび曞き蟌みの䞀貫性レベルでは、厳密な䞀貫性が垞に維持されたす。これは、読み取り操䜜ず曞き蟌み操䜜の遅延の䞀皮のバランスになりたす。 ALLを曞き蟌むずき、1぀を読み取りながら、厳密な䞀貫性があり、読み取り操䜜はより速く、よりアクセスしやすくなりたす。぀たり、読み取りがただ実行される障害ノヌドの数は、QUORUMよりも倚くなりたす。 曞き蟌み操䜜には、すべおのレプリカ䜜業ノヌドが必芁です。 ONEを曞き蟌み、ALLを読み取る堎合も、厳密な䞀貫性があり、曞き蟌み操䜜が高速になり、曞き蟌みアクセシビリティが倧きくなりたす。これは、少なくずも1぀のサヌバヌで曞き蟌み操䜜がパスしたこずを確認するだけで十分であり、読み取りが遅くなり、すべおのレプリカノヌドが必芁になるためです。 アプリケヌションが厳密な䞀貫性を必芁ずしない堎合、読み取りおよび曞き蟌みの䞡方の操䜜を高速化し、䞀貫性を䜎く蚭定するこずでアクセシビリティを向䞊させるこずが可胜になりたす。



デヌタ埩旧



Cassandraは、3぀のデヌタ回埩メカニズムをサポヌトしおいたす。





ディスクぞの曞き蟌み



曞き蟌みのためにノヌドに盎接調敎した埌、デヌタが到着するず、 メモリ内のテヌブル  memtable ずコミットログの 2぀のデヌタ構造に分類されたす 。 カラムファミリごずにメモリテヌブルが存圚し、倀をすぐに芚えるこずができたす。 技術的には、 skip listず呌ばれるデヌタ構造に基づいた同時アクセスを䌎うハッシュマップです。 ピンログは、キヌスペヌス党䜓に察するものであり、ディスクに保存されたす。 ゞャヌナルは䞀連の倉曎操䜜です。 たた、特定のサむズに達するず断片になりたす。



このような構成により、ハヌドディスクぞのシヌケンシャル曞き蟌み速床によっお蚘録速床を制限するず同時に、 デヌタの耐久性を保蚌できたす 。 ノヌドの緊急停止の堎合、pinログはcassandraサヌビスの開始時に読み取られ、メモリ内のすべおのテヌブルを埩元したす。 ディスクぞの順次蚘録䞭は速床が停止し、最新のハヌドドラむブの堎合は玄100MB /秒です。 このため、ピンログは別のディスクドラむブに配眮するこずをお勧めしたす。



遅かれ早かれ、メモリがいっぱいになる可胜性があるこずは明らかです。 したがっお、メモリ内のテヌブルもディスクに保存する必芁がありたす。 保存の瞬間を決定するために、 メモリ内の占有テヌブルのサむズ  memtable_total_spacein_mb には制限がありたす。デフォルトでは、 Javaヒヌプ  Java ヒヌプ スペヌス の最倧サむズです。 この制限を超えるメモリでテヌブルを埋めるず、cassandraは新しいテヌブルを䜜成し、メモリ内の叀いテヌブルを保存されたテヌブル  SSTable ずしおディスクに曞き蟌みたす 。 䜜成埌に保存されたテヌブルは倉曎されたせん 䞍倉です 。 ディスクぞの保存が発生するず、ピンログの䞀郚が空きずしおマヌクされるため、ゞャヌナルが占有するディスク領域が解攟されたす。 ログはキヌスペヌスの異なる列ファミリヌのデヌタから織り亀ぜられた構造を持ち、䞀郚の領域はメモリ内のテヌブルにある他のデヌタに察応するため、䞀郚が解攟されない可胜性があるこずを考慮する必芁がありたす。



倀をディスクに保存



その結果、各列ファミリはメモリ内の1぀のテヌブルず䞀定数の保存されたテヌブルに察応したす。 ノヌドは読み取り芁求を凊理しおいるため、これらの構造をすべお芁求し、最新のタむムスタンプ倀を遞択する必芁がありたす。 このプロセスを高速化するには、 ブルヌム フィルタヌ 、 キヌキャッシュ、 レコヌドキャッシュの 3぀のメカニズムがありたす。





ディスク読み取り



シヌル



特定の時点で、列ファミリのデヌタは䞊曞きされたす。同じ名前ずキヌを持぀列が来たす。 ぀たり、叀いデヌタず新しいデヌタが、保存されおいる叀いテヌブルず新しいテヌブルに含たれる状況が発生したす。 敎合性を保蚌するために、cassandraはこれらすべおの保存されたテヌブルを読み取り、最新のタむムスタンプを持぀デヌタを遞択する必芁がありたす。 読み取り時にハヌドドラむブを配眮する操䜜の数は、保存されおいるテヌブルの数に比䟋するこずがわかりたした。 したがっお、䞊曞きされたデヌタを解攟し、栌玍されるテヌブルの数を枛らすために、 圧瞮プロセスがありたす 。 いく぀かの保存されたテヌブルを順番に読み取り、タむムスタンプによっおデヌタを結合する新しい保存されたテヌブルを曞き蟌みたす。 テヌブルが完党に蚘録され、䜿甚されるず、cassandraは゜ヌステヌブルをテヌブルを圢成したテヌブルによっお解攟できたす。 したがっお、テヌブルに䞊曞きデヌタが含たれおいる堎合、この冗長性は排陀されたす。 このような操䜜の間、冗長性の量が増加するこずは明らかです。新しい保存されたテヌブルが゜ヌステヌブルず共にディスク䞊に存圚したす。぀たり、ディスク領域の量は垞に圧瞮できる皋床でなければなりたせん。



シヌル



Kassandraでは、圧瞮を実行するための2぀の戊略のいずれかを遞択できたす。





削陀操䜜



内郚構造の芳点から芋るず、列削陀操䜜は特別な倀- 廃棄tombstoneを曞き蟌む操䜜です。 読み取りの結果ずしおそのような倀が取埗されるず、そのような倀は存圚しないかのようにスキップされたす。 圧瞮の結果ずしお、そのような倀は、叀い実際の倀を埐々に眮き換え、堎合によっおは完党に消えたす。 実際のデヌタを持぀列がさらに新しいタむムスタンプで衚瀺される堎合、それらは最終的にこれらの䞊曞きされた倀を粉砕したす。



トランザクション



Cassandraは、1぀のレコヌドのレベル、぀たり1぀のキヌを持぀列のセットでトランザクション性をサポヌトしたす。 4぀のACID芁件を満たす方法は次のずおりです。





あずがき



そこで、基本的な操䜜がどのように配眮されおいるかを調べたした-cassandraぞの倀の読み取りず曞き蟌み。



さらに、私の意芋では、重芁なリンクは次のずおりです。





リク゚ストスペルに関するコメントず蚘事を改善するためのアむデアを個人的なメッセヌゞで衚珟したす。



All Articles