my mysql best practices

31
My MySQL Best Practices 2017/03/21 MyNA @mita2

Upload: satoshi-mitani

Post on 13-Apr-2017

142 views

Category:

Software


0 download

TRANSCRIPT

Page 1: My MySQL Best Practices

My MySQL Best Practices

2017/03/21 MyNA@mita2

Page 2: My MySQL Best Practices

2

Thank you, Matt !

Welcome MySQL Nippon Association

Page 3: My MySQL Best Practices

みんなBest Practice おさらい

• @yoku0825

• MySQL パターン

• https://www.slideshare.net/yoku0825/mysql-71661984

• アンリーダーブルSQL

• RDBMS・ザ・オラクルマシン etc…

• @sodai1025

• Web エンジニアに知ってほしいRDBアンチパターン

• http://soudai.hatenablog.com/entry/2017/03/04/190000

3

Page 4: My MySQL Best Practices

自己紹介

4

• 三谷 智史(Twitter: @mita2)

• MySQLとの関わり2002年~ 主に利用して開発2010年~ 主に管理する立場

Page 5: My MySQL Best Practices

5

My MySQL Best Practice

というかDBAからのお願いです

Page 6: My MySQL Best Practices

My MySQL Best Practice

• DBを選ぶ

• Use InnoDB 、no more MyISAM

• エラーハンドリング

• 定期的な再接続

• クエリとクエリの間に重い処理を入れない

• DBAとのコミュニケーションのコツ

6

Page 7: My MySQL Best Practices

My MySQL Best Practice

• DBを選ぶ

• Use InnoDB 、no more MyISAM

• エラーハンドリング

• 定期的な再接続

• クエリとクエリの間に重い処理を入れない

• DBAとのコミュニケーションのコツ

7

Page 8: My MySQL Best Practices

DBを選ぶ

• みんな 大好き MySQL

• 苦手なこともあるよ

8

Page 9: My MySQL Best Practices

MySQL の得意分野

9

OLTP系 ワークロードOLTP系 ワークロード DWH系 ワークロードDWH系 ワークロード

テーブル テーブル

• Online Transaction Processing

• オンライン処理

• 結果をすぐ返す

• 多数の行のうち少数の行の複数のカラムに注目

• よくアクセスされる行とそうでない行がある

• Data WareHouse

• 集計・解析

• 多くはバッチ・非同期

• 多数の行のうち多数の行の少数のカラムに注目

• 比較的均一にアクセスされる

Page 10: My MySQL Best Practices

MySQL の得意分野

10

OLTP系 ワークロードOLTP系 ワークロード DWH系 ワークロードDWH系 ワークロード

テーブル テーブル

• Online Transaction Processing

• オンライン処理

• 結果をすぐ返す

• 多数の行のうち少数の行の複数のカラムに注目

• よくアクセスされる行とそうでない行がある

• Data WareHouse

• 集計・解析

• 多くはバッチ・非同期

• 多数の行のうち多数の行の少数のカラムに注目

• 比較的均一にアクセスされる

Page 11: My MySQL Best Practices

DBMSの使い分け

• DB選定フェーズを確保する

• 「違うもの」と比較する

• × MySQL vs MySQL forks

• ○ MySQL vs Hadoop

• ○ MySQL vs Cassandra

• ○ OSS vs 商用

• × どのDBが一番良いか

• ○ どう組み合わせるのが良いか11

Page 12: My MySQL Best Practices

My MySQL Best Practice

• DBを選ぶ

• Use InnoDB 、no more MyISAM

• エラーハンドリング

• 定期的な再接続

• クエリとクエリの間に重い処理を入れない

• DBAとのコミュニケーションのコツ

12

Page 13: My MySQL Best Practices

Use InnoDB, No more MyISAM

• MyISAM は トランザクション非対応

• BEGIN/COMMITが使えない・・・だけではない

13

Page 14: My MySQL Best Practices

Use InnoDB, No more MyISAM

• MyISAM は ディスクに同期書き込みしない• 障害時にデータがロストするリスクがある

• 破損チェックや復旧に時間がかかる

14

Page 15: My MySQL Best Practices

Use InnoDB, No more MyISAM

• MyISAM フェードアウトは確定的

• MySQL 8.0

• Dictionary Data in InnoDB

• DDL が crash safe に• https://dev.mysql.com/doc/refman/8.0/en/data-dictionary.html

