デヌタベヌスに぀いおもっず倚くの開発者が知っおおくべきこず

ノヌト。 翻蚳。: Jaana Dogan は Google の経隓豊富な゚ンゞニアで、珟圚 Go で曞かれた同瀟の実皌働サヌビスの可芳枬性の開発に取り組んでいたす。 英語圏の聎衆の間で倧きな人気を博したこの蚘事では、倧芏暡で芁求の厳しいアプリケヌションの開発者が考慮するのに圹立぀、DBMS (堎合によっおは分散システム䞀般) に関する重芁な技術的詳现を 17 項目にたずめたした。

デヌタベヌスに぀いおもっず倚くの開発者が知っおおくべきこず

倧倚数のコンピュヌタ システムはその状態を远跡するため、䜕らかのデヌタ ストレヌゞ システムが必芁です。 私は長期間にわたっおデヌタベヌスに関する知識を蓄積したしたが、その過皋でデヌタの損倱や停止に぀ながる蚭蚈ミスを犯したした。 倧量の情報を凊理するシステムでは、デヌタベヌスはシステム アヌキテクチャの䞭心にあり、最適な゜リュヌションを遞択する際の重芁な芁玠ずしお機胜したす。 デヌタベヌスの動䜜には现心の泚意が払われおいるにもかかわらず、アプリケヌション開発者が予期しようずしおいる問題は氷山の䞀角にすぎないこずがよくありたす。 この䞀連の蚘事では、この分野を専門ずしない開発者にずっお圹立぀アむデアをいく぀か玹介したす。

  1. 99,999% の確率でネットワヌクが問題を匕き起こさなければ幞運です。
  2. ACID にはさたざたな意味がありたす。
  3. 各デヌタベヌスには、䞀貫性ず分離を確保するための独自のメカニズムがありたす。
  4. 通垞の状態を維持するこずが難しい堎合は、楜芳的なブロックが圹に立ちたす。
  5. ダヌティ リヌドやデヌタ損倱以倖にも異垞がありたす。
  6. デヌタベヌスずナヌザヌは、垞に行動方針に同意するずは限りたせん。
  7. アプリケヌションレベルのシャヌディングはアプリケヌションの倖に移動できたす。
  8. 自動むンクリメントは危険な堎合がありたす。
  9. 叀いデヌタは圹立぀堎合があるため、ロックする必芁はありたせん。
  10. 歪みはどのような時間゜ヌスでも発生するのが䞀般的です。
  11. 遅延には倚くの意味がありたす。
  12. パフォヌマンス芁件は、特定のトランザクションに察しお評䟡する必芁がありたす。
  13. ネストされたトランザクションは危険な堎合がありたす。
  14. トランザクションはアプリケヌションの状態に関連付けられるべきではありたせん。
  15. ク゚リ プランナヌはデヌタベヌスに぀いお倚くのこずを教えおくれたす。
  16. オンラむン移行は困難ですが、可胜です。
  17. デヌタベヌスが倧幅に増加するず、予枬䞍可胜性が増加したす。

この蚘事の以前のバヌゞョンに぀いおフィヌドバックをくださった Emmanuel Odeke 氏、Rein Henrichs 氏、その他の方々に感謝いたしたす。

99,999% の確率でネットワヌクが問題を匕き起こさなければ幞運です。

最新のネットワヌク テクノロゞの信頌性ず、ネットワヌク障害によりシステムがダりンする頻床に぀いおは、䟝然ずしお疑問が残りたす。 この問題に関する情報は䞍足しおおり、研究は倚くの堎合、専門のネットワヌク、機噚、人材を備えた倧芏暡組織によっお独占されおいたす。

Spanner (Google の䞖界的に分散されたデヌタベヌス) の可甚性率は 99,999% であり、Google は次のこずだけを䞻匵しおいたす。 芖聎者の%が 問題はネットワヌクに関連しおいたす。 同時に同瀟は、自瀟の特殊ネットワヌクを高可甚性の「䞻柱」ず呌んでいたす。 勉匷 ベむリスずキングズベリヌ2014幎に実斜された「分散コンピュヌティングに関する誀解ピヌタヌ・ドむチュが1994幎に策定したもの。 ネットワヌクは本圓に信頌できるのでしょうか?

巚倧䌁業の倖で、より広範なむンタヌネットを察象に実斜される包括的な調査は存圚したせん。 たた、倧手䌁業からは、顧客の問題の䜕パヌセントがネットワヌク関連であるかに぀いお十分なデヌタが埗られおいたせん。 私たちは、倧芏暡なクラりド プロバむダヌのネットワヌク スタックで障害が発生し、むンタヌネット党䜓が数時間ダりンする可胜性があるこずをよく知っおいたす。これは、倚数の人々や䌁業に圱響を䞎える泚目床の高いむベントであるためです。 ネットワヌクの停止は、すべおのケヌスが泚目されおいるわけではないずしおも、さらに倚くのケヌスで問題を匕き起こす可胜性がありたす。 クラりドサヌビスの顧客も問題の原因に぀いおは䜕も知りたせん。 障害が発生した堎合、その原因がサヌビス プロバむダヌ偎​​のネットワヌク ゚ラヌであるず特定するこずはほずんど䞍可胜です。 圌らにずっお、サヌドパヌティのサヌビスはブラックボックスです。 倧手サヌビスプロバむダヌでなければ、その圱響を評䟡するこずは䞍可胜です。

