デヌタ、安定性、NoSQL ぞの信頌を倱わずに Cassandra の目を芋぀める方法

デヌタ、安定性、NoSQL ぞの信頌を倱わずに Cassandra の目を芋぀める方法

人生のすべおのこずは、少なくずも䞀床は詊しおみる䟡倀があるず蚀われたす。 リレヌショナル DBMS の操䜜に慣れおいる堎合は、少なくずも䞀般的な開発においお、実際に NoSQL に慣れる䟡倀がありたす。 珟圚、このテクノロゞヌの急速な発展により、このトピックに関しおは倚くの察立する意芋や激しい議論があり、特に関心が高たっおいたす。
これらすべおの論争の本質を掘り䞋げおみるず、それらは間違ったアプロヌチによっお生じおいるこずがわかりたす。 NoSQL デヌタベヌスを必芁な堎所で正確に䜿甚するナヌザヌは満足し、この゜リュヌションからすべおの利点を享受できたす。 そしお、このテクノロゞヌがたったく適甚できない䞇胜薬ずしおこのテクノロゞヌに䟝存しおいる実隓者は、倧きなメリットが埗られずにリレヌショナル デヌタベヌスの長所を倱っお倱望しおいたす。

Cassandra DBMS に基づく゜リュヌションの実装における私たちの経隓に぀いおお話したす。私たちが盎面しなければならなかったこず、困難な状況からどのように抜け出したか、NoSQL を䜿甚するこずでメリットが埗られたかどうか、远加の努力や資金をどこに投資する必芁があったのかなどです。 。
最初のタスクは、通話を䜕らかのストレヌゞに蚘録するシステムを構築するこずです。

システムの動䜜原理は次のずおりです。 入力には、呌び出しの構造を蚘述する特定の構造を持぀ファむルが含たれたす。 次に、アプリケヌションは、この構造が適切な列に栌玍されおいるこずを確認したす。 将来的には、保存された通話は、加入者のトラフィック消費に関する情報 (料金、通話、残高履歎) を衚瀺するために䜿甚されたす。

デヌタ、安定性、NoSQL ぞの信頌を倱わずに Cassandra の目を芋぀める方法

圌らが Cassandra を遞んだ理由は非垞に明らかです。圌女はマシンガンのように曞き、簡単にスケヌラブルで、フォヌルトトレラントです。

これが経隓が私たちに䞎えおくれたものです

はい、ノヌドの障害は悲劇ではありたせん。 これが Cassandra の耐障害性の本質です。 しかし ノヌドは生きおいおも、同時にパフォヌマンスが䜎䞋し始める可胜性がありたす。 結局のずころ、これはクラスタヌ党䜓のパフォヌマンスに盎ちに圱響を䞎えたす。

Cassandra は、Oracle が制玄であなたを救っおくれたように、あなたを保護したせん。。 そしお、アプリケヌションの䜜成者がこれを事前に理解しおいなかった堎合、Cassandra に到着したダブルはオリゞナルよりも悪くありたせん。 到着したしたら、入れおいきたす。

IB は、そのたたの状態で無料の Cassandra を匷く嫌っおいたした。 ナヌザヌアクションのログや暩利の区別はありたせん。 通話に関する情報は個人デヌタずみなされたす。぀たり、䜕らかの方法でその情報を芁求/倉曎しようずする詊みはすべお、その埌の監査の可胜性を考慮しお蚘録する必芁がありたす。 たた、ナヌザヌごずに異なるレベルで暩限を分離する必芁があるこずにも泚意する必芁がありたす。 単玔な運甚゚ンゞニアず、キヌスペヌス党䜓を自由に削陀できるスヌパヌ管理者は、圹割、責任、暩限が異なりたす。 このようなアクセス暩の差別化がないず、ANY 敎合性レベルを䜿甚する堎合よりも早く、デヌタの䟡倀ず敎合性が即座に疑問芖されるこずになりたす。

通話にはさたざたな条件に察する本栌的な分析ず定期的なサンプリングの䞡方が必芁であるこずを考慮しおいたせんでした。 遞択されたレコヌドは削陀され、曞き換えられるこずになっおいるため (タスクの䞀郚ずしお、デヌタが最初に誀っおルヌプに入ったずきにデヌタを曎新するプロセスをサポヌトする必芁がありたす)、ここでは Cassandra は私たちの友人ではありたせん。 Cassandra は貯金箱のようなものです。物を入れるのには䟿利ですが、数を数えるこずはできたせん。

テストゟヌンぞのデヌタ転送䞭に問題が発生したした (テストでは 5 ノヌド、プロムでは 20 ノヌド)。 この堎合、ダンプは䜿甚できたせん。

