postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

Andrey Salnikov による 2016 幎初頭のレポヌトの曞き起こし「postgresql の肥倧化に぀ながるアプリケヌションの兞型的な゚ラヌ」を読むこずをお勧めしたす。

このレポヌトでは、アプリケヌション コヌドを蚭蚈および䜜成する段階で発生するアプリケヌションの䞻な゚ラヌを分析したす。 Postgresql の肥倧化に぀ながる゚ラヌのみを取り䞊げたす。 原則ずしお、これはシステム党䜓のパフォヌマンスの終わりの始たりですが、圓初はこのための前提条件が芋えたせんでした。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

皆さんを歓迎したす! このレポヌトは、私の同僚による以前のレポヌトほど技術的なものではありたせん。 私たちはかなりの数のクラむアントを抱えおいるため、このレポヌトは䞻にバック゚ンド システム開発者を察象ずしおいたす。 そしお、圌らは皆同じ​​間違いを犯したす。 それらに぀いおお話したす。 これらの間違いがどのような臎呜的で悪いこずを匕き起こすかを説明したす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

なぜ間違いが起こるのでしょうか? これらが行われる理由は XNUMX ぀ありたす。XNUMX ぀は、おそらくうたくいくだろうずいうランダムな理由、もう XNUMX ぀は、デヌタベヌスずアプリケヌションの間のレベル、およびデヌタベヌス自䜓で発生するいく぀かのメカニズムを理解しおいないためです。

事態がどれほど悪化したかに぀いお、ひどい写真ずずもに XNUMX ぀の䟋を玹介したす。 そこで起こるメカニズムに぀いお簡単に説明したす。 そしお、それらにどのように察凊し、い぀起こったのか、そしお間違いを防ぐためにどのような予防法を䜿甚すればよいのか。 補助ツヌルに぀いお説明し、圹立぀リンクを提䟛したす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

XNUMX ぀のテヌブルがあるテスト デヌタベヌスを䜿甚したした。 XNUMX ぀のプレヌトには顧客の口座が蚘茉され、もう XNUMX ぀のプレヌトにはこれらの口座での取匕が蚘茉されたす。 たた、これらの口座の残高は䞀定の頻床で曎新されたす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

プレヌトの初期デヌタ: 2 MB ず非垞に小さいです。 デヌタベヌス、特にサむンの応答時間も非垞に優れおいたす。 そしおかなり良い負荷 - プレヌトによるず2秒あたり000回の操䜜。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

このレポヌトでは、䜕が起こっおいるかを明確に理解できるようにグラフを瀺したす。 グラフを含むスラむドは垞に 2 枚ありたす。 最初のスラむドは、サヌバヌ䞊で䞀般的に䜕が起こるかを瀺しおいたす。

そしおこの状況では、本圓に小さな兆候があるこずがわかりたす。 むンデックスは 2 MB ず小さいです。 これは巊偎の最初のグラフです。

サヌバヌの平均応答時間も安定しお短くなりたす。 右䞊のグラフです。

巊䞋のグラフは最長のトランザクションを瀺しおいたす。 トランザクションが迅速に完了しおいるこずがわかりたす。 たた、これは開始テストだったので、ここでは自動バキュヌムはただ機胜したせん。 それは今埌も機胜し、私たちにずっお圹立぀でしょう。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

XNUMX 番目のスラむドは垞にテストされるプレヌト専甚になりたす。 この堎合、圓瀟はクラむアントの口座残高を垞に曎新したす。 たた、曎新操䜜の平均応答時間は非垞に良奜で、XNUMX ミリ秒未満であるこずがわかりたす。 プロセッサ リ゜ヌス (これは右䞊のグラフ) も均等に消費され、非垞に少ないこずがわかりたす。

右䞋のグラフは、曎新する前に目的の行を怜玢するためにどれだけの動䜜メモリずディスクメモリを通過するかを瀺しおいたす。 そしお、最初に述べたように、笊号に応じた挔算数は 2 秒あたり 000 回です。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

そしお今、悲劇が起きおいたす。 䜕らかの理由で、長い間忘れられおいたトランザクションがありたす。 通垞、その理由はすべおありきたりなものです。

  • 最も䞀般的なものの XNUMX ぀は、アプリケヌション コヌドで倖郚サヌビスぞのアクセスを開始したこずです。 そしお、このサヌビスは私たちに答えたせん。 ぀たり、トランザクションを開き、デヌタベヌスに倉曎を加え、アプリケヌションからメヌルを読んだり、むンフラストラクチャ内の別のサヌビスに移動したりしたしたが、䜕らかの理由で応答したせん。 そしお、セッションはい぀解決されるか䞍明な状態でスタックしおいたす。
  • XNUMX 番目の状況は、䜕らかの理由でコヌド内で䟋倖が発生した堎合です。 そしお䟋倖ずしお、トランザクションの終了凊理を行いたせんでした。 そしお、オヌプンなトランザクションでハングセッションが発生しおしたいたした。
  • 最埌のケヌスもかなり䞀般的なケヌスです。 これは䜎品質のコヌドです。 䞀郚のフレヌムワヌクはトランザクションを開きたす。 ハングしおいたすが、アプリケヌションではハングしおいるこずに気づかない可胜性がありたす。

そのようなこずはどこに぀ながるのでしょうか

テヌブルずむンデックスが劇的に膚匵し始めるたでに。 これはたさに同じ膚匵効果です。 デヌタベヌスの堎合、これはデヌタベヌスの応答時間が倧幅に増加し、デヌタベヌス サヌバヌの負荷が増加するこずを意味したす。 その結果、アプリケヌションに問題が発生したす。 なぜなら、デヌタベヌスぞのリク゚ストにコヌドで 10 ミリ秒、ロゞックで 10 ミリ秒を費やした堎合、関数が完了するたでに 20 ミリ秒かかるからです。 そしお今、あなたの状況は完党に悲しいものになるでしょう。

そしお䜕が起こるか芋おみたしょう。 巊䞋のグラフは、長い長いトランザクションがあるこずを瀺しおいたす。 巊䞊のグラフを芋るず、テヌブルのサむズが 300 メガバむトから XNUMX メガバむトに突然増加しおいるこずがわかりたす。 同時に、テヌブル内のデヌタ量は倉化しおいたせん。぀たり、かなり倧量のゎミがそこにありたす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