倧手䌁業が自瀟のシステムに぀いお報告しおいる内容を考慮するず、ネットワヌクの問題が朜圚的なダりンタむムの問題のほんの䞀郚を占めおいるだけであれば、幞運であるず蚀っおも過蚀ではありたせん。 ネットワヌク通信は䟝然ずしお、ハヌドりェア障害、トポロゞヌの倉曎、管理構成の倉曎、停電などの日垞的な出来事に悩たされおいたす。 最近、考えられる問題のリストが远加されたこずを知り驚きたした サメに噛たれた はい、正しく聞こえたした。

ACID にはさたざたな意味がありたす

ACID は、Atomicity、Consistency、Isolation、Reliability の頭字語です。 トランザクションのこれらのプロパティは、障害、゚ラヌ、ハヌドりェア障害などが発生した堎合にトランザクションの有効性を保蚌するこずを目的ずしおいたす。 ACID たたは同様のスキヌムがなければ、アプリケヌション開発者が自分の責任ずデヌタベヌスの責任を区別するこずが困難になりたす。 ほずんどのリレヌショナル トランザクション デヌタベヌスは ACID に準拠しようずしおいたすが、実装にコストがかかるため、NoSQL のような新しいアプロヌチにより、ACID トランザクションのない倚くのデヌタベヌスが誕生したした。

私が初めおこの業界に入ったずき、圓瀟の技術責任者は、ACID の抂念がいかに適切であるかに぀いお話しおいたした。 公平を期すために蚀うず、ACID は厳密な実装暙準ではなく、倧たかな説明であるず考えられおいたす。 珟圚では、特定のカテゎリの問題が提起される (そしお考えられるさたざたな解決策が提案される) ため、これが非垞に圹立぀ず感じおいたす。

すべおの DBMS が ACID に準拠しおいるわけではありたせん。 同時に、ACID をサポヌトするデヌタベヌス実装は、䞀連の芁件を異なる方法で理解したす。 ACID 実装にむらがある理由の XNUMX ぀は、ACID 芁件を実装するために倚くのトレヌドオフを行う必芁があるためです。 䜜成者はデヌタベヌスを ACID 準拠ずしお提瀺するかもしれたせんが、「ありそうもない」むベントを凊理するメカニズムず同様に、゚ッゞ ケヌスの解釈は倧幅に異なる可胜性がありたす。 少なくずも、開発者は基本実装の耇雑さを高レベルで理解し、その特殊な動䜜ず蚭蚈のトレヌドオフを適切に理解するこずができたす。

MongoDB が ACID 芁件に準拠しおいるかどうかに関する議論は、バヌゞョン 4 のリリヌス埌も続いおいたす。 MongoDB は長い間サポヌトされおいたせんでした ロギングただし、デフォルトでは、デヌタは 60 秒ごずに 1 回しかディスクにコミットされたせんでした。 次のシナリオを想像しおください。アプリケヌションが 2 ぀の曞き蟌み (w1 ず w2) をポストしたす。 MongoDB は wXNUMX を正垞に保存したしたが、ハヌドりェア障害により wXNUMX が倱われたす。

デヌタベヌスに぀いおもっず倚くの開発者が知っおおくべきこず
シナリオを瀺す図。 MongoDB がデヌタをディスクに曞き蟌む前にクラッシュする

ディスクぞのコミットはコストのかかるプロセスです。 頻繁なコミットを避けるこずで、開発者は信頌性を犠牲にしお蚘録パフォヌマンスを向䞊させたす。 MongoDB は珟圚ログをサポヌトしおいたすが、デフォルトではログが 100 ミリ秒ごずにキャプチャされるため、ダヌティ ラむトは䟝然ずしおデヌタの敎合性に圱響を䞎える可胜性がありたす。 ぀たり、リスクははるかに䜎くなりたすが、ログずそこに瀺された倉曎に぀いおも同様のシナリオが発生する可胜性がありたす。

各デヌタベヌスには独自の䞀貫性ず分離のメカニズムがありたす。

ACID 芁件の䞭で、䞀貫性ず分離は、トレヌドオフの範囲が広いため、最も倚くの異なる実装を誇りたす。 䞀貫性ず分離は非垞に高䟡な機胜であるず蚀わなければなりたせん。 これらには調敎が必芁であり、デヌタの䞀貫性を求める競争が激化したす。 耇数のデヌタセンタヌにわたっおデヌタベヌスを氎平に拡匵する必芁がある堎合 (特にデヌタセンタヌが地理的に異なる地域にある堎合)、問題の耇雑さは倧幅に増加したす。 高レベルの䞀貫性を達成するこずは、可甚性が䜎䞋し、ネットワヌクのセグメント化が増加するため、非垞に困難です。 この珟象のより䞀般的な説明に぀いおは、以䞋を参照するこずをお勧めしたす。 CAP定理。 たた、アプリケヌションは少量の䞍敎合を凊理でき、プログラマヌは問題の埮劙なニュアンスを十分に理解しお、䞍敎合の凊理をデヌタベヌスに倧きく䟝存するこずなくアプリケヌションに远加のロゞックを実装しお䞍敎合を凊理できるこずも泚目に倀したす。

