mysql勉強会 リプリケーション編.2013 08-09

36
MySQL 社内講習 リプリケーション編 CROOZ Team Venus

Upload: crooz-inc

Post on 28-May-2015

3.747 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: MySQL勉強会 リプリケーション編.2013 08-09

MySQL 社内講習リプリケーション編

CROOZ Team Venus

Page 2: MySQL勉強会 リプリケーション編.2013 08-09

目次

•  リプリケーションとは •  マスターとスレーブ •  スレーブ遅延とは •  スレーブ遅延の原因は •  スレーブ遅延の確認方法は •  スレーブ遅延の影響 •  まとめ •  参考資料

Page 3: MySQL勉強会 リプリケーション編.2013 08-09

『リプリケーションとは』

Page 4: MySQL勉強会 リプリケーション編.2013 08-09

リプリケーションとは データベースを拡張する

仕組みのことです

Page 5: MySQL勉強会 リプリケーション編.2013 08-09

具体的には

元になるデータベース(以下DB) をコピーして複製(リプリカ)の DBを作ることでDBを拡張します

Page 6: MySQL勉強会 リプリケーション編.2013 08-09

マスターとスレーブ

 この元のDBを『マスター』複製されたDBを『スレーブ』 といいます。

Page 7: MySQL勉強会 リプリケーション編.2013 08-09

使用している リプリケーション方式は

Page 8: MySQL勉強会 リプリケーション編.2013 08-09

非同期型シングルマスター/マルチスレーブ方式

 一般的に多く使われているリプリ

ケーションの方式で、1つのマスター

DBで更新を処理し、その更新内容が

ネットワークを通じ非同期にスレーブ

DBに伝播される方式です

Page 9: MySQL勉強会 リプリケーション編.2013 08-09

リプリケーション構成図

スレーブ スレーブ スレーブ

マスター

更新系のSQLのみ伝播

DELETE/UPDATE/INSERT

DML(ALTER TABLE等)

Page 10: MySQL勉強会 リプリケーション編.2013 08-09

■ メリット・システムの構成がシンプル■ デメリット・システムの構成上、更新はマスター1台のみとなる。つまり参照しか拡張できない。・マスター/スレーブ間で同期していない為、タイミングによってはマスター/スレーブ間でデータの不一致が発生する可能性がある

メリット/デメリット

Page 11: MySQL勉強会 リプリケーション編.2013 08-09

参照と更新

スレーブ

スレーブ

スレーブ

マスター

参照(SELECT)

更新(INSERT/UPDATE/DELETE/ ALTER TABLE)

Page 12: MySQL勉強会 リプリケーション編.2013 08-09

『スレーブ遅延とは』

Page 13: MySQL勉強会 リプリケーション編.2013 08-09

マスターからスレーブへの伝播に遅れが生じること

Page 14: MySQL勉強会 リプリケーション編.2013 08-09

『スレーブ遅延の原因は』

Page 15: MySQL勉強会 リプリケーション編.2013 08-09

スレーブ遅延の原因は

•  マスターDBとスレーブDB間のネットワーク上をデータ転送に時間が掛かっている場合

•  スレーブDBで更新が完了するのに時間が掛かっている場合 多くの場合は後者

Page 16: MySQL勉強会 リプリケーション編.2013 08-09

マスターからスレーブへの データ転送図

スレーブ マスター

× ×

binlog relaylog

更新クエリ(INSERT/UPDATE/DELETE/ALTER TABLE)

データの転送に遅延が発生

スレーブの更新処理に遅延が発生

更新が完了したものからbinlogに書き出し

Page 17: MySQL勉強会 リプリケーション編.2013 08-09

スレーブの更新処理 遅延の原因は

•  UPDATE/DELETE/INSERTなど更新系のクエリで1つのクエリの実行時間が非常に長い場合に発生する。

•  インデックスが効いておらず、対象件数が多い場合によく発生する。

Page 18: MySQL勉強会 リプリケーション編.2013 08-09

スレーブ更新処理遅延

ALTER TABLE

master

commit

commit

slave

SQLの実行時間がそのままスレーブ遅延の時間になる

ALTER TABLE

UPDATE

UPDATE

DELETE

DELETE

クエリを分割すれば、ほとんど遅延は発生しない

Page 19: MySQL勉強会 リプリケーション編.2013 08-09

注意事項 •  リプリケーションの仕組み上、スレーブへの更新がシング

ルスレッド(1つづつ順番に)処理される為、サービスで全く参照されていない(イベント期間外でサービスで使われていない)テーブルであっても、カラム追加やインデックスの追加など更新に時間が掛かる場合にはスレーブ遅延が発生する。

•  スレーブ遅延は、実行時間が掛かる更新クエリが完了した後に発生する。更新に数分掛かっても終わらない場合は、途中で処理を中断することで、スレーブ遅延を回避できる。尚、途中で更新をキャンセルしても、更新処理が途中の状態になる訳ではなく、クエリ発行前の状態に戻るので、気が付いたら早めにキャンセルを行う。

