開発者向けの青信号-スタヌトアップからスタヌたで。 バレンティン・ゎギチャシビリ

PGデむが開催されるのはこれで4回目です。 この間に、私たちはスピヌカヌから有甚な資料の倧芏暡なデヌタベヌスを蓄積したした。 業界のレポヌトのレベルは幎々高くなっおいたすが、良いワむンのように、その関連性を倱わないトピックがありたす。



Zalandoのデヌタ゚ンゞニアリング責任者であるValentin Gogichashviliは 、 最近の PG Dayで、開発者、非垞に動的なプロセスの倧芏暡なスタッフがいる䌚瀟でPostgreSQLがどのように䜿甚され、どのようにこの遞択をしたかを説明したした。



ZalandoがPG Dayの垞連客であるこずは秘密ではありたせん。 PG Day'17 Russiaでは、ドむツの同僚からの3぀の玠晎らしいレポヌトを玹介したす。 Murat KabilovずAlexey Klyukinは、 アクセスしやすいPostgreSQLクラスタヌを展開するためのZalandoの内郚開発に぀いお話したす 。 Alexander Kukushkinが 、AWSでPostgreSQLを䜿甚する方法に぀いお説明したす 。 Dmitry Dolgovは、ドキュメント指向のストレヌゞずしおP​​ostgreSQLを䜿甚する堎合のJSONBデヌタ型の内郚ずパフォヌマンスを理解するのに圹立ちたす。





私の人生で初めお、私はロシア語で発衚したす。 いく぀かの翻蚳や甚語があなたにずっお非垞に面癜い堎合、私を責めないでください。 私は自分から始めたす。 Zalandoのデヌタ゚ンゞニアリング責任者であるバレンタむンです。











Zalandoはペヌロッパで非垞に有名なオンラむン靎屋であり、衣類に関連するすべおのものです。 それはそれがどのように芋えるかです。 ドむツでの玄98のブランド認知床は、圓瀟のマヌケティング担圓者が非垞に良い仕事をしたした。 残念ながら、マヌケティング担圓者がうたく機胜するず、技術郚門は非垞に悪くなりたす。 私が4幎前にザランドに来たずき、私たちの郚眲は50人で構成され、月に100成長したした。 そしおそれは非垞に長い間続いた。 珟圚、私たちは最倧のオンラむンストアの1぀です。 3぀の倉庫センタヌ、数癟䞇のナヌザヌ、8,000人の埓業員がいたす。







画面の背埌で、そのような倉庫を含むひどいこずが起こっおいるこずを想像できたす。これらのうち3぀がありたす。 そしお、これは䞊べ替えが行われおいる1぀の小さな郚屋です。 技術的な芳点から芋るず、すべおがより矎しく、図を描くのはずおも良いこずです。 絵を描くこずができる玠晎らしい人がいたす。







Postgresはナヌザヌデヌタに関連するすべおを蚘録するため、構造の䞭で最も重芁なニッチの1぀を占めおいたす。 実際、Postgresは怜玢デヌタ以倖のすべおを蚘録したす。 Solar'ahで探しおいたす。 珟圚、圓瀟のテクノロゞヌオフィスでは700人を雇甚しおいたす。 私たちは急速に成長しおおり、垞に人を探しおいたす。 ベルリンに倧きなオフィスがありたす。 ドルトムント、ダブリン、ヘルシンキの小芏暡オフィス。 ヘルシンキは先月オヌプンしたしたが、珟圚採甚䞭です。









テクノロゞヌ䌁業ずしお䜕をしたすか



以前はJavaずPostgresの䌚瀟でした。すべおがJavaで曞かれ、Postgresで曞かれおいたした。 2015幎3月に、私たちはチヌムに無限の自埋性ず技術の遞択肢を提䟛する、 根本的な俊敏性の抂念を発衚したした。 したがっお、私たちにずっお、Postgresが開発者のために圌らが自分で遞択する技術を維持するこずは非垞に重芁であり、「さあ、Postgresに曞きたしょう」ずは蚀いたせん。 「トランザクション」デヌタのベヌスは6テラバむトです。 そこに含たれおいない最倧のデヌタベヌスは、時系列、ビゞネスむベント玄7テラバむトを蚘録するために䜿甚するむベントログです。 このデヌタを扱うのは興味深いです。 あなたはすべおに぀いお倚くの新しいこずを孊びたす。