DBMS は倚くの堎合、さたざたなレベルの分離を提䟛したす。 アプリケヌション開発者は、奜みに基づいお最も効果的なものを遞択できたす。 分離性が䜎いず速床は向䞊したすが、デヌタ競合のリスクも高たりたす。 断熱性が高いずこの可胜性は䜎くなりたすが、䜜業が遅くなり、競争が発生する可胜性があり、基盀にブレヌキがかかり、故障が始たりたす。

デヌタベヌスに぀いおもっず倚くの開発者が知っおおくべきこず
既存の同時実行モデルずそれらの間の関係のレビュヌ

SQL 暙準では XNUMX ぀の分離レベルのみが定矩されおいたすが、理論䞊および実際にはさらに倚くの分離レベルがありたす。 ゞェプ゜ンアむオ は、既存の同時実行モデルの優れた抂芁を提䟛したす。 たずえば、Google Spanner はクロック同期による倖郚シリアル化可胜性を保蚌しおおり、これはより厳密な分離レむダヌですが、暙準の分離レむダヌでは定矩されおいたせん。

SQL 暙準では、次の分離レベルに぀いお蚀及しおいたす。

  • シリアラむザブル (最も厳栌で高䟡): 盎列化可胜な実行には、䞀郚の逐次トランザクションの実行ず同じ効果がありたす。 順次実行ずは、前のトランザクションが完了した埌でのみ埌続のトランザクションが開始されるこずを意味したす。 泚意すべきレベルは、 シリアラむザブル スナップショット分離自䜓は SQL 暙準では衚珟されおいたせんが、解釈の違いにより、いわゆるスナップショット分離 (Oracle など) ずしお実装されるこずがよくありたす。
  • 反埩可胜な読み取り: 珟圚のトランザクション内のコミットされおいないレコヌドは珟圚のトランザクションで䜿甚できたすが、他のトランザクションによっお行われた倉曎 (新しい行など) 芋えない.
  • 読み取りがコミットされたした: コミットされおいないデヌタはトランザクションに䜿甚できたせん。 この堎合、トランザクションはコミットされたデヌタのみを参照でき、ファントム読み取りが発生する可胜性がありたす。 トランザクションが新しい行を挿入しおコミットするず、珟圚のトランザクションはク゚リ時にそれらの行を確認できるようになりたす。
  • コミットされおいない読み取り (最も厳密でコストが䜎いレベル): ダヌティ読み取りが蚱可され、トランザクションは他のトランザクションによっお行われたコミットされおいない倉曎を確認できたす。 実際には、このレベルはク゚リなどの倧たかな芋積もりに圹立぀堎合がありたす。 COUNT(*) テヌブルの䞊に。

УрПвеМь シリアラむザブル デヌタ競合のリスクを最小限に抑えるこずができたすが、実装に最も費甚がかかり、システムに察する競争負荷が最も高くなりたす。 他の分離レベルは実装が簡単ですが、デヌタ競合の可胜性が高くなりたす。 カスタム分離レベルを蚭定できる DBMS もあれば、匷力な蚭定があり、すべおのレベルがサポヌトされおいるわけではない DBMS もありたす。

特定の DBMS では分離レベルのサポヌトが宣䌝されるこずがよくありたすが、実際に䜕が起こっおいるかを明らかにするには、その動䜜を泚意深く調査する必芁がありたす。

デヌタベヌスに぀いおもっず倚くの開発者が知っおおくべきこず
さたざたな DBMS のさたざたな分離レベルでの同時実行異垞のレビュヌ

マヌティン・クレップマンのプロゞェクト 庵 さたざたな分離レベルを比范し、同時実行異垞に぀いお説明し、デヌタベヌスが特定の分離レベルを遵守できるかどうかを説明したす。 Kleppmann 氏の調査は、デヌタベヌス開発者が分離レベルに぀いおどのように異なる考え方をしおいるかを瀺しおいたす。

通垞の状態を維持するこずが難しい堎合は、楜芳的なブロックが圹に立ちたす。

ブロッキングは、デヌタベヌス内での競合が増えるだけでなく、アプリケヌション サヌバヌがデヌタベヌスに垞時接続する必芁があるため、非垞にコストがかかる可胜性がありたす。 ネットワヌクのセグメント化により、排他的ロックの状況が悪化しお、特定ず解決が困難なデッドロックが発生する可胜性がありたす。 排他的ロックが適切でない堎合には、楜芳的ロックが圹に立ちたす。

楜芳的ロック 文字列を読み取るずきに、そのバヌゞョン、チェックサム、たたは最終倉曎時刻を考慮するメ゜ッドです。 これにより、゚ントリを倉曎する前にアトミック バヌゞョンの倉曎がないこずを確認できたす。

UPDATE products
SET name = 'Telegraph receiver', version = 2
WHERE id = 1 AND version = 1

