2552


既存のMySQLマスタースレーブ(1-2)を組んで運用しているサービスがあるとします。

この構成に前日取得したSnapshotからつくったMySQLノードを新規にスレーブとして追加して(1-3)となる構成にしました。
しかし、スレーブを追加する作業中に何故かMasterのシステム負荷が一時的に上がりました。

スレーブを追加することでマスターのシステム負荷が高くなる理由は何故なのでしょうか？


CC BY-SA 3.0
2014-12-25T05:46:10.697
2543
2014-12-26T23:44:08.770
3023
question
mysql
既存のMySQL Masterにスレーブを追加する場合にシステム負荷が上がる理由


追加されたスレーブに最新の状況を反映させる際に、マスターでは古いbinlogを読み込む必要があるからではないでしょうか。binlogはメモリ上にバッファを持たないので、I/O負荷が上がると考えます。(実際に検証したわけではありません。)

公式ドキュメントではないのですが、以下のようなブログ記事がありましたので引用しておきます。

`The binary log does not have its own in memory buffers, so it's possible if
an out of date slave came online that the master server may need to read old
binary log files in order to send previous server events.`

cf. [When does MySQL perform IO? | Master
MySQL](http://www.tocker.ca/2013/05/06/when-does-mysql-perform-io.html)

尚、以前手元環境でMS SQL Serverでのレプリケーション構成にスレーブを追加した際にも、やはり負荷が上がったと記憶しています。


CC BY-SA 3.0
2014-12-25T07:05:19.657
2552
2014-12-25T07:05:19.657
3313
2543
answer


MySQLのバージョンが書かれていないため見当違いかもしれませんが、過去のバージョンにおいてMasterへSlaveが接続するたびに無駄なバイナリログスキャンが行われていたバグがあったようです。

> MySQL 5.6シリーズの最初のバージョンである、MySQL
> 5.6.10にはこの処理に問題があった。なんと、スレーブが接続したときに、マスター上ではバイナリログを若い方から全てスキャンしていたのだ。スレーブが接続、あるいは再接続する度にバイナリログを全てスキャンしていたため、大変なI/Oの負荷があった。流石にこの問題は致命的だったので、その次のバージョンであるMySQL
> 5.6.11で修正された。

引用元：[MySQLレプリケーションの運用が劇的変化！！GTIDについて仕組みから理解する](http://nippondanji.blogspot.jp/2014/12/mysqlgtid.html)

一般にデータベースのレプリケーションではバイナリログの同期作業が絶対に起こるので、一定の負荷上昇はやむを得ないと思います。
しかし明らかに異常な負荷がかかっていると思われる場合は、MySQLのバージョンを確認されるとよいのではないかと思います。


CC BY-SA 3.0
2014-12-26T23:44:08.770
2660
2014-12-26T23:44:08.770
3277
2543
answer