I.はじめに
データベースであろうと他のビジネスシステムであろうと、ログは非常に重要です。ログには通常、システムで次の機能があります。
1. ビジネス上の問題の位置付け。システム開発において、バグをいくつか書いていなかったのは誰ですか?ログを使用すると、問題をすばやく特定してシステムを修復するのに便利です。これは、ログを最もよく使用する場所です。
2. システム運用プロセスの監視。ガチョウは痕跡を残す必要があり、システムはログを介して検証され、システムがあなたの考えではなく、所定のプロセスに従って実行されていることを確認できます。結局のところ、コンピューターの実行方法は、コンピューターが考えるものであり、あなたが考えるものではありません。
3. セキュリティ監査。ペーパーレスオフィスの時代では、レコードを削除せずに何かをする人は誰でも、すべてが安全だと思って、ダチョウのように頭を砂に埋めることができます。
4. 障害の修復。これは基本的にデータベースの標準構成です。MySQLでもRedisでも、MongodbでもESでも、システムの修復に役立つログがあります。
この記事の焦点は、データベースがログを使用して障害を修復する方法です。
2.システム障害
「トランザクション処理の概念と技術」という本には、環境、運用、保守、ハードウェア、ソフトウェア、プロセスなど、障害のあらゆる側面の原因が記録されています。
ユーザーとして、障害が修復された後、システムが正常に動作することを願っています。つまり、システムがいくつかの障害(フォールトトレランス)を許容して、システムがより長く動作することを保証できることを願っています。996では不十分であり、7 * 24が最適です。結局のところ、自動化されたビジネスプロセスの時代では、ビジネスプロセスの処理におけるシステムの効率が高すぎます(たとえば、AlipayはTmall Double 11 Ocean Baseが1秒間に6,100万回のピークを処理するのを支援します)。ダウンタイムのコストは大きすぎます。電子商取引と金融の場合、処理されるすべてのトランザクションは価値のないお金です。システムがストライキを開始すると、損失は1人が休暇を要求したり辞任したりするほど些細なことではありません。
失敗の可能性は低いですが、それは致命的であり、防止する必要があります。
3.対策
「トランザクション処理の概念とテクノロジー」では、トランザクションの理解は非常に単純です。データベースの状態の変更です。たとえば、給料を払うと、銀行カードの残高が増えます。この残高は、銀行カードのステータスです。給与計算のビジネスプロセスでは、関係するもう1つの目的は、会社の銀行カードのお金が少ないことです。
データベースは、ビジネスプロセスに関係するサブジェクトのステータス変更が一貫していることを確認する必要があります。そうしないと、会社のアカウントが台無しになります。
これにより、トランザクションの特性であるACIDが発生します。ACIDの法令は、実際には契約法に類似しており、プロセスが正常な場合、ボックスの下部では使用されません。プロセスで紛争が発生した場合は、契約を使用して問題を解決する必要があります。実際、ACIDを理解するには、実際の結婚の例を理解する方が簡単です。もっと厳密に言えば、例として中国の「婚姻法」を取り上げてください。
Atomicity-A:当初、両方の人のステータスは[未婚]でしたが、結婚証明書を受け取った瞬間に、両方とも[既婚]に変わりました。二人の状態は結びついています。
一貫性-C:両方の人のステータスが[未婚]から[既婚]に変更されました。一貫性の制約はここに隠されています。男性は現在の妻を1人だけ持つことができ、女性は現在の夫を1人だけ持つことができます。これは、データベースの一意のインデックスの制約と同じです。
隔離-I:結婚が他の人とは関係がなく、証拠がない他のカップルに影響を与えない2つのカップル。
持続性-D:離婚しない限り、婚姻状況は継続的です。
トランザクションの分離はロックメカニズムによって実現され、アトミック性、一貫性、および耐久性はトランザクションログによって保証されます。
基本的な概念を理解した後、思考実験を行いましょう。コードのバグ(たとえば、0による除算)が原因でビジネスプロセスが中断された場合、データベースの整合性の制約を確保するにはどうすればよいですか?つまり、例外処理の最終的な目標は、データベース内の状態の一貫性を確保し、システムがビジネス仕様の要件を満たしていることを確認することです。
ログを元に戻す
状態が異常な場合は、シーンを復元しても問題ありません。たとえば、自動車教習所で運転を練習することは、何度も何度もロールバックすることです。トランザクションが変更される前の状態を元に戻すログに記録します。現在のトランザクション処理が異常な場合は、このようなことが起こらなかったかのように、元の状態にロールバックします。Tを使用してトランザクションを表し、Xを使用してトランザクションによって変更された要素を表し、vを使用してXの元の値を表します。次に、<T、X、v>はログレコードの3つの必要なフィールドです。例:<Pay Salary、Zhang San、0>は、給与が支払われる前に、MoonlightClanのZhangSanの銀行カードにお金がないことを意味します。
以下のキーログ情報がシステム処理トランザクションに表示されます。
ログ<STARTT>は、トランザクションの開始を示します。
ログ<COMMITT>はトランザクションのコミットを示し、ログ<ABORTT>はトランザクションの中止を示します。トランザクションの場合、<COMMITT>と<ABORTT>は1つだけを記録します。
トランザクションの処理フローは次のとおりです。
S1:レコード<START T>は、トランザクションを開始することを意味します。
S2:トランザクション要素が変更される前の状態を示す元に戻すログ<T、X、v>を記録します。(永続性が必要)
S3:X要素を変更して状態を変更します。(永続性が必要)
S4:トランザクションがコミットされたことを示す<COMMITT>を記録します。
システムに障害が発生した場合は、サービスの提供を一時停止し、障害修復手順を開始します。
S1:ログを逆にトラバースします。すでに<COMMITT>があるトランザクションを処理する必要はありません。
S2:<COMMIT T>のないトランザクションの場合、元に戻すログを使用して、トランザクションを変更前の状態に復元します。
障害修復の各操作は、新しいトランザクションを構成することに注意してください。
元に戻すログの修復プロセスは、チェックポイントとidompotentの2つの概念につながります。
チェックポイント:システム障害の可能性は一般に低いため、累積ログサイズは膨大です。履歴ログ全体をトラバースすると、障害修復の効率が低すぎます。したがって、チェックポイントメカニズムは、システムの障害のないマイルストーンを記録するために使用されます。障害が発生した場合は、マイルストーンにロールバックすることで修復プロセスを停止できます。
べき等:障害が修復されると、障害も発生します。実行する方法?ログ修復の操作がべき等であることを確認してください。この制限により、再試行すると問題が解決します。いわゆるべき等、つまり1回実行した結果は、複数回実行した結果と同じです。「トランザクション処理の概念とテクノロジー」には、非常に鮮明な例があります。
「原子炉の反応棒を2cm下げる」ことはべき等ではありません。
「原子炉の反応棒をxxの位置に動かす」ことはべき等です。
ログをやり直す
元に戻すログを使用すると、パフォーマンスの問題が発生する可能性があります。つまり、トランザクションによって変更されたデータがディスクに書き込まれる前に、トランザクションをコミットすることはできません。これは、すべてのトランザクション操作に少なくとも3つのディスク操作があることを意味します。いわゆるひょうたんを押してスクープを浮かせます。新しいメカニズムが必要であり、これがREDOログのソースです。
元に戻すログが人生に対する否定的な態度を表す場合、やり直しログは人生に対する肯定的な態度です。楼蘭を壊さず、戻さないというかなりの勢い。つまり、システムに障害が発生した場合、到達しようとしているエンドポイントを記録しているので、障害が発生した場合は、何を返すかを再試行するだけで十分です。
元に戻すログと同様に、やり直しログはトランザクションTに代わってトランザクション<T、X、v>を記録し、要素Xの値をvに変更します。vは新しい値です。
REDOログを使用したトランザクションフローは次のとおりです。
S1:レコード<START T>は、トランザクションを開始することを意味します。
S2:REDOログを記録します:<T、X、v>、トランザクション要素が変更される前の状態を示します。(永続性が必要)
S3:トランザクションがコミットされたことを示す<COMMITT>を記録します。(永続性が必要)
S4:X要素を変更して状態を変更します。
元に戻すログと比較して、COMMITTは予定より進んでいます。この場合、トランザクションが完了したかどうかは、ログにCOMMIT情報があるかどうかを確認することですが、このプロセスでは、COMMITを使用したトランザクションデータがハードディスクに固定されることを保証できなくなります。これには、チェックポイントが生成されるときに、データがディスクに配置されていることを確認する必要があります。
障害修復プロセスも非常に簡単です。
S1:COMMITされたすべてのトランザクションを調べます
S2:REDOログを使用して、元のトランザクションの操作を再実行します
Undo/Redo日志
REDOログでは、トランザクションがコミットされてログレコードがフラッシュされる前に、変更されたすべてのブロックをバッファーに保持する必要があります。これにより、トランザクションに必要なバッファーの平均数が増える可能性があります。さらに、データベース要素が完全なブロックではない場合、元に戻すログとやり直しログは、チェックポイントプロセス中にバッファを処理する方法に関して競合します。それで、新しい計画がリリースされました、それは元に戻す/やり直しの複合体です、それはそれがあなたに3000人を殺すことを意味します。つまり、ログを記録するときに、<T、X、v、w>の4つの値を記録します。これは、トランザクションTが要素Xを変更し、xの古い値がvで、新しい値がwであることを意味します。 。
元に戻す/やり直しログを使用したトランザクションフローは次のとおりです。
S1:レコード<START T>は、トランザクションを開始することを意味します。
S2:元に戻す/やり直しログを記録する:<T、X、v、w>、トランザクションTは要素Xを変更し、xの古い値はv、新しい値はwです。(永続性が必要)
S3:データベース要素を変更する
S4:<COMMITT>ログを記録します。
S3とS4の明確な注文要件はありません。
ここでは、現在のバッファステータスに応じて柔軟に制御できます。<COMMITT>のデータベース要素の操作を変更することは重要ではなくなりました。
回復:
S1:ログをトラバースします
S2:COMMITされたトランザクションの場合、やり直しを使用してやり直します
S3:COMMITのないトランザクションの場合、元に戻すを使用してロールバックします
ファローアップ
この記事では、トランザクションとACIDの理解について簡単に要約します。それは、イデオロギーの原則から、元に戻す、やり直し、および元に戻す/やり直しのメカニズムの進化プロセスを分類し、チェックポイントとべき等の2つの概念のソースも分類します。フォローアップでは、MySQL、ES、およびその他のデータベースのログ実装を分析し、工業製品での着陸姿勢の実際の理解と組み合わせます。
参照
「トランザクション処理の概念と技術」
「データベースシステムの実装」