カジュアルに本番データを開発環境に入れる #mysqlcasual

22
カジュアルに 本番データを 開発環境に入れる MySQL Casual Talks vol.9 @oinume

Upload: kazuhiro-oinuma

Post on 23-Jan-2017

2.651 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: カジュアルに本番データを開発環境に入れる #mysqlcasual

カジュアルに 本番データを

開発環境に入れるMySQL Casual Talks vol.9

@oinume

Page 2: カジュアルに本番データを開発環境に入れる #mysqlcasual

自己紹介

๏ Kazuhiro Oinuma (@oinume)

๏ MySQL user since v3.23

๏ CyberAgent,Inc

๏ Ameba Ownd

Page 3: カジュアルに本番データを開発環境に入れる #mysqlcasual
Page 4: カジュアルに本番データを開発環境に入れる #mysqlcasual

๏ 簡単にオシャレなWebサイトが作れる

๏ ブログっぽいデザイン、キュレーションメディアのようなデザインなどカスタマイズも可能

๏ Starbucks, VOGUE, NIGO, etc…

Page 5: カジュアルに本番データを開発環境に入れる #mysqlcasual

カジュアルに 本番データを

開発環境に入れる

Page 6: カジュアルに本番データを開発環境に入れる #mysqlcasual

動機

๏ 開発環境でちゃんとしたテストデータを作るのつらい

๏ UGCかつデザインのバリエーションが多い

๏ 本番環境ディプロイ後に発見される不具合たち

Page 7: カジュアルに本番データを開発環境に入れる #mysqlcasual

http://techlife.cookpad.com/entry/2014/10/03/110806

Page 8: カジュアルに本番データを開発環境に入れる #mysqlcasual

本番データを開発環境に入れちゃおう

Page 9: カジュアルに本番データを開発環境に入れる #mysqlcasual

DBサーバー構成

App

Replication

ELB

Slave

Master

調査用

RDS

Page 10: カジュアルに本番データを開発環境に入れる #mysqlcasual

流れ๏ 1. 調査用のDBからmysqldump

๏ 2. 開発環境のDBにインポート

๏ 3. データを開発環境向けにUPDATE

๏ 上記をJenkinsのJobで毎日動かす

๏ あえてレプリケーション方式にはしなかった

๏ リアルタイム性は不要

๏ レプリが止まった時の対応が面倒そう

Page 11: カジュアルに本番データを開発環境に入れる #mysqlcasual

補足๏ mysqldumpしたファイルのサイズは3GB弱ぐらい

๏ 小規模!!

๏ mysqldump するのに3分ぐらい

๏ dumpファイルをインポートするのに20分ぐらい

๏ MySQLのバージョンは5.6.19

๏ 5.7じゃなくてすいません(́・ω・`)

Page 12: カジュアルに本番データを開発環境に入れる #mysqlcasual

第一段階mysqldumpしてインポートするだけなら簡単

Page 13: カジュアルに本番データを開発環境に入れる #mysqlcasual

問題๏ mysqldumpしてからインポートするため、データが一度消えてしまう

๏ →開発環境独自に作ったデータが消えてしまう

๏ 対策:開発環境独自のレコードのidを+10億に

๏ AUTO_INCREMENTをずらす

Page 14: カジュアルに本番データを開発環境に入れる #mysqlcasual

流れ v21. 調査用のDBからmysqldump

2. 開発環境DBでid >= 10億 のレコードをバックアップ

3. 1.の本番データを開発環境DBにインポート

4. データを開発環境向けにUPDATE

5. 2.でバックアップしたデータをリストア

6. 各テーブルのAUTO_INCREMENT値をずらす

Page 15: カジュアルに本番データを開発環境に入れる #mysqlcasual

id >= 10億 のレコード のみmysqldump

$ mysqldump -h {db_host} -P {db_port} \ -u{db_user} -p{db_password} \ ̶no-create-info \ ̶order-by-primary \ ̶default-character-set=utf8mb4 \ ̶insert-ignore \ ̶where “id >= 10億” {db_name} {table}

Page 16: カジュアルに本番データを開発環境に入れる #mysqlcasual

AUTO_INCREMENT のずらし方

๏ INFORATION_SCHEMAから各テーブルの現在のAUTO_INCREMENT値を取得

๏ ALTER TABLE {table} AUTO_INCREMENT=… でずらす

Page 17: カジュアルに本番データを開発環境に入れる #mysqlcasual

INFORMATION_SCHEMA からAUの値を取得

SELECT t.table_name, t.auto_increment FROM information_schema.tables AS t INNER JOIN information_schema.columns AS c ON t.table_name = c.table_name WHERE t.table_schema = '{db_name}' AND c.table_schema = ‘{db_name}' AND t.auto_increment IS NOT NULL AND c.column_key = 'PRI' /* 主キーのみ対象 */ ORDER BY t.table_name;

Page 18: カジュアルに本番データを開発環境に入れる #mysqlcasual

INFORMATION_SCHEMA からAUの値を取得

+--------------------------------+----------------+ | table_name | auto_increment | +--------------------------------+-----------------+ | blog_posts | 900000 | | blog_post_categories | 250000 | | pages | 590000 |

※数字はフィクションです

Page 19: カジュアルに本番データを開発環境に入れる #mysqlcasual

AUTO_INCREMENTずらす

ALTER TABLE {table} AUTO_INCREMENT=…

Page 20: カジュアルに本番データを開発環境に入れる #mysqlcasual

よかったこと๏ 不具合が本番ディプロイ前に発見しやすくなった

๏ 機能追加・修正のイメージがしやすくなった

๏ ユーザーと同等の体験をして開発できる

๏ 開発時に重いクエリに気付きやすくなった

๏ ALTER TABLEする場合にどのぐらい時間がかかるか簡単に試せる

Page 21: カジュアルに本番データを開発環境に入れる #mysqlcasual

カジュアルに本番データを開発環境に入れちゃおう

Page 22: カジュアルに本番データを開発環境に入れる #mysqlcasual

ありがとう ございました