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 では変数はヒープに保存されるのか、スタックに保存されるのか?
私は全体のプロセスを 4 つのステップに分けます。 JDKをダウンロードしてインストールするTomc...
通常、vue プロジェクトではルーティングを使用します。vue-router は vue.js の公...
インストール環境: CentOS7 64ビットMINI版公式ソースコードのコンパイルおよびインストー...
1. /etc/passwdファイル内のデフォルトシェルが/sbin/nologinではないユーザー...
この記事では、モバイルデバイス上の 1 ピクセルの境界線の問題を解決する 5 つの方法を紹介します。...
応答性を実現するための object.defineProperty の理解observe/watch...
目次1. 現状2. コミュニティソリューション2.1 事業レビュー3. 技術的ソリューション3.1....
1: ターミナルに入ったらPHPのバージョンを確認する php -v出力は次のようになります。 PH...
目次1. nginxのインストールと操作(Mac OS環境) 2. nginxルールの設定3. コマ...
1. ul タグには、Mozilla ではデフォルトでパディング値がありますが、IE ではマージン値...
ベクトル波 <svg viewBox="0 0 560 20" class...
Docker をインストールし、Docker コアとインストールを通じて簡単な操作を実行できます。 ...
ハードウェア上の理由により、機械は標準時間にある程度追いつけない場合があり、その誤差は 1 か月で数...
目次1. beforeCreateとcreated関数2. beforeMountとmount関数3...
序文この記事では主にMySQLでトランザクションを開始する方法について紹介します。関連情報については...