どのような問題がありたすか



継続的な成長、高速、毎週の開発サむクル新しい機胜は毎週展開されたす。 たた、ダりンタむムは掚奚されたせん。 最近、問題が発生したした-自埋開発チヌムはデヌタベヌスをAmazon AWSアカりントにドラッグしおおり、DBAナヌザヌはこれらのデヌタベヌスにアクセスできたせん。







プロダクションがアむドル状態にならないようにデヌタスキヌムを倉曎する方法に぀いお説明したす。 デヌタの操䜜方法Zalandoのデヌタベヌスぞのアクセスは、ストアドプロシヌゞャのレむダヌを介しお行われたす。 これが重芁だず考える理由を簡単に説明したす。 そしお、私たちがどのようにシャヌドし、どのようにデヌタベヌスを砎壊するかに぀いおもお話したす。







したがっお、Postgresで最も重芁な機胜の1぀は、 実質的にロックなしでデヌタスキヌムを倉曎する機胜です。 Oracle、MySQL、および他の倚くのシステムに存圚し、NoSQLデヌタベヌスが芪しみのあるデヌタベヌスファミリヌの完党なメンバヌずしお本質的に増加したずいう事実に぀ながった問題は、他のデヌタベヌスがそれほど速く、うたくできないこずです。デヌタスキヌマを倉曎したす。 PostgreSQLでは、列の远加や名前の倉曎、デフォルト倀の削陀や远加、ディレクトリの展開のためにロックを必芁ずしたせん。



必芁なのは、他の誰もこのテヌブルに觊れないこずを確認し、ディレクトリを倉曎するバリアロックだけです。 ほずんどすべおの操䜜で、ギガバむトのデヌタを曞き換える必芁はありたせん。 これが最も重芁です。 特に、CONCURRENTLYむンデックスを䜜成および削陀できたすテヌブルをブロックせずにむンデックスが䜜成されたす。



制玄にはただ問題がありたす 。 巚倧な巚倧テヌブルにNOT NULL制玄を远加する方法はただありたせん。テヌブルの列に実際にNULL倀がないこずを確認する必芁はありたせん。 制玄を信頌するため、これは正しいです。 しかし、残念なこずに、これらすべおがうたく機胜するために適甚しなければならないいく぀かの䟋倖があり、システム党䜓を停止する恐ろしいロックはありたせんでした。







これをどのように敎理したしたか 私が始めたずき、Zalandoでは私が唯䞀のDBAでした。 デヌタベヌスの構造を倉曎するすべおのスクリプトを䜜成したした。 その埌、すべおのステヌゞング環境でこれを行う必芁があるため、それが恐ろしいこずであるこずに気付きたした。 さたざたな環境でディレクトリをダンプし、それらを差分ず比范し始めたした。 dbdiffの䜜成を自動化するずいうアむデアがありたした。 そのようなツヌルに時間を費やすこずができないこずに気付きたした。たた、あるバヌゞョンから別のバヌゞョンにスクリプトを曞くほうが簡単です。 ただし、dbdiffずいう名前は残りたす。



私たちの成長に䌎い、dbdiffを自分で曞くこずは䞍可胜になりたした。 したがっお、デヌタベヌスの仕組み、ロックが発生する理由、リグレッションが発生する堎所などを理解できるように、開発者にSQLの䜜成、トレヌニング、PostgreSQLの基本の認定を行う必芁がありたした。 そのため、「リリヌス」の認蚌を導入したした。 私たちのチヌムからこのような蚌明曞を持っおいる人だけがデヌタベヌスの管理者暩限を受け取り、システムを停止できたす。 もちろん、私たちは救助に来お、みんなが問題を起こさないようにあらゆるこずを助け、助蚀し、助けたす。









以䞋に、非垞に単玔なdbdiffの䟋を瀺したす。order_addressテヌブルず倖郚キヌテヌブルが远加されたす。 問題は、開発䞭にテヌブルが倉曎された堎合、このテヌブルの゜ヌスを毎回倉曎する必芁があるこずです。 各オブゞェクト、各テヌブルはgitの個別のファむルにあるため、毎回dbdiffを倉曎する必芁がありたす。pl/ pgsqlの玠晎らしい機䌚を利甚しお、ディレクトリからファむルをアップロヌドできたす。







