「逆説的に聞こえるかもしれないが、真実は、学べば学ぶほど、絶対的な意味で無知になるということだ。なぜなら、悟りによってのみ自分の限界に気付くからだ。 より具体的には、知的進化の最も有望な結果の1つは、新しいより広い視点の絶え間ない発見です。 ニコラ・テスラ
![](https://habrastorage.org/files/ce0/efe/46b/ce0efe46b74d4abaa19096fe1492be3e.png)
PostgreSQLは驚くべき速度で開発されている素晴らしいプロジェクトです。 この一連の投稿では、バージョン全体でのPostgreSQLのフォールトトレランスの進化に焦点を当てます。
簡単に言えばPostgreSQL
PostgreSQLは本質的にフォールトトレラントです。 第一に、それは高度なオープンソースのデータベース管理システムであり、今年で20周年を迎えます[約。 レーン:2016年に記念日が開催され、PG Day'16 Russiaの最後の夜にロシアのコミュニティから厳soleなお祝いが行われました。 したがって、それは活発なコミュニティを持つ実証済みの技術であり、そのおかげで積極的に開発されています。
PostgreSQLはSQL準拠(SQL:2011)であり、ACID要件(原子性、一貫性、分離、信頼性)に完全に準拠しています。
注 :PostgreSQLのA (トミシティ) C (持続性) I (ソレーション) D (耐久性)
アトミック性により、トランザクションの結果が他のトランザクション内で完全に表示されるか、まったく表示されなくなりますが、トランザクションはそれ自体に対してアトミックではありません。 PostgreSQLは一貫性があり、一貫性の原則によって指示されたシステム定義の制約がトランザクション結果に適用されます。 つまり、トランザクションが完了した後、データは一貫した状態を維持する必要があります。 同時に実行されるトランザクションは相互に影響しません。これは分離を示します(このポストでは、トランザクション分離レベルについて少し後で説明します)。 トランザクションが完了すると、その後の失敗に関係なくその結果は失われず、これによりPostgreSQLの信頼性が高まります。
PostgreSQLでは、物理的および論理的なレプリカを作成できます。これには、物理的および論理的なソリューションが組み込まれています。 次の投稿で、フォールトトレランスの観点からPostgreSQLのレプリケーション方法について説明します。
PostgreSQLでは、同期および非同期トランザクション、 PITR(ポイントインタイムリカバリ-ポイントインタイムリカバリ)およびMVCC(マルチバージョン同時実行制御-マルチバージョンを使用した競合アクセスの制御)を実行できます。 これらの概念はすべて、ある程度のフォールトトレランスに関連するものであり、PostgreSQLの基本概念とそのアプリケーションを説明する際の影響を説明しようとします。
PostgreSQLは信頼できます!
データベース内のすべてのアクションは、 トランザクションログで保護されたトランザクション内で実行されます 。 トランザクションログは、ソフトウェア障害が発生した場合に自動災害復旧を実行します。
オプションで、ハードウェアの問題を診断するためのデータブロック チェックサムを持つデータベースを作成できます。 詳細な復元が必要な場合に備えて、完全かつ詳細なPITRを備えた多くのバックアップメカニズムがあります。 さまざまな診断ツールも利用できます。
データベース複製はネイティブでサポートされています。 同期レプリケーションは、適切に構成および管理されると、 「5ナイン」(99.999%)と比較して、高度なアクセシビリティとデータ保護を提供します。
上記のすべての事実を考慮すると、PostgreSQLは信頼できると簡単に言えます!
PostgreSQLフォールトトレランス:WAL
WAL-先読みロギング-PostgreSQLの主要なフォールトトレランスシステムです。
WALは、PostgreSQLデータディレクトリのpg_xlogサブディレクトリに記録された一連のバイナリファイルで構成されています。 データベースに加えられた各変更は、最初にWALに書き込まれるため、「トランザクションログ」と一致する「プロアクティブ」ログという名前になります。 トランザクションが完了すると、デフォルトの動作(および最も安全な動作)により、WALによるディスクへの書き込みが強制されます。
障害が発生した場合、PostgreSQL WALが再現され、最後のトランザクションが完了した時点でデータベースが返されるため、データベースへの変更の安全性が確保されます。
トランザクション? コミットしますか?
データベースへの変更自体は、トランザクションの完了時にディスクに書き込まれません。 しばらくしてから、適切に調整されたサーバー上のライターおよびチェックポイントのバックグラウンドプロセスによって記録されます。 (上記のWALの説明を参照)
トランザクションは、すべてのデータベースシステムの基本概念です。 トランザクションの際立った特徴は、複数のステップを単一のオールオアナッシング操作にリンクすることです。
注 :PostgreSQLのトランザクション
PostgreSQLは実際、すべてのSQLクエリをトランザクション内で実行されているものとして扱います。 BEGINコマンドを記述しない場合、個々のリクエストにはそれぞれ暗黙のBEGINコマンドと(成功した場合)COMMITが最初と最後にあります。 BEGINおよびCOMMITでラップされたクエリのグループは、トランザクションブロックと呼ばれることもあります。
ステップ間の中間状態は、並行して実行される他のトランザクションからは見えないため、トランザクションの完了を妨げる障害が発生しても、データベース全体に影響するステップはありません。 PostgreSQLはダーティリードをサポートしていません( ダーティリード - トランザクションは並列の不完全なトランザクションによって書き込まれたデータを読み取ります )。
注:トランザクション分離
SQL標準では、トランザクション分離の4つのレベルが定義されています。読み取りが不完全、読み取りが完了、再読み取り、シリアル化です。
表1:標準SQLトランザクション分離レベル
分離レベル 汚れた読書 ユニークな読書 ファントムリーディング シリアル化の異常 不完全な読書 許可されていますが、PGでは許可されていません たぶん たぶん たぶん 読み取り完了 不可能 たぶん たぶん たぶん 繰り返し読みます 不可能 不可能 許可されていますが、PGでは許可されていません たぶん 連載 不可能 不可能 不可能 不可能
最も厳しいレベルはシリアル化です。これは、シリアル化可能なトランザクションの同時実行は、同じ順序での順次実行と同じ効果を持つことが保証されているという段落の標準によって決定されます。
このトピックの詳細については、 トランザクションの分離に関するPostgresのドキュメントをご覧ください。
制御点
災害復旧はWALを再現しますが、復旧はどの時点で始まりますか?
回復は、 チェックポイントとして知られるWAL内のポイントから始まります。 障害復旧の期間は、最後のチェックポイント以降のトランザクションログの変更数によって異なります。 チェックポイントは、以前のデータベースの変更がすでにディスクに書き込まれていることを保証するため、リカバリの既知の安全な開始点です。
マイルストーンは即時または計画的です。 CHECKPOINTコマンドなどによる特権ユーザー(スーパーユーザー)の一部のアクションにより、即時コントロールポイントが表示されます。 スケジュールされたブレークポイントは、Postgresによって自動的に設定されます。
おわりに
この投稿では、フォールトトレランスに関連する重要なPostgreSQL機能をリストしました。 プロアクティブなロギング、トランザクション、分離レベル、ブレークポイント、および災害復旧が言及されました。 次の投稿では、postgreSQLレプリケーションストーリーでトピックを継続します。