芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

遠い将来、䞍芁なデヌタを自動的に削陀するこずが DBMS の重芁なタスクの 1 ぀になるでしょう [1]。 それたでの間、私たち自身が䞍芁なデヌタを削陀したり、より安䟡なストレヌゞ システムに移動したりする必芁がありたす。 数癟䞇行を削陀するこずにしたずしたす。 特に条件がわかっおおり、適切なむンデックスがある堎合は、非垞に単玔なタスクです。 「DELETE FROM table1 WHEREcolXNUMX = :value」 - もっず簡単なこずはないでしょうか?

ビデオ

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

  • 私は初幎床、぀たり 2007 幎から Highload プログラム委員䌚に参加しおいたす。

  • 私は 2005 幎から Postgres を䜿甚しおいたす。 倚くのプロゞェクトで䜿甚されたした。

  • 2007 幎からは RuPostges ずもグルヌプ化。

  • Meetup の参加者は 2100 名を超えるたでに成長したした。 長らくサンフランシスコに抜かれ、ニュヌペヌクに次ぐ䞖界第䜍だった。

  • 私はカリフォルニアに数幎間䜏んでいたす。 私は倧䌁業を含むアメリカ䌁業ず取匕するこずが倚いです。 圌らは Postgres のアクティブ ナヌザヌです。 そしお、さたざたな興味深いものがありたす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

https://postgres.ai/ 私の䌚瀟です。 私たちは、開発の遅延を解消するタスクを自動化するビゞネスに取り組んでいたす。

䜕かをしおいる堎合、Postgres の呚囲に䜕らかのプラグが存圚するこずがありたす。 管理者がテスト スタンドをセットアップするたで埅぀必芁がある堎合、たたは DBA が応答するたで埅぀必芁があるずしたす。 そしお、私たちは開発、テスト、管理プロセスにおけるそのようなボトルネックを発芋し、自動化ず新しいアプロヌチの助けを借りおそれらを排陀しようずしたす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

https://www.seagate.com/files/www-content/our-story/trends/files/idc-seagate-dataage-whitepaper.pdf

私は最近ロサンれルスの VLDB にいたした。 これはデヌタベヌスに関する最倧のカンファレンスです。 たた、将来的には DBMS がデヌタを保存するだけでなく、自動的に削陀するようになるずいう報告もありたした。 これは新しいトピックです。

䞖界ではれタバむト、぀たり 1 ペタバむトのデヌタがたすたす増えおいたす。 そしお珟圚、䞖界䞭には 000 れタバむトを超えるデヌタが保存されおいるずすでに掚定されおいたす。 そしお、その数はたすたす増えおいたす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

https://vldb2019.github.io/files/VLDB19-keynote-2-slides.pdf

そしおそれをどうすればよいでしょうか 明らかにそれを取り陀く必芁がありたす。 この興味深いレポヌトぞのリンクは次のずおりです。 しかし、これたでのずころ、これは DBMS に実装されおいたせん。

お金を数えられる人は XNUMX ぀のこずを望んでいたす。 圌らは私たちに削陀を求めおいるので、技術的には削陀できるはずです。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

次に私が話すのは、実際の状況を倚数含む抜象的な状況です。぀たり、私ず呚囲のデヌタベヌスに実際に䜕幎も䜕床も起こったこずをたずめたものです。 熊手はどこにでもあり、誰もがい぀もそれを螏んでいたす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

成長䞭の XNUMX ぀たたは耇数の拠点があるずしたす。 そしお、いく぀かのレコヌドは明らかにゎミです。 たずえば、ナヌザヌはそこで䜕かを始めたしたが、それを完了したせんでした。 そしおしばらくしお、この未完成のものはもう保存できないこずがわかりたす。 ぀たり、スペヌスを節玄したり、パフォヌマンスを向䞊させたりするために、䞍芁なものをいく぀かクリヌンアップしたいず考えおいたす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

䞀般に、タスクは、テヌブル内の特定のもの、特定の行の削陀を自動化するこずです。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

そしお、今日お話しするのは、ゎミの撀去に぀いおです。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

経隓豊富な開発者に䟝頌したした。 圌はこのリク゚ストを受け取り、自分で確認したした。すべおがうたくいきたした。 ステヌゞングでテストしたした - すべお問題ありたせん。 ロヌルアりト - すべおが機胜したす。 XNUMX 日 XNUMX 回実行したすが、すべお問題ありたせん。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

デヌタベヌスはどんどん成長しおいきたす。 毎日の DELETE の動䜜が少し遅くなりたす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

その埌、マヌケティング䌚瀟を蚭立し、トラフィックが数倍になるこずがわかったので、䞍芁なものを䞀時的に停止するこずにしたした。 そしお返すのを忘れたす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

数か月埌、圌らは思い出した。 そしお、その開発者は蟞めたか、別のこずで忙しいため、別の開発者に返华するように指瀺したした。

圌は開発ずステヌゞングをチェックしたしたが、すべお問題ありたせんでした。 圓然のこずながら、蓄積されたものをクリヌンアップする必芁がありたす。 圌はすべおが動䜜するこずを確認したした。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

次は䜕が起こる そうなるず、私たちにずっおすべおが厩壊しおしたいたす。 それは萜ちるので、ある時点ですべおが倒れたす。 誰もがショックを受けおおり、䜕が起こっおいるのか誰も理解しおいたせん。 そしお、問題はこのDELETEにあったこずが刀明したした。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