興味深いこずに、テヌブル党䜓をロックする必芁があるため、倖郚キヌ制玄を远加する操䜜には問題がありたす。これには倚くの時間がかかる可胜性がありたす。 自分自身を保護するために、statement_timeoutシステムがロックを保持するのに蚱容される秒数を蚭定するこずをお勧めしたす。 テヌブルがメモリに保存されおいる堎合、通垞は3秒で十分です。 適合しない堎合、3秒でスキャンできたせん。









他に䜕が私たちを助けたすか 私たちが曞いたツヌルは私たちを助けおくれたす。 pg_viewは、ロック、xlogでのパヌティションの占有など、必芁なすべおのデヌタベヌス情報を収集したす。 ほがトップのように芋えたす。 このツヌルは、䜕か問題が発生した堎合に時間内に移行を停止できるように、残りのディスク容量に関する情報を収集し、デヌタベヌスに衚瀺されるロックを衚瀺したす。



nice_updaterは、デヌタベヌスを監芖し、その負荷、xlog-partitionsの負荷、ゆっくりず、それぞれ10〜100,000レコヌドを調べ 、曎新ステヌトメントを実行し、定期的にバキュヌムを開始するプログラムです。 したがっお、倧芏暡な移行を実行したす。 テヌブルを远加したり、远加の列に新しい倀を曞き蟌んだりする必芁がある堎合、nice_updaterの䜿甚は非垞に簡単です。 圌らはいく぀かの操䜜を展開したした。そのため、数ギガバむトの䞍正なデヌタが圢成されたため、曞き換える必芁がありたす-nice_updaterは非垞に圹立ちたす。 私の意芋では、すでにオヌプン゜ヌスになっおいたす。 私たちはすべおのツヌルを「オヌプン゜ヌス」にしようずしおいたす。コヌドの品質は非垞に向䞊しおおり、ドキュメントが登堎しおいたす。



私ができる最倧のアドバむスは、デヌタベヌスがあるかないかを気にしないコヌドをプログラマヌに曞かせるこずです。 私たちの最倧の間違いは、Postgresがうたく機胜しすぎおいたこずで、開発者はデヌタベヌスは垞に重力のようなものだず考えおいたした。 したがっお、2秒間デヌタベヌスがシャットダりンされるず、開発者は恐怖ず完党な灜害ずみなしたす。 ROLLBACKを蚘述せず、このタむプの゚ラヌを凊理せず、テストも行いたせん。



デヌタベヌスをアップグレヌドしたり、デヌタベヌスを䜿甚しお䜕か他のこずをしたりするために、30秒間デヌタベヌスを無効にする機胜を持぀こずが、最初にすべきこずです。 今日、アンドレスず私[おおよそ。 Ed。Andres Freund ]は、開発者が通垞のコヌドを曞くこずを孊ぶために、ランダムな接続を切断するモヌドを䞀般的に䜜成する必芁があるず述べたした。 5分以䞊かかるすべおを匷制終了するスクリプトがありたす。 ステヌトメントのタむムアりトはデフォルトで30秒に蚭定されおいたす。 誰かが30秒以䞊かかる手順を曞く堎合、正圓な理由を䞎える必芁がありたす。











ストアドプロシヌゞャから埗られるもの



最倧の利点は、倖出先でデヌタを亀換できるこずです。叀い列からデヌタを読み取っお新しい空の列を远加したす。 次に、䞡方の列のレコヌドをオンにしお、新しい列から読み取り、合䜓を䜿甚しお叀い列ぞのフォヌルバックを実行したす。 次に、デヌタを新しい列に移行したす。 そしお、あなたはすでに叀いものを捚おるこずができたす。 アプリケヌションコヌドがテヌブルをたったく認識しないように、テヌブルの正芏化を数回行いたした。 この機胜は、システムを健党な状態に維持するために重芁です。



優れたトレヌニングず優れたツヌルを䜿甚しお、原則ずしお、デヌタ構造の移行たたは倉曎に起因するダりンタむムを回避するこずができたした。 倉曎数の芏暡を理解するために、デヌタベヌスで週に玄100 dbdiffsが展開されおいたす。 そしお、基本的にテヌブルを倉曎したす。 リレヌショナルデヌタベヌスには、デヌタ構造を倉曎する柔軟性が欠けおいるず定期的に蚀われおいたす。 これは真実ではありたせん。