サヌバヌの平均応答時間に関する䞀般的な状況も、数桁倉化したした。 ぀たり、サヌバヌ䞊のすべおのリク゚ストが完党に䜎䞋し始めたした。 そしお同時に、内郚 Postgres プロセスが自動バキュヌムの圢で起動され、䜕かを行おうずしおリ゜ヌスを消費したす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

私たちの看板に䜕が起こっおいるのでしょうか 同じ。 兆候によるず、平均応答時間は数桁跳ね䞊がりたした。 特に消費されたリ゜ヌスの芳点から芋るず、プロセッサの負荷が倧幅に増加しおいるこずがわかりたす。 右䞊のグラフです。 そしお、プロセッサが必芁な行を探すために倧量の無駄な行を分類する必芁があるため、この量は増加したした。 右䞋のグラフです。 その結果、デヌタベヌスが同じ数のリク゚ストを凊理する時間がなくなったため、XNUMX 秒あたりの呌び出し数が倧幅に枛少し始めたした。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

私たちは日垞に戻らなければなりたせん。 オンラむンにアクセスするず、長時間の取匕が問題に぀ながるこずがわかりたした。 このトランザクションを芋぀けお匷制終了したす。 そしお、私たちにずっおすべおが普通になり぀぀ありたす。 すべおが正垞に機胜したす。

私たちは萜ち着きたしたが、しばらくするず、アプリケヌションが緊急事態前ず同じように機胜しないこずに気づき始めたした。 リク゚ストの凊理は䟝然ずしお遅くなり、倧幅に遅くなりたす。 私の䟋では、具䜓的には XNUMX 倍半から XNUMX 倍遅くなりたす。 サヌバヌの負荷も事故前よりも高くなっおいたす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

そしお、「今この瞬間、基地に䜕が起こっおいるのか」ずいう質問です。 そしお、ベヌスでは次のような状況が発生したす。 取匕チャヌトでは、取匕が停止しおおり、実際には長期取匕がないこずがわかりたす。 しかし、事故によっお暙識のサむズが臎呜的に倧きくなった。 そしおそれ以来、圌らは枛っおいたせん。 平均出塁時間が安定しおきたした。 そしおその答えは、私たちが蚱容できる速床で適切に提䟛されおいるようです。 自動バキュヌムはよりアクティブになり、より倚くのデヌタを遞別する必芁があるため、サむンを䜿っお䜕かをし始めたした。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

具䜓的には、残高を倉曎するアカりントのテスト プレヌトによるず、リク゚ストの応答時間が通垞に戻っおいるようです。 しかし実際にはXNUMX倍も高いのです。

たた、プロセッサの負荷から、プロセッサの負荷がクラッシュ前の必芁な倀に戻っおいないこずがわかりたす。 そしお、その理由はたさに右䞋のグラフにありたす。 そこではある皋床のメモリが怜玢されおいるこずがわかりたす。 ぀たり、必芁な行を芋぀けるために、無駄なデヌタを遞別しながらデヌタベヌス サヌバヌのリ゜ヌスを無駄に消費するこずになりたす。 XNUMX 秒あたりのトランザクション数が安定したした。

党䜓的には良奜ですが、状況は以前よりも悪化しおいたす。 このデヌタベヌスを操䜜するアプリケヌションの結果ずしお、明らかにデヌタベヌスが䜎䞋したす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

前回のレポヌトをご芧になっおいない方のために、そこで䜕が起こっおいるのかを理解するために、ここで少し理論を説明したしょう。 内郚プロセスに関する理論。 車に掃陀機をかける理由ずその効果は䜕ですか?

文字通り、理解のために簡単に説明したす。 ある時点でテヌブルができたした。 テヌブルには行がありたす。 これらの線は、アクティブであり、生き生きずしおおり、今私たちが必芁ずしおいるものになりたす。 写真では緑色でマヌクされおいたす。 そしお、すでに解決され、曎新され、新しい゚ントリが远加されたデッドラむンがありたす。 そしお、それらはデヌタベヌスにずっおもはや興味深いものではないずいうマヌクが付けられたす。 ただし、これらは Postgres の機胜により衚に含たれおいたす。

車の掃陀機が必芁な理由は䜕ですか? ある時点で、自動バキュヌムが来おデヌタベヌスにアクセスし、「珟圚デヌタベヌスで開いおいる最も叀いトランザクションの ID を教えおください」ず尋ねたす。 デヌタベヌスはこの ID を返したす。 そしお、自動バキュヌムは、これに䟝存しお、テヌブル内の行を䞊べ替えたす。 そしお、䞀郚の行がはるかに叀いトランザクションによっお倉曎されたこずを確認した堎合、そこに新しいデヌタを曞き蟌むこずで、将来再利甚できる行ずしおマヌクを付ける暩利がありたす。 これはバックグラりンドプロセスです。

珟時点では、デヌタベヌスの操䜜を継続し、テヌブルにいく぀かの倉曎を加え続けたす。 そしお、再利甚できるこれらの行に、新しいデヌタを曞き蟌みたす。 したがっお、サむクルが発生したす。぀たり、垞に叀い行がそこに衚瀺され、その代わりに必芁な新しい行を曞き留めたす。 これは PostgreSQL が動䜜する通垞の状態です。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

事故䞭に䜕が起こったのですか? そこでこのプロセスはどのようにしお起こったのでしょうか?

サむンには䜕らかの状態があり、生きおいるサむンもあれば、期限切れのサむンもありたした。 車甚掃陀機が到着したした。 圌はデヌタベヌスに、最も叀いトランザクションずその ID を尋ねたした。 私がこの ID を受け取ったのは䜕時間も前、あるいは XNUMX 分前かもしれたせん。 それはデヌタベヌスにかかる負荷がどれだけ倧きいかによっお異なりたす。 そしお、再利甚ずしおマヌクできる行を探したした。 そしお、私たちのテヌブルにはそのような行は芋぀かりたせんでした。

ただし、珟時点ではテヌブルでの䜜業を続けたす。 その䞭で䜕かを行い、曎新し、デヌタを倉曎したす。 このずきデヌタベヌスは䜕をすべきでしょうか? 圌女には既存の衚の末尟に新しい行を远加する以倖に遞択肢はありたせん。 したがっお、テヌブルのサむズは膚匵し始めたす。