Page 20: MySQL勉強会 リプリケーション編.2013 08-09

スレーブ更新処理で 遅延させない為には

Page 21: MySQL勉強会 リプリケーション編.2013 08-09

・1つのSQLでまとめて更新処理(update/insert/delete) しない。なるべく分割する。 ・クエリを実行する前にEXPLAINを実行し、インデックスが使われているかどうか確認する。 ・インデックスの追加/カラムの追加などで時間が掛かる処理で、どうしてもスレーブ遅延が発生する場合は、メンテナンス時に作業を行う。

スレーブ更新処理で 遅延させない為には

Page 22: MySQL勉強会 リプリケーション編.2013 08-09

事例に基づいて 考えて見ましょう

Page 23: MySQL勉強会 リプリケーション編.2013 08-09

前回の事例で スレーブ遅延を確認します

Page 24: MySQL勉強会 リプリケーション編.2013 08-09

demo

•  インデックスが効いていないUPDATE文を実行

•  ALTER TABLEでインデックスを追加

Page 25: MySQL勉強会 リプリケーション編.2013 08-09

mysql> UPDATE prize_history SET del_flg = 1 WHERE prize_id = 14 AND ctime BETWEEN '2013-05-18 00:00:00' AND '2013-05-24 00:00:00';

インデックスが 効いていないUPDATE文

Page 26: MySQL勉強会 リプリケーション編.2013 08-09

(1) 【master】インデックスが効いていないUPDATE文を実行UPDATE prize_history SET del_flg = 1 WHERE prize_id = 14 AND ctime BETWEEN '2013-05-18 00:00:00' AND '2013-05-24 00:00:00';(2) 【slave】スレーブ遅延状況を確認(クエリ実行中/スレーブ遅延発生中/スレーブ遅延解消後)SHOW SLAVE STATUS\G;(3) 【master/slave】贈り物テーブルの特定のIDのレコードを確認するSELECT * FROM prize_history WHERE prize_history_id = 2100000\G;(4) 【master】インデックスが効いていないUPDATE文をもう一度実行UPDATE prize_history SET del_flg = 1 WHERE prize_id = 14 AND ctime BETWEEN '2013-05-18 00:00:00' AND '2013-05-24 00:00:00';(5) 【master】UPDATE文(4)を実行完了後スレーブ遅延発生時に、確認した贈り物テーブルの特定のIDのレコードに受け取りフラグを設定するUPDATE prize_history SET receive_flg=1 WHERE prize_history_id = 2100000;(6) 【master/slave】贈り物テーブルの特定のIDのレコードを確認する(スレーブ遅延発生中/スレーブ遅延発生後)SELECT * FROM prize_history WHERE prize_history_id = 2100000\G;

インデックスが 効いていないUPDATE文

Page 27: MySQL勉強会 リプリケーション編.2013 08-09

mysql> ALTER TABLE prize_history ADD KEY prize_id (prize_id,ctime);

インデックスを追加 (ALTER TABLE)

Page 28: MySQL勉強会 リプリケーション編.2013 08-09

(1) 【master/slave】テストデータを確認するSELECT * FROM test WHERE id=32776\G;(2) 【master】インデックスを追加するALTER TABLE prize_history ADD KEY prize_id (prize_id,ctime);(3) 【master/slave】マスターのインデックス実行完了後スレーブ遅延発生時に、確認した特定のIDのレコードを更新するUPDATE test SET c=500 WHERE id=32776\G;(4) 【master/slave】贈り物テーブルの特定のIDのレコードを確認する(スレーブ遅延発生中/スレーブ遅延発生後)SELECT * FROM test WHERE id=32776\G;

インデックスを追加 (ALTER TABLE)

Page 29: MySQL勉強会 リプリケーション編.2013 08-09

『スレーブ遅延の確認方法は』

Page 30: MySQL勉強会 リプリケーション編.2013 08-09

SHOW SLAVE STATUS Seconds_Behind_Master

の項目を確認する

Page 31: MySQL勉強会 リプリケーション編.2013 08-09

『スレーブ遅延の影響』

Page 32: MySQL勉強会 リプリケーション編.2013 08-09

何が問題なの?

Page 33: MySQL勉強会 リプリケーション編.2013 08-09

マスターとスレーブの間に 差分が発生!!

Page 34: MySQL勉強会 リプリケーション編.2013 08-09

具体的な事例

アイテム増殖

Page 35: MySQL勉強会 リプリケーション編.2013 08-09

まとめ •  実行時間が掛かる更新系SQL(INSERT/UPDATE/

DELETE)、データベース操作DDL(ALTER TABLE)はクエリは実行しない。

•  更新系クエリはなるべく分割する。

•  大きな更新が必要な場合はメンテナンス時に行う

•  数分掛かっても更新が終わらないクエリはスレーブ遅延が発生する前に早めにキャンセルする。

Page 36: MySQL勉強会 リプリケーション編.2013 08-09

『参考資料』 ・MySQLにおけるレプリケーション遅延の傾向と対策 ・MySQLレプリケーションを安全に利用するための10のテクニック