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 では変数はヒープに保存されるのか、スタックに保存されるのか?
最近コンピュータを再インストールした後、最新バージョンのみをインストールするという強迫観念に基づいて...
Dockerインストール後のネットワークタイプ [root@insure updev]# docke...
最近、カンファレンスの健康申告システムに取り組んでいたとき、バックエンドを構築する必要があり、vue...
目次1. 古いバージョンを削除する2. サーバーのカーネルタイプを確認し、適切なバージョンをダウンロ...
1. インストールバージョンの詳細 サーバー: MariaDB サーバーバージョン: 5.5.60-...
目次1. フロントエンドの状態管理とは何ですか? 2. ヴュークス3. バス4. ウェブストレージ序...
<input> タグ<input> タグはユーザー情報を収集するために使用さ...
1. フォームテキスト入力のモバイル選択: テキスト入力フィールドにプロンプトが追加されている場...
1. CentOS 7 仮想マシンを開きます。 2. 仮想マシンにログインし、リストにないユーザー名...
CSS オーバーフローのメカニズムを詳細に学ぶ必要があるのはなぜですか?実際の開発プロセスでは、コン...
前回のブログでは、Nginx と httpd を使用して、逆生成用のバックエンド Tomcat サー...
サーバーの LNPM 環境をインストールして構成する場合、複数のバージョンの PHP の共存を考慮す...
最近、電子アーカイブに取り組んでおり、バックエンドではファイルの Huawei Cloud OSS ...
日々の開発において、フロントエンドの学生はアニメーションやデザインについてよく議論します。デザイナー...
メタタグ機能METAタグは、HTMLタグのHEAD領域にある重要なタグです。文書の文字セット、使用言...