実際には、緑色の線が機胜する必芁がありたす。 しかし、このような問題が発生するず、テヌブル党䜓で緑の線の割合が非垞に䜎いこずがわかりたす。

そしお、ク゚リを実行するずき、デヌタベヌスは目的の行を芋぀けるために、赀ず緑の䞡方の行をすべお調べなければなりたせん。 たた、無駄なデヌタでテヌブルが肥倧化する圱響は「肥倧化」ず呌ばれ、ディスク容量も消費したす。 2 MB だったものが 300 MB になったのを芚えおいたすか? ここでメガバむトをギガバむトに倉曎するず、すぐにすべおのディスク リ゜ヌスが倱われたす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

私たちにどのような圱響が及ぶ可胜性があるでしょうか?

  • 私の䟋では、テヌブルずむンデックスは 150 倍に増加したした。 私たちのクラむアントの䞭には、単にディスク容量が䞍足し始めたずきに、より臎呜的なケヌスに遭遇した人もいたす。
  • テヌブル自䜓のサむズは決しお枛少したせん。 デッドラむンしかない堎合、自動バキュヌムによっおテヌブルの末尟が切り取られる堎合がありたす。 ただし、垞にロヌテヌションが行われるため、XNUMX ぀の緑の線が最埌にフリヌズしお曎新されない堎合がありたすが、他のすべおの線はプレヌトの先頭のどこかに曞き蟌たれたす。 ただし、テヌブル自䜓のサむズが瞮小するずいうこずは非垞にたれな出来事であるため、期埅する必芁はありたせん。
  • デヌタベヌスは、倧量の無駄な行を分類する必芁がありたす。 そしお、ディスクリ゜ヌス、プロセッサリ゜ヌスず電力を浪費したす。
  • そしお、これはアプリケヌションに盎接圱響したす。なぜなら、最初にリク゚ストに 10 ミリ秒、コヌドに 10 ミリ秒を費やした堎合、クラッシュ䞭にリク゚ストに 10 秒、コヌドに 20 ミリ秒を費やし始めるからです。アプリケヌションのパフォヌマンスが倧幅に䜎䞋したした。 そしお事故が解決するず、リク゚ストに 10 ミリ秒、コヌドに XNUMX ミリ秒を費やすようになりたした。 これは、䟝然ずしお生産性が XNUMX 倍䜎䞋しおいるこずを意味したす。 そしおこれはすべお、おそらく私たちのせいで凍結した XNUMX ぀のトランザクションのせいです。
  • そしお、「どうすればすべおを取り戻すこずができるでしょうか」ずいう質問です。そうすれば、すべおがうたくいき、事故前ず同じくらい早くリク゚ストが届くようになりたす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

この目的のために、䞀定の䜜業サむクルが実行されたす。

たず、肥倧化しおいる問題のあるテヌブルを芋぀ける必芁がありたす。 䞀郚のテヌブルでは蚘録がより掻発になり、他のテヌブルではそれほど掻発ではないこずがわかりたす。 このために、拡匵機胜を䜿甚したす pgstattuple。 この拡匵機胜をむンストヌルするず、非垞に肥倧化したテヌブルを怜玢するのに圹立぀ク゚リを䜜成できたす。

これらのテヌブルを芋぀けたら、それらを圧瞮する必芁がありたす。 このためのツヌルはすでにありたす。 圓瀟ではXNUMX぀のツヌルを䜿甚しおいたす。 XNUMX ぀目は、内蔵の VACUUM FULL です。 圌は残酷で厳しく、無慈悲ですが、時には非垞に圹に立぀こずもありたす。 Pg_repack О pgコンパクトテヌブル - これらはテヌブルを圧瞮するためのサヌドパヌティ ナヌティリティです。 そしお、デヌタベヌスをより慎重に扱いたす。

どちらが䟿利かに応じお䜿甚されたす。 しかし、これに぀いおは最埌にお話したす。 重芁なのは、ツヌルが XNUMX ぀あるずいうこずです。 遞択肢はたくさんありたす。

すべおを修正し、すべおが正垞であるこずを確認したら、今埌この状況を防ぐ方法を知る必芁がありたす。

  • それは非垞に簡単に防ぐこずができたす。 マスタヌサヌバヌ䞊のセッションの継続時間を監芖する必芁がありたす。 トランザクション状態でアむドル状態にあるセッションは特に危険です。 これらは、トランザクションを開いお䜕かをしただけで終了したり、単にハングしたり、コヌドの䞭で迷っおしたった人たちです。
  • 開発者にずっお、このような状況が発生したずきにコヌドをテストするこずが重芁です。 難しいこずではありたせん。 これは䟿利なチェックになりたす。 長時間のトランザクションに䌎う倚くの「幌皚な」問題を回避できたす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

これらのグラフでは、この堎合、VACUUM FULL のサむンを通過した埌に、サむンずデヌタベヌスの動䜜がどのように倉化したかを瀺したかったのです。 これは私にずっお制䜜ではありたせん。

テヌブルのサむズはすぐに数メガバむトの通垞の動䜜状態に戻りたした。 これはサヌバヌの平均応答時間に倧きな圱響を䞎えたせんでした。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

しかし、特に口座残高を曎新したテスト サむンの堎合、サむン内のデヌタ曎新リク゚ストの平均応答時間が緊急前のレベルたで短瞮されたこずがわかりたす。 このリク゚ストを完了するためにプロセッサが消費したリ゜ヌスも、クラッシュ前のレベルたで䜎䞋したした。 右䞋のグラフは、テヌブルが圧瞮される前に存圚しおいたデッドラむンの山を通過するこずなく、必芁な行をすぐに正確に芋぀けるこずができるこずを瀺しおいたす。 たた、平均リク゚スト時間はほが同じレベルのたたでした。 しかし、ここではむしろハヌドりェアに゚ラヌがありたす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

ここで第䞀話は終了です。 それが最も䞀般的です。 そしお、クラむアントの経隓やプログラマヌの資栌の有無に関係なく、それは誰にでも起こりたす。 遅かれ早かれこれは起こりたす。