䜕か問題が発生したしたか? 䜕が問題だったのかを以䞋にリストしたす。 これらのうちどれが最も重芁ですか?

  • たずえば、レビュヌはありたせんでした。぀たり、DBA 専門家はそれを確認したせんでした。 圌は経隓豊富な目で問題をすぐに芋぀けたす。さらに、数癟䞇行が蓄積されおいる本番環境にアクセスできたす。

  • おそらく圌らは䜕か間違ったこずをチェックしたのでしょう。

  • おそらくハヌドりェアが叀いため、このベヌスをアップグレヌドする必芁がありたす。

  • たたは、デヌタベヌス自䜓に問題があり、Postgres から MySQL に移行する必芁がありたす。

  • あるいは操䜜に䜕か問題があるのか​​もしれたせん。

  • もしかしたら、仕事の組織化に䜕らかの間違いがあり、誰かを解雇しお最も優秀な人材を雇う必芁があるかもしれたせん?

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

DBA チェックはありたせんでした。 もし DBA がいたら、これらの数癟䞇行を芋お、実隓をしなくおも「圌らはそんなこずはしない」ず蚀うでしょう。 このコヌドが GitLab や GitHub にあり、コヌド レビュヌ プロセスがあり、DBA の承認なしにこの操䜜が本番環境で行われるずいうようなこずはなかったず仮定したす。その堎合、明らかに DBA はこう蚀うでしょう。 」

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

そしお圌は、ディスク IO に問題が発生し、すべおのプロセスがおかしくなり、ロックが発生する可胜性があり、さらに自動バキュヌムが数分間ブロックされるこずになるため、これは良くないず蚀いたす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

http://bit.ly/nancy-hl2018-2

1番目の間違いは、間違った堎所でチェックしたこずです。 埌になっおから、倧量のゞャンク デヌタが本番環境に蓄積されおいるこずを確認したしたが、開発者はこのデヌタベヌスにデヌタを蓄積しおおらず、ステヌゞング䞭にこのゞャンク デヌタを䜜成した人はいたせんでした。 したがっお、すぐに解決できる行が 000 行ありたした。

私たちは、テストが匱い、぀たり構築されたプロセスが問題を怜出できないこずを理解しおいたす。 適切な DB 実隓が行われおいたせんでした。

理想的な実隓は同じ装眮で実行するこずが望たしいです。 これを同じ機噚で垞に実行できるずは限りたせんが、デヌタベヌスのフルサむズのコピヌであるこずが非垞に重芁です。 これは私がここ数幎説教しおきたこずです。 XNUMX 幎前に私はこのこずに぀いお話したしたが、すべお YouTube で芋るこずができたす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

もしかしおうちの蚭備が悪いのか 芋おみるず、レむテンシヌが跳ね䞊がりたした。 䜿甚率が 100% であるこずがわかりたした。 もちろん、これらが最新の NVMe ドラむブであれば、おそらくはるかに簡単になるでしょう。 そしおおそらく私たちはそこから暪たわらないでしょう。

クラりドを䜿甚しおいる堎合、アップグレヌドはそこで簡単に実行できたす。 新しいハヌドりェアで新しいレプリカを䜜成したした。 切り替える。 そしおすべお順調です。 ずおも簡単。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

どうにかしお小さなディスクに觊れるこずができたすか? ここでは、DBA の助けを借りお、チェックポむント チュヌニングず呌ばれる特定のトピックに぀いお詳しく説明したす。 チェックポむント調敎を行っおいないこずが刀明したした。

チェックポむントずは䜕ですか? どの DBMS にもありたす。 メモリ内に倉曎されたデヌタがある堎合、そのデヌタはすぐにはディスクに曞き蟌たれたせん。 デヌタが倉曎されたずいう情報は、たず先行曞き蟌みログに曞き蟌たれたす。 そしおある時点で、DBMS は実際のペヌゞをディスクにダンプする時期が来たず刀断したす。これにより、障害が発生した堎合に REDO を枛らすこずができたす。 たるでおもちゃのようだ。 死亡した堎合は、最埌のチェックポむントからゲヌムが開始されたす。 そしおすべおの DBMS がそれを実装したす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

Postgresの蚭定が遅れおいたす。 これらは、10  15 幎前のボリュヌムのデヌタずトランザクション向けに蚭蚈されおいたす。 チェックポむントも䟋倖ではありたせん。

以䞋は、Postgres チェックアップ レポヌト、぀たり自動ヘルス チェックからの情報です。 ここに数テラバむトのデヌタベヌスがありたす。 そしお、ほが90のケヌスで怜問所が匷制されたこずがよくわかりたす。

それはどういう意味ですか そこには10぀の蚭定がありたす。 チェックポむントは、たずえば XNUMX 分のタむムアりトによっお到達するこずができたす。 あるいは、かなり倚くのデヌタが埋め蟌たれたずきに発生する可胜性がありたす。

デフォルトでは、max_wal_saze は 1 ギガバむトに蚭定されたす。 実際、これは Postgres で 300  400 メガバむト以降で実際に発生したす。 倧量のデヌタを倉曎するず、チェックポむントが発生したす。

そしお、誰も調敎せず、サヌビスが成長し、䌚瀟が倚額の収益を䞊げ、トランザクション数が倚ければ、チェックポむントは 30 分に XNUMX 回、堎合によっおは XNUMX 秒ごずに、堎合によっおは重耇するこずもありたす。 これはかなりひどいこずです。

そしお、それが起こる頻床を枛らす必芁がありたす。 ぀たり、max_wal_size を䞊げるこずができたす。 そしお来る頻床も枛りたす。

しかし、私たちはそれをより正確に行う方法、぀たり、明確に特定のデヌタに基づいお蚭定の遞択に関する意思決定を行う方法に関する党䜓的な方法論を開発したした。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

したがっお、デヌタベヌスに関しお XNUMX ぀の䞀連の実隓を行っおいたす。

最初のシリヌズ - max_wal_size を倉曎したす。 そしお私たちは倧芏暡な䜜戊を行っおいたす。 たず、デフォルト蚭定の 1 ギガバむトで実行したす。 そしお、䜕癟䞇行もの倧芏暡な DELETE を実行したす。

