MySQLの読み書き分離の落とし穴 読み取りと書き込みの分離の主な目的は、メイン データベースの負荷を分散することであり、クライアントはクエリ用にバックエンド データベースを選択します。もう 1 つのアーキテクチャは、MYSQL とクライアントの間に中間プロキシ層が存在するというものです。クライアントはプロキシに接続し、プロキシはリクエストの種類とコンテキストに基づいてリクエストの配布ルートを決定します。
使用されるアーキテクチャに関係なく、マスターとスレーブ間の遅延が発生する可能性があるため、クライアントが更新トランザクションの実行直後にクエリを開始し、クエリがスレーブを選択した場合、トランザクションの更新前のステータスを読み取ることができます。この「スレーブ ライブラリ上でシステムの期限切れ状態を読み取る」という現象を、ここでは「期限切れ読み取り」と呼ぶことにします。 解決策1: メインデータベースソリューションを強制する クエリ要求は次の 2 つのカテゴリに分けられます。
解決策2: 睡眠ソリューション マスターデータベースが更新された後、select sleep (1) コマンドを実行するのと同様に、スレーブデータベースを読み取る前にスリープが実行されます。このソリューションの前提は、ほとんどの場合、マスタースレーブの遅延は 1 秒以内であり、スリープによって最新のデータを取得できる可能性が非常に高いということです。 販売者が商品を公開する例を挙げると、商品が公開された後、実際にデータベースを照会するのではなく、Ajax を使用して、クライアントが入力したコンテンツを「新商品」としてページに直接表示します。このように、販売者はこの表示を使用して、製品が正常にリリースされたことを確認できます。販売者がページを更新して商品を確認するまでに、実際にいくらかの時間が経過しているため、スリープの目的が達成され、期限切れの読書の問題が解決されます。 解決策 3: マスターとバックアップに遅延がないかどうかを確認します。 最初の方法: まず、show slave status 結果の seconds_behind_master パラメータの値を使用して、マスターとスレーブ間の遅延の長さを測定します。まず、パラメータ値が 0 かどうかを判断します。0 でない場合は、リクエストを実行する前にパラメータが 0 になるまで待つ必要があります。 2 番目の方法: 比較サイトは、プライマリとバックアップに遅延がないことを確認します。
Master_Log_File、Relay_Master_Log_File、Read_Master_Log_Pos、Exec_Master_Log_Posの値が全く同じであれば、受信したログが同期されていることを意味します。 3番目の方法: GTID (グローバルトランザクションID)を比較して、マスターとスレーブ間の遅延がないことを確認する
2 つのセットが同じである場合、スタンバイ データベースによって受信されたログが同期されていることを意味します。 スキーム4: 均等マスターライブラリサイトスキーム
このコマンドはスレーブ データベースで実行されます。パラメータ file と pos は、マスター データベース上のファイル名と位置を指します。タイムアウトは、この関数が最大 N 秒間待機することを意味します。
図に示すように、まずtrx1を実行し、次にクエリ要求のロジックを実行します。正しいデータが見つかるかどうかを確認するには、 この論理 1. trx1 トランザクションが更新されたら、すぐに show master status を実行して、マスター データベースによって現在実行されているファイルと位置を取得します。 2. クエリ ステートメントを実行するスレーブ データベースを選択します。 3. スレーブ データベースで select master_pos_wait(File, Position, 1) を実行します。 4. 戻り値が正の整数 >= 0 の場合、このスレーブ データベースでクエリ ステートメントを実行します。 5. それ以外の場合は、メイン データベースに移動してクエリ ステートメントを実行します。 ここでは、この選択クエリがスレーブ データベースで最大 1 秒間待機すると想定します。次に、master_pos_wait が 1 秒以内に 0 以上の整数を返す場合、スレーブ データベースで実行されたクエリ結果に trx1 のデータが含まれていることが保証されます。 5 メイン データベースでクエリ ステートメントを実行することは、このタイプのソリューションの一般的な劣化メカニズムです。スレーブ データベースの遅延時間は制御不能であり、無期限に待機することはできないため、待機がタイムアウトした場合は、諦めてマスター データベースを確認する必要があります。期限切れの読み取りを許可しないという要件によると、オプションは 2 つしかありません。1 つはタイムアウト後に諦めること、もう 1 つはクエリのためにメイン データベースに切り替えることです。 同時接続と同時クエリ innodb_thread_concurrency パラメータは、Innodb の同時スレッドの上限を制御します。この値を超えると、新しいリクエストは保留になります。
以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: メモリの原則に関する詳細な説明: JS では変数はヒープに保存されるのか、スタックに保存されるのか?
チェックボックスは Web ページで非常によく使用されます。e コマースの Web サイトでもプラッ...
機能: 前のページまたは次のページにジャンプします。要素: ページングの基本要素は、前のページ + ...
この記事では、一般的な MySQL ストレージ エンジンの機能と使用方法を例を使って説明します。ご参...
1. 仮想マシンバージョン15.5.1をダウンロードする公式サイトから直接最新バージョンをダウンロー...
Windows Server 2008 サーバーが自動的に再起動します。サーバーにログインした後、ど...
必要:ハードコードされたデータの代わりに、セレクター内のオプション値の動的な表示を実装します。私のロ...
目次データブローカーとイベントObject.defineProperty メソッドのレビューデータブ...
登録するフロントエンドは、vue の axios を使用して値を渡し、取得したアカウントとパスワード...
MySQL データ型における DECIMAL の使用法の詳細な説明MySQL のデータ型には、INT...
Toutiao IT School で、CSS がフロントエンドの画像変形の問題を完璧に解決するとい...
MySql は常に MySQLInstallerConsole.exe ウィンドウを定期的にポップア...
インターネット技術の発展に伴い、ユーザーはますます Web ページに依存するようになり、Web フロ...
まず、私たちがやりたいことは、serverA の usera を使用して、パスワードなしで serv...
目次vueカスタムディレクティブグローバル指令ローカル指示使用フック関数(両方ともオプション)使用方...
目次序文Toastコンポーネントをカプセル化する方法ユースケース具体的な実装要約する序文ビジネスが発...