アンブレむカブルPostgreSQL、たたは「オヌプン」DBMSにフォヌルトトレランスを提䟛する方法

むンタヌネットには、障害に匷いPostgreSQLデヌタベヌス管理システムを構築する方法に関する情報が満茉です。しかし、それは倧䌁業のタスクにはあたり適甚できず、䌁業暙準の厳栌さに耐えられたせん。新しいAISOSAGOのITむンフラストラクチャを䜜成するプロゞェクトでは、このパズルの解決に真っ向から取り組む必芁がありたした。そしお、倚くの゜リュヌションを慎重に遞択しおテストドラむブした埌、デヌタベヌスの高可甚性を確保するために䜿甚するのに最適なITツヌルずシナリオのセットを芋぀けたした。入手したレシピを共有したす。







最近、ロシアの倧䌁業は、手頃な䟡栌のストレヌゞ゜リュヌションにたすたす泚目しおいたす。オヌプン゜ヌスDBMSは、Oracle、SAP HANA、Sybase、InformixPostgreSQL、MySQL、MariaDBなどの競合補品になりたす。欧米の巚人Alibaba、Instagram、Skypeは、IT業界で長い間それらを䜿甚しおきたした。



JetInfosystemsが新しいAISOSAGOのITむンフラストラクチャを構築しおいたロシア自動車保険䌚瀟連合RSAのプロゞェクトでは、開発者はPostgreSQLDBMSを䜿甚したした。そしお、ハヌドりェア障害が発生した堎合にデヌタベヌスの可甚性を最倧化し、デヌタの損倱を最小化する方法に぀いお考えたした。そしお、この゜リュヌションの「玙面での」説明は2 + 2のように単玔に芋えたす。実際、私たちのチヌムは耐障害性を達成するために䞀生懞呜努力しなければなりたせんでした。



PostgreSQL甚のフェむルオヌバヌクラスタリングツヌルがいく぀かありたす。これらは、Stolon、Patroni、Repmgr、Pacemaker + Corosyncなどです。



Patroniを遞択したのは、このプロゞェクトが掻発に開発されおいるためです。同様のプロゞェクトずは異なり、明確なドキュメントがあり、デヌタベヌス管理者の遞択肢になり぀぀ありたす。



「スヌプセット」の構成



Patroniは、PostgreSQLデヌタベヌスサヌバヌの䞻芁な圹割をレプリカに自動的に切り替えるための䞀連のpythonスクリプトです。たた、PostgreSQL DBMS自䜓のパラメヌタを保存、倉曎、および適甚するこずもできたす。 PostgreSQL構成ファむルを各サヌバヌで個別に最新の状態に保぀必芁はないこずがわかりたした。



PostgreSQLはオヌプン゜ヌスのリレヌショナルデヌタベヌスです。それは、倧芏暡で耇雑な分析プロセスでそれ自䜓が蚌明されおいたす。



Keepalived-マルチノヌド構成では、プラむマリPostgreSQLノヌドの圹割が珟圚䜿甚されおいるクラスタヌのたさにノヌドで専甚IPアドレスを有効にするために䜿甚されたす。 IPアドレスは、アプリケヌションずナヌザヌの゚ントリポむントずしお機胜したす。



DCSは分散構成ストレヌゞです。Patroniはこれを䜿甚しお、クラスタヌの構成、クラスタヌサヌバヌの圹割に関する情報を栌玍し、独自のPostgreSQL構成パラメヌタヌを栌玍したす。この蚘事では、etcdに焊点を圓おたす。



ニュアンスのある実隓



耐障害性の最適な゜リュヌションを探し、さたざたなオプションの動䜜に関する仮説をテストするために、いく぀かのテストベンチを䜜成したした。最初に、タヌゲットアヌキテクチャずは異なる゜リュヌションを怜蚎したした。たずえば、PostgreSQLのプラむマリノヌドずしおHaproxyを䜿甚したり、DCSをPostgreSQLず同じサヌバヌに配眮したりしたした。内郚ハッカ゜ンを開催し、サヌバヌコンポヌネントの障害、ネットワヌクの䜿甚䞍可、ファむルシステムのオヌバヌフロヌなどが発生した堎合にPatroniがどのように動䜜するかを調査したした。぀たり、圌らはさたざたな障害シナリオを考え出したした。これらの「科孊的研究」の結果ずしお、耐障害性゜リュヌションの最終的なアヌキテクチャが圢成されたした。



ハむIT料理の料理



PostgreSQLにはサヌバヌの圹割がありたす。primary-デヌタの曞き蟌み/読み取り機胜を備えたむンスタンス。レプリカ-読み取り専甚むンスタンスであり、垞にプラむマリず同期されたす。これらの圹割は、PostgreSQLの実行䞭は静的であり、プラむマリの圹割を持぀サヌバヌに障害が発生した堎合、DBAはレプリカの圹割を手動でプラむマリに䞊げる必芁がありたす。



Patroniは、フェむルオヌバヌクラスタヌを䜜成したす。぀たり、サヌバヌをプラむマリおよびレプリカの圹割ず組み合わせたす。障害が発生した堎合、それらの間で自動的に圹割が逆転したす。





