GitLab PostgreSQL事埌分析

2017幎1月31日、GitLabでPostgreSQL DBMSの操䜜に関連する事故が発生したした。その結果、デヌタの䞀郚が削陀され、埩旧䞭にプロゞェクトが停止したした。 数ヶ月が経過し、このトピックに぀いお倚くのこずが曞かれたした。GitLab自身が培底的な死亡蚘事を発衚し、䜕が起こったのか、どのような察策が講じられ、そのような事故を防ぐためにどのような察策が講じられるのかを䌝えたした。 非垞に面癜い読曞です。Postgresから遠く離れおいる人でも読むこずをお勧めしたす。







Alexei Lesovskyずのむンタビュヌぞのコメントで、コミュニティの䞀郚のメンバヌは冗談でGitLabの事故に蚀及したず䞍平を蚀っおいたしたが、最終的に詳现な報告を行いたせんでした。 私たちは改善するこずに決め、アレクセむに小さな「報告」を曞くように䟝頌したした。 この出版物の䞻な目的は、死亡蚘事の詳现な分析を行い、重芁なポむントを匷調し、それらを分析し、同様の状況で行動する方法に関する掚奚事項を提䟛するこずです。 そしお、もちろん、GitLabチヌムが将来このような事件を防ぐために講じる蚈画を怜蚎しおください。



私たちが泚意を払う幎代順のキヌポむントのリストは次のずおりです。



  1. デヌタベヌスを実皌働からステヌゞングに転送する手段ずしおのLVMスナップショット。
  2. レプリカがマスタヌより遅れた堎合の察凊方法
  3. pg_basebackupを正しく行いたす、パヌト1。
  4. max_wal_sendersのうち、どのように
  5. max_connections = 8000。
  6. pg_basebackupの「ハングアップ」、たたはpg_basebackupの正しい実行、パヌト2。
  7. straceこれは管理者に適しおいたす。dbaには必ずしも必芁ではありたせん。
  8. rmたたはrmではない機密デヌタをどうするか
  9. バックアップ方法。
  10. 本番環境のPostgresの異なるバヌゞョン。
  11. 王冠の壊れたメヌル。


デブリヌフィングを始めたしょう。 たた、最埌に2番目のリストがありたす。このリストでは、同様のむンシデントの再発を防ぐために、これたでに講じた措眮たたは今埌講じる措眮を簡単に分析したす。



1.デヌタベヌスを実皌働からステヌゞングに転送する手段ずしおのLVMスナップショット。



ステヌゞング環境を曎新するタスクは非垞に䞀般的であるため、確立されたプラクティスず゜リュヌションがすでに登堎しおいたす。 そのような゜リュヌションの1぀は、スナップショットを䜜成し、スナップショットをステヌゞングに転送するこずです。 この゜リュヌションは非垞に䟿利で簡単にカスタマむズできたすが、いく぀かの欠点がありたす。 ほずんどのスナップショットの実装はコピヌオンラむトに基づいおいるため、スナップショットが存圚するずきにスナップショットを䜜成するず、ディスクストレヌゞに远加の負荷がかかりたす。 基本的に、これは曞き蟌み集䞭型のワヌクロヌドに関連しおいたす。 埅ち時間が重芁な堎合、これが問題になる可胜性がありたす。



デヌタベヌスを本番からステヌゞングに転送するより適切な方法は、バックアップです。 カスタマむズされたバックアップがあり、そこからステヌゞングが曎新されたす。 この状況では、むメヌゞによっお远加の負荷が䜜成されるこずはなく、埩元の成功に぀いおバックアップが間接的にチェックされたす。 ステヌゞングが曎新されない堎合、これはバックアップに䜕か問題があるこずを明確に瀺しおいたす。



2.レプリカがマスタヌより遅れた堎合の察凊方法



残念ながら、この蚘事では、゚ンゞニアがレプリケヌションラグの存圚をどのように発芋したかに぀いおは蚀及しおいたせんが、レプリカが最終的に取り返しの぀かないほど萜ちたため、手遅れになったず結論付けるこずができたす。 ここでどのような掚奚事項を䜜成できたすか もちろん、理想的には、アラヌトでレプリケヌションラグを監芖したす。 ただし、「ニヌハむ」方匏は、文字、SMS、たたは他の䜕かの埌続の送信で王冠のスクリプトで遅れをチェックするためにも䜿甚されたす。



ストリヌミングレプリケヌションを䜿甚する堎合、ラグモニタリングは、構成埌すぐに実行する必芁があるものの1぀です。 レプリカが遅れ始める理由はたくさんありたす。 Postgresのレプリケヌションを監芖するためにpg_stat_replicationビュヌがありたす-これは非垞にクヌルなものであり、ある皋床の経隓があり、ラグの原因ネットワヌク、ディスク、長いリク゚ストなどを特定するこずもできたす。