15

Page 16: My MySQL Best Practices

My MySQL Best Practice

• DBを選ぶ

• Use InnoDB 、no more MyISAM

• エラーハンドリング

• 定期的な再接続

• クエリとクエリの間に重い処理を入れない

• DBAとのコミュニケーションのコツ

16

Page 17: My MySQL Best Practices

エラーハンドリング

• DBのエラーはログに落とす

• PHP PDOのERR_MODEをException にするの忘れがち• setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

• エラーハンドリングは「開発者の腕の見せ所」

17

Page 18: My MySQL Best Practices

リトライ

• エラーはいつでもあり得る

• DBの構成を工夫しても、リトライがなければ活かされない

• リトライしてますか?

• そのバッチ再実行できますか?

18

Page 19: My MySQL Best Practices

そしてテスト

• 障害試験

• 負荷試験

• RDBはスケールできない(他と比較して

• 近年、軽視されがち

• ビジネスの加速

• CI/CD 等によるチェックポイントのない運用

• クラウドによるスケールアップ

19

Page 20: My MySQL Best Practices

My MySQL Best Practice

• DBを選ぶ

• Use InnoDB 、no more MyISAM

• エラーハンドリング

• 定期的な再接続

• クエリとクエリの間に重い処理を入れない

• DBAとのコミュニケーションのコツ

20

Page 21: My MySQL Best Practices

定期的な再接続

• コネクションプーリングしているとき

• 定期的に張りなおしが必要

• Apache なら MaxRequestsPerChild を設定

• 2つの理由

21

Page 22: My MySQL Best Practices

理由1 設定変更の反映

• コネクションの設定は、「新規接続時」に適用される

• SET GLOBAL →再接続しないといつまでも古い設定のまま

22

Page 23: My MySQL Best Practices

理由2 コネクションの偏りを解消する

• 障害等でコネクションが偏る

• 偏っても問題ないのが、理想だが・・・実際は不安

• 復旧後、自動で偏りが解消されるように

23

Page 24: My MySQL Best Practices

My MySQL Best Practice

• DBを選ぶ

• Use InnoDB 、no more MyISAM

• エラーハンドリング

• 定期的な再接続

• クエリとクエリの間に重い処理を入れない

• DBAとのコミュニケーションのコツ

24

Page 25: My MySQL Best Practices

クエリとクエリの間に処理をはさまない

25

ConnectConnect

Execute SQLExecute SQL

Call WebAPICall WebAPI

Execute SQLExecute SQL

DisconnectDisconnect

ConnectConnect

Execute SQLExecute SQL

Call WebAPICall WebAPI

Execute SQLExecute SQL

DisconnectDisconnect

APIが遅くなると・・・

TIME

Page 26: My MySQL Best Practices

クエリとクエリの間に処理をはさまない

• API を呼び出している間、コネクションは Idle 状態

• コネクションの生存期間が延びて・・・

• Too many connections で新規接続不可

26

Page 27: My MySQL Best Practices

クエリとクエリの間に処理をはさまない

• Idle コネクションはそのうちwait_timeoutで切られる

• SQL 実行時には接続が失われている

27

ConnectConnect

Execute SQLExecute SQL

Call WebAPICall WebAPI

Execute SQLExecute SQL

DisconnectDisconnect

MySQLserver

has gone away

MySQLserver

has gone away

Page 28: My MySQL Best Practices

クエリとクエリの間に処理をはさまない

• DBの処理はまとめて行う

• まとめられないなら、「遅くなる可能性のある処理」にはタイムアウトを

28

ConnectConnect

Execute SQLExecute SQL

Call Web APICall Web API

Execute SQLExecute SQL

DisconnectDisconnect

Page 29: My MySQL Best Practices

My MySQL Best Practice

• DBを選ぶ

• Use InnoDB 、no more MyISAM

• エラーハンドリング

• 定期的な再接続

• クエリとクエリの間に重い処理を入れない

• DBAとのコミュニケーションのコツ

29

Page 30: My MySQL Best Practices

DBAとのコミュニケーションのコツ

• 「やってほしい作業」ではなく「目的」を伝える

• 開発者に見えているDBの状態はごく一部

• 経験豊富・情報量の多いDBAに「手段」はまかせる

30

Page 31: My MySQL Best Practices

31

Enjoy MySQL