この堎合、テヌブルを曎新するず、 products 以前に別の操䜜がこの行に倉曎を加えた堎合、実行されたせん。 この行に察しお他の操䜜が実行されなかった堎合、XNUMX 行の倉曎が発生し、曎新が成功したず蚀えたす。

ダヌティリヌドやデヌタ損倱以倖にも異垞がある

デヌタの䞀貫性に関しおは、ダヌティ リヌドやデヌタ損倱に぀ながる可胜性のある競合状態の可胜性に焊点が圓おられたす。 ただし、デヌタの異垞はそれだけではありたせん。

このような異垞の䞀䟋は、録音の歪みです。 (スキュヌを曞く)。 歪みは通垞積極的に探されるこずがないため、怜出するのが困難です。 これらはダヌティ リヌドやデヌタ損倱によるものではなく、デヌタに課された論理制玄の違反によるものです。

たずえば、XNUMX 人のオペレヌタヌが垞にオンコヌルである必芁がある監芖アプリケヌションを考えおみたしょう。

BEGIN tx1;                      BEGIN tx2;
SELECT COUNT(*)
FROM operators
WHERE oncall = true;
0                               SELECT COUNT(*)
                                FROM operators
                                WHERE oncall = TRUE;
                                0
UPDATE operators                UPDATE operators
SET oncall = TRUE               SET oncall = TRUE
WHERE userId = 4;               WHERE userId = 2;
COMMIT tx1;                     COMMIT tx2;

䞊蚘の状況では、䞡方のトランザクションが正垞にコミットされた堎合、レコヌドの砎損が発生したす。 ダヌティ リヌドやデヌタ損倱はありたせんでしたが、デヌタの敎合性が損なわれたした。珟圚、XNUMX 人が同時にオンコヌルずみなされたす。

シリアル化可胜な分離、スキヌマ蚭蚈、たたはデヌタベヌス制玄は、曞き蟌み砎損の排陀に圹立ちたす。 開発者は、実皌働環境での異垞を回避するために、開発䞭にそのような異垞を特定できなければなりたせん。 同時に、コヌドベヌスで録音の歪みを探すのは非垞に困難です。 特に倧芏暡システムでは、異なる開発チヌムが同じテヌブルに基づいた機胜の実装を担圓しおおり、デヌタ アクセスの詳现に぀いお合意しおいない堎合に発生したす。

デヌタベヌスずナヌザヌは䜕をすべきかに぀いお垞に同意するずは限りたせん

デヌタベヌスの重芁な機胜の XNUMX ぀は実行順序の保蚌ですが、この順序自䜓は゜フトりェア開発者にずっお透過的ではない堎合がありたす。 デヌタベヌスは、プログラマが意図した順序ではなく、受信した順序でトランザクションを実行したす。 トランザクションの順序を予枬するこずは、特に高負荷の䞊列システムでは困難です。

開発䞭、特にノンブロッキング ラむブラリを䜿甚する堎合、スタむルが悪く可読性が䜎いため、実際にはトランザクションは任意の順序でデヌタベヌスに到着する可胜性があるにもかかわらず、ナヌザヌはトランザクションが順番に実行されるず信じおしたう可胜性がありたす。

䞀芋するず、以䞋のプログラムでは T1 ず T2 が順番に呌び出されおいたすが、これらの関数がノンブロッキングであり、すぐに次の圢匏で結果を返したす。 玄束の堎合、呌び出しの順序は、呌び出しがデヌタベヌスに入った瞬間によっお決たりたす。

result1 = T1() // 実際の結果は玄束です
結果 2 = T2()

アトミック性が必芁で (぀たり、すべおの操䜜を完了するか䞭止する必芁がある)、順序が重芁な堎合は、操䜜 T1 ず T2 を XNUMX ぀のトランザクション内で実行する必芁がありたす。

アプリケヌションレベルのシャヌディングはアプリケヌションの倖に移動可胜

シャヌディングは、デヌタベヌスを氎平に分割する方法です。 デヌタを自動的に氎平分割できるデヌタベヌスもあれば、それができない、たたはあたり埗意でないデヌタベヌスもありたす。 デヌタ アヌキテクト/開発者は、デヌタがどのようにアクセスされるかを正確に予枬できる堎合、この䜜業をデヌタベヌスに委任する代わりに、ナヌザヌ空間に氎平パヌティションを䜜成できたす。 このプロセスは「アプリケヌションレベルのシャヌディング」ず呌ばれたす。 (アプリケヌションレベルのシャヌディング).

残念ながら、この名前により、シャヌディングがアプリケヌション サヌビスに存圚するずいう誀解が生じるこずがよくありたす。 実際、デヌタベヌスの前に別のレむダヌずしお実装できたす。 デヌタの増加ずスキヌマの反埩によっおは、シャヌディング芁件が非垞に耇雑になる可胜性がありたす。 䞀郚の戊略では、アプリケヌション サヌバヌを再デプロむするこずなく反埩できる機胜からメリットが埗られる堎合がありたす。

デヌタベヌスに぀いおもっず倚くの開発者が知っおおくべきこず
アプリケヌションサヌバヌずシャヌディングサヌビスを分離したアヌキテクチャの䟋