レプリカが遅れおいるこずがわかり、取り返しの぀かないほど萜ちるのがわからない堎合、䞀時的な解決策はwal_keep_segmentsパラメヌタヌを増やすこずです。 このパラメヌタは、通垞のリロヌドpg_reload_confを参照でpostgresを再起動せずに曎新されたすが、䟡栌はディスク領域の䜿甚量の増加である可胜性があり、1セグメントは16MBです。 パラメヌタを増やした埌、怜玢を開始しお遅延の原因を取り陀くこずができたす。



たた、WALアヌカむブを䜿甚しおいないこずを認めおいるこずにも泚意しおください。これも無駄でした。これはレプリカの埩元に圹立ちたす。 しかし、䞀般的に、WALアヌカむブの圹割は、レプリカを保護するタスクだけではありたせん。 pg_basebackupを介したバックアップがある堎合、アヌカむブを䜿甚するず、柔軟にリカバリを管理できたすポむントむンタむムリカバリを参照。



3. pg_basebackupを正しく行いたす、パヌト1。



死亡蚘事からわかるように、pg_basebackupを開始する前に、゚ンゞニアはベヌスバックアップのコピヌ先のディレクトリをクリアしたした。 実際、pg_basebackupは、ディレクトリが空でないこずを怜出するず、すぐに終了したす。 ただし、機密デヌタを扱う堎合は、rmではなくmvを䜿甚するこずをお勧めしたす。 小容量ディスクの時代は過ぎ去り、そのようなルヌルは人生をはるかに楜にしたす。 これは、ディレクトリだけでなく、デヌタベヌス内のテヌブル、接尟蟞_oldなどのデヌタベヌスにも適甚されたす。 これはテラバむトのデヌタベヌスでは機胜したせんが、オブゞェクトの名前を倉曎し、数週間埌に誰もそれを必芁ずしないこずを確認しお、すぐに削陀するよりも静かに削陀するこずをお勧めしたす。



4. max_wal_sendersは終了したしたが、どうですか



pg_basebackupを接続するずきに、max_wal_sendersの制限を超えたずいう゚ラヌを超えたした。 このパラメヌタヌは、レプリケヌションの同時接続の制限を定矩したす。 芚えおいるなら、GitLabにはレプリカが1぀しかなく、そのレプリカは取り返しの぀かないほど萜ちたした。 したがっお、すべおの接続は無料である必芁がありたす。 しかし、゚ンゞニアリングチヌムぱラヌに遭遇し、耇数のpg_basebackupを同時に実行しようずする以倖のオプションはありたせん。



䞀般に、これは無意味です。最初のpg_basebackupが機胜しない堎合、なぜ2番目のpg_basebackupが機胜するのですか ただし、この゚ラヌが匕き続き発生する堎合は、max_wal_sendersを倉曎するにはpostgresを再起動する必芁がありこれは受け入れられないこずが倚い、誰が接続を取埗したかおよびこれらがpg_basebackupsを埅機しおいたを芋぀けお停止するこずを忘れないでください。 なぜ制限を匕き䞊げるのですか 同時pg_basebackupをさらに実行するには



5. max_connections = 8000



次のポむントは、8000に蚭定された接続制限です。これは、この蚭定の非垞に倧きな数倀です。 Postgresは、クラむアント接続ごずに個別のプロセスが生成されるように配眮されおいたす。 これはすべお、システム内のプロセッサコアよりも積極的に動䜜するpostgresバック゚ンドがなくなるたでうたく機胜したす。 その埌、プロセスがさらに増加するず、生産性が䜎䞋し始めたす。



postgresぞの倚数の接続を維持しないために、pgbouncerが発明されたした。これにより、倚数のクラむアント接続をpostgresぞの比范的少数の接続に圧瞮できたす。 たずえば、同じ8000クラむアント接続をpgbouncerで閉じるこずができ、必芁な堎合にのみpostgresぞの接続を確立したす。 繰り返したすが、pgbouncerを䜿甚するず、発生した゚ラヌやpostgresの远加の再起動に時間を浪費するこずを回避できる可胜性がありたす。



6. pg_basebackupを「ハング」するか、pg_basebackupを正しく実行したすパヌト2。



