mikedaの日記スマートフォン用の表示で見るmikedaの日記2015-09-21InnoDBのウォームアップに別サーバでdumpしたib_buffer_poolを使ってみるMySQLでスレーブを複数台並べている。負荷増加やサーバ障害で新規スレーブを追加したい。構築したばかりのMySQLスレーブをいきなりサービスに突っ込むとどうなるか。それなりの規模のサービスであれば、buffer_poolが空っぽのDBだとIOがつまって応答遅延が発生します。いうわけでサービス投入前にbuffer_poolのウォームアップが必要で、方法としてはいくつか考えられます。普段は主要テーブルのIndexを読み込んでから、低い振り分け比率でサービス投入、ディスクIO見ながら徐々に振り分け比率を上げていく、ということをしていました。前にとあるエンジニアから『稼働中DBでdumpしたib_buffer_poolを新規DBでloadする』というかなりびっくりなウォームアップ手順を聞きました。100この設定があるとMySQL停止時にバッファプールの状態をダンプし、起動時にそれを読み込むことでバッファプールの状態を復旧出来ます。このダンプファイル(ib_buffer_pool)は稼働中のDBでも取得可能なので、それを新規構築したDBで読み込めばバッファプールを本番稼働中の既存DBと同じ状態に出来ると。これはなかなか怪しい手順です。IDで、細かいことよくわかってないですが取得したDBとは別のDBでそれを使うのはかなり乱暴な気はします。今自分が主に使っている環境では、バックアップDBがあって、新規スレーブのデータは全てこのDBのEBSのスナップショットから作っています。元データは完全に同じもので、その後の更新クエリも同じもの。なんかいけるような気もする・・・まぁとりあえず試してみよう、ということでやってみました。稼働中のスレーブでdumpを取る。1;以下のコマンドを実行してcompletedになってれば完了。これはあっという間に完了して、サービス影響は全く無さそう。ダンプファイルもすごく小さいです。|+--------------------------------+--------------------------------------------------+出力されたダンプファイルを新規DBにコピーする。=1が設定されていれば、mysqlを起動するだけでダンプファイルの読み込みが始まります。start既にmysqlが起動済みであれば以下のコマンドでloadを開始してもOK。※別のloadが走ってたらinnodb_buffer_pool_load_abort=1で止めてからのほうがいいかも。1;以下のコマンドでcompletedになれば完了。|+--------------------------------+--------------------------------------------------+検証とある本番環境でざっくり効果を検証してみました。環境依存がデカイので細かいことは置いといて、1回ずつだけウォームアップ時間、サンプルクエリの実行時間を測定しました。全部同じスナップショットから作成サンプルクエリは本番サーバでtcpdumpしてとった50万行のSELECTです。-l504316実行時間は単純に1並列で流し込んで測定しました。/dev/null比較として、いつもやってる主要テーブルのIndexの読み込みウォームアップも合わせて実施します。comments,articles,...innodb-warmerコマンドは@songmuさんのMySQL::Warmerを@sgwr_dtsさんがrubyで書きなおしたものです。結果warmup済みのEBSで検証してみるとこんな感じ。2m38s別サーバからbuffer_poolをdumpしてloadした場合のウォームアップ時間は30分強で、検証クエリの実行時間は本番稼働中のサーバと同程度に速かったです。どちらもIndex読み込み方式に比べるとかなり優秀。2m49sウォームアップの時間がものすごくかかる・・・この状態のDBを実際にサービスに投入してみます。読み込みのIOPSはこうなる。青がサービス稼働中の既存DB、赤が『innodb-warmerで主要テーブルを温める』のやつ、緑が『別サーバからbuffer_poolをdumpしてload』。緑のディスク読み込みが短時間で本番DBと同程度になるのに対し、赤はだいぶ時間がかかっています。んー、こっちの結果はEBSのウォームアップはたいへんだなという意味しかないかな。EBSのウォームアップ、もうちょっとなんとかなんないかなぁ・・・まとめ検証した条件では、ib_buffer_poolを別サーバから持ってきてloadするのはInnnoDBのウォームアップ手順としてなかなか優秀なように見えるので、状況に応じて使っていこうと思います。この方法が汎用的に使えるのかというと疑問があるので、ツッコミや別の検証結果があればぜひ見たいです。iptablesで切断したコネクションが消えなくてハマったLVS+DSRでMySQLサーバの参照を分散してRailsから接続してみたと...2013-12-312013年のふり返りこんばんわ、mikedaです。最新記事クックパッドを退職して株式会社リスタを立ち上げましたWEB系各社で使われている監視ツールまとめInnoDBのウォームアップに別サーバでdumpしたib_buffer_poolを使ってみるGoogleスプレッドシートからAWSを操作する自宅マンツーマン英会話レッスンを始めてみた月別アーカイブ注目記事はてなブログをはじめよう!mikedaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。