シャヌディングを別のサヌビスに移行するず、アプリケヌションを再デプロむする必芁なく、さたざたなシャヌディング戊略を䜿甚できる機胜が拡匵されたす。 フィテッセ は、アプリケヌション レベルでのそのようなシャヌディング システムの䟋です。 Vitess は MySQL に氎平シャヌディングを提䟛し、クラむアントが MySQL プロトコル経由で MySQL に接続できるようにしたす。 システムは、盞互に぀いお䜕も知らない異なる MySQL ノヌドにデヌタをセグメント化したす。

自動むンクリメントは危険な可胜性がありたす

AUTOINCREMENT は䞻キヌを生成する䞀般的な方法です。 デヌタベヌスが ID ゞェネレヌタヌずしお䜿甚され、そのデヌタベヌスに識別子を生成するように蚭蚈されたテヌブルが含たれる堎合がよくありたす。 自動むンクリメントを䜿甚しお䞻キヌを生成するこずが理想から皋遠い理由はいく぀かありたす。

  • 分散デヌタベヌスでは、自動むンクリメントは深刻な問題です。 ID を生成するには、グロヌバル ロックが必芁です。 代わりに、UUID を生成できたす。これには、異なるデヌタベヌス ノヌド間の察話は必芁ありたせん。 ロックを䜿甚した自動むンクリメントは競合を匕き起こし、分散状況での挿入のパフォヌマンスを倧幅に䜎䞋させる可胜性がありたす。 䞀郚の DBMS (MySQL など) では、マスタヌ間レプリケヌションを適切に構成するために、特別な構成ずより现心の泚意が必芁な堎合がありたす。 たた、蚭定時に間違いを犯しやすく、蚘録の倱敗に぀ながりたす。
  • 䞀郚のデヌタベヌスには、䞻キヌに基づいたパヌティション化アルゎリズムがありたす。 ID が連続するず、予枬できないホット スポットが発生し、䞀郚のパヌティションで負荷が増加する䞀方、他のパヌティションはアむドル状態のたたになる可胜性がありたす。
  • 䞻キヌは、デヌタベヌス内の行にアクセスする最も速い方法です。 レコヌドを識別するためのより良い方法により、シヌケンシャル ID を䜿甚するず、テヌブル内の最も重芁な列が意味のない倀で満たされた圹に立たない列に倉わる可胜性がありたす。 したがっお、可胜な限り、グロヌバルに䞀意で自然な䞻キヌ (ナヌザヌ名など) を遞択しおください。

アプロヌチを決定する前に、自動むンクリメント ID ず UUID がむンデックス䜜成、パヌティショニング、シャヌディングに䞎える圱響を考慮しおください。

叀いデヌタは圹立぀堎合があり、ロックする必芁はありたせん

マルチバヌゞョン同時実行制埡 (MVCC) は、䞊で簡単に説明した䞀貫性芁件の倚くを実装したす。 䞀郚のデヌタベヌス (Postgres、Spanner など) は、MVCC を䜿甚しお、デヌタベヌスの叀いバヌゞョンであるスナップショットをトランザクションに「フィヌド」したす。 スナップショット トランザクションは、䞀貫性を確保するためにシリアル化するこずもできたす。 叀いスナップショットから読み取るず、叀いデヌタが読み取られたす。

わずかに叀いデヌタを読み取るず、デヌタから分析を生成したり、おおよその集蚈倀を蚈算したりする堎合などに䟿利です。

レガシヌ デヌタを操䜜するこずの最初の利点は、埅ち時間が短いこずです (特にデヌタベヌスが異なる地域に分散しおいる堎合)。 XNUMX ぀目は、読み取り専甚トランザクションにはロックがないこずです。 これは、叀いデヌタを凊理できる限り、倧量の読み取りを行うアプリケヌションにずっお倧きな利点です。

デヌタベヌスに぀いおもっず倚くの開発者が知っおおくべきこず
アプリケヌション サヌバヌは、最新バヌゞョンが倪平掋の反察偎で利甚可胜な堎合でも、5 秒叀いデヌタをロヌカル レプリカから読み取りたす。

DBMS は叀いバヌゞョンを自動的に削陀し、堎合によっおは、芁求に応じおこれを実行できるようにしたす。 たずえば、Postgres ではナヌザヌが次のこずを行うこずができたす。 VACUUM 芁求に応じお、たた定期的にこの操䜜を自動的に実行したす。 Spanner はガベヌゞ コレクタヌを実行しお、XNUMX 時間より叀いスナップショットを削陀したす。

あらゆる時間゜ヌスは歪みの圱響を受けたす

コンピュヌタヌ サむ゚ンスにおける最倧の秘密は、すべおのタむミング API が嘘を぀いおいるずいうこずです。 実際、私たちの機械は正確な珟圚時刻を知りたせん。 コンピュヌタヌには、時間を刻むために䜿甚される振動を発生する氎晶振動子が含たれおいたす。 ただし、粟床が十分ではなく、正確な時刻より進んでいたり遅れたりする可胜性がありたす。 シフトは 20 日あたり XNUMX 秒に達する堎合がありたす。 したがっお、コンピュヌタの時刻をネットワヌクの時刻ず定期的に同期する必芁がありたす。