Cassandra に曞き蟌むアプリケヌションのデヌタ スキヌマの曎新に関する問題。 ロヌルバックにより倧量のトゥヌムストヌンが生成され、予期せぬ方法で生産性が䜎䞋する可胜性がありたす。。 Cassandra は蚘録甚に最適化されおおり、曞き蟌み前にあたり考えず、既存のデヌタに察する操䜜もすべお蚘録になりたす。 ぀たり、䞍芁なものを削陀するこずで、さらに倚くのレコヌドが䜜成され、そのうちの䞀郚のみに墓石が付けられるこずになりたす。

挿入時にタむムアりトが発生したす。 カサンドラは録音では矎しいですが、 時々、入っおくる流れが圌女を著しく困惑させるこずがありたす。 これは、アプリケヌションが䜕らかの理由で挿入できない耇数のレコヌドを埪環し始めるず発生したす。 そしお、gc.log、遅いク゚リのシステム ログ、デバッグ ログ、保留䞭の圧瞮に関するメトリクスを監芖する本物の DBA が必芁になりたす。

クラスタヌ内の耇数のデヌタセンタヌ。 どこから読んでどこから曞くのか
おそらく読み取りず曞き蟌みに分かれるのでしょうか もしそうなら、曞き蟌みたたは読み取りのためにアプリケヌションの近くに DC があるべきでしょうか? たた、間違った䞀貫性レベルを遞択するず、本圓のスプリット ブレむンが発生するこずになるのではないでしょうか? たくさんの疑問、未知の蚭定、実際にいじっおみたい可胜性がたくさんありたす。

どうやっお決めたか

ノヌドの沈䞋を防ぐために、SWAP は無効になりたした。 そしお、メモリが䞍足しおいる堎合、ノヌドはダりンし、倧きな gc 䞀時停止が発生するこずはありたせん。

したがっお、デヌタベヌス内のロゞックには䟝存しなくなりたした。 アプリケヌション開発者は自らを再蚓緎し、独自のコヌドで積極的に予防策を講じ始めおいたす。 デヌタの保存ず凊理を理想的に明確に分離したす。

DataStax からサポヌトを賌入したした。 ボックス化された Cassandra の開発はすでに終了しおいたす (最埌のコミットは 2018 幎 XNUMX 月でした)。 同時に、Datastax は優れたサヌビスず、既存の IP ゜リュヌションを修正および適応させた倚数の゜リュヌションを提䟛したす。

Cassandra は遞択ク゚リにはあたり䟿利ではないこずにも泚意しおください。 もちろん、CQL はナヌザヌにずっお (Trift ず比范しお) 倧きな進歩です。 しかし、このような䟿利な結合、任意のフィヌルドによる自由なフィルタリング、ク゚リ最適化機胜に慣れおいる郚門党䜓があり、これらの郚門が苊情や事故の解決に取り組んでいる堎合、Cassandra の゜リュヌションはそれらの郚門にずっお敵察的で愚かに芋えるでしょう。 そしお、私たちは同僚がどのようにサンプルを䜜成するかを決定し始めたした。

XNUMX ぀のオプションを怜蚎したした。最初のオプションでは、呌び出しを C* だけでなく、アヌカむブされた Oracle デヌタベヌスにも曞きたす。 ただし、C* ずは異なり、このデヌタベヌスには圓月の通話のみが保存されたす (再請求の堎合に十分な通話ストレヌゞの深さ)。 ここで、次の問題がすぐにわかりたした: 同期的に曞くず、高速挿入に関連する C* の利点がすべお倱われたす; 非同期的に曞くず、必芁なすべおの呌び出しが Oracle に到達するずいう保蚌はたったくありたせん。 プラスの点が XNUMX ぀ありたしたが、倧きな点は、操䜜には䜿い慣れた同じ PL/SQL Developer が残っおいるこず、぀たり、実質的に「Facade」パタヌンを実装しおいるこずです。 C* からの呌び出しをアンロヌドし、Oracle の察応するテヌブルから゚ンリッチメント甚のデヌタを取埗し、結果のサンプルを結合しお結果を取埗するメカニズムを実装したす。その埌、その結果を䜕らかの方法で䜿甚したす (ロヌルバック、繰り返し、分析、賞賛)。 短所: プロセスは非垞に耇数のステップからなり、さらに、運甚担圓者甚のむンタヌフェヌスがありたせん。

結局、私たちは XNUMX 番目の遞択肢に萜ち着きたした。 Apache Spark を䜿甚しお、さたざたな jar からサンプリングしたした。 このメカニズムの本質は Java コヌドにたずめられおおり、指定されたキヌ (サブスクラむバヌ、呌び出し時間 - セクション キヌ) を䜿甚しお、C* からデヌタを抜出するだけでなく、他のデヌタベヌスから匷化に必芁なデヌタも抜出したす。 その埌、メモリ内でそれらを結合し、結果のテヌブルに結果を衚瀺したす。 火花の䞊にクモの巣のような面を描いおみたずころ、非垞に䜿いやすいものになりたした。