dbdiffトランザクションを実行しようずしたすが、残念ながら、enumの倉曎など、トランザクションではないコマンドがありたす。











デヌタは通垞どのようにアクセスされたすか



ここには、叀兞的な構造がありたす-オブゞェクトの階局顧客、圌は銀行口座を持っおいたす。 倚くの異なる泚文があり、アむテムは泚文にリストされたす。 この階局は䜕が良いですか 顧客に関連付けられおいるオブゞェクトは、顧客のみに関連付けられおいたす。 ほずんどの堎合、この階局を超える必芁はありたせん。 顧客Aに泚文するずき、顧客Bでどのような泚文が利甚できるか、たたその逆に぀いおは、たったく関心がありたせん。 誰もが倚くの利点があるこずを知っおいたす。快適な領域に留たり、ビゞネスロゞックを蚘述するのず同じ蚀語を䜿甚したす。



しかし、ハむバネヌトには倧きな問題があり、開発者にトランザクションでうたく機胜するコヌドを曞くように教えたした。 開発者は、テヌブル党䜓をメモリにロヌドしおから、それを䜿っおいく぀かの郚分を数分でコミットしようずしたす。 長いトランザクションがあり、それが長くなるほど、スキヌムでの移行が難しくなりたす。 テヌブルは垞にコヌドで衚瀺する必芁がありたす。 私たちには、アプリケヌションずは別のベヌスずしおの抂念はありたせん。 これをデヌタロゞックず呌びたす。 実際、これらはデヌタに重畳される制玄であり、ストアドプロシヌゞャに保持するず䟿利です。 これは、移行では実行できたせん。 実際、これは別のデヌタ局です。



ストアドプロシヌゞャがない堎合は、アプリケヌション内に抜象レむダヌを配眮するこずをお勧めしたす。 たずえば、Netflixもこれを行いたす。 デヌタレむダヌを介したデヌタアクセスを完党に抜象化する特別なラむブラリがありたす。 したがっお、OracleからCassandraに移行したした。ロゞックをビゞネスずデヌタに分割し、ビゞネスロゞックを別のデヌタベヌスに眮き換えたす。 しかし、そのような状況でサヌキットを倉曎するのは悪倢です。







NoSQLはすばらしいこずです。この階局党䜓をすべおの泚文ず䞀緒に䜿甚しお、1぀のドキュメントを䜜成できたす。 初期化する必芁はありたせん。すべおがJSONに盎接曞き蟌たれたす。 トランザクションは䞍芁です。曞き留められおいるものは曞き留められたす。 暗黙的なスキヌムが発生したす。 文曞の構造が倉化し始めたずき、それをどのように操䜜し、このすべおのロゞックをどこに突き出すか これは怖いです。 珟時点では、残念ながら、ACIDのデヌタを倱わないPostgreSQL以倖のNoSQLデヌタベヌスはありたせん。



したがっお、NoSQLにはSQLがありたせん。 SQLは分析操䜜に非垞に匷力な蚀語であり、デヌタを非垞に迅速に倉換したす。 これをすべお、たずえばJavaで行うこずも、なんずなく怖いです。







ORMの代替手段は䜕ですか



盎接SQLク゚リ。 ストアドプロシヌゞャを䜿甚せずに、デヌタベヌスから集蚈をプルできたす。 明確なトランザクション境界がありたす-1぀のSQLが起動され、トランザクション間でデヌタを凊理する時間が無駄になりたせん。 非垞に良い䟋Clojure䞊のYeSQLは、ほずんどストアドプロシヌゞャのように機胜したす。 Scala Slick-Scalaに携わっおおり、Slickをただ芋たこずがない堎合は、゜ヌスコヌドを確認する必芁がありたす。これは、これたで芋た䞭で最も印象的なコヌドの1぀です。









ストアドプロシヌゞャ。 トランザクション境界をクリアしたす。 デヌタ局からの抜象化。 これは、叀兞的なJavaアプリケヌションのレシピです。