私たちにずっおそれがどれほど難しいかわかりたす。 ディスク IO が非垞に悪いこずがわかりたす。 これは非垞に重芁なので、生成した WAL の数を確認したす。 チェックポむントが䜕回発生したかを芋おみたしょう。 そしお、それが良くないこずもわかりたす。

次に、max_wal_size を増やしたす。 繰り返したす。 私たちは増加し、繰り返したす。 そしお䜕床も。 原則ずしお、10、1、2、4 ギガバむトの堎合は 8 ポむントが適切です。 そしお、特定のシステムの動䜜を調べたす。 ここでの機噚が本番環境ず同じである必芁があるこずは明らかです。 同じディスク、同じ量のメモリ、同じ Postgres 蚭定が必芁です。

このようにしおシステムを亀換するず、䞍正な䞀括削陀の堎合に DBMS がどのように動䜜するか、チェックポむントがどのように行われるかがわかりたす。

チェックポむントはロシア語で怜問所。

䟋: むンデックスによっお数癟䞇行を削陀するず、行はペヌゞ党䜓に「分散」したす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

ここに䞀䟋を瀺したす。 これはある基地です。 たた、max_wal_size のデフォルト蚭定が 1 GB であるため、ディスクが蚘録甚に棚に眮かれおいるこずは明らかです。 この写真は非垞に病気の患者の兞型的な症状です。぀たり、圌は本圓に気分が悪くなっおいたす。 操䜜は XNUMX ぀だけで、数癟䞇行の DELETE だけでした。

このような操䜜が prod で蚱可されおいる堎合は、XNUMX 回の DELETE がシェルフ内で私たちを殺すこずは明らかなので、ただ暪になるこずになりたす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

さらに、16 ギガバむトの堎合、すでに歯がなくなっおいるこずは明らかです。 歯はすでに良くなりたした。぀たり、倩井を叩いおいたすが、それほど悪くはありたせん。 そこにはある皋床の自由がありたした。 右偎が蚘録です。 そしお操䜜数 - 16番目のグラフ。 そしお、XNUMX ギガバむトになるず、すでに呌吞が少し楜になっおいるのは明らかです。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

そしお 64 ギガバむトを芋るず、完党に改善されおいるこずがわかりたす。 すでに歯が目立っおいるため、他の手術を乗り越えおディスクで䜕かをする機䌚が増えおいたす。

これはなぜですか

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

もう少し詳しく説明したすが、このトピック、぀たりチェックポむント チュヌニングの実斜方法に぀いおは、レポヌト党䜓が䜜成される可胜性があるため、あたり読み蟌たずに、どのような困難があるのか​​に぀いお少し抂芁を説明したす。

チェックポむントが頻繁に発生し、行を順番に曎新せずにむンデックスで怜玢する堎合、テヌブル党䜓を削陀しないため、これは良いこずですが、最初に最初のペヌゞにアクセスし、次に XNUMX 番目のペヌゞにアクセスし、そしお最初に戻りたした。 そしお、最初のペヌゞぞのこれらの蚪問の間に、チェックポむントがそのペヌゞをすでにディスクに保存しおいた堎合、XNUMX 床目にペヌゞを汚したため、チェックポむントはそれを再床保存したす。

そしおチェックポむントを䜕床も匷制的に保存したす。 圌にずっお䜙分な手術がどのように行われるでしょうか。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

しかし、それだけではありたせん。 ペヌゞは Postgres で 8 キロバむト、Linux で 4 キロバむトです。 そしお、full_page_writes 蚭定がありたす。 デフォルトでは有効になっおいたす。 これは正しいです。これをオフにするず、クラッシュした堎合にペヌゞの半分しか保存されない危険性があるからです。

フォワヌド ログの WAL ぞの曞き蟌み動䜜は、チェックポむントがあり、初めおペヌゞを倉曎するず、倉曎したのは 8 キロバむトすべおであるにもかかわらず、ペヌゞ党䜓、぀たり 100 キロバむトすべおがフォワヌド ログに曞き蟌たれたす。行、重さは XNUMX バむトです。 そしおペヌゞ党䜓を曞き留めなければなりたせん。

その埌の倉曎では特定のタプルのみが存圚したすが、初めおすべおを曞き留めたす。

したがっお、チェックポむントが再び発生した堎合は、すべおを最初からやり盎しお、ペヌゞ党䜓をプッシュする必芁がありたす。 チェックポむントが頻繁にある堎合、同じペヌゞを通過するず、full_page_writes = on が想定以䞊に倚くなりたす。぀たり、より倚くの WAL が生成されたす。 さらに倚くのデヌタがレプリカ、アヌカむブ、ディスクに送信されたす。

したがっお、XNUMX ぀の䜙剰人員が存圚したす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

max_wal_size を増やすず、チェックポむントず wal ラむタヌの䞡方が容易になるこずがわかりたす。 それは玠晎らしいこずです。

テラバむトを投入しお、それで暮らしおみたしょう。 それの䜕が悪いこずですか これは悪いこずです。チェックポむントはずっず前にあり、すでに倚くのこずが倉わっおいるため、倱敗した堎合は䜕時間も登るこずになりたす。 そしお、これらすべおをやり盎しする必芁がありたす。 そこで私たちは XNUMX 番目の䞀連の実隓を行いたす。

操䜜を実行し、チェックポむントが完了するタむミングを確認し、-9 Postgres を意図的に匷制終了したす。

その埌、再床起動しお、この装眮でどのくらいの時間䞊昇するか、぀たり、この悪い状況でどれだけ REDO するかを確認したす。

状況が悪いこずに二床泚意したす。 たず、チェックポむントが終わる盎前にクラッシュしおしたったので、倱うものがたくさんありたす。 そしお第二に、倧芏暡な手術が行われたした。 たた、チェックポむントがタむムアりトになった堎合、最埌のチェックポむント以降に生成される WAL はおそらく少なくなりたす。 ぀たり二重の敗者です。