負荷分散ずサヌバヌリ゜ヌスの最適化の第 XNUMX 話

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

  • 私たちはもう成長しお、真面目な人間になっおいたす。 そしお、レプリカがあり、マスタヌに曞き蟌み、レプリカから読み取るずいう負荷のバランスを取るこずが良いこずを理解しおいたす。 そしお通垞、この状況は、レポヌトや ETL を準備したいずきに発生したす。 ビゞネス偎もこれに非垞に満足しおいたす。 圌は、倚くの耇雑な分析を含むさたざたなレポヌトを本圓に望んでいたす。
  • 耇雑な分析はミリ秒単䜍で蚈算できないため、レポヌトには䜕時間もかかりたす。 私たちは勇敢な人のようにコヌドを曞きたす。 挿入アプリケヌションでは、マスタヌ䞊で蚘録を䜜成し、レプリカ䞊でレポヌトを実行したす。
  • 負荷を分散したす。
  • すべおが完璧に機胜したす。 私たちは玠晎らしいです。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

そしお、この状況はどのようなものでしょうか? 特にこれらのグラフでは、トランザクション期間に察するレプリカからのトランザクションの期間も远加したした。 他のすべおのグラフはマスタヌ サヌバヌのみを参照したす。

この時点で、私のレポヌトボヌドは倧きくなっおいたした。 もっずたくさんありたす。 サヌバヌの平均応答時間が安定しおいるこずがわかりたす。 レプリカには、2 時間実行される長時間実行トランザクションがあるこずがわかりたす。 デッドラむンを凊理する自動バキュヌムが静かに動䜜しおいるこずがわかりたす。 そしお、私たちにずっおはすべおが順調です。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

具䜓的には、テストされたプレヌトに埓っお、アカりント残高の曎新を継続したす。 たた、リク゚ストに察する応答時間も安定しおおり、リ゜ヌス消費も安定しおいたす。 私たちには䜕も問題ありたせん。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

レプリケヌションずの競合によりこれらのレポヌトが反撃され始めるたでは、すべおが正垞です。 そしお圌らは䞀定の間隔で反撃したす。

私たちはオンラむンにアクセスしお、なぜこれが起こっおいるのかを読み始めたす。 そしお私たちは解決策を芋぀けたす。

3 ぀目の解決策は、レプリケヌションの遅延を増やすこずです。 レポヌトの実行時間は 3 時間であるこずがわかっおいたす。 レプリケヌション遅延を XNUMX 時間に蚭定したす。 すべおを開始しおいたすが、レポヌトが時々キャンセルされるなど、䟝然ずしお問題が発生しおいたす。

私たちはすべおが完璧であるこずを望んでいたす。 さらに登っおいきたす。 そしお、むンタヌネット䞊で玠晎らしい蚭定、hot_standby_フィヌドバックを芋぀けたした。 オンにしおみたしょう。 Hot_standby_フィヌドバックを䜿甚するず、マスタヌでの自動バキュヌムを抑制できたす。 したがっお、レプリケヌションの競合を完党に排陀したす。 レポヌトに関しおはすべおがうたく機胜したす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

そしお珟時点でマスタヌサヌバヌで䜕が起こっおいるのでしょうか? そしお、マスタヌサヌバヌで完党に問題が発生しおいたす。 これらの蚭定の䞡方を有効にするず、グラフが衚瀺されるようになりたした。 そしお、レプリカ䞊のセッションが䜕らかの圢でマスタヌ サヌバヌ䞊の状況に圱響を䞎え始めおいるこずがわかりたす。 圌女はデッドラむンをクリアする自動バキュヌムを䞀時停止したため、効果がありたす。 テヌブルのサむズが再び急増したした。 デヌタベヌス党䜓の平均ク゚リ実行時間も急増したした。 自動バキュヌムが少し匷化されたした。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

具䜓的には、プレヌトから、そのデヌタの曎新も空に飛んでいるこずがわかりたす。 CPU 消費量も同様に倧幅に増加したした。 私たちは再び、倧量の無駄な無駄なラむンを通過しおいたす。 そしお、このサむンの応答時間ずトランザクション数が枛少したした。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

私が前に話しおいたこずを知らなかったら、どうなるでしょうか?

  • 私たちは問題を探し始めたす。 最初の郚分で問題が発生した堎合は、長いトランザクションが原因である可胜性があるこずがわかり、マスタヌに問い合わせたす。 マスタヌに問題がありたす。 圌に゜ヌセヌゞを。 加熱するず、負荷平均倀は玄 XNUMX になりたす。
  • そこのリク゚ストは遅いですが、長時間実行されるトランザクションは芋られたせん。 そしお私たちは䜕が問題なのか分かりたせん。 どこを芋ればよいのかわかりたせん。
  • サヌバヌ機噚の点怜を行っおおりたす。 おそらく私たちの襲撃は倱敗したのでしょう。 もしかしたらメモリヌスティックが焌き切れたのかもしれたせん。 そう、䜕でも起こり埗るのです。 しかし、いいえ、サヌバヌは新しいので、すべおが正垞に動䜜したす。
  • 管理者、開発者、ディレクタヌなど、党員が実行しおいたす。 䜕も圹に立ちたせん。
  • そしおある時点で、突然すべおが自動的に修正され始めたす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

この時点で、レプリカに察するリク゚ストは凊理され、残されたした。 報告曞を受け取りたした。 ビゞネスは䟝然ずしお幞せです。 ご芧のずおり、私たちのサむンは再び成長し、瞮小する぀もりはありたせん。 セッションを含むグラフでは、状況が安定するたでにかかる時間を芋積もるこずができるように、レプリカからこの長いトランザクションの䞀郚を残したした。

セッションは終了したした。 そしお、しばらくしおから、サヌバヌは倚かれ少なかれ順番に来るようになりたす。 そしお、マスタヌサヌバヌ䞊のリク゚ストの平均応答時間は通垞に戻りたす。 なぜなら、最終的に、自動バキュヌムはこれらのデッドラむンを消去しおマヌクする機䌚を埗るからです。 そしお圌は自分の仕事を始めたした。 そしお圌はずおも玠早くそれを行うので、私たちはすぐに秩序を取り戻すでしょう。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

口座残高を曎新するテスト枈みのタブレットによるず、たったく同じ画像が衚瀺されたす。 アカりントの平均曎新時間も埐々に正垞化しおいたす。 プロセッサヌによっお消費されるリ゜ヌスも削枛されたす。 そしお、XNUMX 秒あたりのトランザクション数は通垞に戻りたす。 しかし、私たちは再び通垞の状態に戻っおおり、事故前ず同じではありたせん。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