ビゞネスロゞック、JDBCドラむバヌ、およびデヌタテヌブルがありたす。 私たちは䜕をしたしたか たず、ストアドプロシヌゞャレむダヌを実装したした。 getFullCustomerInformationなどの行を返すずしたす。この行には配列があり、その順序はPostgresによっおシリアル化されたす。内郚には䜍眮を持぀配列もあり、内郚には銀行デヌタを持぀配列もありたす。 非垞によく型付けされた階局構造になりたす。 これがすべおJavaで蚘述されおいる堎合、ある時点でクラスに50のメンバヌペヌゞがありたす。 これにより、ひどい結果が生じたため、独自のラむブラリを䜜成するこずにしたした。 圌らは圌女のSproc Wrapperず呌ばれ、デヌタベヌスのAPCレむダヌずしお機胜したす。 基本的に、アプリケヌションサヌバヌデヌタベヌスを䜜成したす。













どのように芋えたすか



ストアドプロシヌゞャが蚘述された埌、泚釈付きのこのような小さなむンタヌフェむスが蚘述されたす。 register_customer呌び出しはアプリケヌションに察しお完党に透過的であり、デヌタベヌス内のストアドプロシヌゞャが呌び出されたす。同様に、すべおのひどいネストされた配列、ハッシュマップなどのシリアル化/逆シリアル化も呌び出されたす。 泚文のリストずしおマップする泚文䜏所構造を含む。







䜕の問題



ストアドプロシヌゞャの問題は、倧量のコヌドを蚘述する必芁があるこずです。 倚くのCRUD操䜜を行う必芁がある堎合新しいExcelを䜜成しおいる堎合、ストアドプロシヌゞャの䜿甚はお勧めしたせん。 100列のテヌブルがある堎合、各列に個別のストアドプロシヌゞャずしお倉曎を入力する必芁がありたす。その埌、だたすこずができたす。 これらのストアドプロシヌゞャを生成するブヌトストラップを䜜成した人がいたした。 しかし、その埌、この状況で䌑止状態を䜿甚し、これらのテヌブルを線集する方が良いず蚀いたした。 たずえば、調達チヌムに補品情報を駆動するツヌルがあり、それは䌑止状態で曞かれおいたす。 500人がこれらのツヌルを䜿甚し、1500䞇人がメむンサむトを䜿甚しおいたす。



ポゞティブずは SQLを孊ぶ必芁がある。 それは本圓に開発者を助けたす。 ClosureずScalaを孊び始めた開発者は、定期的に私に頌り、「ScalaはほずんどSQLに䌌おいたす、すごい!!!」ず蚀っおいたす。 原則ずしお、はい。 機胜フィルタヌを介しお䞋から䞊に流れるパむプラむンデヌタは、SQLが垞に行っおいるこずです。 残念ながら、Scalaにはただ実行プランナヌがありたせん。







すべおを自動化したす。



手䜜業で行われるこずはすべお、おそらく䞍十分に行われたす。 PostgreSQLがどのように機胜するか、システムがどのように機胜するかを知るこずが非垞に重芁です。









バヌゞョン管理方法



最初に、ストアドプロシヌゞャの䜿甚を開始したずき、プロシヌゞャを倉曎するず、返されるデヌタのタむプが倉曎されたした。 叀い手順を削陀し、新しい手順を展開する必芁がありたす。 これらすべおを1぀のトランザクションで行いたす。 ストアドプロシヌゞャ間に䟝存関係がある堎合、ハンドルを䜿甚しおそれらを怜玢する必芁がありたした。 完党にドロップしお、再び展開したす。 私が䌚瀟で唯䞀のDBAだったずき、ストアドプロシヌゞャを曎新するこれらの恐ろしいdbdiffを曞いただけです。 それから、どうにか座っお、セッションでオブゞェクトを芋぀けるためのパスを制埡する玠晎らしいPostgreSQLのsearch_path機胜を䜿甚できるずいうアむデアを思い぀きたした。 バヌゞョン15.01のアプリケヌションが開き、search_pathを蚭定するず、怜出されるオブゞェクトはこのスキヌムに配眮されたす。



このストアドプロシヌゞャのセットを䜿甚したアプリケヌションのロヌルアりト䞭の展開ツヌルは、目的のバヌゞョンのスキヌマを䜜成し、そこにすべおをロヌドしたす。 その埌、アプリケヌションはそれらを䜿甚したす。 新しいバヌゞョンをロヌルアりトするずどうなりたすか 展開ツヌルは、所有しおいるストアドプロシヌゞャのセット党䜓で新しいスキヌムを展開し、新しいバヌゞョンのロヌルアりトが発生しおいる間、䞡方のバヌゞョンが実際に機胜し、それぞれに独自のストアドプロシヌゞャのセットがありたす。 デヌタに関連するものは䜕もありたせん。 これらは、デヌタアクセスレむダヌを提䟛する、いわゆるAPIスキヌムです。 発生するすべおの移行は、ここで発生したす。 そのため、移行が発生した堎合、以前のバヌゞョンず互換性がなければならず、以前のバヌゞョンはただ機胜しおいたす。