このような状況をさたざたな max_wal_size サむズで枬定し、max_wal_size が 64 ギガバむトの堎合、10 倍の最悪のケヌスでは 3 分間䞊昇するこずがわかりたした。 そしおそれが自分に合うか合わないかを考えたす。 これはビゞネス䞊の質問です。 私たちはこの写真を経営䞊の意思決定の責任者に芋せお、こう尋ねる必芁がありたす。 最悪の状況で5〜XNUMX分間暪になるこずができたすか そしおあなたは決断を䞋したす。

そしおここに興味深い点がありたす。 カンファレンスでのパトロヌニに関するレポヌトがいく぀かありたす。 そしおもしかしたらあなたもそれを䜿っおいるかもしれたせん。 これは Postgres の自動フェむルオヌバヌです。 GitLab ず Data Egret がこれに぀いお話したした。

30 秒以内に自動フェむルオヌバヌが行われる堎合は、10 分間暪になっおもよいでしょうか? この時点たでにレプリカに切り替えるず、すべおがうたくいくためです。 これは議論の䜙地がありたす。 明確な答えはわかりたせん。 このトピックはクラッシュリカバリに関するものだけではないず感じおいたす。

倱敗からの回埩に時間がかかるず、他の倚くの状況でも䞍快になりたす。 たずえば、同じ実隓で、䜕かをするずきに 10 分間埅たなければならない堎合がありたす。

たずえ自動フェむルオヌバヌがあったずしおも、私はそこたでやりすぎる぀もりはありたせん。 䞀般に、64、100 ギガバむトなどの倀が適切な倀です。 堎合によっおは、遞択を枛らすこずさえ䟡倀がありたす。 䞀般に、これは埮劙な科孊です。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

たずえば、max_wal_size =1, 8 などの反埩を実行するには、䞀括操䜜を䜕床も繰り返す必芁がありたす。 やった。 そしお、同じベヌスで、もう䞀床やりたいず思っおいたすが、すでにすべおを削陀しおいたす。 䜕をするか

私たちの解決策、そのような状況で反埩するために䜕をするかに぀いおは埌ほど説明したす。 そしおこれが最も正しいアプロヌチです。

しかし、この堎合、私たちは幞運でした。 ここで「BEGIN、DELETE、ROLLBACK」ず曞かれおいる堎合は、DELETE を繰り返すこずができたす。 ぀たり、自分でキャンセルした堎合は、繰り返すこずができたす。 そしお物理的には、デヌタは同じ堎所に眮かれたす。 むくみもありたせん。 このような DELETE を反埩凊理できたす。

この ROLLBACK を䜿甚した DELETE は、適切にデプロむされたデヌタベヌス ラボがない堎合でも、チェックポむントのチュヌニングに最適です。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

「i」がXNUMX列のプレヌトを䜜りたした。 Postgres にはナヌティリティ列がありたす。 特に芁求されない限り、それらは衚瀺されたせん。 これらは、ctid、xmid、xmax です。

ctid は物理アドレスです。 れロペヌゞ、ペヌゞ内の最初のタプル。

ROOLBACK 埌もタプルは同じ堎所に残っおいるこずがわかりたす。 ぀たり、再詊行しおも同じように動䜜したす。 これが䞻なものです。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

Xmax はタプルの消滅時刻です。 スタンプされおいたすが、Postgres はトランザクションがロヌルバックされたこずを認識しおいるため、それが 0 であるかロヌルバックされたトランザクションであるかは関係ありたせん。 これは、DELETE を反埩しおシステム動䜜の䞀括操䜜を確認できるこずを瀺唆しおいたす。 貧しい人々のためのデヌタベヌスラボを䜜るこずができたす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

プログラマヌに぀いおの話です。 DBAに぀いおも、プログラマヌに察しお「なぜそんなに長くお難しい操䜜をするのですか」ずい぀も叱られたす。 これはたったく異なる垂盎のトピックです。 か぀おは管理が行われおいたしたが、これからは開発が行われたす。

明らかに、私たちはばらばらにはなっおいたせん。 それは明らかだ。 このような DELETE を䜕癟䞇行もの郚分に分割しないこずは䞍可胜です。 それは20分間行われ、すべおが暪になりたす。 しかし、残念ながら、たずえ倧䌁業であっおも、経隓豊富な開発者でもミスをするこずがありたす。

なぜ壊すこずが重芁なのでしょうか

  • ディスクが硬いこずがわかったら、速床を䞋げたしょう。 そしお、壊れた堎合は、䞀時停止を远加したり、スロットリングを遅くしたりするこずができたす。

  • そしお、私たちは他の人を長期間ブロックしたせん。 堎合によっおは問題ありたせんが、誰も䜜業しおいない実際のガベヌゞを削陀する堎合は、トランザクションが完了するたで埅機するため、自動バキュヌム䜜業以倖はブロックされない可胜性が高くなりたす。 しかし、他の人がリク゚ストできるものを削陀するず、その人はブロックされ、ある皮の連鎖反応が発生したす。 Web サむトやモバむル アプリケヌションでは長時間のトランザクションを避ける必芁がありたす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

https://postgres.ai/products/joe/

これは面癜い。 開発者が「どのパック サむズを遞択すればよいですか?」ず尋ねるのをよく芋かけたす。

バンドル サむズが倧きくなるほど、トランザクション オヌバヌヘッド、぀たりトランザクションによる远加オヌバヌヘッドが小さくなるのは明らかです。 しかし同時に、このトランザクションにかかる時間も増加したす。

私には非垞に単玔なルヌルがありたす。それは、できる限り倚くのデヌタを取埗したすが、XNUMX 秒あたりの実行可胜ファむルの数を超えないようにするこずです。

なぜちょっず? 説明は非垞にシンプルで、専門知識のない人でも理解できたす。 反応が芋られたす。 50 ミリ秒を考えおみたしょう。 䜕かが倉化するず、私たちの目は反応したす。 それ以䞋の堎合は、さらに困難になりたす。 たずえば、マりスをクリックしお 100 ミリ秒埌に䜕かが応答した堎合、すでにこのわずかな遅延を感じおいたす。 100番目はすでにブレヌキずしお認識されおいたす。

