web-dev-qa-db-ja.com

MySQLレプリケーションは私のDBのパフォーマンスを妨げますか?

私は「適格」なDBAではありませんが、そうです。ソーシャルアプリで使用する自分のDBを担当しています。

最近、明らかな理由により、データベースにマスター/スレーブレプリケーションを実装しました。

私が知りたいのは、マスターDBに書き込むすべてのユーザーがスレーブDBに追加の書き込みを作成するため、MySQLレプリケーションが私のDBのパフォーマンスを停止するかどうかです(ここでは間違っているかもしれません)。

私のスレーブとマスターの間に遅れはありません。したがって、レプリケーションはほぼ瞬時に行われます。

6
Jigar Jain

レプリケーション設定のためにマスターが処理しなければならない2つの主要な事柄があります

ディスクI/O

マスターは、完了したすべてのSQLトランザクションをバイナリログに書き込む必要があります。

ネットワークI/O

スレーブが接続されている場合、マスターはトラフィック警官を再生する必要があります。

  • マスターはSQLステートメントを最新のバイナリログに書き込みます
  • スレーブから発生するDB接続のマスターポーリング
  • スレーブDB接続ごとに、マスターは次のことを行います。
    • マスターがスレーブのリレーログの最後のエントリ以降、バイナリログから最も古いSQLステートメントのリクエストを受信する
    • マスターは以下をスレーブのIOスレッドに送信します
      1. マスターログファイル名
      2. マスターログの位置
      3. マスターのログファイル名と位置にあるSQLステートメント

忙しいマスターがSeconds_Behind_Master : 0、単に素晴らしい。

これらのメトリックのいずれかが顕著になった場合、特定のことを行う必要がある場合があります。

レプリケーショントポロジの設定に関する他の投稿は次のとおりです

7
RolandoMySQLDBA

「いいえ、レプリケーションによってマスターのパフォーマンスが低下することはありません」という質問に簡単に答えると、

マスターがレプリケーション環境で重要なことを2つ実行するだけでよいため、レプリケーションによるマスターへの影響は、通常、マスターが実行する必要がある他のすべてのことと比較して非常に小さくなります。

  • イベントを作成し、ローカルハードドライブのbinlogに書き込む
  • binlogに書き込むすべてのイベントのコピーを、接続されているすべてのスレーブに送信します

常にレプリケーションを行わない場合でもバイナリログを有効にする必要があるため、バイナリログの書き込みはレプリケーションのコストとは見なしません。これは、非常に貴重なトラブルシューティングおよび回復ツールです。

スレーブにレプリケーションイベントを送信するコストもごくわずかです。スレーブはマスターへの永続的なTCP接続を維持する責任があるため、マスターとしてソケットにデータをコピーするだけです。イベントが発生します。それを超えて、マスターはスレーブがそれらを実行するために移動するかどうか、またはいつそれを気にしません。

最後のステートメントの部分的な例外は semi-synchronous レプリケーションで、これはデフォルトではありません。このモードでは、マスターは少なくとも1つのスレーブが各トランザクションからのバイナリログイベントの受信と永続ストレージ(実際の実行ではありません)を確認するのを待ってから、マスターが各コミットで制御をクライアントに返します。

しかし、どの場合でも、マスターはスレーブで更新を実際に実行する責任はない-スレーブに次の2つのうちの1つを送信するだけです。 (ステートメントベースモードで)実行された実際の入力クエリのコピー、または各クエリによって実際に挿入/更新/削除された行のデータ(行ベースモード)。混合モードでは、クエリオプティマイザーはイベントごとに使用する形式を決定します。

4