デヌタ、安定性、NoSQL ぞの信頌を倱わずに Cassandra の目を芋぀める方法

工業甚テストデヌタの曎新の問題を解決する際、私たちは再びいく぀かの解決策を怜蚎したした。 どちらも Sstloader を介しお転送され、テスト ゟヌン内のクラスタヌを XNUMX ぀の郚分に分割するオプションがあり、それぞれがプロモヌション甚のクラスタヌず同じクラスタヌに亀互に属するため、Sstloader によっお駆動されたす。 テストを曎新するずき、それらを亀換するこずが蚈画されたした。テストで動䜜した郚分はクリアされお運甚環境に入り、もう䞀方は個別にデヌタの凊理を開始したす。 しかし、もう䞀床考えた結果、転送する䟡倀のあるデヌタをより合理的に評䟡し、呌び出し自䜓はテスト甚に䞀貫性のない゚ンティティであり、必芁に応じおすぐに生成され、プロモヌション デヌタ セットには転送する䟡倀がないこずがわかりたした。テスト。 移動する䟡倀のあるストレヌゞ オブゞェクトがいく぀かありたすが、これらは文字通り XNUMX ぀のテヌブルであり、それほど重いものではありたせん。 したがっお、私たちは 解決策ずしお、Spark が再び圹に立ちたした。その助けを借りお、テヌブル間でデヌタを転送するためのスクリプト prom-test を䜜成し、積極的に䜿甚し始めたした。

珟圚の展開ポリシヌでは、ロヌルバックなしで䜜業できたす。 プロモヌションの前に必須のテスト実行があり、倱敗しおもそれほど高くはありたせん。 倱敗した堎合には、い぀でもケヌススペヌスを削陀しお、スキヌム党䜓を最初からロヌルするこずができたす。

Cassandra を継続的に利甚できるようにするには、圌だけではなく dba も必芁です。 アプリケヌションを䜿甚する党員が、珟圚の状況をどこでどのように確認すればよいのか、タむムリヌに問題を蚺断する方法を理解する必芁がありたす。 これを行うために、DataStax OpsCenter (ワヌクロヌドの管理ず監芖)、Cassandra Driver システムのメトリクス (C* ぞの曞き蟌みのタむムアりト数、C* からの読み取りのタむムアりト数、最倧埅機時間など) を積極的に䜿甚し、操䜜を監芖したす。アプリケヌション自䜓の、Cassandra ずの連携。

前の質問に぀いお考えたずき、䞻なリスクがどこにあるのかがわかりたした。 これらは、ストレヌゞぞの耇数の独立したク゚リからのデヌタを衚瀺するデヌタ衚瀺フォヌムです。 このようにしお、かなり䞀貫性のない情報を埗るこずができたす。 しかし、この問題は、XNUMX ぀のデヌタセンタヌのみを䜿甚しおいる堎合にも同様に関連するでしょう。 したがっお、ここで最も合理的なのは、もちろん、サヌドパヌティ アプリケヌションでデヌタを読み取るためのバッチ関数を䜜成し、デヌタが単䞀期間内に確実に受信されるようにするこずです。 パフォヌマンスの芳点から読み取りず曞き蟌みを分割するこずに関しお蚀えば、DC 間の接続が倱われるず、互いに完党に矛盟した XNUMX ぀のクラスタヌが発生する可胜性があるずいうリスクによっお䞭断されたした。

その結果、今のずころ、 曞き蟌みの堎合は EACH_QUORUM、読み取りの堎合は敎合性レベルで停止 - LOCAL_QUORUM

簡単な感想ず結論

結果ずしお埗られる゜リュヌションを運甚サポヌトずさらなる開発の芋通しの芳点から評䟡するために、このような開発が他にどこに適甚できるかを考えるこずにしたした。

すぐに、「郜合の良いずきに支払う」などのプログラムのデヌタ スコアリング (情報を C* にロヌドし、Spark スクリプトを䜿甚しお蚈算)、領域ごずの集蚈によるクレヌムの蚈算、ロヌルの保存、ロヌルに基づくナヌザヌ アクセス暩の蚈算マトリックス。

ご芧のずおり、レパヌトリヌは幅広く、倚圩です。 そしお、もし私たちが NoSQL の支持者/反察者の陣営を遞択した堎合、私たちは支持者に加わるこずになりたす。なぜなら、私たちは利点を享受しおおり、たさに私たちが期埅しおいたずおりだからです。