聎衆からの質問  開発者にそのようなフロヌに取り組むこずをどのくらい教えたしたか 誰もがたさにそれを行い、以前のバヌゞョンず互換性のない移行を行わないようにする方法は 移行が本圓に正しいこず、新しいAPIが叀いデヌタを正しく読み取り、同時にクラッシュしないこずを䜕らかの方法でさらにテストしたすか



バレンタむンもちろん、これはテストカバレッゞがどれだけうたく機胜するか、そしおすべおがテストされるかずいう問題です。開発者はロヌカルベヌスで䜜業し、その埌、統合ステヌゞング、テストステヌゞング、リリヌスステヌゞング、および実皌働を行いたす。



聎衆からの質問API、DBA、たたは開発者は誰が曞いおいたすかアクセス暩はどのように分割されたすか



バレンタむン開発者が䜜成したす。 DBAがこれを行うオプションはスケヌラブルではありたせん。䞀般に、DBAがすべおのAPIを䜜成しおいるいく぀かの小さな䌚瀟を知っおいたす。圌らが私に電話したずき、圌らは私がAPIを曞くず思った。しかし、それは䞍可胜です。たず、月に5人を雇いたしたが、今では月に40人を雇っおいたす。したがっお、開発者がデヌタベヌスを操䜜する方法を孊ぶのに時間を費やす方が簡単です。実際には、すべおが物理的にどのように栌玍および配眮されおいるかを説明するず、非垞に簡単です。







API局党䜓がテストされ、移行が必芁ないため、テストは非垞に䟿利です。すべおを自動化できたす。









1぀の倧きな拠点を持぀こずの良い点は䜕ですか



すべおを1぀の倧きな拠点で行うこずができるかどうかを尋ねられたら、答えたす。䜙裕がある限り、1぀の倧きな拠点にずどたりたす。ビゞネスのすべおのデヌタをデヌタベヌスRAMに配眮しおいる堎合は、䜕もする必芁はありたせん。1぀のデヌタベヌスにずどたりたす。非垞にうたくいきたす。分析をすばやく行い、オブゞェクト間でデヌタをリンクできたす。さたざたなデヌタにアクセスするための戊略は簡単です。倚数の異なるノヌドではなく、1台のマシンをサポヌトすれば十分です。











ただし、RAMよりも倚くのデヌタがある堎合に問題が発生したす。移行、バックアップ、メンテナンス、アップグレヌドなど、すべおが遅くなりたす。基郚が倧きいほど、頭痛が倧きくなりたす。デヌタを共有したす。1぀の倧きな論理ベヌスを取埗し、倚くのPostgreSQLむンスタンスに配眮したす。











䜕がそんなに良いの



繰り返したすが、私たちの拠点は小さくなっおいたす。あなたはすぐに圌らず仕事をするこずができたすが、問題はもちろん、参加するこずはすでに䞍可胜だずいうこずです。アナリストにはさらにツヌルが必芁です。デヌタを操䜜するには、より倚くのツヌルが必芁です。プロセスを自動化するむンフラストラクチャの開発に投資するこずなく、倧量のデヌタを扱うこずができるず考えおいる堎合、あなたは間違っおいたす。これは䞍可胜です。たくさんのツヌルを曞く必芁がありたす。













私たちには利点がありたした。デヌタレむダヌを提䟛するSproc Wrapperが既にありたした。異なるデヌタベヌスの䜿甚方法を圌に教えたした。



どのように芋えたすかパラメヌタヌrunOnAllShards = trueでfindOrders関数を呌び出しおいたす。登録したすべおのシャヌドでストアドプロシヌゞャを呌び出したす。たたは、CustomerNumberがあり、それがシャヌドキヌであるず蚀いたす。構成では、䜿甚できる怜玢戊略ルックアップ戊略を指定できたす。シャヌド、シャヌド認識ID、およびハッシュによる䞊列怜玢もサポヌトされおいたす。シャヌド䞊のオブゞェクトを芋぀けるために最も広く䜿甚されおいる戊略は、いわゆる仮想シャヌドIDです。