したがっお、倧量の操䜜を 10 秒のバヌストに分割するず、誰かをブロックしおしたうリスクがありたす。 そしお、それは数秒間効果があり、人々はすでにそれに気づきたす。 したがっお、私はXNUMX秒以䞊はやりたくないのです。 ただし同時に、トランザクションのオヌバヌヘッドが顕著になるため、あたり现かく分割しないでください。 ベヌスが硬くなり、別の問題が発生する可胜性がありたす。

パックのサむズを遞択したす。 それぞれの堎合においお、異なる方法で実行できたす。 自動化できる。 そしおXNUMXパックの凊理効率にも自信がありたす。 ぀たり、XNUMX぀のパックのDELETEたたはUPDATEを行いたす。

ちなみに、私が話しおいるのは DELETE だけではありたせん。 ご想像のずおり、これらはデヌタに察する䞀括操䜜です。

そしお、その蚈画が玠晎らしいこずが分かりたした。 むンデックス スキャンが確認できたすが、むンデックスのみのスキャンはさらに優れおいたす。 そしお、少量のデヌタが関係しおいたす。 そしお、それは XNUMX 秒もかからずに完了したす。 玠晎らしい。

そしお、劣化がないこずを確認する必芁がありたす。 最初のパックはすぐにうたくいきたすが、その埌はどんどん悪化しおいきたす。 このプロセスでは倚くのテストを行う必芁がありたす。 デヌタベヌス ラボはたさにこれに圓おはたりたす。

そしお、本番環境でこれに正しく埓うこずができるように、䜕かを準備する必芁がありたす。 たずえば、ログに時刻を曞き蟌んだり、今どこにいるのか、誰を削陀したのかを曞き蟌んだりできたす。 そしおこれにより、埌で䜕が起こっおいるかを理解できるようになりたす。 そしお、䜕か問題が発生した堎合には、すぐに問題を芋぀けたす。

リク゚ストの効率をチェックする必芁があり、䜕床も繰り返す必芁がある堎合は、フェロヌ ボットのようなものがありたす。 圌はすでに準備ができおいたす。 毎日数十人の開発者によっお䜿甚されおいたす。 そしお圌は、芁求に応じお 30 秒で巚倧なテラバむトのデヌタベヌスを自分のコピヌずしお提䟛する方法を知っおいたす。 そこで䜕かを削陀しお「リセット」ず蚀い、再床削陀するこずができたす。 このように実隓しおみるこずができたす。 私はこのこずには未来があるず思っおいたす。 そしお私たちはすでにそれを実行しおいたす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

https://docs.gitlab.com/ee/development/background_migrations.html

パヌティショニング戊略ずは䜕ですか? このパックの開発者が䜿甚しおいる 3 ぀の異なるパヌティショニング戊略がわかりたす。

100぀目はずおもシンプルです。 数倀IDを持っおいたす。 そしお、それをさたざたな間隔に分割しお䜜業しおみたしょう。 マむナス面は明らかです。 最初のセグメントには実際のゎミが 5 行あるかもしれたせんが、1 番目の 000 行にはゎミが含たれおいるか、たったく含たれおいない堎合、XNUMX 行すべおがゎミであるこずが刀明したす。 非垞に䞍均䞀な䜜業ですが、壊れやすいです。 圌らは最倧のIDを奪い、それを粉砕したした。 これは玠朎なアプロヌチです。

10 番目の戊略はバランスのずれたアプロヌチです。 Gitlabで䜿甚されおいたす。 圌らはテヌブルを手に取っおスキャンしたした。 各パックにちょうど 000 レコヌドが含たれるように、ID パックの境界を芋぀けたした。 そしお圌らを列に䞊べたす。 そしお、凊理しおいきたす。 これは耇数のスレッドで実行できたす。

ちなみに、最初の戊略でも、これを耇数のスレッドで実行できたす。 難しくない。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

https://medium.com/@samokhvalov/how-partial-indexes-affect-update-performance-in-postgres-d05e0052abc

しかし、もっずクヌルで優れたアプロヌチがありたす。 これが XNUMX ぀目の戊略です。 そしお可胜であればそれを遞択する方が良いでしょう。 これは特別なむンデックスに基づいお行われたす。 この堎合、ガベヌゞ条件ず ID に応じたむンデックスになる可胜性が高くなりたす。 ヒヌプに行かないように、むンデックスのみのスキャンになるように ID を含めたす。

䞀般に、むンデックスのみのスキャンはむンデックス スキャンよりも高速です。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

そしお、削陀したい ID がすぐに芋぀かりたす。 BATCH_SIZE は事前に遞択したす。 そしお、私たちはそれらを入手するだけでなく、特別な方法で入手し、すぐにハッキングしたす。 ただし、ロックしおいるため、すでにロックされおいる堎合はロックせず、先に進んで次のロックを取埗したす。 曎新スキップロック甚です。 Postgres のこの優れた機胜により、必芁に応じお耇数のスレッドで䜜業できるようになりたす。 XNUMX぀のストリヌムで可胜です。 そしおここに CTE がありたす - これは XNUMX ぀の芁求です。 そしお、この CTE の XNUMX 階では実際の削陀が行われおいたす - returning *。 IDを返すこずもできたすが、その方が良いです *各行にあたりデヌタがない堎合。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

なぜそれが必芁なのでしょうか? これは私たちが報告する必芁があるものです。 実際、非垞に倚くの行を削陀したした。 そしお、このようにIDたたはcreated_atごずに境界線を蚭定したす。 最小倀、最倧倀を実行できたす。 他にも䜕かできるはずです。 ここにはたくさん詰めるこずができたす。 モニタリングにも非垞に䟿利です。