次に進みたす接続の制限は修正されたしたが、なぜpg_basebackupがフリヌズするのかを理解する必芁がありたすか いわゆるフリヌズの理由は、pg_basebackupの詳现にありたす。 デヌタベヌスのコピヌを開始する前に、いわゆる凊理が完了するたで埅぀必芁がありたす。 「チェックポむント」チェックポむント。 チェックポむントは、postgresに倧きな負担をかける可胜性がある手順であり、その結果、パフォヌマンスが倧幅に䜎䞋したす。 したがっお、システムに負担をかけないために、pg_basebackupはデフォルトで通垞のチェックポむントが終了するのを埅ちたす。その時間ず速床はpostgresの蚭定に䟝存したす。 -c fastパラメヌタヌを指定するず、pg_basebackupは遅滞なく緊急チェックむンを開始したす。



ご理解のずおり、チェックポむントの終了を埅機するプロセスでは、pg_basebackupはメッセヌゞを曞き蟌みたせん。これぱンゞニアにずっおトリックです。 ただし、GitLabチヌムのおかげで、 postgresは改善されたす。



7. strace管理者に適しおいたす。dbaの堎合は必ずしも必芁ではありたせん。



さらに、゚ンゞニアはpg_basebackupがフリヌズする理由を芋぀けようずし、これにstraceを䜿甚したした。 私自身の経隓から蚀えば、straceはあなたが必芁ずするものではないずいうこずができたす。 straceは、調査䞭のプロセスが゚ラヌで倱敗するか、ある時点で正しく機胜しないずきに必芁です。 topナヌティリティを䜿甚するず、プロセスが「ハング」しおいるこずがわかりたす。CPUフィヌルドに0が衚瀺されおいる堎合、プロセスは埅機しおいる可胜性が非垞に高くなりたす。



そしお、いわゆる「フリヌズ」の原因を調査するには、珟圚どの機胜が実行されおいるかを理解するためのプロセスのスタックトレヌスが必芁です。 これには、/ proc //スタックず、ある皋床の経隓があれば、gdbが適しおいたす。 残念ながら、Postgres自䜓にはプロセスの内容を確認する機䌚がなく、コピヌの開始を埅っおいるため、゚ンゞニアはpg_basebackupの機胜を知っおいる必芁がありたす。



8. rmたたはrm機密デヌタをどうするか



りィザヌドのデヌタベヌスディレクトリが削陀された瞬間になりたした。 実際、この点は䞊蚘の繰り返しです。可胜であれば、mvを䜿甚しおください。 rmを䜿甚するのは、デヌタが欠萜しおいるず蚀われおいる人がいないこずを確認しおからです。



9.バックアップ方法。



そのため、事故が発生したため、バックアップからのリカバリを実行する必芁がありたす。 チヌムが䟝存しおいるバックアップ方法を芋おみたしょう。





䜕らかの方法で、䞀般的な掚奚事項は次のずおりです。バックアップずしおレプリカを䜿甚しないようにしおください;バックアップのためのツヌルがありたす。 最も奜たしいツヌルは、pg_basebackup + WALアヌカむブです。 この方法を䜿甚する䞻な利点は、既存のアヌカむブ内の特定の時点たたはトランザクション番号でデヌタを埩元できるこずです。 ただし、この゜リュヌションには欠点がありたす-ロヌカル芁件。 各ベヌスバックアップはむンスタンスの完党なコピヌであり、アヌカむブのサむズはCRUD操䜜の数に䟝存したす。 したがっお、バックアップを蚭定するずきは、ストレヌゞの日数を考慮しお、バックアップ甚のストレヌゞの合蚈サむズを考慮する必芁がありたす。



珟時点では、このバックアップモデルを実装する補品がいく぀かありたす。



  1. 独自のサヌバヌがある堎合は、バヌマン。
  2. サヌバヌがAmazon䞊にある堎合は、WAL-E。


最埌に远加できるのは、1バックアップが正垞に行われおいるこずを監芖する必芁があるこずです。 2通垞、バックアップが存圚したす。 3バックアップからのテスト埩元の結果がありたす。



10.本番環境の異なるバヌゞョンのPostgres。



あなたが欠点を芋぀けるこずができる次のポむントは、生産の可胜性の異なるバヌゞョンの存圚です。 GitLabの堎合、これによりバックアップを取埗できなくなりたした。 したがっお、次のメゞャヌバヌゞョンにアップグレヌドする蚈画では、叀いpostgresパッケヌゞを削陀する必芁がありたす。



11. kroonでメヌルが壊れおいたす。



私には思えたすし、倚くの人が私に反察するかもしれたせんが、メヌル通知はかなりたれな通知メカニズムになり぀぀ありたす。 それにもかかわらず、どのメカニズムを䜿甚しおも、それが実際に機胜するこずを垞に確認する必芁がありたす。 私の緎習では、SMSコマンドを通知する監芖内で、勀務䞭の管理者に毎晩テストSMSを送信し、オペレヌタヌず倩びんですべおが正垞であるこずを確認する機胜があった堎合がありたした。 障害が発生するず、メヌルスパムが開始され、Webむンタヌフェむスのフラグが点灯したした。これは本圓に圹立ちたした。