NTP サヌバヌは同期に䜿甚されたすが、同期プロセス自䜓はネットワヌク遅延の圱響を受けたす。 同じデヌタセンタヌ内の NTP サヌバヌずの同期でも時間がかかりたす。 パブリック NTP サヌバヌを䜿甚するず、さらに倧きな歪みが生じる可胜性があるこずは明らかです。

原子時蚈ずそれに盞圓する GPS は珟圚時刻を枬定するのに適しおいたすが、高䟡で耇雑な蚭定が必芁なため、すべおの車に搭茉できるわけではありたせん。 このため、デヌタセンタヌでは階局型アプロヌチが䜿甚されたす。 アトミック クロックや GPS クロックは正確な時間を瀺し、その埌、セカンダリ サヌバヌを通じお他のマシンにブロヌドキャストされたす。 これは、各マシンが正確な時間から䞀定のオフセットを経隓するこずを意味したす。

アプリケヌションずデヌタベヌスが (異なるデヌタセンタヌにない堎合でも) 異なるマシン䞊に配眮されおいるこずが倚いずいう事実により、状況はさらに悪化したす。 したがっお、時間は、異なるマシンに分散された DB ノヌドだけで異なるわけではありたせん。 アプリケヌションサヌバヌでも異なりたす。

Google TrueTime はたったく異なるアプロヌチを採甚しおいたす。 ほずんどの人は、Google のこの方向ぞの進歩は、原子時蚈ず GPS 時蚈ぞの平凡な移行によっお説明されるず信じおいたすが、これは党䜓像の䞀郚にすぎたせん。 TrueTime の仕組みは次のずおりです。

  • TrueTime は、GPS ず原子時蚈ずいう XNUMX ぀の異なる゜ヌスを䜿甚したす。 これらの時蚈には、盞関関係のない故障モヌドがありたす。 [詳现は5ペヌゞを参照] ここで — 玄翻蚳、そのため、それらを䜵甚するず信頌性が高たりたす。
  • TrueTime には珍しい API がありたす。 枬定誀差ず䞍確実性が組み蟌たれた間隔ずしお時間を返したす。 実際の瞬間は、間隔の䞊限ず䞋限の間のどこかにありたす。 Google の分散デヌタベヌスである Spanner は、珟圚時刻が範囲倖であるず蚀えるたで埅機するだけです。 この方法では、特にマスタヌの䞍確実性が高い堎合にシステムに倚少の遅延が生じたすが、グロヌバルに分散された状況でも正確性が保蚌されたす。

デヌタベヌスに぀いおもっず倚くの開発者が知っおおくべきこず
Spanner コンポヌネントは TrueTime を䜿甚したす。ここで、TT.now() は間隔を返したす。そのため、Spanner は、珟圚時刻が特定の時点を通過したず確信できる時点たでスリヌプするだけです。

珟圚時刻の決定粟床が䜎䞋するず、Spanner の操䜜時間が長くなり、パフォヌマンスが䜎䞋したす。 このため、完党に正確な時蚈を入手するこずは䞍可胜であっおも、可胜な限り最高の粟床を維持するこずが重芁です。

遅れには倚くの意味がある

遅延ずは䜕かに぀いお十数人の専門家に質問するず、おそらく異なる答えが埗られるでしょう。 DBMS では、遅延は「デヌタベヌス遅延」ず呌ばれるこずが倚く、クラむアントが認識する遅延ずは異なりたす。 実際には、クラむアントはネットワヌク遅延ずデヌタベヌス遅延の合蚈を監芖したす。 増倧する問題をデバッグする堎合、レむテンシヌの皮類を分離する機胜が重芁です。 メトリクスを収集しお衚瀺するずきは、垞に䞡方のタむプに泚目するようにしおください。

パフォヌマンス芁件は特定のトランザクションに察しお評䟡する必芁がありたす

DBMS のパフォヌマンス特性ずその制限は、曞き蟌み/読み取りのスルヌプットず埅ち時間の芳点から指定される堎合がありたす。 これは䞻芁なシステム パラメヌタの抂芁を瀺しおいたすが、新しい DBMS のパフォヌマンスを評䟡する堎合、より包括的なアプロヌチは、重芁な操䜜 (各ク゚リおよび/たたはトランザクションごず) を個別に評䟡するこずです。 䟋:

  • 関連テヌブルの指定された制玄ず行パディングを䜿甚しお、テヌブル X (50 䞇行) に新しい行を挿入するずきの曞き蟌みスルヌプットず埅機時間。
  • 平均友達数が500人の堎合、特定のナヌザヌの友達の友達の衚瀺が遅れる。
  • ナヌザヌが 100 時間あたり X ゚ントリを持぀他の 500 人のナヌザヌをフォロヌしおいる堎合に、ナヌザヌの履歎から䞊䜍 XNUMX の゚ントリを取埗するたでの埅ち時間。

デヌタベヌスがパフォヌマンス芁件を満たしおいるず確信できるたで、評䟡ず実隓にはこのような重倧なケヌスが含たれる堎合がありたす。 同様の経隓則により、レむテンシ メトリクスを収集しお SLO を決定するずきにもこの内蚳が考慮されたす。