むンデックスに぀いおはもう XNUMX ぀泚意点がありたす。 このタスクに特別なむンデックスが必芁であるず刀断した堎合は、それによっおヒヌプのみのタプルの曎新が損なわれないようにする必芁がありたす。 ぀たり、Postgres にはそのような統蚈がありたす。 これは、テヌブルの pg_stat_user_tables で確認できたす。 ホットアップデヌトが䜿甚されおいるかどうかを確認できたす。

新しいむンデックスによっおそれらが単玔に切り取られる堎合がありたす。 他のアップデヌトもすべおすでに機胜しおいるので、速床を萜ずしおください。 むンデックスが衚瀺されたからだけではなく各むンデックスの曎新が少し遅くなりたすが、少しず぀、ここではただそれが台無しになっおいたす。 たた、このテヌブルに察しお特別な最適化を行うこずはできたせん。 これは時々起こりたす。 これは非垞に埮劙な点なので、芚えおいる人はほずんどいたせん。 そしおこの熊手は螏みやすいです。 堎合によっおは、反察偎からのアプロヌチを芋぀けお、それでもこの新しいむンデックスを䜿甚しない、別のむンデックスを䜜成する、たたは他の方法 (たずえば XNUMX 番目の方法を䜿甚する) が必芁になる堎合がありたす。

ただし、これが最も最適な戊略であり、バッチに分割しお XNUMX ぀のリク゚ストでバッチを撮圱したり、少し削陀したりする方法です。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

ロングトランザクション https://gitlab.com/snippets/1890447

自動バキュヌムのブロック - https://gitlab.com/snippets/1889668

ブロックの問題 - https://gitlab.com/snippets/1890428

間違い #5 は倧きな間違いです。 Okmeter の Nikolai が Postgres の監芖に぀いお話したした。 残念ながら、理想的な Postgres 監芖は存圚したせん。 近いものもあれば、遠いものもありたす。 OKmeter はほが完璧に近づいおいたすが、倚くのものが欠けおおり、远加する必芁がありたす。 これに備えお準備をしおおく必芁がありたす。

たずえば、無効なタプルは監芖するのが最適です。 テヌブルに死んだものがたくさんある堎合は、䜕かが間違っおいたす。 今すぐ察応した方が良いです。そうしないず劣化が起こる可胜性があるので、暪になっおも倧䞈倫です。 それは起こりたす。

IO が倧きい堎合、これが良くないこずは明らかです。

長い取匕も。 OLTP では長いトランザクションを蚱可しないでください。 そしお、ここにあるスニペットぞのリンクを参照するず、このスニペットを䜿甚しお、すでに長いトランザクションの远跡を行うこずができたす。

なぜ長時間のトランザクションは良くないのでしょうか? すべおのロックが解陀されるのは最埌だけだからです。 そしお私たちは皆を台無しにしたす。 さらに、すべおのテヌブルの自動バキュヌムをブロックしたす。 党然良くないよ。 レプリカでホット スタンバむが有効になっおいる堎合でも、それでも問題は発生したす。 䞀般に、長時間のトランザクションを回避するのが最適な堎所はありたせん。

バキュヌムされおいないテヌブルが倚数ある堎合は、アラヌトが必芁です。 ここではそのような状況が考えられたす。 自動バキュヌムの動䜜に間接的に圱響を䞎える可胜性がありたす。 これは Avito の抜粋で、私が少し改良したものです。 そしお、これは自動バキュヌムで䜕ができるかを知るための興味深いツヌルであるこずがわかりたした。 たずえば、いく぀かのテヌブルはそこで埅機しおいお、順番を埅ちたせん。 たた、監芖察象にしおアラヌトを発する必芁もありたす。

そしおブロックを発行したす。 ブロックの朚の森。 私は誰かから䜕かを取り入れお改良するのが奜きです。 ここでは、ロック ツリヌの森を瀺す Data Egret からクヌルな再垰 CTE を取埗したした。 これは優れた蚺断ツヌルです。 そしお、それに基づいお監芖を構築するこずもできたす。 しかし、これは慎重に行う必芁がありたす。 自分甚に小さなstatement_timeoutを䜜成する必芁がありたす。 そしお、lock_timeout が望たしいです。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

堎合によっおは、これらすべおの゚ラヌが合蚈しお発生するこずがありたす。

私の意芋では、ここでの䞻な間違いは組織的なものです。 テクニックが匕っ匵らないので組織的です。 これがその 2 です。圌らは間違った堎所にチェックを入れたした。

簡単にチェックできる実皌働クロヌンがなかったため、間違った堎所でチェックしおしたいたした。 開発者は本番環境にたったくアクセスできない堎合がありたす。

そしお、私たちはそこにいないこずを確認したした。 もし私たちがそこを確認しおいたら、私たち自身もそれを芋おいたでしょう。 開発者は、同じ量のデヌタず同じ堎所がある良奜な環境でチェックすれば、DBA がなくおもすべおを確認できたした。 圌はこのすべおの劣化を芋たら、恥じ入るだろう。

自動バキュヌムに぀いおさらに詳しく。 数癟䞇行の倧芏暡なスむヌプを行った埌も、REPACK を行う必芁がありたす。 これはむンデックスにずっお特に重芁です。 私たちがそこにあるものをすべお掃陀した埌、圌らは気分が悪くなるでしょう。

そしお、毎日の掃陀䜜業を埩掻させたい堎合は、より頻繁に、ただし芏暡は小さくするこずをお勧めしたす。 XNUMX 分に XNUMX 回、あるいはそれよりも少し頻繁に行うこずもありたす。 そしお、XNUMX ぀のこずを監芖する必芁がありたす。それは、これに゚ラヌがないこずず、遅れがないこずです。 私が瀺したトリックはこれを解決するだけです。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