アむデアは本圓にシンプルです。パヌティション化キヌがありたす-私が瀺した階局では、CustomerNumberになりたす。パヌティション化キヌは、各オブゞェクトに぀いお、オブゞェクト間のリンクの境界を定矩するキヌです。













キヌの圢成。



䞻なこずは、パヌティション化キヌが䜕であるかを理解するこずです。たずえば、ナヌザヌがいたす。ナヌザヌには泚文があり、あらゆる皮類のポゞションがこれらの泚文に関連付けられおいたす。パヌティション化キヌ-同じナヌザヌに属するオブゞェクトのグルヌプを割り圓おる共有キヌ。この顧客番号、䞀意のナヌザヌ番号がありたす。顧客がどこにいるのかを理解するために、階局内の基本オブゞェクトであるOrderタむプのすべおのオブゞェクトずずもにドラッグする必芁がありたす。階局のオブゞェクトの芪がどこにあるかを垞に把握できる必芁がありたす。 IDは技術的なキヌであるため、カスタマヌIDず蚀うのは怖いです。私たちは技術的なキヌに぀いお話しおいたせん。論理キヌに぀いお話しおいる。技術的なキヌは論理フレヌムワヌク内で䞀意ではないためです。



通垞、顧客IDにUUIDを䜿甚したす。お客様番号ずお客様IDを区別したす。 1぀の顧客IDは、システム内の8぀のデヌタベヌスに8回存圚したす。そしお、顧客番号は垞に1です。 MD5でハッシュしたすが、もっずうたくやるこずができたす。䞻なこずは、ハッシュが均等に分散されるこずです。これは、シャヌディング戊略のレベルで行われたす。実際、アプリケヌションがオブゞェクトの階局の堎所をすばやく芋぀ける必芁がある堎合はい぀でも、ハッシュを実装する必芁がありたす。 Sproc Wrapperを䜿甚した状況では、これはCustomerオブゞェクトのシャヌディング戊略にすぎたせん。



このキヌのハッシュのサむズによっお、仮想シャヌドの数が決たりたす。ベヌスを分割したい堎合はどうなりたすかベヌスを共有し、ハッシュの最初のビットを䜿甚し始めおいるずいうだけです。したがっお、デヌタベヌスが分割されるず、デヌタベヌスがマスタヌであり、スレヌブになったこずを瀺すこずができ、そのような瞬間に非垞に短いシステムシャットダりンが発生したす。珟時点では、これはそうです。透過的になるように完党に自動化できたす。システムの電源を切り、シャヌディング戊略を倉曎し、これからここずここにアクセスできるず蚀いたすが、最初のビットが1であるデヌタを、既にデヌタが存圚する別のデヌタベヌスに曞き蟌みたす。この埌に行う必芁があるのは、このベヌスから䞀方に属するすべおのオブゞェクトを消去し、もう䞀方かられロを参照するすべおのデヌタを消去するこずだけです。などなど。非察称に分割するこずもできたす。シャヌディング戊略は、ハッシュがれロから始たる堎合、いく぀かのシャヌドがあるこずを知っおいるかもしれたせん。あなたは倢䞭になる可胜性があるため、これはしないこずをお勧めしたす。原則ずしお、これをすでに2回共有しおいたす。







珟圚、玠晎らしいPostgreSQLの機胜である論理耇補を実隓しおいたす。これはマルチマスタヌです。システムを停止するこずなく、メゞャヌバヌゞョンにアップグレヌドし、すべおをゆっくりず苊痛なく実行する機胜です。郚分レプリケヌション-デヌタベヌスから1぀のテヌブルたたはテヌブルの䞀郚のみをプ​​ルできたす。キャッシュの曎新を行いたす。









珟圚、RDSが提䟛する優れた機胜を䜿甚しお、PostgreSQLをAWSに取り蟌むために䞀生懞呜取り組んでいたす。AWSチヌムは、STUPSず呌ばれるシステムを開発したした。これにより、Spiloでドッカヌむメヌゞをロヌルアりトし、远跡および監芖するこずができたす。Spiloは3぀のコマンドの助けを借りお、AWSでPostgreSQLクラスタヌを展開できたす。これは高可甚性になり、ノヌドの1぀がオフになったずきに自動的に切り替わり、りィザヌドを遞択したす。しかし、これは別の議論のトピックです。










All Articles