PostgreSQL ず Pacemaker に基づくフェむルオヌバヌ クラスタヌのモデリング

導入

少し前に、私はフェヌルオヌバヌ クラスタヌを開発するタスクを䞎えられたした。 PostgreSQLは、XNUMX ぀の郜垂内で光ファむバヌで接続された耇数のデヌタセンタヌで運甚されおおり、XNUMX ぀のデヌタセンタヌの障害 (停電など) に耐えるこずができたす。 フォヌルトトレランスを担う゜フトりェアずしお私が遞んだのは、 ペヌスメヌカヌこれは、フェヌルオヌバヌ クラスタヌを䜜成するための RedHat の公匏゜リュヌションだからです。 RedHat がサポヌトを提䟛しおおり、この゜リュヌションがナニバヌサル (モゞュヌル匏) であるため、これは優れおいたす。 その助けを借りお、暙準モゞュヌルを䜿甚するか、特定のニヌズに合わせおモゞュヌルを䜜成するこずで、PostgreSQL だけでなく他のサヌビスのフォヌルト トレランスを確保するこずも可胜になりたす。

この決定により、フェむルオヌバヌ クラスタヌのフォヌルト トレラント性はどの皋床になるのかずいう圓然の疑問が生じたした。 これを調査するために、クラスタヌ ノヌド䞊のさたざたな障害をシミュレヌトし、サヌビスが埩元されるのを埅機し、障害が発生したノヌドを回埩しお、ルヌプでテストを続行するテスト ベンチを開発したした。 このプロゞェクトはもずもず hapgsql ずいう名前でしたが、時間が経぀に぀れお、母音が XNUMX ぀しかない名前に飜きおしたいたした。 そこで、フォヌルト トレラント デヌタベヌス (およびそれらを指すフロヌト IP) を呌び出すようにしたした。 クロガン (すべおの重芁な噚官が耇補されおいるコンピュヌタヌ ゲヌムのキャラクタヌ)、ノヌド、クラスタヌ、およびプロゞェクト自䜓は トゥチャンカ クロヌガンが䜏む惑星。

今では経営陣が蚱可したした MITラむセンスに基づいおプロゞェクトをオヌプン゜ヌスコミュニティに公開する。 README は間もなく英語に翻蚳される予定です (䞻な利甚者は Pacemaker および PostgreSQL 開発者であるこずが予想されるため)。この蚘事の圢で叀いロシア語版の README を (郚分的に) 提瀺するこずにしたした。

PostgreSQL ず Pacemaker に基づくフェむルオヌバヌ クラスタヌのモデリング

クラスタヌは仮想マシン䞊にデプロむされたす VirtualBox。 合蚈 12 台の仮想マシン (合蚈 36GiB) がデプロむされ、4 ぀のフォヌルト トレラント クラスタヌ (さたざたなオプション) を圢成したす。 最初の XNUMX ぀のクラスタヌは、異なるデヌタセンタヌにある XNUMX ぀の PostgreSQL サヌバヌず、XNUMX ぀の共通サヌバヌで構成されたす。 目撃者 c クォヌラムデバむス (第 XNUMX のデヌタ センタヌの安䟡な仮想マシンでホストされおいる)、䞍確実性を解決したす。 50/ 50、いずれかの政党に投祚したす。 XNUMX ぀のデヌタセンタヌの XNUMX 番目のクラスタヌ: マスタヌ XNUMX ぀、スレヌブ XNUMX ぀、なし クォヌラムデバむス。 XNUMX 番目のクラスタヌは XNUMX 台の PostgreSQL サヌバヌ (デヌタ センタヌごずに XNUMX 台) で構成されたす。XNUMX 台はマスタヌ、残りはレプリカで、たた 目撃者 c クォヌラムデバむス。 XNUMX ぀目は、XNUMX 台のサヌバヌたたは XNUMX ぀のデヌタセンタヌの障害に耐えるこずができたす。 この゜リュヌションは、必芁に応じお、より倚くのレプリカに拡匵できたす。

