データベースの読み取りと書き込みの分離は、トラフィック量の多い大規模システムやインターネット アプリケーションにとって不可欠かつ重要な機能です。 MySQL の場合、標準的な読み取り/書き込み分離はマスター/スレーブ モードであり、書き込みノード マスターの後に複数の読み取りノードが続きます。読み取りノードの数はシステムの負荷によって異なり、通常は 1 ~ 3 個の読み取りノードで構成されます。 Mycat の読み取り/書き込み分離および自動切り替えメカニズムなどの一般的な読み取り/書き込み分離ミドルウェアでは、MySQL のマスター/スレーブ レプリケーション メカニズムの連携が必要です。 マスタースレーブ構成に関する注意事項 1. マスターDBサーバーとスレーブDBサーバーのデータベースのバージョンが一致している 2. マスターDBサーバとスレーブDBサーバのデータベースデータ名が一致している 3. マスターDBサーバーはバイナリログを開始します。マスターDBサーバーとスレーブDBサーバーのserver_idは一意である必要があります。MySQLマスターサーバーの構成 ステップ 1: my.conf ファイルを変更します。 [mysqld] セクションの下に以下を追加します。 binlog-ignore-db=mysql # バイナリログを有効にする log-bin=mysql-bin //バイナリログには、ステートメント/行/混合の3つの形式があります binlog_format=行 #メインサーバーの一意のID。通常はIPアドレスの最後のセグメントです。server-id=82 ステップ2: MySQLサービスを再起動する サービスmysqlの再起動 ステップ3: アカウントを作成し、スレーブを承認する
通常、ルート アカウントは使用されません。「%」は、アカウントとパスワードが正しい限り、すべてのクライアントが接続できることを意味します。ここでは、セキュリティを強化するために、192.168.145.226 などの特定のクライアント IP アドレスを使用できます。 権限の更新 mysql> 権限をフラッシュします。 ステップ4: マスターのステータスを照会する mysql> マスターステータスを表示します。 +------------------+----------+--------------+------------------+------------------+ | ファイル | 位置 | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+------------------+ | mysql-bin.000001 | 881 | | mysql | | +------------------+----------+--------------+------------------+------------------+ セット内の 1 行 (0.00 秒) MySQLスレーブサーバーの構成 ステップ1: my.confファイルを変更する [mysqld]# サーバーからの一意のID。通常はIPアドレスの最後のセグメントです。server-id=83 ステップ2: スレーブサーバーを構成する
文の途中で切断されないように注意してください。master_port は MySQL サーバーのポート番号 (引用符なし)、master_user は同期操作を実行するデータベース アカウント、"881" には一重引用符がありません (ここで 881 は show master status に表示される位置の値、ここで mysql-bin.000001 はファイルに対応する値です)。 ステップ3: サーバーからレプリケーション機能を開始する mysql>スレーブを起動します。 ステップ 4: スレーブ サーバーのレプリケーション機能のステータスを確認します。 mysql> スレーブのステータスを表示します。
注意: Slave_IO プロセスと Slave_SQL プロセスは正常に実行される必要があります (つまり、YES 状態)。そうでない場合はエラー状態になります (たとえば、どちらかが NO の場合はエラーです)。 確認する マスター ノードでテーブルを作成してデータを挿入すると、スレーブ ノードでもテーブルが作成され、データが挿入されることがわかります。 MySQL マスタースレーブレプリケーションの原理は何ですか? マスター データベースは変更を binlog ログに書き込み、スレーブ データベースがマスター データベースに接続した後、スレーブ データベースには、マスター データベースの binlog ログをローカル コンピューターにコピーし、リレー ログに書き込む IO スレッドがあります。次に、スレーブ データベースの SQL スレッドがリレー ログからバイナリ ログを読み取り、バイナリ ログの内容を実行します。つまり、SQL をローカルで再度実行して、データがマスター データベースのデータと同じであることを確認します。 ここで非常に重要な点があります。それは、スレーブ データベースのデータをマスター データベースと同期するプロセスがシリアル化される、つまり、マスター データベースでの並列操作がスレーブ データベースでシリアルに実行されるということです。これは非常に重要なポイントです。スレーブ データベースはマスター データベースからログをコピーし、SQL をシリアル実行するという特性上、同時実行性の高いシナリオでは、スレーブ データベースのデータはマスター データベースのデータよりも確実に遅くなり、遅延が発生します。そのため、メイン データベースに書き込まれたばかりのデータが読み取れないことが頻繁に発生し、読み取りに数十ミリ秒または数百ミリ秒かかる場合があります。 ここで別の問題があります。マスター データベースが突然ダウンし、データがスレーブ データベースに同期されていない場合、一部のデータがスレーブ データベースで使用できなくなり、一部のデータが失われる可能性があります。 そのため、MySQL には実際にこの領域で 2 つのメカニズムがあります。1 つは半同期レプリケーションで、マスター データベースのデータ損失の問題を解決するために使用されます。もう 1 つは並列レプリケーションで、マスターとスレーブの同期遅延の問題を解決するために使用されます。 このいわゆる半同期レプリケーション ( いわゆる並列レプリケーションとは、データベースから複数のスレッドを開始し、リレー ログ内の異なるデータベースのログを並列に読み取り、異なるデータベースのログを並列に再生することを意味します。これがデータベース レベルの並列処理です。 MySQL マスタースレーブ同期遅延問題 過去には、マスターとスレーブの同期の遅延によって発生したオンライン バグに対処したことがあります。これは、軽微な製造上の事故でした。 これがそのシーンですか?クラスメートがコードロジックを次のように書きました。まずデータを挿入し、それをチェックアウトして、データを更新します。実稼働環境のピーク時には、書き込み同時実行数が 2000/s に達しました。このとき、マスター スレーブ間のレプリケーション遅延は約数十ミリ秒でした。毎日何らかのデータが存在し、重要なデータのステータスが更新されることを期待しますが、ピーク時には更新されません。ユーザーはカスタマー サービスにフィードバックを提供し、カスタマー サービスは私たちにフィードバックを提供します。 MySQL コマンドを使用します: ステータスを表示
一般的に、マスタースレーブ遅延が深刻な場合は、次の解決策があります。 メイン データベースを複数のメイン データベースに分割するデータベース シャーディングにより、各メイン データベースの書き込み同時実行性が数倍減少し、マスター スレーブ間の遅延は無視できるようになります。 MySQL でサポートされている並列レプリケーションを有効にし、複数のデータベースを並列に複製します。特定のデータベースの書き込み同時実行性が非常に高く、単一のデータベースの書き込み同時実行性が 2000/s に達した場合、並列レプリケーションは依然として意味がありません。コードを書き直します。コードを書く生徒は注意が必要です。データを挿入するときに、すぐに見つけられない場合があります。存在していて最初に挿入する必要がある場合は、すぐにクエリを実行し、その後すぐに逆の操作を実行する必要があります。このクエリには、メイン データベースへの直接接続を設定します。この方法は推奨されません。これを行うと、読み取りと書き込みを分離する意味が失われます。並列レプリケーションを有効にする マルチスレッド レプリケーションを有効にするには、次の 2 つのデフォルトのキー パラメータがあります。 mysql> 'slave_parallel_%' のような変数を表示します。 +------------------------+-----------+ | 変数名 | 値 | +------------------------+-----------+ | スレーブ並列型 | データベース | | スレーブ並列ワーカー | 0 | +------------------------+-----------+ セット内の 2 行 (0.00 秒) スレーブパラレルタイプのデフォルト値はデータベースです スレーブ並列ワーカー デフォルト値は0です 開ける: mysql> スレーブ sql_thread を停止します。 クエリは正常、影響を受けた行は 0 行 (0.05 秒) mysql> グローバルslave_parallel_typeを'LOGICAL_CLOCK'に設定します。 クエリは正常、影響を受けた行は 0 行 (0.00 秒) mysql> グローバルslave_parallel_workersを4に設定します。 クエリは正常、影響を受けた行は 0 行 (0.00 秒) mysql> スレーブ sql_thread を開始します。 クエリは正常、影響を受けた行は 0 行 (0.07 秒) 参考文献: https://www.jianshu.com/p/3932551e0221 https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/mysql-read-write-separation.md 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: vue3.0 sfcのセットアップの変更について簡単に説明します。
>>: HTMLのimgタグで画像の中心部分だけを表示する方法(3つの方法)
以前にインストールされたバージョンのデータベースをアンインストールする方法については、この記事を参照...
Vue でタブ切り替えを実装する 3 つの方法1. v-showはコンテンツの切り替えを制御します1...
MIME タイプとは何ですか? 1. まず、ブラウザがコンテンツを処理する方法を理解する必要がありま...
成果を達成するステップ1. 初期index.html最初の写真、一番上の写真を作成します。写真の i...
1. 配列のよく使われる高階関数配列があり、その配列に対して次の操作を実行したいとします。 100 ...
問題を見つける最近、プロジェクトで問題が発生しました。接続が多すぎるため、「接続が多すぎます」という...
目次概要Canvas API: グラフィックスの描画パス線種矩形アーク文章グラデーションと画像の塗り...
目次序文フィルターとは何かフィルターの使い方グローバルフィルターローカルフィルターフィルターは直列に...
今日、外出中に同僚から、ウェブサイトのバックエンドにアクセスできないというメッセージが届きました。と...
目次序文準備する要約する継承方法プロトタイプ継承プロトタイプチェーン継承コンストラクタの借用(クラス...
この記事の例では、Webメッセージボードを実装するためのjsの具体的なコードを参考までに共有していま...
序文Windows では、各インスタンスに適切なパラメータを使用してコマンド ラインから複数の My...
現在の要件は、ファイルのアップロード ボタンがあることです。ボタンをクリックすると、アップロードする...
<br />長年の専門的なアートデザイン教育を通じて「美とは何か」を学びましたが、「美を...
一部の Web ページは大きく見えなくても開くのに非常に時間がかかる場合があります。一方、他の We...