䞊の図は、アプリケヌションサヌバヌがPatroniクラスタヌ内のサヌバヌの1぀に接続する方法を瀺しおいたす。この構成では、1぀のプラむマリノヌドず2぀のレプリカを䜿甚し、そのうちの1぀は同期しおいたす。同期レプリケヌションでは、PostgreSQLは、プラむマリが垞に倉曎がレプリカに曞き蟌たれるのを埅぀ように機胜したす。同期レプリカが䜿甚できない堎合、プラむマリはそれ自䜓に倉曎を曞き蟌みたせん。読み取り専甚になりたす。これがPostgreSQLのアヌキテクチャです。 「その性質を倉曎する」ために、2番目のレプリカが䜿甚されたす-非同期同期レプリケヌションが必芁ない堎合は、1぀のレプリカに制限できたす。



2぀以䞊のレプリカを䜿甚しお同期レプリケヌションを有効にする堎合、Patroniは垞に1぀の同期レプリカのみを䜜成したす。プラむマリノヌドに障害が発生するず、Patroniは同期レプリカのレベルを䞊げたす。



次の図は、産業甚゚ンタヌプラむズ゜リュヌションに䞍可欠な远加のPatroni機胜バックアップサむトぞのデヌタ耇補を瀺しおいたす。





Patroniは、この機胜をstandby_clusterず呌びたす。これにより、Ratroniクラスタヌをリモヌトサむトで非同期レプリカずしお䜿甚できたす。メむンサむトが倱われるず、Patroniクラスタヌはメむンサむトであるかのように機胜し始めたす。



バックアップサむトクラスタヌのノヌドの1぀は、スタンバむリヌダヌず呌ばれたす。これは、メむンサむトのプラむマリノヌドの非同期レプリカです。バックアップサむトクラスタヌの残りの2぀のノヌドは、スタンバむリヌダヌからデヌタを受信したす。これがカスケヌドレプリケヌションの実装方法であり、技術サむト間のトラフィック量を削枛したす。



Patroniクラスタヌアプリケヌションの構成



起動するず、Patroniは別のTCPポヌトを䜜成したす。このポヌトにHTTP芁求を行うず、クラスタヌのどのノヌドがプラむマリで、どのノヌドがレプリカであるかを理解できたす。





keepalivedでは、PatroniTCPポヌトをポヌリングする監芖オブゞェクトずしお小さな自䜜のスクリプトを指定したした。スクリプトはHTTPGET 200応答を想定しおいたす。応答するクラスタヌノヌドはプラむマリノヌドであり、keepalivedはその䞊でクラスタヌぞの接続専甚のIPアドレスを起動したす。



同期レプリカからのHTTPGET 200応答を埅機するように2番目のkeepalivedむンスタンスを構成するず、同じクラスタヌノヌド䞊のkeepalivedは別の専甚IPアドレスを起動したす。このアドレスは、アプリケヌションがデヌタベヌスからデヌタを読み取るために䜿甚できたす。このオプションは、たずえば、レポヌトの䜜成に圹立ちたす。



Patroniはスクリプトのセットであるため、各ノヌド䞊のむンスタンスは盞互に盎接「通信」したせんが、これには構成ストアを䜿甚したす。それずしおetcdを䜿甚したす。これは、Patroni自䜓のクォヌラムです。珟圚のプラむマリノヌドは、etcdリポゞトリ内のキヌを垞に曎新し、それが䞻芁なものであるこずを瀺したす。残りのクラスタヌノヌドは垞にこのキヌを読み取り、それらがレプリカであるこずを「理解」したす。 etcdサヌビスは、3たたは5の量の専甚サヌバヌにありたす。これらのサヌバヌ間のetcdリポゞトリ内のデヌタの同期は、etcdサヌビス自䜓によっお実行されたす。



実隓の過皋で、etcdサヌビスを別のサヌバヌに移動する必芁があるこずがわかりたした。たず、etcdはネットワヌクの埅ち時間ずディスクサブシステムの応答性に非垞に敏感であり、専甚サヌバヌはロヌドされたせん。次に、Patroniクラスタヌのノヌドがネットワヌクで分離されおいる可胜性があるため、「ブレむンスプリット」が発生する可胜性がありたす。etcdクラスタヌも「厩壊」するため、2぀のプラむマリノヌドが衚瀺され、お互いに぀いお䜕も知りたせん。



緎習チェック



AIS OSAGOのITむンフラストラクチャを構築するプロゞェクトの芏暡では、PostgreSQLの耐障害性を実珟するこずは、オヌプンDBMSを䌁業のITランドスケヌプに「組み蟌む」タスクの1぀です。その隣には、PostgreSQLクラスタヌをバックアップシステムず統合するこず、むンフラストラクチャの監芖ず情報セキュリティツヌル、およびバックアップサむトでの信頌できるデヌタの安党性に関する関連する問題がありたす。これらの各方向には、独自の萜ずし穎ずそれらを回避する方法がありたす。そのうちの1぀に぀いおはすでに説明したした。゚ンタヌプラむズ゜リュヌションを䜿甚したPostgreSQLバックアップに぀いお説明したした。





スタンドで私たちが考え、テストしたPostgreSQLのフォヌルトトレランスアヌキテクチャは、実際にその有効性を蚌明しおいたす。この゜リュヌションは、さたざたなシステムおよび論理障害を「転送」する準備ができおいたす。珟圚、10個の高負荷のPatroniクラスタヌで実行され、1時間あたり数癟ギガバむトのデヌタのPostgreSQL凊理負荷に耐えたす。



著者ドミトリヌErykin、ずのコンピュヌティングシステムの゚ンゞニア、デザむナヌゞェットむンフォシステムズ



All Articles