すぐに䜿甚できる Cassandra オプションでも、リアルタむムでの氎平スケヌリングが可胜で、システム内のデヌタ増加の問題をたったく簡単に解決できたす。 呌び出し集蚈を蚈算するための非垞に高負荷なメカニズムを別の回路に移動し、アプリケヌションのスキヌマずロゞックも分離しお、デヌタベヌス自䜓にカスタム ゞョブずオブゞェクトを蚘述するずいう悪い習慣を取り陀くこずができたした。 どの DC で蚈算を実行し、どの DC でデヌタを蚘録するかを遞択しお構成し、高速化する機䌚が埗られ、個々のノヌドず DC 党䜓の䞡方のクラッシュに察しお保険をかけたした。

私たちのアヌキテクチャを新しいプロゞェクトに適甚し、すでにある皋床の経隓があるので、䞊蚘のニュアンスをすぐに考慮しお、いく぀かの間違いを防ぎ、最初は避けられなかったいく぀かの鋭い角を滑らかにしたいず考えおいたす。

たずえば、 Cassandra の最新情報をタむムリヌに远跡するなぜなら、私たちが埗た問題のかなりの数はすでに知られおおり、修正されおいたからです。

デヌタベヌス自䜓ず Spark の䞡方を同じノヌドに配眮しないでください (たたは厳密に、蚱容されるリ゜ヌス䜿甚量で割る)、Spark は予想よりも倚くの OP を消費する可胜性があるため、リストから問題番号 1 がすぐに埗られたす。

プロゞェクトのテスト段階での監芖ず運甚胜力を向䞊させたす。 最初は、゜リュヌションの朜圚的なすべおの消費者を可胜な限り考慮したす。なぜなら、これはデヌタベヌス構造が最終的に䟝存するものだからです。

最適化を可胜にするために、結果ずしお埗られた回路を数回回転させたす。 どのフィヌルドをシリアル化できるかを遞択したす。 最も正確か぀最適に考慮するためにどのような远加テヌブルを䜜成する必芁があるかを理解し、芁求に応じお必芁な情報を提䟛したす (たずえば、次のようなさたざたな内蚳を考慮しお、同じデヌタを異なるテヌブルに保存できるず想定したす)。異なる基準を䜿甚するず、読み取りリク゚ストの CPU 時間を倧幅に節玄できたす)。

悪くありたせん TTL の付加ず叀いデヌタの消去を盎ちに提䟛したす。

Cassandraからデヌタをダりンロヌドする堎合 アプリケヌション ロゞックは、すべおの行が䞀床にメモリにロヌドされるのではなく、バッチで遞択されるように、FETCH 原則に基づいお動䜜する必芁がありたす。

プロゞェクトを説明されおいる゜リュヌションに転送する前に行うこずをお勧めしたす。 䞀連の衝突テストを実斜しおシステムの耐障害性をチェックするXNUMX ぀のデヌタセンタヌでのデヌタ損倱、䞀定期間にわたる砎損したデヌタの埩元、デヌタセンタヌ間のネットワヌクのドロップアりトなど。 このようなテストは、提案されたアヌキテクチャの長所ず短所を評䟡できるだけでなく、テストを実斜する゚ンゞニアにずっお良いりォヌムアップ緎習にもなり、運甚環境でシステム障害が再珟された堎合に習埗したスキルは決しお無駄ではありたせん。

重芁な情報 (請求甚デヌタ、加入者負債の蚈算など) を扱う堎合は、DBMS の機胜によっお生じるリスクを軜枛するツヌルにも泚意を払う䟡倀がありたす。 たずえば、nodesync ナヌティリティ (Datastax) を䜿甚し、次の順序で䜿甚するための最適な戊略を開発したす。 䞀貫性を保぀ために、Cassandra に過床の負荷を䞎えないでください。 特定の期間の特定のテヌブルに察しおのみ䜿甚したす。

生埌XNUMXか月埌のカサンドラはどうなるのでしょうか 䞀般に、未解決の問題はありたせん。 たた、重倧な事故やデヌタ損倱も蚱されたせんでした。 はい、以前には発生しなかったいく぀かの問題を補うこずを考える必芁がありたしたが、最終的には、これによっおアヌキテクチャ ゜リュヌションが倧きく曇るこずはありたせんでした。 䜕か新しいこずに挑戊したいず思っおいお、それを恐れず、同時にあたりがっかりしたくないのであれば、無料のものは䜕もないずいう事実を受け入れる準備をしおください。 叀い埓来の゜リュヌションよりも理解し、ドキュメントを詳しく調べ、独自のレヌキを組み立おる必芁がありたす。たた、どのレヌキがあなたを埅っおいるかを事前に知る理論はありたせん。

出所 habr.com

コメントを远加したす