私たちがやっおいるこずはオヌプン゜ヌスです。 GitLab に投皿されおいたす。 たた、DBA がなくおもチェックできるようにしおいたす。 私たちはデヌタベヌス ラボを行っおいたす。぀たり、Joe が珟圚䜜業しおいるベヌス コンポヌネントを呌び出したす。 そしお、本番環境のコピヌを入手するこずもできたす。 珟圚、Slack 甚の Joe の実装があり、そこで「これこれのリク゚ストを説明する」ず蚀うず、デヌタベヌスのコピヌの結果をすぐに取埗できたす。 そこで削陀するこずもできたすが、誰もそれに気づきたせん。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

10 テラバむトがあるずしたす。デヌタベヌス ラボも 10 テラバむトにしたす。 たた、同時に 10 テラバむトのデヌタベヌスを䜿甚できるため、10 人の開発者が同時に䜜業できたす。 誰もが自分のやりたいこずをするこずができたす。 削陀したりドロップしたりできるなど、それはずおも幻想です。 これに぀いおは明日話したす。

芪愛なるDELETE様。 ニコラむ・サモクバロフ (Postgres.ai)

これはシン プロビゞョニングず呌ばれたす。 これは埮劙なプロビゞョニングです。 これは、開発やテストの遅れを倧幅に解消し、この点で䞖界をより良い堎所にするある皮のファンタゞヌです。 ぀たり、䞀括操䜜の問題を回避できるだけです。

䟋: 5 テラバむトのデヌタベヌス、30 秒以内にコピヌを取埗したす。 そしお、それはサむズにも䟝存したせん、぀たり、䜕テラバむトかは関係ありたせん。

今日あなたが行けるのは、 postgres.ai そしお私たちのツヌルを掘り䞋げおみたしょう。 登録するず、そこにあるものを確認できたす。 このボットをむンストヌルできたす。 それは無料です。 曞く。

質問

実際の状況では、テヌブルに残すべきデヌタが、削陀する必芁があるデヌタよりもはるかに少ないこずが刀明するこずがよくありたす。 ぀たり、そのような状況では、新しいオブゞェクトを䜜成し、必芁なデヌタのみをそこにコピヌし、叀いテヌブルをトランクする方が簡単なため、そのようなアプロヌチを実装する方が簡単であるこずがよくありたす。 切り替え䞭の珟時点では、プログラムによるアプロヌチが必芁であるこずは明らかです。 このアプロヌチはどうですか

これは非垞に優れたアプロヌチであり、非垞に優れたタスクです。 これは pg_repack が行うこずず非垞に䌌おおり、ID を 4 バむトにするずきに行う必芁があるこずず非垞に䌌おいたす。 倚くのフレヌムワヌクは数幎前にこれを行っおいたしたが、プレヌトだけが倧きくなり、8 バむトに倉換する必芁がありたした。

この䜜業はかなり難しいです。 やった。 そしお、非垞に泚意しなければなりたせん。 鍵などはありたすがやられおいたす。 ぀たり、暙準的なアプロヌチは pg_repack を䜿甚するこずです。 このようなラベルを宣蚀したす。 たた、スナップショット デヌタのアップロヌドを開始する前に、すべおの倉曎を远跡する XNUMX ぀のプレヌトも宣蚀したす。 䞀郚の倉曎を远跡できない可胜性があるずいうトリックがありたす。 埮劙な点がありたす。 そしお、ロヌリング倉曎によっお切り替えたす。 党員をシャットダりンするずきは少し時間がかかりたすが、通垞はこれが行われおいたす。

GitHub の pg_repack を芋るず、ID を int 4 から int 8 に倉換するタスクがあったずきに、pg_repack 自䜓を䜿甚するずいうアむデアがありたした。 これも可胜ですが、ちょっずしたハックですが、これでも機胜したす。 pg_repack が䜿甚するトリガヌに介入しお、「このデヌタは必芁ありたせん」ず蚀うこずができたす。぀たり、必芁なものだけを転送したす。 そしお圌はただ切り替えお、それで終わりです。

このアプロヌチでも、テヌブルの XNUMX 番目のコピヌを取埗できたす。このコピヌでは、デヌタがすでにむンデックス付けされおおり、矎しいむンデックスで非垞に均等に積み重ねられおいたす。

膚満感はなく、良いアプロヌチです。 しかし、これを自動化する、぀たり普遍的な゜リュヌションを開発する詊みがあるこずは知っおいたす。 この自動化に぀いおご連絡させおいただきたす。 Python で曞かれおいるので、それは良いこずです。

私は MySQL の䞖界から少しだけ離れおいるので、話を聞きに来たした。 そしお私たちはこのアプロヌチを採甚しおいたす。

ただし、それは 90% を達成した堎合に限りたす。 5% ある堎合、それを䜿甚するのはあたり良くありたせん。

ご報告ありがずうございたす prod の完党なコピヌを䜜成するリ゜ヌスがない堎合、負荷やサむズを蚈算するためのアルゎリズムや蚈算匏はありたすか?

良い質問。 これたでのずころ、数テラバむトのデヌタベヌスを芋぀けるこずができおいたす。 たずえハヌドりェアが同じでなくおも、たずえば、メモリやプロセッサが少なく、ディスクがたったく同じではありたせんが、それでも私たちは同じこずをしたす。 たったくどこにもない堎合は、考える必芁がありたす。 明日たで考えさせおください、あなたが来たした、私たちは話したす、これは良い質問です。

ご報告ありがずうございたす あなたは最初に、さたざたな制限があるクヌルな Postgres が存圚するずいう事実から始めたしたが、それは開発䞭です。 そしお、これは党䜓的に芋お束葉杖です。 これはすべお、Postgres 自䜓の開発ず矛盟しおいるのではありたせんか。Postgres 自䜓の開発では、䜕らかの DELETE 遅延関数や、ここで私たちが奇劙な手段で汚そうずしおいるものを䜎レベルに保぀べき䜕かが珟れるでしょう。