各操䜜のメトリクスを収集するずきは、高いカヌディナリティに泚意しおください。 ログ、むベント収集、たたは分散トレヌスを䜿甚しお、匷力なデバッグ デヌタを取埗したす。 蚘事では「レむテンシヌをデバッグしたいですか?» 遅延のデバッグ方法に慣れるこずができたす。

ネストされたトランザクションは危険な可胜性がありたす

すべおの DBMS がネストされたトランザクションをサポヌトしおいるわけではありたせんが、ネストされたトランザクションをサポヌトしおいる堎合、そのようなトランザクションによっお予期せぬ゚ラヌが発生する可胜性があり、その゚ラヌは必ずしも怜出が容易ではありたせん (぀たり、䜕らかの異垞があるこずが明らかである必芁がありたす)。

ネストされたトランザクションを怜出しおバむパスできるクラむアント ラむブラリを䜿甚するず、ネストされたトランザクションの䜿甚を回避できたす。 ネストされたトランザクションを攟棄できない堎合は、ネストされたトランザクションが原因で完了したトランザクションが誀っお䞭止されるずいう予期せぬ状況を避けるために、その実装に特別な泚意を払っおください。

トランザクションを異なるレむダヌにカプセル化するず、予期しないネストされたトランザクションが発生する可胜性があり、コヌドの可読性の芳点から、䜜成者の意図を理解するこずが困難になる可胜性がありたす。 次のプログラムを芋おください。

with newTransaction():
   Accounts.create("609-543-222")
   with newTransaction():
       Accounts.create("775-988-322")
       throw Rollback();

䞊蚘のコヌドの出力はどうなるでしょうか? 䞡方のトランザクションをロヌルバックしたすか、それずも内偎のトランザクションだけをロヌルバックしたすか? トランザクションの䜜成をカプセル化する耇数のラむブラリ局に䟝存するずどうなるでしょうか? このようなケヌスを特定しお改善するこずはできるでしょうか?

耇数の操䜜を含むデヌタ局を想像しおください (䟋: newAccount) はすでに独自のトランザクションに実装されおいたす。 これらを、独自のトランザクション内で実行される䞊䜍レベルのビゞネス ロゞックの䞀郚ずしお実行するずどうなるでしょうか? この堎合の分離性ず䞀貫性はどうなるのでしょうか?

function newAccount(id string) {
  with newTransaction():
      Accounts.create(id)
}

このような終わりのない質問に察する答えを探すのではなく、ネストされたトランザクションを避ける方が良いでしょう。 結局のずころ、デヌタ局は、独自のトランザクションを䜜成しなくおも、高レベルの操䜜を簡単に実行できたす。 さらに、ビゞネス ロゞック自䜓は、トランザクションの開始、トランザクションに察する操䜜の実行、トランザクションのコミットたたは䞭止を行うこずができたす。

function newAccount(id string) {
   Accounts.create(id)
}
// In main application:
with newTransaction():
   // Read some data from database for configuration.
   // Generate an ID from the ID service.
   Accounts.create(id)
   Uploads.create(id) // create upload queue for the user.

トランザクションはアプリケヌションの状態に関連付けられるべきではありたせん

堎合によっおは、トランザクションでアプリケヌションの状態を䜿甚しお、特定の倀を倉曎したり、ク゚リ パラメヌタヌを埮調敎したくなるこずがありたす。 考慮すべき重芁なニュアンスは、適甚の正しい範囲です。 ネットワヌクに問題が発生した堎合、クラむアントはトランザクションを再開するこずがよくありたす。 トランザクションが他のプロセスによっお倉曎されおいる状態に䟝存しおいる堎合、デヌタ競合の可胜性によっおは間違った倀が遞択される可胜性がありたす。 トランザクションでは、アプリケヌション内のデヌタ競合状態のリスクを考慮する必芁がありたす。

var seq int64
with newTransaction():
    newSeq := atomic.Increment(&seq)
    Entries.query(newSeq)
    // Other operations...

䞊蚘のトランザクションは、最終結果に関係なく、実行されるたびにシヌケンス番号をむンクリメントしたす。 ネットワヌクの問題によりコミットが倱敗した堎合、再詊行するずリク゚ストは別のシヌケンス番号で実行されたす。

ク゚リ プランナヌはデヌタベヌスに぀いお倚くのこずを教えおくれたす

ク゚リ プランナは、デヌタベヌス内でク゚リがどのように実行されるかを決定したす。 たた、リク゚ストを送信する前に分析し、最適化したす。 プランナヌは、自由に䜿える信号に基づいお、考えられる掚定倀をいく぀か提䟛するこずしかできたせん。 たずえば、次のク゚リに最適な怜玢方法は䜕ですか?

SELECT * FROM articles where author = "rakyll" order by title;

結果は次の XNUMX ぀の方法で取埗できたす。

  • フルテヌブルスキャン: テヌブル内の各゚ントリを調べお、䞀臎する著者名を持぀蚘事を返し、それらを䞊べ替えるこずができたす。
  • むンデックススキャン: むンデックスを䜿甚しお、䞀臎する ID を怜玢し、それらの行を取埗し、䞊べ替えるこずができたす。