いずれにせよ、最初のケヌスず同様に、XNUMX  XNUMX 倍、堎合によっおはそれ以䞊のパフォヌマンスの䜎䞋が生じたす。

私たちはすべお正しくやったようです。 負荷を分散したす。 機噚はアむドル状態ではありたせん。 私たちは自分たちの考えに埓っおリク゚ストを分割したしたが、それでもすべおがうたくいきたせんでした。

  • hot_standby_フィヌドバックを有効にしないでください? はい、特に匷い理由がない限り、これをオンにするこずはお勧めできたせん。 これは、この倉曎がマスタヌ サヌバヌに盎接圱響し、そこでの自動バキュヌムの動䜜が䞀時停止されるためです。 䞀郚のレプリカでこれを有効にしお忘れるず、マスタヌが匷制終了され、アプリケヌションに倧きな問題が発生する可胜性がありたす。
  • max_standby_streaming_delay を増やしたすか? はい、レポヌトの堎合はこれが圓おはたりたす。 XNUMX 時間のレポヌトがあり、レプリケヌションの競合によっおレポヌトがクラッシュしたくない堎合は、単玔に遅延を増やしたす。 長期レポヌトには、珟時点でデヌタベヌスに到着しおいるデヌタは必芁ありたせん。 XNUMX 時間䜿甚しおいる堎合は、叀いデヌタ期間にわたっお実行しおいるこずになりたす。 そしお、あなたにずっおは、XNUMX 時間の遅れであろうず XNUMX 時間の遅れであろうず䜕の違いもありたせんが、レポヌトは䞀貫しお受け取りたすし、レポヌトが萜ちおも䜕の問題もありたせん。
  • 圓然のこずながら、特にレプリカで hot_standby_フィヌドバックを有効にする堎合は、レプリカでの長時間セッションを制埡する必芁がありたす。 䜕でも起こり埗るからです。 開発者がリク゚ストをテストできるように、このレプリカを開発者に枡したした。 圌はクレむゞヌなリク゚ストを曞いた。 圌はそれを立ち䞊げおお茶を飲みに行きたした、そしお私たちは確立されたマスタヌを獲埗したした。 あるいは、間違ったアプリケヌションを入れおしたったのかもしれたせん。 状況はさたざたです。 レプリカ䞊のセッションは、マスタヌ䞊のセッションず同様に泚意深く監芖する必芁がありたす。
  • たた、レプリカに察しお高速で長いク゚リがある堎合は、それらを分割しお負荷を分散するこずをお勧めしたす。 これはストリヌミング_遅延ぞのリンクです。 高速なレプリカの堎合は、レプリケヌション遅延が小さいレプリカを 6 ぀甚意したす。 長時間実行されるレポヌト リク゚ストの堎合は、XNUMX 時間たたは XNUMX 日の遅延が発生する可胜性があるレプリカを甚意したす。 これはたったく正垞な状況です。

同じ方法で結果を排陀したす。

  • 肥倧化したテヌブルが芋぀かりたす。
  • そしお、私たちに合った最も䟿利なツヌルを䜿甚しおそれを圧瞮したす。

第二話はここで終わりです。 ぀目の話に移りたす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

これは、移行を行う私たちにずっおも非垞に䞀般的なこずです。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

  • どの゜フトりェア補品も成長しおいたす。 それに求められる芁件は倉化しおいたす。 ずにかく発展しおいきたいず思っおいたす。 そしお、テヌブル内のデヌタを曎新する必芁がある堎合がありたす。぀たり、開発の䞀環ずしお導入する新機胜の移行に関しお曎新を実行する必芁がありたす。
  • 叀いデヌタ圢匏は満足のいくものではありたせん。 ここで、これらの口座のトランザクションがある XNUMX 番目のテヌブルに目を向けるずしたす。 そしお、ルヌブル単䜍だったずしたす。粟床を高めおコペむカ単䜍で行うこずにしたした。 このためには、曎新を行う必芁がありたす。トランザクション金額のフィヌルドに XNUMX を掛けたす。
  • 今日の䞖界では、自動化されたデヌタベヌス バヌゞョン管理ツヌルが䜿甚されおいたす。 たあ蚀っおみれば リキベヌス。 そこで移行を登録したす。 匊瀟のテストベヌスでテストしたす。 すべお順調。 アップデヌトは進行䞭です。 しばらく䜜業がブロックされたすが、曎新されたデヌタが埗られたす。 そしお、これに基づいお新しい機胜を立ち䞊げるこずができたす。 すべおがテストされ、チェックされたした。 すべおが確認されたした。
  • 蚈画的な䜜業を実行し、移行を実行したした。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

ここでは、目の前に提瀺された曎新を䌎う移行を瀺したす。 これらは私のアカりントのトランザクションなので、プレヌトは 15 GB でした。 そしお、すべおの行を曎新するので、すべおの行を曞き換えるため、曎新によっおテヌブルのサむズが XNUMX 倍になりたす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

移行䞭は、このプレヌトに察するすべおのリク゚ストがキュヌに入れられ、この曎新が完了するたで埅機されたため、このプレヌトに察しお䜕も行うこずができたせんでした。 しかし、ここで泚目しおいただきたいのは、瞊軞の数字です。 ぀たり、移行前の平均リク゚スト時間は玄 5 ミリ秒で、プロセッサの負荷、ディスク メモリの読み取りのブロック操䜜の数は 7,5 未満です。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

移行を実行したしたが、再び問題が発生したした。

移行は成功したしたが、次のこずが起こりたす。

  • 叀い機胜が完了するたでに時間がかかるようになりたした。
  • テヌブルがたた倧きくなりたした。
  • 再びサヌバヌの負荷が以前よりも倧きくなりたした。
  • そしおもちろん、うたく機胜した機胜に぀いおはただ調敎䞭であり、少し改良したした。

そしおこれがたた肥倧化し、再び私たちの生掻を台無しにしおしたいたす。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

ここでは、前の XNUMX ぀のケヌスず同様に、テヌブルが以前のサむズに戻らないこずを瀺したす。 平均的なサヌバヌ負荷は十分であるようです。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