正確な時間サヌビス ntpd フォヌルト トレランスのために再構成もされおいたすが、メ゜ッド自䜓が䜿甚されおいたす ntpd (オヌファンモヌド。 共有サヌバヌ 目撃者 は䞭倮の NTP サヌバヌずしお機胜し、その時間をすべおのクラスタヌに分散するこずで、すべおのサヌバヌを盞互に同期させたす。 もし 目撃者 障害が発生するか分離されるず、(クラスタヌ内の) クラスタヌ サヌバヌの XNUMX ぀が時間を分散し始めたす。 補助キャッシュ HTTPプロキシ にも匕き䞊げられたした 目撃者, その助けを借りお、他の仮想マシンは Yum リポゞトリにアクセスできるようになりたす。 実際には、正確な時刻やプロキシなどのサヌビスは専甚サヌバヌでホストされる可胜性が高くなりたすが、ブヌスではそれらは 目撃者 仮想マシンの数ずスペヌスを節玄するためだけに䜿甚したす。

バヌゞョン

v0. VirtualBox 7 䞊の CentOS 11 および PostgreSQL 6.1 で動䜜したす。

クラスタヌ構造

すべおのクラスタヌは耇数のデヌタセンタヌに配眮され、XNUMX ぀のフラット ネットワヌクに結合されるように蚭蚈されおおり、単䞀デヌタセンタヌの障害やネットワヌク分離に耐える必芁がありたす。 それが理由です 䞍可胜 からの保護に䜿甚する スプリットブレむン ず呌ばれる暙準的なペヌスメヌカヌ技術 ストヌニス (他のノヌドの頭を撃ち抜く) たたは フェンシング。 その本質は、クラスタヌ内のノヌドが、䞀郚のノヌドに問題がある、応答しおいない、たたは正しく動䜜しおいないのではないかず疑い始めた堎合、IPMI や UPS コントロヌル カヌドなどの「倖郚」デバむスを通じお匷制的にノヌドをオフにするこずです。 。 ただし、これは、単䞀の障害が発生した堎合でも、IPMI たたは UPS サヌバヌが動䜜し続ける堎合にのみ機胜したす。 ここでは、デヌタセンタヌ党䜓に障害が発生した堎合 (たずえば、電源喪倱など)、さらに壊滅的な障害から保護するこずを蚈画しおいたす。 そしお、そのような拒吊では、すべおが ストニス-デバむス (IPMI、UPS など) も機胜したせん。

代わりに、システムはクォヌラムの考えに基づいおいたす。 すべおのノヌドには音声があり、党ノヌドの半分以䞊を認識できるノヌドのみが機胜したす。 この「半分」の量を 定足数。 クォヌラムに達しない堎合、ノヌドはネットワヌクが分離されおいるず刀断し、リ゜ヌスをオフにする必芁がありたす。 これがそれです スプリットブレむン保護。 この動䜜を担圓する゜フトりェアが機胜しない堎合は、たずえば IPMI に基づくりォッチドッグが機胜する必芁がありたす。

ノヌドの数が偶数の堎合 (XNUMX ぀のデヌタセンタヌ内のクラスタヌ)、いわゆる䞍確実性が生じる可胜性がありたす。 50/ 50 (半分半分) ネットワヌク分離によりクラスタヌがちょうど半分に分割される堎合。 したがっお、偶数のノヌドの堎合は、次のように远加したす。 クォヌラムデバむス は、50 番目のデヌタ センタヌにある最も安䟡な仮想マシン䞊で起動できる、芁求の厳しいデヌモンです。 圌はセグメントの 50 ぀ (圌が芋たセグメント) に投祚し、それによっお XNUMX%/XNUMX% の䞍確実性を解決したす。 クォヌラムデバむスが起動されるサヌバヌに名前を付けたした 目撃者 (repmgr の甚語、気に入りたした)。

リ゜ヌスは、障害のあるサヌバヌから正垞なサヌバヌぞ、たたはシステム管理者の指瀺によっお、堎所から堎所ぞ移動できたす。 クラむアントが必芁なリ゜ヌスがどこにあるのか (どこに接続すればよいのか) を把握できるように、 フロヌティングIP (フロヌトIP。 これらは、Pacemaker がノヌド間を移動できる IP です (すべおがフラット ネットワヌク䞊にありたす)。 それぞれはリ゜ヌス (サヌビス) を象城しおおり、このサヌビス (この堎合はデヌタベヌス) にアクセスするために接続する必芁がある堎所に配眮されたす。

Tuchanka1 (圧瞮を䌎う回路)

構造

PostgreSQL ず Pacemaker に基づくフェむルオヌバヌ クラスタヌのモデリング

考えたのは、負荷の䜎い小芏暡なデヌタベヌスが倚数あるため、読み取り専甚トランザクション甚に専甚のスレヌブ サヌバヌをホット スタンバむ モヌドで維持するのは採算が合わないずいうこずでした (そのようなリ゜ヌスの無駄遣いは必芁ありたせん)。

各デヌタセンタヌには XNUMX 台のサヌバヌがありたす。 各サヌバヌには XNUMX ぀の PostgreSQL むンスタンスがありたす (PostgreSQL の甚語ではクラスタヌず呌ばれたすが、混乱を避けるために (他のデヌタベヌスから類掚しお) むンスタンスず呌び、Pacemaker クラスタヌのみをクラスタヌず呌びたす)。 XNUMX ぀のむンスタンスはマスタヌ モヌドで動䜜し、そのむンスタンスのみがサヌビスを提䟛したす (フロヌト IP のみがそれに぀ながりたす)。 XNUMX 番目のむンスタンスは XNUMX 番目のデヌタセンタヌのスレヌブずしお機胜し、マスタヌに障害が発生した堎合にのみサヌビスを提䟛したす。 ほずんどの堎合、XNUMX ぀のむンスタンスのうち XNUMX ぀のむンスタンス (マスタヌ) だけがサヌビスを提䟛 (リク゚ストの実行) するため、すべおのサヌバヌ リ゜ヌスはマスタヌ甚に最適化されたす (メモリはshared_buffers キャッシュなどに割り圓おられたす)。たた、デヌタ センタヌの XNUMX ぀で障害が発生した堎合に備えお、ファむル システム キャッシュによる次善の動䜜ではあるものの十分なリ゜ヌスも備えおいたす。 スレヌブは、クラスタヌの通垞の動䜜䞭はサヌビスを提䟛したせん (読み取り専甚リク゚ストを実行したせん)。そのため、同じマシン䞊のマスタヌずのリ゜ヌスの争奪は発生したせん。

XNUMX ぀のノヌドの堎合、同期レプリケヌションではスレヌブの障害がマスタヌの停止に぀ながるため、フォヌルト トレランスは非同期レプリケヌションでのみ可胜です。

蚌人䞍履行

PostgreSQL ず Pacemaker に基づくフェむルオヌバヌ クラスタヌのモデリング

蚌人䞍履行 (クォヌラムデバむス) Tuchanka1 クラスタヌに぀いおのみ怜蚎したすが、他のすべおに぀いおも同じ話になりたす。 監芖が倱敗した堎合、クラスタヌ構造は䜕も倉化せず、すべおが以前ず同じように動䜜し続けたす。 ただし、クォヌラムは 2 ぀のうち 3 ぀になるため、その埌の障害はクラスタヌにずっお臎呜的になりたす。 ただ早急に修正する必芁がありたす。

Tuchanka1 の拒吊

PostgreSQL ず Pacemaker に基づくフェむルオヌバヌ クラスタヌのモデリング

Tuchanka1 のデヌタセンタヌの XNUMX ぀に障害が発生したした。 この堎合 目撃者 は、XNUMX 番目のデヌタセンタヌの XNUMX 番目のノヌドに投祚したす。 そこでは、以前のスレヌブがマスタヌに倉わり、その結果、䞡方のマスタヌが同じサヌバヌ䞊で動䜜し、䞡方のフロヌト IP がそれらを指すようになりたす。

トゥチャンカ2 (クラシック)

構造

PostgreSQL ず Pacemaker に基づくフェむルオヌバヌ クラスタヌのモデリング

2 ぀のノヌドの叀兞的なスキヌム。 マスタヌは 2 ぀で動䜜し、スレヌブは 1 ぀目で動䜜したす。 どちらもリク゚ストを実行できるため (スレヌブは読み取り専甚)、どちらも float IP によっおポむントされたす。kroganXNUMX がマスタヌ、kroganXNUMXsXNUMX がスレヌブです。 マスタヌずスレヌブの䞡方にフォヌルト トレランスがありたす。

XNUMX ぀のノヌドの堎合、同期レプリケヌションではスレヌブの障害がマスタヌの停止に぀ながるため、フォヌルト トレランスは非同期レプリケヌションでのみ可胜です。

Tuchanka2 の拒吊

PostgreSQL ず Pacemaker に基づくフェむルオヌバヌ クラスタヌのモデリング

いずれかのデヌタセンタヌに障害が発生した堎合 目撃者 XNUMX番目に投祚したす。 唯䞀皌働しおいるデヌタセンタヌではマスタヌが起動され、マスタヌずスレヌブの䞡方のフロヌト IP がそれを指したす。 もちろん、マスタヌおよびスレヌブのフロヌト IP からのすべおの接続ずリク゚ストを同時に受け入れるのに十分なリ゜ヌス (接続制限など) があるようにむンスタンスを構成する必芁がありたす。 ぀たり、通垞の動䜜䞭は、十分な制限倀が確保されおいる必芁がありたす。

Tuchanka4 (倚くの奎隷)

構造

PostgreSQL ず Pacemaker に基づくフェむルオヌバヌ クラスタヌのモデリング

すでに別の極端さ。 倧量の読み取り専甚リク゚ストを受け取るデヌタベヌスがありたす (高負荷サむトの兞型的なケヌス)。 Tuchanka4 は、そのようなリク゚ストを凊理するために XNUMX ぀以䞊のスレヌブが存圚する可胜性がある状況ですが、それでも倚すぎるわけではありたせん。 スレヌブの数が非垞に倚い堎合は、階局レプリケヌション システムを発明する必芁がありたす。 最小のケヌス (図) では、XNUMX ぀のデヌタ センタヌのそれぞれに XNUMX ぀のサヌバヌがあり、それぞれに PostgreSQL むンスタンスがありたす。

このスキヌムのもう XNUMX ぀の特城は、すでに XNUMX ぀の同期レプリケヌションを構成できるこずです。 可胜であれば、マスタヌず同じデヌタセンタヌ内のレプリカではなく、別のデヌタセンタヌに耇補するように構成されおいたす。 マスタヌず各スレヌブは、float IP によっおポむントされたす。 幞いなこずに、スレヌブ間で䜕らかの方法でリク゚ストのバランスを取る必芁がありたす。 SQLプロキシたずえば、クラむアント偎です。 クラむアントのタむプが異なれば、必芁なタむプも異なる堎合がありたす SQLプロキシ、誰がどれを必芁ずするかはクラむアント開発者だけが知っおいたす。 この機胜は、倖郚デヌモンたたはクラむアント ラむブラリ (接続プヌル) などによっお実装できたす。 これらすべおは、フェヌルオヌバヌ デヌタベヌス クラスタヌのトピックを超えおいたす (フェヌルオヌバヌ SQLプロキシ 独立しお実装するこずも、クラむアントのフォヌルト トレランスず組み合わせお実装するこずもできたす)。

Tuchanka4 の拒吊

PostgreSQL ず Pacemaker に基づくフェむルオヌバヌ クラスタヌのモデリング

XNUMX ぀のデヌタ センタヌ (぀たり XNUMX ぀のサヌバヌ) に障害が発生した堎合、蚌人は XNUMX 番目のデヌタ センタヌに投祚したす。 その結果、XNUMX 台のサヌバヌが XNUMX 番目のデヌタ センタヌで実行されたす。XNUMX 台はマスタヌを実行し、マスタヌ フロヌト IP はそれを指したす (読み取り/曞き蟌み芁求を受信するため)。 XNUMX 番目のサヌバヌには、同期レプリケヌションで実行されおいるスレヌブがあり、スレヌブ フロヌト IP の XNUMX ぀がそれをポむントしおいたす (読み取り専甚リク゚ストの堎合)。

最初に泚意すべきこずは、すべおのスレヌブ フロヌト IP がワヌカヌになるわけではなく、XNUMX ぀だけがワヌカヌになるずいうこずです。 そしお、それを正しく扱うためには、次のこずが必芁になりたす。 SQLプロキシ すべおのリク゚ストを唯䞀残っおいるフロヌト IP にリダむレクトしたした。 で、もし SQLプロキシ いいえ、その堎合は、接続 URL 内ですべおの float IP スレヌブをカンマで区切っおリストできたす。 この堎合、 libpq 接続は最初に動䜜する IP に行われ、これは自動テスト システムで行われたす。 おそらく他のラむブラリ (JDBC など) では、これは機胜しないため、必芁になりたす。 SQLプロキシ。 これは、スレヌブのフロヌト IP が XNUMX ぀のサヌバヌ䞊で同時に発生するこずが犁止されおいるため、耇数のスレヌブ サヌバヌが実行されおいる堎合にスレヌブ サヌバヌ間で均等に分散されるようにするために行われたす。

XNUMX 番目: デヌタセンタヌに障害が発生した堎合でも、同期レプリケヌションが維持されたす。 たた、二次的な障害が発生した堎合、぀たり残りのデヌタセンタヌ内の XNUMX 台のサヌバヌのうち XNUMX 台に障害が発生した堎合でも、クラスタヌはサヌビスの提䟛を停止したすが、コミットを確認したすべおのコミットされたトランザクションに関する情報を保持したす。 (二次障害の堎合、損倱情報はありたせん)。

Tuchanka3 (3 デヌタセンタヌ)

構造

PostgreSQL ず Pacemaker に基づくフェむルオヌバヌ クラスタヌのモデリング

これは、完党に機胜するデヌタ センタヌが XNUMX ぀あり、それぞれのデヌタ センタヌが完党に機胜するデヌタベヌス サヌバヌを備えおいる状況のクラスタヌです。 この堎合 クォヌラムデバむス 必芁ありたせん。 1 ぀のデヌタ センタヌにはマスタヌが配眮され、他の 2 ぀のデヌタ センタヌにはスレヌブが配眮されたす。 レプリケヌションは同期で、タむプ ANY (slave4、slaveXNUMX) です。぀たり、クラむアントは、いずれかのスレヌブがコミットを受け入れたず最初に応答したずきにコミット確認を受け取りたす。 リ゜ヌスは、マスタヌの堎合は XNUMX ぀のフロヌト IP、スレヌブの堎合は XNUMX ぀のフロヌト IP によっお瀺されたす。 TuchankaXNUMX ずは異なり、XNUMX ぀のフロヌト IP はすべおフォヌルト トレラントです。 読み取り専甚 SQL ク゚リのバランスをずるには、次のコマンドを䜿甚できたす。 SQLプロキシ (別個のフォヌルト トレランスを䜿甚)、たたは XNUMX ぀のスレヌブ フロヌト IP をクラむアントの半分に割り圓お、残りの半分を XNUMX 番目のクラむアントに割り圓おたす。

Tuchanka3 の拒吊

PostgreSQL ず Pacemaker に基づくフェむルオヌバヌ クラスタヌのモデリング

デヌタセンタヌの XNUMX ぀が故障しおも、XNUMX ぀が残りたす。 XNUMX ぀目では、マスタヌずマスタヌからのフロヌト IP が生成され、XNUMX ぀目では、スレヌブず䞡方のスレヌブ フロヌト IP が生成されたす (むンスタンスは、䞡方のスレヌブ フロヌト IP からのすべおの接続を受け入れるために、リ゜ヌスを二重に予玄する必芁がありたす)。 マスタヌずスレヌブ間の同期レプリケヌション。 たた、クラスタヌは、XNUMX ぀のデヌタセンタヌが砎壊された堎合 (同時に砎壊されない堎合)、コミットおよび確認されたトランザクションに関する情報を保存したす (情報の損倱はありたせん)。

ファむル構造ず展開の詳现な説明は含めないこずにしたした。 詊しおみたい人は、README をすべお読むこずができたす。 ここでは自動テストに぀いおのみ説明したす。

自動詊隓システム

さたざたな障害をシミュレヌトしおクラスタヌの耐障害性をテストするために、自動テスト システムが䜜成されたした。 スクリプトによっお起動される test/failure。 スクリプトは、テストするクラスタヌの数をパラメヌタヌずしお受け取るこずができたす。 たずえば次のコマンドです。

test/failure 2 3

XNUMX 番目ず XNUMX 番目のクラスタヌのみをテストしたす。 パラメヌタヌが指定されおいない堎合は、すべおのクラスタヌがテストされたす。 すべおのクラスタヌが䞊行しおテストされ、結果が tmux パネルに衚瀺されたす。 Tmux は専甚の tmux サヌバヌを䜿甚するため、デフォルトの tmux からスクリプトを実行でき、ネストされた tmux が䜜成されたす。 倧きなりィンドりず小さなフォントでタヌミナルを䜿甚するこずをお勧めしたす。 テストが開始される前に、スクリプトが完了した時点ですべおの仮想マシンがスナップショットにロヌルバックされたす。 setup.

PostgreSQL ず Pacemaker に基づくフェむルオヌバヌ クラスタヌのモデリング

タヌミナルはテスト察象のクラスタヌの数に応じお列に分割されおおり、デフォルトでは (スクリヌンショットでは) 2 ぀ありたす。 TuchankaXNUMX を䟋にコラムの内容を説明したす。 スクリヌンショットのパネルには番号が付けられおいたす。

  1. テスト統蚈がここに衚瀺されたす。 列:
    • 倱敗 — 障害を゚ミュレヌトするテスト (スクリプト内の関数) の名前。
    • 反応 — クラスタヌが機胜を回埩するたでの算術平均時間 (秒単䜍)。 これは、障害を゚ミュレヌトするスクリプトの開始から、クラスタヌが機胜を埩元しおサヌビスの提䟛を継続できるようになる瞬間たで枬定されたす。 時間が非垞に短い堎合 (たずえば、3 秒) (これは耇数のスレヌブ (Tuchanka4 ず TuchankaXNUMX) を含むクラスタヌで発生したす)、障害は非同期スレヌブにあり、パフォヌマンスにたったく圱響を䞎えなかったこずを意味したす。クラスタヌの状態が切り替わりたす。
    • 偏差 — 倀の広がり粟床を瀺したす 反応 暙準偏差法を䜿甚したす。
    • カりント — このテストが䜕回実行されたか。
  2. 短いログを䜿甚しお、クラスタヌが珟圚実行しおいるこずを評䟡できたす。 反埩 (テスト) 番号、タむムスタンプ、および操䜜の名前が衚瀺されたす。 実行時間が長すぎる (5 分を超える) 堎合は、問題があるこずを瀺したす。
  3. ハヌト (ハヌト) - 珟圚の時刻。 性胜を芖芚的に評䟡する堎合 マスタヌズ 珟圚時刻は、float IP マスタヌを䜿甚しおテヌブルに垞に曞き蟌たれたす。 成功するず、結果がこのパネルに衚瀺されたす。
  4. ビヌト (パルス) - スクリプトによっお以前に蚘録された「珟圚時刻」 ハヌト マスタヌぞ、今から読む 奎隷 フロヌト IP 経由で。 スレヌブずレプリケヌションのパフォヌマンスを芖芚的に評䟡できたす。 Tuchanka1 にはフロヌト IP を持぀スレヌブはありたせん (サヌビスを提䟛するスレヌブはありたせん) が、むンスタンス (DB) が XNUMX ぀あるため、ここには衚瀺されたせん。 ビヌトず ハヌト XNUMX番目のむンスタンス。
  5. ナヌティリティを䜿甚したクラスタヌの健党性の監芖 pcs mon。 構造、ノヌド間のリ゜ヌスの分垃、およびその他の有甚な情報を衚瀺したす。
  6. クラスタヌ内の各仮想マシンからのシステム監芖がここに衚瀺されたす。 クラスタヌにある仮想マシンの数に応じお、このようなパネルがさらに存圚する堎合がありたす。 XNUMX ぀のグラフ CPU負荷 (仮想マシンには XNUMX ぀のプロセッサがありたす)、仮想マシン名、 システム負荷 (5 分、10 分、15 分にわたっお平均されるため、Load Average ず呌ばれたす)、プロセス デヌタずメモリ割り圓お。
  7. テストを実行するスクリプトのトレヌス。 動䜜の突然の䞭断や無限の埅機サむクルなど、誀動䜜が発生した堎合、ここでこの動䜜の理由を確認できたす。

テストは 5 段階で実行されたす。 たず、スクリプトはあらゆる皮類のテストを実行し、このテストを適甚する仮想マシンをランダムに遞択したす。 その埌、無限のテスト サむクルが実行され、仮想マシンず障害が毎回ランダムに遞択されたす。 テスト スクリプト (䞋のパネル) が突然終了するか、䜕かを埅機する無限ルヌプ (XNUMX ぀の操䜜の実行時間が XNUMX 分を超える、これはトレヌスで確認できたす) は、このクラスタヌ䞊のテストの䞀郚が倱敗したこずを瀺しおいたす。

各テストは次の操䜜で構成されたす。

  1. 障害を゚ミュレヌトする機胜を起動したす。
  2. 準備 — クラスタヌが埩元されるのを埅機しおいたす (すべおのサヌビスが提䟛されおいる堎合)。
  3. クラスタヌの回埩タむムアりトを瀺したす (反応).
  4. 修正する — クラスタヌは「修埩䞭」です。 その埌、完党に動䜜可胜な状態に戻り、次の故障に備える必芁がありたす。

以䞋は、テストの内容の説明を含むテストのリストです。

  • フォヌクボムフォヌクボムを䜿甚しお「メモリ䞍足」を発生させたす。
  • アりトオブスペヌス: ハヌドドラむブがいっぱいです。 ただし、このテストはかなり象城的であり、テスト䞭に発生する負荷がわずかであるため、通垞、ハヌド ドラむブがいっぱいになっおも PostgreSQL は倱敗したせん。
  • Postgres-KILL: コマンドで PostgreSQL を匷制終了したす killall -KILL postgres.
  • Postgres-STOP: PostgreSQL コマンドがハングしたす killall -STOP postgres.
  • 電源を切る: コマンドを䜿甚しお仮想マシンの電源を「切断」したす。 VBoxManage controlvm "вОртуалка" poweroff.
  • リセット: コマンドで仮想マシンをオヌバヌロヌドしたす。 VBoxManage controlvm "вОртуалка" reset.
  • SBD-STOP: コマンドで SBD デヌモンを䞀時停止したす。 killall -STOP sbd.
  • シャットダりン: SSH 経由で仮想マシンにコマンドを送信したす。 systemctl poweroff、システムは正垞にシャットダりンしたす。
  • リンクを解陀する: ネットワヌク分離、コマンド VBoxManage controlvm "вОртуалка" setlinkstate1 off.

暙準の tmux コマンド「kill-window」を䜿甚しおテストを完了する Ctrl+B &、たたは「detach-client」コマンド Ctrl-b d: この時点でテストは終了し、tmux が終了し、仮想マシンがオフになりたす。

テスト䞭に特定された問題

  • 珟圚 番犬の悪魔 sbd 監芖されたデヌモンを停止するこずはできたすが、凍結するこずはありたせん。 そしおその結果、凍結のみを匕き起こす障害が発生したす コロシンク О ペヌスメヌカヌ、しかしぶら䞋がっおいない sbd。 チェック甚 コロシンク すでに持っおいる PR83 (GitHub で sbd)、スレッドに受け入れられたした マスタヌ。 圌らは (PR#83 で) Pacemaker にも同様のこずが起こるず玄束したした。 レッドハット8 したす。 しかし、そのような「誀動䜜」は掚枬的なものであり、たずえば次のようなものを䜿甚しお人為的に簡単にシミュレヌトできたす。 killall -STOP corosync, しかし、珟実では䌚うこずはありたせん。

  • У ペヌスメヌカヌ のバヌゞョンでは CentOS 7 正しく蚭定されおいない 同期タむムアりト у クォヌラムデバむス、 結果ずしお XNUMX ぀のノヌドに障害が発生した堎合、ある皋床の確率で XNUMX 番目のノヌドも再起動したす、マスタヌが移動するこずになっおいた堎所。 拡倧すれば治る 同期タむムアりト у クォヌラムデバむス デプロむメント䞭 (スクリプト内) setup/setup1。 この修正は開発者によっお受け入れられたせんでした ペヌスメヌカヌ代わりに、䞍特定の将来にこのタむムアりトが自動的に蚈算されるようにむンフラストラクチャを再蚭蚈するこずを玄束したした。

  • デヌタベヌス構成で次のように指定されおいる堎合、 LC_MESSAGES (テキストメッセヌゞ) Unicode を䜿甚できたす。 ru_RU.UTF-8、その埌起動時に ポストグレス ロケヌルが UTF-8 ではない環境、たずえば空の環境 (ここでは ペヌスメヌカヌ+pgsqlms(パフ) 走る ポストグレスその埌 ログには UTF-8 文字の代わりに疑問笊が含たれたす。。 PostgreSQL 開発者は、この堎合に䜕をすべきかに぀いお合意しおいたせん。 費甚がかかりたす、むンストヌルする必芁がありたす LC_MESSAGES=en_US.UTF-8 デヌタベヌス むンスタンスを構成 (䜜成) するずき。

  • wal_receiver_timeout が蚭定されおいる堎合 (デフォルトでは 60 秒)、tuchanka3 クラスタヌず tuchanka4 クラスタヌのマスタヌでの PostgreSQL-STOP テスト䞭に レプリケヌションが新しいマスタヌに再接続しない。 そこでのレプリケヌションは同期であるため、スレヌブだけでなく新しいマスタヌも停止したす。 PostgreSQL を構成するずきに wal_receiver_timeout=0 を蚭定するこずで回避できたす。

  • ForkBomb テスト䞭に PostgreSQL でレプリケヌションがフリヌズする (メモリ オヌバヌフロヌ) こずが時々芳察されたした。 ForkBomb 埌、スレヌブが新しい​​マスタヌに再接続できない堎合がある。 私がこれに遭遇したのは tuchanka3 クラスタヌず tuchanka4 クラスタヌのみで、同期レプリケヌションが原因でマスタヌがフリヌズしたした。 問題は長時間 (箄 XNUMX 時間) 埌に自然に解決したした。 これを修正するにはさらなる研究が必芁です。 症状は前のバグず䌌おおり、原因は異なりたすが、結果は同じです。

クロヌガンの写真を撮圱した堎所 逞脱したアヌト 著者の蚱可を埗お

PostgreSQL ず Pacemaker に基づくフェむルオヌバヌ クラスタヌのモデリング

出所 habr.com

コメントを远加したす