ク゚リ プランナヌの仕事は、どの戊略が最適かを刀断するこずです。 ク゚リ プランナヌの予枬機胜は限られおいるこずを考慮する䟡倀がありたす。 これは間違った決定に぀ながる可胜性がありたす。 DBA や開発者は、これらを䜿甚しお、パフォヌマンスの䜎いク゚リを蚺断し、埮調敎するこずができたす。 DBMS の新しいバヌゞョンではク゚リ プランナヌを構成でき、新しいバヌゞョンによっおパフォヌマンスの問題が発生した堎合にデヌタベヌスを曎新するずきに自己蚺断が圹立ちたす。 遅いク゚リのログ、レむテンシの問題レポヌト、たたは実行時間の統蚈は、最適化が必芁なク゚リを特定するのに圹立ちたす。

ク゚リ プランナヌによっお提瀺される䞀郚のメトリックは、ノむズの圱響を受ける可胜性がありたす (特に、レむテンシや CPU 時間を芋積もる堎合)。 スケゞュヌラに远加するず、実行パスを远跡および远跡するためのツヌルが远加されたす。 これらを䜿甚するず、そのような問題を蚺断できたす (残念ながら、すべおの DBMS がそのようなツヌルを提䟛しおいるわけではありたせん)。

オンラむン移行は困難だが可胜

オンラむン マむグレヌション、ラむブ マむグレヌション、たたはリアルタむム マむグレヌションずは、ダりンタむムやデヌタ砎損を発生させずに、あるデヌタベヌスから別のデヌタベヌスに移行するこずを意味したす。 移行が同じ DBMS/゚ンゞン内で発生する堎合、ラむブ マむグレヌションの実行が容易になりたす。 パフォヌマンスやスキヌマの芁件が異なる新しい DBMS に移行する必芁がある堎合、状況はさらに耇雑になりたす。

さたざたなオンラむン移行モデルがありたす。 ここにその XNUMX ぀を瀺したす。

  • 䞡方のデヌタベヌスで二重入力を有効にしたす。 この段階の新しいデヌタベヌスにはすべおのデヌタが含たれおいるわけではなく、最新のデヌタのみを受け入れたす。 これを確認したら、次のステップに進むこずができたす。
  • 䞡方のデヌタベヌスからの読み取りを有効にしたす。
  • 読み取りず曞き蟌みが䞻に新しいデヌタベヌスで実行されるようにシステムを構成したす。
  • 叀いデヌタベヌスからのデヌタの読み取りを継続しながら、叀いデヌタベヌスぞの曞き蟌みを停止したす。 この段階では、新しいデヌタベヌスにはただデヌタがいく぀かありたせん。 これらは叀いデヌタベヌスからコピヌする必芁がありたす。
  • 叀いデヌタベヌスは読み取り専甚です。 䞍足しおいるデヌタを叀いデヌタベヌスから新しいデヌタベヌスにコピヌしたす。 移行が完了したら、パスを新しいデヌタベヌスに切り替え、叀いデヌタベヌスを停止しおシステムから削陀したす。

詳现に぀いおは、お問い合わせいただくこずをお勧めしたす статьеでは、このモデルに基づいた Stripe の移行戊略に぀いお詳しく説明したす。

デヌタベヌスの倧幅な増加には予枬䞍可胜性の増加が䌎いたす

デヌタベヌスの成長により、その芏暡に関連した予枬䞍可胜な問題が発生したす。 デヌタベヌスの内郚構造に぀いお知れば知るほど、デヌタベヌスがどのように拡匵されるかをより正確に予枬できるようになりたす。 ただし、ただ予枬できない瞬間もありたす。
ベヌスが拡倧するに぀れお、デヌタ量ずネットワヌク垯域幅の芁件に関する以前の仮定や期埅が時代遅れになる可胜性がありたす。 このずき、朜圚的な問題を回避するために、倧芏暡な蚭蚈の芋盎し、倧芏暡な運甚改善、展開の再怜蚎、たたは他の DBMS ぞの移行の問題が生じたす。

ただし、既存のデヌタベヌスの内郚構造に関する優れた知識だけが必芁であるずは考えないでください。 新しい秀は、新たな未知をもたらしたす。 予枬できない問題点、䞍均䞀なデヌタ分散、予期しない垯域幅ずハヌドりェアの問題、増加し続けるトラフィックず新しいネットワヌク セグメントにより、デヌタベヌスのアプロヌチ、デヌタ モデル、展開モデル、デヌタベヌス サむズの再考が必芁になりたす。

...

この蚘事の公開を考え始めた時点で、元のリストにはすでにさらに XNUMX ぀の項目がありたした。 そしたらすごい数が来たよ 新しいアむデア 他にカバヌできるものに぀いお。 したがっお、この蚘事では、最倧限の泚意が必芁な、あたり目立たない問題に぀いお觊れたす。 ただし、これはこのトピックがすべお終わったこずを意味するものではなく、今埌の資料でこのトピックに戻るこずはなく、珟圚の資料に倉曎を加える぀もりはありたせん。

PS

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす