Questions
5.4.4.1: スレーブは常にマスタに接続している必要がありますか。
5.4.4.2: マスタをネットワーク化しなければ、レプリケーションを実行できませんか。
5.4.4.3: スレーブがマスタと比較してどれだけ遅れているかを知る方法はありますか。または、スレーブによって複製が行われた最後のクエリ日を知る方法はありますか。
5.4.4.4: スレーブが追いつくまでマスタの更新をブロックする方法はありますか。
5.4.4.5: 二方向レプリケーションをセットアップするときに注意する点はありますか。
5.4.4.6: レプリケーションを使用してシステムのパフォーマンスを改善する方法はありますか。
5.4.4.7: パフォーマンス改善レプリケーションを用いたアプリケーションを作成するときに、クライアントコードはどのように準備しますか。
5.4.4.8: MySQL のレプリケーションで、どれくらいのシステム パフォーマンスの向上が期待できますか、そしてそれはいつ行うものですか。
5.4.4.9: 冗長性と高可用性を実現するために、レプリケーションをどのように使用すればよいですか。
5.4.4.10: マスタ サーバのロギング形式が、ステートメント ベースまたは行ベースのどちらであるかを確かる方法はありますか。
5.4.4.11: スレーブが行ベースのレプリケーションを使用するように設定する方法はありますか。
5.4.4.12: スレーブのマシンへの複製で、GRANT および REVOKE のステートメントを抑制する方法はありますか。
5.4.4.13: 混在のオペレーティング システムでレプリケーションを実行できますか。(例:マスタが Linux、スレーブが Mac OS X と Windows の場合)
5.4.4.14: 混在のハードウェア アーキテクチャでレプリケーションを実行できますか。(マスタが 64-bit、スレーブが32-bit のマシンの場合など)
Questions and Answers
5.4.4.1: スレーブは常にマスタに接続している必要がありますか。
いいえ、その必要はありません。スレーブは何時間でも、あるいは何日間でもシャットダウンしておいたり、非接続にしておいても、再接続してマスタの更新に追いつくことができます。たとえば、マスタとスレーブの関係をダイヤルアップ リンクでセットアップし、リンクアップを散発的かつ短時間に設定できます。この場合、任意の時点でスレーブがマスタと同期している保証がないため、これに対応する特別な対策を投じてください。
この対策としては、スレーブに情報が複製されていない場合は、マスタからバイナリ ログを削除しないでください。非同期のレプリケーションは、スレーブが最後に読み込んだレプリケーション ステートメントのバイナリ ログを読み込みできる場合に限ります。
5.4.4.2: マスタをネットワーク化しなければ、レプリケーションを実行できませんか。
はい。マスタのネットワーク化してください。ネットワーク化できない場合は、スレーブがマスタに接続してバイナリ
ログを転送することができません。skip-networking
ルールがコンフィギュレーション
ファイルで実行可能になっているかどうかを確認してください。
5.4.4.3: スレーブがマスタと比較してどれだけ遅れているかを知る方法はありますか。または、スレーブによって複製が行われた最後のクエリ日を知る方法はありますか。
SHOW SLAVE STATUS
の
Seconds_Behind_Master
カラムを参考にしてください。詳細は
項5.5.1. 「レプリケーション実装の詳細」
を参照してください。
スレーブの SQL
スレッドでマスタから読み込んだイベントを実行する場合、このスレッドは自らのタイムをイベントのタイムスタンプに修正します。ノート: TIMESTAMP
が十分に複製される理由はここにあります。SHOW
PROCESSLIST
出力の Time
カラムに表示される数字は、スレーブ SQL
スレッドに対する秒数であり、 最後に複製したイベントのタイムスタンプとスレーブ
マシンの実際の時刻の差です。これを使用して、最後に複製したイベントの日付を特定できます。注意:
スレーブがマスタから切断してから 1
時間後に再接続した場合、SHOW
PROCESSLIST
の Time
カラムでスレーブ SQL スレッドが 3600
の値を表示する場合があります。これは、スレーブは
1
時間遅れたクエリを実行しているためです。(タイムスタンプから
1 時間経過している)
5.4.4.4: スレーブが追いつくまでマスタの更新をブロックする方法はありますか。
次の手順を使用します。
マスタで、次のコマンドを実行する。
mysql>FLUSH TABLES WITH READ LOCK;
mysql>SHOW MASTER STATUS;
SHOW
ステートメントの出力からログファイル名とオフセットを記録する。
スレーブで次のコマンドを実行する。ここで、
MASTER_POS_WAIT()
関数の引数であるレプリケーション座標は、前のステップで記録した値。
mysql> SELECT MASTER_POS_WAIT('log_name
', log_offset
);
指定のログ
ファイルとオフセットにスレーブが到達するまで、SELECT
ステートメントがブロックする。到達した時点でスレーブはマスタと同期して、ここでステートメントが戻る。
マスタで次のステートメントを発行し、マスタによる更新処理の再開を許可する。
mysql> UNLOCK TABLES;
5.4.4.5: 二方向レプリケーションをセットアップするときに注意する点はありますか。
MySQL レプリケーションでは、現在のところ、分散 (サーバ間の) 更新の原子性を保証するマスタとスレーブ間のロッキング プロトコルをサポートしていません。つまり、クライアント A が co-master 1 に更新を行い、それを co-master 2 に伝播する前に、クライアント B が co-master 2 に更新を行う場合、クライアント A の更新が co-master 1 で更新したものとは異なった更新になる可能性があります。この場合、co-master 2 からの更新すべてが伝播した後であっても、クライアント A の更新が co-master 2 に伝わるとき、co-master 1 とは異なるテーブルが生成されます。このため、どのような順序でも更新が安全に行われるという確証がある場合またはクライアントコードで更新順序の不正に対処できる場合以外では、二方向レプリケーションで 2 つのサーバをチェーン状に設定しないでください。
更新については、二方向レプリケーションは、それほどあるいはまったく、パフォーマンス向上には役立ちません。1 つのサーバで更新を行うときと同様に、どのサーバでも同等量での更新を行う必要があります。別のサーバから発生した更新が 1 つのスレーブ スレッドでシリアル化されるため、ロックの競合が少なくなる、という違いがあります。この利点も、ネットワーク遅延によっては相殺されてしまう可能性があります。
5.4.4.6: レプリケーションを使用してシステムのパフォーマンスを改善する方法はありますか。
1
つのサーバをマスタとしてセットアップし、書き込みのすべてをそこで直接行います。そして割当量とスペースが許容する限り多くのスレーブで構成し、マスタと複数のスレーブで読み取りを分散します。スレーブ側での速度を向上するには、--skip-innodb
、--low-priority-updates
および --delay-key-write=ALL
でスレーブを起動することもできます。この場合、スレーブは
InnoDB
テーブルの代わりに非トランザクションの
MyISAM
テーブルを使用して、トランザクション
オーバーヘッドを取り除きながら、速度を上げます。
5.4.4.7: パフォーマンス改善レプリケーションを用いたアプリケーションを作成するときに、クライアントコードはどのように準備しますか。
スケール アウト ソリューションとしてレプリケーションを使用するためのガイドは、項5.3.3. 「スケールアウトのレプリケーション」 を参照してください。
5.4.4.8: MySQL のレプリケーションで、どれくらいのシステム パフォーマンスの向上が期待できますか、そしてそれはいつ行うものですか。
MySQL レプリケーションは、読み取りが頻繁に行われ、書き込みはそれほどでもないシステムに最も適しています。理論的には、単一のマスタや複数のスレーブのセットアップを使用することで、システムを拡張することができます。つまりネットワーク帯域幅を超えるか、更新負荷がマスタで処理しきれないポイントに到達するまでは、スレーブの数をシステムに追加できます。
追加する利点がなくなるまでいくつのスレーブを追加できるか、あるいはサイトのパフォーマンスをどれだけ向上できるかを判断するには、クエリ
パターンを知る必要があります。そして読み取りには毎秒ごとの読み取り、または
reads
、書き取りには
writes
で、マスタとスレーブの通常のスループットの関係をベンチマークして、実証的に決定します。ここでは、例として、仮想システムのレプリケーションでの単純化した計算を示します。
システム負荷が 10% の書き込みと 90%
の読み取りで構成され、reads
が 1200 – 2 × writes
であると仮定します。つまり、書き込みがなければシステムは毎秒
1,200
の読み取りを実行します。書き込みの平均は読み取り平均の
2 倍かかります。この関係はリニア (直線的)
です。マスタとそれぞれスレーブの能力は同じで、1
マスタと N
スレーブがあると想定します。それぞれのサーバ
(マスタまたはスレーブ)
は次のようになります。
reads = 1200 – 2 × writes
reads = 9 × writes /
(
(読み取りは分散、書き込みはすべてのサーバへ)
N
+ 1)
9 × writes / (
N
+
1) + 2 × writes = 1200
writes = 1200 / (2 +
9/(
N
+1))
最後の数式は、N
スレーブ毎の最大数を示し、
ここでは、毎分 1,200
の可能な最大読み込み割合と書き込みあたり
9 の読み込み割合と仮定しています。
この分析は、次の結論を導き出します。
N
=
0(レプリケーションがないことを意味する)の場合、システムは
1200/11、つまり毎秒 109
書き込みを処理できる(アプリケーションの性質上、読み取りが
9 倍になる)
N
= 1 の場合、毎秒 184
の書き込みまで処理可能
N
= 8 の場合、毎秒 400
の書き込みまで処理可能
N
= 17 の場合、毎秒 480
の書き込みまで処理可能
N
が無限に近づくと(割当量も無限大に膨らみ)、毎秒
600 の書き込みに近くなり、システム
スループットは 5.5 倍になる。しかし、8
サーバだけで 4 倍近くになる。
注意:
この計算ではシステム帯域を無限として想定しています。そのため、実際のシステムでは重要であるファクタを無視している可能性があります。多くの場合、N
アプリケーション
スレーブを追加した場合の結果を正確に予測するために、上記と同様の計算を行うことは適していません。このため、レプリケーションによってシステムのパフォーマンスが改善するかどうか、またどの程度改善するか、以下の質問の答えを参照して判断してください。
システムの読み取りと書き込みの比率
読み取りを減らした場合、1 つのサーバで処理できる書き込み負荷を増やせる程度
ネットワークの帯域幅を使用できるスレーブ数の上限
5.4.4.9: 冗長性と高可用性を実現するために、レプリケーションをどのように使用すればよいですか。
どのように冗長性を向上するかは、使用しているアプリケーションと状況により異なります。(自動フェールオーバを伴う) 高可用性ソリューションは、アクティブなモニタリングに加え、オリジナルのMySQL サーバからそのスレーブへのフェールオーバを行うためのカスタム スクリプトまたはサード パーティのツールのいずれかを必要とします。
この処理を手動で行うには、失敗したスレーブから事前構成のスレーブに移行できることを確認してください。(失敗時にアプリケーションとスレーブにマスタの変更を指示するスクリプトを作成する)。これを行うには、新たなサーバと通信するアプリケーションで代替するか、または、失敗したサーバから新たなサーバに MySQL サーバの DNS を調節します。
詳細とソリューション例に関しては 項5.3.6. 「フェイルオーバでのマスタ切り替え」 を参照してください。
5.4.4.10: マスタ サーバのロギング形式が、ステートメント ベースまたは行ベースのどちらであるかを確かる方法はありますか。
binlog_format
システム変数の値を確認します。
mysql> SHOW VARIABLES LIKE 'binlog_format';
その値は STATEMENT
または
ROW
のどちらかを示します。
5.4.4.11: スレーブが行ベースのレプリケーションを使用するように設定する方法はありますか。
スレーブは自動的にどちらの形式を使用するかを認識します。
5.4.4.12: スレーブのマシンへの複製で、GRANT および REVOKE のステートメントを抑制する方法はありますか。
サーバを
--replicate-wild-ignore-table=mysql.%
オプションで起動します。.
5.4.4.13: 混在のオペレーティング システムでレプリケーションを実行できますか。(例:マスタが Linux、スレーブが Mac OS X と Windows の場合)
はい、できます。
5.4.4.14: 混在のハードウェア アーキテクチャでレプリケーションを実行できますか。(マスタが 64-bit、スレーブが32-bit のマシンの場合など)
はい、できます。