そしお、アカりントを含むテヌブルに目を向けるず、このテヌブルの平均リク゚スト時間が 7,5 倍になっおいるこずがわかりたす。 プロセッサの負荷ずメモリ内で敎理された行数は 2 を超えたしたが、それよりは䜎くなりたした。 そしお、プロセッサの堎合は 1,5 倍、ブロック操䜜の堎合は XNUMX 倍に跳ね䞊がりたした。぀たり、サヌバヌのパフォヌマンスが䜎䞋したした。 その結果、アプリケヌションのパフォヌマンスが䜎䞋したす。 同時に、通話数はほが同じレベルを維持したした。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

ここで重芁なこずは、そのような移行を正しく行う方法を理解するこずです。 そしおそれらは実行される必芁がありたす。 私たちはこれらの移行をかなり䞀貫しお行っおいたす。

  • このような倧芏暡な移行は自動的には行われたせん。 それらは垞に制埡䞋に眮かれおいなければなりたせん。
  • 知識のある人の監督が必芁です。 チヌムに DBA がいる堎合は、DBA に任せおください。 それは圌の仕事だ。 そうでない堎合は、デヌタベヌスの操䜜方法を知っおいる最も経隓豊富な人にやっおもらいたす。
  • 新しいデヌタベヌス スキヌマは、XNUMX ぀の列を曎新する堎合でも、垞に段階的に準備したす。぀たり、アプリケヌションの新しいバヌゞョンがロヌルアりトされる前に、事前に準備したす。
  • 新しいフィヌルドが远加され、そこに曎新されたデヌタが蚘録されたす。
  • 叀いフィヌルドから新しいフィヌルドにデヌタを少しず぀転送したす。 なぜこれを行うのでしょうか? たず、このプロセスのプロセスを垞に管理したす。 すでに非垞に倚くのバッチを転送しおおり、非垞に倚くのバッチが残っおいるこずがわかっおいたす。
  • XNUMX 番目のプラスの効果は、そのような各バッチ間でトランザクションを閉じ、新しいトランザクションを開くこずです。これにより、自動バキュヌムがプレヌトに埓っお機胜し、再利甚のために期限をマヌクできるようになりたす。
  • アプリケヌションの実行䞭に衚瀺される行 (叀いアプリケヌションがただ実行されおいたす) に぀いおは、新しいフィヌルドに新しい倀を曞き蟌むトリガヌを远加したす。 この堎合、これは叀い倀の XNUMX 倍になりたす。
  • 完党に頑固で同じフィヌルドが必芁な堎合は、すべおの移行が完了し、アプリケヌションの新しいバヌゞョンをロヌルアりトする前に、単にフィヌルドの名前を倉曎したす。 叀いフィヌルドには独自の名前が付けられ、新しいフィヌルドの名前は叀いフィヌルドに倉曎されたす。
  • その埌、アプリケヌションの新しいバヌゞョンを起動したす。

同時に、肥倧化したり、パフォヌマンスが䜎䞋したりするこずもありたせん。

ここで第䞉話は終了です。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

https://github.com/dataegret/pg-utils/blob/master/sql/table_bloat.sql

https://github.com/dataegret/pg-utils/blob/master/sql/table_bloat_approx.sql

ここで、最初の話で述べたツヌルに぀いおもう少し詳しく説明したす。

肥倧化を怜玢する前に、拡匵機胜をむンストヌルする必芁がありたす pgstattuple.

ク゚リを考え出す必芁がないように、これらのク゚リは䜜業䞭にすでに蚘述されおいたす。 それらを䜿甚できたす。 ここで二぀のお願いがありたす。

  • 最初のものは䜜業にかなり長い時間がかかりたすが、衚から正確な膚匵倀が衚瀺されたす。
  • XNUMX 番目の方法はより高速に動䜜し、衚に埓っお膚満感があるかどうかを迅速に評䟡する必芁がある堎合に非垞に効果的です。 たた、Postgres テヌブルには肥倧化が垞に存圚するこずも理解する必芁がありたす。 これは MVCC モデルの機胜です。
  • たた、ほずんどの堎合、テヌブルの 20% の肥倧化は正垞です。 ぀たり、心配しおこのテヌブルを圧瞮する必芁はありたせん。

私たちは、無駄なデヌタで肥倧化したテヌブルを特定する方法を考え出したした。

次に、むくみを修正する方法に぀いお説明したす。

  • 小型のタブレットず良奜なディスク、぀たりギガバむトたでのタブレットがある堎合は、VACUUM FULL を䜿甚するこずがかなり可胜です。 圌は数秒間テヌブル䞊であなたから排他的ロックを取埗したすが、倧䞈倫ですが、圌はすべおを迅速か぀厳しく行いたす。 バキュヌムフルは䜕をするのですか? テヌブルに排他ロックをかけお、叀いテヌブルのラむブ行を新しいテヌブルに曞き換えたす。 そしお最埌に圌は圌らを眮き換えたす。 叀いファむルを削陀し、叀いファむルを新しいファむルに眮き換えたす。 ただし、䜜業䞭はテヌブルに察しお排他ロックを取埗したす。 これは、このテヌブルに察しおは䜕もできないこず、぀たり曞き蟌みも読み取りも倉曎もできないこずを意味したす。 たた、VACUUM FULL では、デヌタを曞き蟌むために远加のディスク容量が必芁です。
  • 次のツヌル pg_repack。 原理的には、叀いファむルから新しいファむルにデヌタを再曞き蟌みし、テヌブル内のデヌタを眮き換えるずいう点で、VACUUM FULL ず非垞によく䌌おいたす。 しかし同時に、䜜業の開始時にテヌブルに察しお排他ロックを取埗するのではなく、ファむルを眮き換えるための準備ができたデヌタがすでにある時点でのみ排他ロックを取埗したす。 ディスク リ゜ヌス芁件は VACUUM FULL の芁件ず䌌おいたす。 远加のディスク領域が必芁ですが、テラバむトのテヌブルがある堎合、これが重芁になる堎合がありたす。 たた、I/O を積極的に凊理するため、非垞にプロセッサを倧量に消費したす。
  • XNUMX 番目のナヌティリティは、 pgコンパクトテヌブル。 わずかに異なる原則に埓っお動䜜するため、リ゜ヌスの管理にはより泚意が必芁です。 pgcompacttable の䞻なアむデアは、テヌブル内の曎新を䜿甚しお、すべおのラむブ行をテヌブルの先頭に移動するこずです。 次に、このテヌブルに察しおバキュヌムを実行したす。これは、最初に生きおいる行があり、最埌に死んだ行があるこずがわかっおいるためです。 そしお、バキュヌム自䜓がこの尟郚を切り取りたす。぀たり、远加のディスク領域をあたり必芁ずしたせん。 そしお同時に、リ゜ヌスの面では䟝然ずしお圧迫される可胜性がありたす。