SQL で XNUMX ぀のトランザクションで倚くのレコヌドを削陀たたは曎新するず蚀ったら、Postgres はどのようにしおそれをそこに分散できるのでしょうか? 物理的に業務に限界がございたす。 これからも長くやっおいきたす。 そしおこの時点でロックしたす、など。

むンデックスの䜜成は完了です。

同じチェックポむントのチュヌニングを自動化できるず考えられたす。 い぀かそうなるかもしれない。 しかし、それでは質問がよくわかりたせん。

問題は、あちらに行ったりこちらに行ったり、こちらでは䞊行しお進むような開発のベクトルがあるのか​​ずいうこずです。 それらの。 圌らはただそれに぀いお考えおいないのですか

今から䜿える原則に぀いおお話したした。 別のボットがありたす ナンシヌ, これを䜿甚するず、自動チェックポむント調敎を行うこずができたす。 い぀かPostgresにも登堎するのでしょうか わかりたせん、ただ議論されおいたせん。 私たちはただそこからは皋遠いです。 しかし、新しいシステムを䜜る科孊者がいたす。 そしお圌らは私たちを自動むンデックスに抌し蟌みたす。 発展もある。 たずえば、自動チュヌニングを芋おみたしょう。 パラメヌタを自動的に遞択したす。 しかし、圌はただチェックポむント調敎を行う぀もりはありたせん。 ぀たり、パフォヌマンスやシェルバッファヌなどが向䞊したす。

チェックポむントの調敎に぀いおは、これを行うこずができたす。クラりド䞊に XNUMX 個のクラスタヌず異なるハヌドりェア、異なる仮想マシンがある堎合、圓瀟のボットを䜿甚できたす。 ナンシヌ 自動化を行いたす。 そしお、max_wal_size はタヌゲット蚭定に埓っお自動的に遞択されたす。 しかし、残念ながら今のずころ、これは栞心に迫るものではありたせん。

こんにちは長期取匕の危険性に぀いお話したした。 削陀の堎合には自動バキュヌムがブロックされるず蚀いたした。 他にどのように私たちに害を及がすのでしょうか なぜなら、私たちはスペヌスを解攟し、それを䜿甚できるようにするこずに぀いおもっず話しおいるからです。 他に䜕が足りないでしょうか

ここでの最倧の問題は自動バキュヌムではないかもしれたせん。 そしお、長いトランザクションが他のトランザクションをロックする可胜性があるずいう事実、この可胜性はさらに危険です。 圌女は䌚うかもしれないし、䌚わないかもしれない。 もし圌女が䌚ったら、それは非垞に悪いこずになる可胜性がありたす。 そしお自動バキュヌムに関しおも、これは問題です。 OLTP の長いトランザクションには、ロックず自動バキュヌムずいう XNUMX ぀の問題がありたす。 たた、レプリカ䞊でホット スタンバむ フィヌドバックが有効になっおいる堎合でも、マスタヌ䞊で自動バキュヌム ロックを受け取りたす。ロックはレプリカから届きたす。 しかし、少なくずもロックは存圚しないでしょう。 そしおロックもあるでしょう。 デヌタの倉曎に぀いお話しおいるので、ここではロックが重芁なポむントになりたす。 そしお、これがずっず長い間続くず、ロックされるトランザクションがたすたす増えたす。 圌らは他人を盗むこずができたす。 そしおロックの朚が珟れたす。 スニペットぞのリンクを提䟛したした。 そしお、この問題は、蓄積されるだけの自動バキュヌムの問題よりも早く顕著になりたす。

ご報告ありがずうございたす あなたはテストが間違っおいたず蚀っおレポヌトを始めたした。 私たちは、同じ装備、同じ方法でベヌスを䜿甚する必芁があるずいう考えを続けたした。 開発者にベヌスを提䟛したずしたしょう。 そしお圌はその芁求に応じた。 そしお圌は元気のようだ。 しかし、圌はラむブの堎合はチェックしたせんが、ラむブの堎合、たずえば、60〜70の負荷がありたす。 そしおこのチュヌニングをしおもあたりうたくいきたせん。

チヌムに専門家を配眮し、実際のバックグラりンド負荷で䜕が起こるかを予枬できる DBA 専門家を掻甚するこずが重芁です。 クリヌンな倉曎を実行するず、次のような画像が衚瀺されたす。 しかし、より高床なアプロヌチでは、本番環境でシミュレヌトされた負荷を䜿甚しお、同じこずを再床実行したした。 ずおもクヌルです。 それたでは成長しなければなりたせん。 倧人っぜいですね。 私たちは自分たちが持っおいるものを確認し、十分なリ゜ヌスがあるかどうかも確認したした。 それは良い質問です。

すでにガベヌゞ セレクトを実行しおいお、たずえば削陀枈みフラグがある堎合

これは、Postgres で自動バキュヌムが自動的に行うこずです。

ああ、圌はやりたすか

Autovacuum はガベヌゞ コレクタヌです。

ありがずうございたす

ご報告ありがずうございたす すべおのゎミがメむンテヌブルのどこかから汚れおしたうような方法でパヌティション分割を䜿甚しおデヌタベヌスをすぐに蚭蚈するオプションはありたすか?

もちろんありたす。

では、䜿甚すべきではないテヌブルをロックした堎合に自分自身を守るこずはできるのでしょうか?

もちろんありたす。 しかし、それは鶏が先か卵が先かずいうような問題です。 将来䜕が起こるかを私たち党員が知っおいるなら、もちろん、私たちはすべおを冷静に行うでしょう。 しかし、ビゞネスは倉化しおおり、新しいコラムや新しい芁求がありたす。 そしお、おっず、それを削陀したいず思いたす。 しかし、この理想的な状況は人生においお起こりたすが、垞に起こるわけではありたせん。 しかし、党䜓的には良いアむデアです。 切り詰めるだけで終わりです。

出所 habr.com

コメントを远加したす