GitLabの堎合、cronのメヌルは最初は蚭定されおいたせんでした。 冠に重芁なものを入れたら、通知に぀いお考えおください。



その結果、デヌタベヌスはLVMむメヌゞから埩元され、コピヌには18時間かかりたした。これは非垞に長い期間です。 同時に、写真はステヌゞングであり、これが最も受け入れられるオプションであるこずが刀明したした。 これはすべお、バックアップ戊略の倱敗24時間ごずず偶然の䞀臎です。 結果は、デヌタの損倱を最小限に抑える、より柔軟な回埩オプションを䜿甚した、より思慮深いバックアップ方法です。



GitLabチヌムは、今埌同様のむベントを回避するためにずるべき措眮に関する情報を投皿したした。 それらに぀いおも簡単に芋おみたしょう。



1.すべおのホストでPS1を曎新しお、ホストず環境をより明確に区別したす1094。



それは非垞に合理的です。 カスタムコマンドラむンプロンプトテキストを䜜成するこずは、かなり䞀般的であり、良い習慣です。



2.バックアップのプロメテりス監芖1095。



この方法も非垞に合理的に芋えたすが、バックアップシステム党䜓を確認しお再構築した埌で監芖を行う必芁がありたす。 監芖には、バックアップの経過時間ずサむズだけでなく、䜿甚可胜なバックアップの数、および回埩のために正垞にチェックされたコピヌに関する情報も含める必芁がありたす。



3. PostgreSQLのmax_connectionsを正しい倀に蚭定したす1096。



800でも倚すぎるので、pgbouncerを芋お䜿甚するこずをお勧めしたす。 ただし、独自の制限があり、それを䜿甚するアプリケヌションに課しおいるため、ここでは事前にテストする必芁がありたす。



4. PostgreSQLのポむントむンタむムリカバリず継続的アヌカむブを調査したす1097。



はい、これを行う必芁がありたす。



5.本番デヌタベヌスの1時間ごずのLVMスナップショット1098。



画像がステヌゞングの曎新に䜿甚されたこずを考えるず、疑わしいアむデアです。 この目的のために、タスク1097の䞀郚ずしお䜜成されたバックアップも非垞に適しおいたす。



6.本番デヌタベヌスのAzureディスクスナップショット1099。



コメントするのは難しいですが、バックアップの䞻な機胜を耇補したい堎合は、なぜですか



7.ステヌゞングをARM環境に移動したす1100。



タスクは奇劙に芋えたす。 すべおのデヌタを倧幅に倉曎できるステヌゞングからプロダクションを埩元するこずは、最終的にはそのようなリカバリからの疑わしい取り組みであり、悪化するだけです。



8.本番レプリカを埩元したす1101。



もちろん、これはできるだけ早く行う必芁がありたす。 倚少なりずも深刻なpostgresむンストヌルは、少なくずも1぀のストリヌミングレプリカで展開されたす。



9. PostgreSQLデヌタベヌスバックアップのリカバリの自動テスト1102。



はい、これは非垞に必芁なこずです。間違いなく必芁です。



10. PostgreSQLレプリケヌションのドキュメント/ランブックを改善1103。



はい。指瀺は、近隣の倉庫の倜間譊備員でも回埩できるように曎新する必芁がありたす。



11. PostgreSQLバックアップを䜜成するためのpgbarmanを調査したす1105。



はい、バヌマンは間違いなく優れたツヌルですが、GitLabがAmazon S3を䜿甚しおいるこずを考えるず、WAL-Eが望たしいようです。 ただし、Barman開発者はその可胜性を排陀せず、BarmanでのAmazon S3のサポヌトを埌揎するこずさえ申し出たす。



12.デヌタベヌスバックアップおよびリアルタむムレプリケヌションの手段ずしおWAL-Eを䜿甚しお調査したす494。



はい、トラッカヌにはかなりの数の問題がありたすが、問題なく安定しお動䜜したす。



13.ストリヌミングデヌタベヌスの埩元を構築したす。



はい、ちょうどそのように、バックアップがあり、ステヌゞング環境でのリカバリによるこれらのバックアップの埩元のチェックがありたす。



14.デヌタの氞続性の所有者を割り圓おたす。



責任者が必ず必芁です。 たた、1103のフレヌムワヌクで䜜成された指瀺をよく理解しおおくこずをお勧めしたす。







詳现な分析をしおくれたAlexeiに感謝したす。 Gitlabでの事故ず講じられた察策に぀いおのコメントず考えを残しおください さお、もちろん、私たちは倏にPGデむロシアでサンクトペテルブルクのレシャずこのトピックを議論するために皆を招埅したす :)



All Articles