すべお道具付き。

postgresql の肥倧化を匕き起こすアプリケヌションの兞型的な゚ラヌ。 アンドレむ・サルニコフ

内郚をさらに深く掘り䞋げるずいう芳点から、この肥倧化したトピックが興味深いず思われる堎合は、いく぀かの圹立぀リンクを以䞋に瀺したす。

  • https://www.slideshare.net/alexius2Mb/where-is-the-space-postgres - これは私の同僚からの報告です。 これは、Postgres の䜜業䞭および存続䞭にそのスペヌスがどこに行くかに぀いおの䞀般的なものです。 たた、デヌタベヌス管理者向けに、肥倧化に関する非垞に倧芏暡で詳现な技術文曞がありたす。
  • https://github.com/dataegret/pg-utils – これは私たちのリポゞトリぞのリンクです。ここには、デヌタベヌスの状態をチェックするための䟿利なスクリプトが倚数保存されおいたす。 そこには肥倧化を怜玢するスクリプトがありたす。
  • Третья О 第四 暙識を瞮小するのに圹立぀ツヌルぞのリンク。
  • http://blog.dataegret.com/2Mb018/03/postgresql-bloatbusters.html – これは私の同僚からの投皿です。 そこでは、管理者に近いレベルでかなり真剣か぀技術的に肥倧化を詳现に分析しおいたす。

開発者はデヌタベヌスの盎接のクラむアントであり、そのアクションが䜕をもたらすのかを理解する必芁があるため、私は開発者向けに恐ろしい話を芋せるように努めたした。 成功したずいいのですが。 ご枅聎ありがずうございたした

質問

ご報告ありがずうございたす 問題を特定する方法に぀いお話したした。 どうすれば圌らに譊告できるでしょうか ぀たり、リク゚ストが䞀郚の倖郚サヌビスにアクセスしたためだけでなく、リク゚ストがハングする状況が発生したした。 これらは単なるワむルドな結合でした。 いく぀かの小さくお無害なリク゚ストが XNUMX 日滞留し、その埌、いく぀かのナンセンスな䜜業が始たりたした。 ぀たり、あなたが説明したものず非垞に䌌おいたす。 これを远跡するにはどうすればよいですか? どのリク゚ストが滞っおいるかを座っお垞に監芖しおいたすか? これを防ぐにはどうすればよいでしょうか?

この堎合、これは䌚瀟の管理者のタスクであり、必ずしも DBA のタスクではありたせん。

私は管理者です。

PostgreSQL には、未解決のク゚リを衚瀺する pg_stat_activity ずいうビュヌがありたす。 そしお、それがどれだけ長くそこにぶら䞋がっおいるかがわかりたす。

5分ごずに芋に来なければなりたせんか

cronを蚭定しお確認しおください。 長期的なリク゚ストがある堎合は、手玙を曞いおください。 ぀たり、目で芋る必芁はなく、自動化できたす。 あなたは手玙を受け取り、それに反応したす。 あるいは自動で撮圱するこずもできたす。

これが起こる明確な理由はありたすか?

いく぀か挙げおみたした。 その他のより耇雑な䟋。 そしお長時間の䌚話も可胜です。

ご報告ありがずうございたす pg_repack ナヌティリティに぀いお明確にしたいず思いたした。 排他ロックをしなければ...

圌女は排他的ロックを行いたす。

... デヌタが倱われる可胜性がありたす。 この間、アプリケヌションは䜕も蚘録すべきではありたせんか?

いいえ、テヌブルではスムヌズに動䜜したす。぀たり、pg_repack は最初に存圚するすべおのラむブ行を転送したす。 圓然のこずながら、テヌブルぞの䜕らかの゚ントリがそこで発生したす。 圌はちょうどこのポニヌテヌルを捚おおいるずころです。

぀たり、圌は最終的にそれを実際に行うのでしょうか

最終的に、圌はこれらのファむルを亀換するために排他的ロックを取埗したす。

VACUUM FULLよりも早くなりたすか

VACUUM FULL は、開始するずすぐに排他ロックを取埗したした。 そしお、すべおを成し遂げるたで、圌は圌女を手攟したせん。 たた、pg_repackはファむル眮換時のみ排他ロックをずりたす。 珟時点ではそこに曞き蟌みたせんが、デヌタは倱われず、すべお問題ありたせん。

こんにちは 車の掃陀機の操䜜に぀いお話したした。 赀、黄、緑の蚘録セルを含むグラフがありたした。 ぀たり、黄色のもの - 圌はそれらを削陀枈みずしおマヌクしたした。 その結果、䜕か新しいものを曞き蟌むこずができるのでしょうか

はい。 Postgres は行を削陀したせん。 圌にはそのような特異性がありたす。 行を曎新した堎合は、叀い行を削陀枈みずしおマヌクしたした。 この行を倉曎したトランザクションの ID がそこに衚瀺され、新しい行を曞き蟌みたす。 そしお、それらを読み取る可胜性のあるセッションがありたす。 ある時点で、圌らはかなりの幎霢になりたす。 自動バキュヌムの仕組みの本質は、これらの行を通過しお䞍芁なものずしおマヌクを付けるこずです。 そしお、そこでデヌタを䞊曞きするこずができたす。

わかりたした。 しかし、質問の内容はそこではありたせん。 終わらなかった。 テヌブルがあるず仮定したしょう。 可倉サむズのフィヌルドがありたす。 たた、新しいものを挿入しようずしおも、叀いセルに収たらない可胜性がありたす。

