ビンログBinLog は、データベース テーブル構造の変更 (テーブルの作成、変更など) とテーブル データの変更 (挿入、更新、削除) をすべて記録するバイナリ ログです。BinLog ファイルは、マスターとスレーブのデータベース同期に使用されます。 BinLog ログ ファイルには 3 つのモードがあります。 ステートメントモード内容: Binlog はデータの変更を引き起こす SQL ステートメントのみを記録します 利点: このモードでは実際のデータが記録されないため、ログの量と IO 消費量が非常に少なく、パフォーマンスが最適になります。 デメリット: ただし、一部の操作は確実ではありません。たとえば、uuid() 関数は一意の識別子をランダムに生成します。binlog 再生に依存する場合、この操作によって生成されるデータは元のデータとは異なる必要があり、予期しない結果が発生する可能性があります。 ROWモード内容: このモードでは、binlog は各操作のソース データと変更されたターゲット データを記録します。StreamSets にはこのモードが必要です。 利点: 絶対的な精度でデータを復元できるため、データのセキュリティと信頼性が確保され、レプリケーションとデータ回復のプロセスを同時に実行できます。 デメリット: デメリットは、binlog のボリュームが非常に大きくなることです。同時に、変更されたレコードが多く、フィールド長が長い操作の場合、記録中のパフォーマンスの消費が非常に深刻になります。データを読み取るには特別な命令も必要です。 混合モード内容: 上記の 2 つのモード (STATEMENT と ROW) を組み合わせたものです。 詳細: ほとんどの操作では、バイナリログを記録するために STATEMENT が使用されます。ROW を使用して実装される操作は、テーブル ストレージ エンジンが NDB であること、uuid() などの不確実な関数が使用されていること、挿入遅延ステートメントが使用されていること、一時テーブルが使用されていることのみです。 マスタースレーブ同期プロセス:1. マスター ノードは、データベース データを変更するすべてのイベントを記録するためにバイナリ ログを有効にする必要があります。 2. スレーブ ノードは、MySQL クライアントとして機能するスレッド (I/O スレッド) を開始し、MySQL プロトコルを介してマスター ノードのバイナリ ログ ファイル内のイベントを要求します。 3. マスターノードは、自身のバイナリログ内のイベントをチェックし、相手側から要求された位置と比較するためのスレッド(ダンプスレッド)を開始します。要求位置パラメータがない場合、マスターノードは最初のログファイルの最初のイベントをスレーブノードに1つずつ送信します。 4. スレーブノードはマスターノードから送信されたデータを受信し、リレーログファイルに配置します。また、マスター ノードのどのバイナリ ログ ファイル内にリクエストが送信されたかという具体的な場所を記録します (マスター ノードには複数のバイナリ ファイルが存在します)。 5. ノードから別のスレッド (SQL スレッド) を開始し、リレー ログ内のイベントを読み取り、ローカルで再度実行します。 MySQL のデフォルトのレプリケーション モードは非同期であり、並列レプリケーション機能を備えています。マスター データベースは、ログをスレーブ データベースに送信し、それを無視します。これにより問題が発生します。マスター データベースがクラッシュし、スレーブ データベースが処理に失敗した場合、スレーブ データベースがマスター データベースに昇格した後にログが失われます。ここから 2 つの概念が生まれます。
マスターデータベースが binlog を書き込んだ後、ログをスレーブデータベースに強制的に同期します。すべてのスレーブデータベースの実行が完了すると、ログがクライアントに返されます。ただし、この方法はパフォーマンスに重大な影響を与えることは明らかです。
半同期レプリケーションのロジックは、スレーブ データベースがログを正常に書き込んだ後、マスター データベースに ACK 確認を返すというものです。マスター データベースは、少なくとも 1 つのスレーブ データベースから確認を受信すると、書き込み操作が完了したと見なします。 やり直しログbinlog と redolog の違い:
MySQL では、すべての更新操作をディスクに書き込む必要があり、ディスクも対応するレコードを見つけて更新する必要があるため、プロセス全体の IO コストと検索コストが非常に高くなります。最初にログを書き込み、次にディスク BinLog と RedoLog を書き込みます。 1. レコードが更新されると、InnoDB エンジンはまずレコードを RedoLog に書き込み、メモリを更新します。同時に、InnoDB エンジンはアイドル状態のときに操作レコードをディスクに更新します。 2. RedoLog が処理できる更新が多すぎる場合は、まず RedoLog データの一部をディスクに書き込み、その後 RedoLog データの一部を消去する必要があります。 RedoLog 書き込み位置とチェックポイントRedoLogには書き込み位置とチェックポイントがあります write pos: は現在のレコードの位置です。書き込み中は後方に移動します。ファイル番号 3 の末尾まで書き込んだ後は、ファイル番号 0 の先頭に戻ります。 チェックポイント: データベースのリカバリ時間を短縮します。バッファ プールのスペースが不足している場合、ダーティ ページはディスクにフラッシュされます。REDO ログが使用できない場合、ダーティ ページはフラッシュされます。 REDO ログの順次書き込みは、実際には複数の固定ファイルをループで書き込み、1 ラウンドが完了すると最初から上書きされます。チェック ポイントと書き込み位置の 2 つの場所が含まれます。書き込み位置は書き込まれる位置で、ループ内で増加します。チェック ポイントは消去される現在の位置です。 2 つの間のスペースは書き込み可能です。書き込み位置がチェックポイントに追いつくと、更新が停止し、一部のレコードが上書きされてから、REDO ログの書き込みが続行されます。 クラッシュセーフなREDOログMySQL は、コミット時にログ バッファー内のログをログ ファイルにフラッシュする方法をユーザーがカスタマイズすることをサポートしています。この制御は、変数 innodb_flush_log_at_trx_commit の値によって決まります。この変数には 0、1、2 の 3 つの値があり、デフォルトは 1 です。ただし、この変数はコミット アクションがログ バッファーをディスクにフラッシュするかどうかのみを制御することに注意してください。
マスタースレーブレプリケーション構造では、トランザクションの永続性と一貫性を確保するために、ログ関連の変数を次のように設定する必要があります。
上記の 2 つの変数を設定すると、各トランザクションがバイナリ ログとトランザクション ログに書き込まれ、コミット時にディスクにフラッシュされるようになります。 InnoDB では、REDO ログを使用することで、データベースが異常に再起動した場合でも、以前に送信されたレコードが失われないことを保証できます。この機能はクラッシュセーフと呼ばれます。 Redolog 2 フェーズ コミット: binlog と redolog 間のロジックを一貫させます。提出手順は次のとおりです。 1 準備段階 --> 2 binlog の書き込み --> 3 コミット 1. ステップ 2 の前にプロセスがクラッシュした場合、再起動後にコミットがないことがわかり、プロセスがロールバックされます。バックアップと復元: binlog なし。一貫性 元に戻すログUNDOログには、ロールバックと複数行バージョン管理(MVCC)を提供するという2つの機能があります。主に2つのタイプに分けられます。 データが変更されると、REDO だけでなく、対応する UNDO も記録されます。トランザクションが失敗したり、何らかの理由でロールバックしたりした場合は、UNDO の助けを借りてロールバックできます。レコードが削除されると、対応する挿入レコードが UNDO ログに記録され、その逆も同様です。レコードが更新されると、対応する反対の更新レコードが記録されます。 ロールバックを実行すると、UNDO ログ内の論理レコードから対応する内容を読み取ってロールバックすることができます。
トランザクションが新しいレコードを挿入するときに生成される UNDO ログを表します。これはトランザクションがロールバックされるときにのみ必要であり、トランザクションがコミットされた直後に破棄できます。
トランザクションが更新または削除しているときに生成される UNDO ログ。トランザクションのロールバック時だけでなく、スナップショットの読み取り時にも必要となるため、安易に削除することはできません。高速読み取りまたはトランザクションのロールバックにログが含まれない場合のみ、対応するログはパージ スレッドによって一律にクリアされます。 上記は、MySQL マスタースレーブ同期とトランザクションロールバックの実装原理の詳細な内容です。MySQL マスタースレーブ同期とトランザクションロールバックの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。 以下もご興味があるかもしれません:
|
<<: Docker デプロイメント RabbitMQ コンテナ実装プロセス分析
>>: 3つのDocker Nginxログの処理の詳細な説明
1. コマンドの紹介ln コマンドは、ファイルのリンクを作成するために使用されます。リンクは、ハード...
DockerでOracle_11gをインストールする1. oracle_11gイメージを取得する d...
サーバーとデータベースの構築方法を学ぶ必要があるため、最近は SQL 言語を独学で学び始めました。デ...
トークンの有効期限が切れたら、ページを更新します。ページの読み込み時にバックエンドに複数のリクエスト...
使用シナリオ: Alibaba Cloud を使用しており、データディスクを別途購入しました (大容...
この記事では、画像ウォーターフォールフローを実現するためのJSの具体的なコードを参考までに共有します...
前回の記事では、MySQL パスワードをリセットする方法を説明しました。一部の学生から、データベース...
CSS3アニメーションとJSアニメーションの違いJSはフレームアニメーションを実装しますCSS3はト...
面接では、次のようなシナリオを経験する必要があります。インタビュアー: 「MySQL を使用したこと...
Nginx は C 言語で開発されており、Linux で実行することをお勧めします。もちろん、Win...
MySQL 5.7 以降では、多くのセキュリティ更新が追加されました。旧バージョンのユーザーは慣れて...
フォームのコードは図の通りです。スタイルシートがまだ追加されていないため、フォームが整列されておらず...
MySQL5.7マスタースレーブ構成の実装方法、具体的な内容は次のとおりですインストール環境:マスタ...
Vim は Linux でよく使用されるテキスト エディターです。 Vim は、Sublime や ...
関連記事: Web コンテンツ ページを作成するための 9 つの実用的なヒント<br />...