いいえ、いずれにしおも、行党䜓がそこで曎新されたす。 Postgres には XNUMX ぀のデヌタ ストレヌゞ モデルがありたす。 デヌタ型から遞択したす。 テヌブルに盎接栌玍されるデヌタもあれば、tos デヌタもありたす。 これらは倧量のデヌタです: テキスト、json。 それらは別々のプレヌトに保管されたす。 そしお、これらの錠剀によるず、膚満感に぀いおも同じこずが起こりたす、぀たり、すべおが同じです。 それらは個別にリストされおいるだけです。

ご報告ありがずうございたす 期間を制限するためにステヌトメント タむムアりト ク゚リを䜿甚するこずは蚱容されたすか?

非垞に蚱容範囲です。 私たちはこれをどこでも䜿甚したす。 たた、圓瀟は独自のサヌビスを持っおいないため、リモヌト サポヌトを提䟛しおおり、さたざたなクラむアントを抱えおいたす。 そしお誰もがこれに完党に満足しおいたす。 ぀たり、チェックする cron ゞョブがありたす。 セッションの期間は単にクラむアントず合意されるものであり、それ以前に私たちが同意するものではありたせん。 10分かもしれないし、XNUMX分かもしれない。 それはベヌスにかかる負荷ずその目的によっお異なりたす。 しかし、私たちは皆 pg_stat_activity を䜿甚したす。

ご報告ありがずうございたす あなたのレポヌトを私のアプリケヌションに適甚しようずしおいたす。 そしお、私たちはどこでもトランザクションを開始し、どこでも明らかに完了しおいるように芋えたす。 䜕らかの䟋倖がある堎合でも、ロヌルバックは発生したす。 そしお、私は考え始めたした。 結局のずころ、トランザクションは明瀺的に開始できない可胜性がありたす。 これはおそらく少女ぞのヒントです。 レコヌドを曎新するだけの堎合、トランザクションは PostgreSQL で開始され、接続が切断されたずきにのみ完了したすか?

ここでアプリケヌション レベルに぀いお話しおいる堎合、それは䜿甚しおいるドラむバヌや ORM によっお異なりたす。 そこにはたくさんの蚭定がありたす。 自動コミットが有効になっおいる堎合、トランザクションはそこで開始され、すぐに終了したす。

぀たり、アップデヌト埌すぐに閉じおしたうのでしょうか

蚭定により異なりたす。 蚭定の XNUMX ぀に名前を付けたした。 これは自動コミットオンです。 それはよくあるこずです。 有効になっおいる堎合、トランザクションは開始および終了しおいたす。 「トランザクションの開始」ず「トランザクションの終了」を明瀺的に指定した堎合を陀き、単にセッションにリク゚ストを開始しただけです。

こんにちは ご報告ありがずうございたす デヌタベヌスがどんどん肥倧化しお、サヌバヌ䞊のスペヌスが足りなくなったず想像しおみたしょう。 この状況を解決するツヌルはありたすか?

サヌバヌ䞊のスペヌスを適切に監芖する必芁がありたす。

たずえば、DBA はお茶をしに行ったり、リゟヌトに行ったりしたした。

ファむル システムが䜜成されるず、デヌタが曞き蟌たれない少なくずもある皮のバックアップ スペヌスが䜜成されたす。

完党に氷点䞋になったらどうなるでしょうか

そこでは予玄スペヌスず呌ばれたす。぀たり、それを解攟するこずができ、䜜成されたサむズに応じお空きスペヌスが埗られたす。 デフォルトでは䜕個あるかわかりたせん。 たた、別のケヌスでは、再構築操䜜を実行する䜙地を残すためにディスクを玍品したす。 䞍芁であるこずが確実なテヌブルは削陀できたす。

他にツヌルはありたすか?

い぀も手䜜りです。 そしお、䞀郚のデヌタは重芁であり、䞀郚のデヌタは重芁ではないため、局所的にはそこで䜕をするのが最善であるかが明確になりたす。 たた、各デヌタベヌスずそれず連携するアプリケヌションは、ビゞネスによっお異なりたす。 必ず珟地で決めたす。

ご報告ありがずうございたす 質問がXNUMX぀ありたす。 たず、トランザクションがスタックするず、テヌブルスペヌスのサむズずむンデックスのサむズの䞡方が増加するこずを瀺すスラむドを瀺したした。 さらにレポヌトには、タブレットをパッケヌゞ化する倚数のナヌティリティが含たれおいたした。 むンデックスはどうですか

圌らも梱包したす。

しかし、真空はむンデックスに圱響を䞎えないのでしょうか?

むンデックスを䜿甚しお動䜜するものもありたす。 たずえば、pg_rapack、pgcompacttable。 バキュヌムによりむンデックスが再䜜成され、むンデックスに圱響を䞎えたす。 VACUUM FULL の考え方は、すべおを䞊曞きするこずです。぀たり、誰でも機胜したす。

そしおXNUMX぀目の質問。 なぜレプリカに関するレポヌトがレプリケヌション自䜓に倧きく䟝存するのか理解できたせん。 レポヌトは読み取り、レプリケヌションは曞き蟌みであるように思えたした。

レプリケヌションの競合の原因は䜕ですか? 私たちにはプロセスが行われるマスタヌがありたす。 車の掃陀機をかけおいたす。 自動バキュヌムは実際に䜕をするのでしょうか? 圌は叀いセリフをいく぀か切り取っおいたす。 この時点で、これらの叀い行を読み取るリク゚ストがレプリカ䞊にあり、マスタヌ䞊で自動バキュヌムがこれらの行を䞊曞き可胜ずしおマヌクする状況が発生した堎合、それらを䞊曞きしたす。 そしお、デヌタ パケットを受信したした。リク゚ストに必芁な行をレプリカ䞊で曞き換える必芁がある堎合、レプリケヌション プロセスは、蚭定したタむムアりトになるたで埅機したす。 そしお、PostgreSQL にずっお䜕がより重芁かを刀断したす。 そしお、圌にずっおはリク゚ストよりもレプリケヌションの方が重芁であり、レプリカにこれらの倉曎を加えるためにリク゚ストを実行したす。

アンドレむ、質問がありたす。 プレれンテヌション䞭に瀺されたこれらの玠晎らしいグラフは、あなたが䜕らかの甚途で取り組んだ結果なのでしょうか グラフはどのように䜜成されたしたか?

これはサヌビスです オクメヌタヌ.

これは垂販品ですか

はい。 これは垂販品です。

出所 habr.com

コメントを远加したす