カジュアルにmysql clusterを使ってみよう@mysql cluster casual talks 2013.09

40
MySQL Cluster MySQL Cluster 使ってみよう! 使ってみよう!  奥野 幹也 @nippondanji mikiya (dot) okuno (at) gmail (dot) com @MySQL Cluster Casual Talks 2013 カジュアルに

Upload: mikiya-okuno

Post on 25-Jun-2015

8.505 views

Category:

Technology


4 download

DESCRIPTION

MySQL Cluster Casual Talksで使った資料です。Slideshareの表示ではフォントがおかしいのでダウンロードして使ってください。

TRANSCRIPT

Page 1: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

MySQL ClusterMySQL Cluster をを使ってみよう!使ってみよう!

 奥野幹也@nippondanjimikiya (dot) okuno (at) gmail (dot) com

@MySQL Cluster Casual Talks 2013

カジュアルに

Page 2: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

免責事項● 本プレゼンテーションにおいて示されている見解は、私自身の見解であって、オラクル・コーポレーションの見解を必ずしも反映したものではありません。ご了承ください。

Page 3: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

自己紹介

● MySQLサポートエンジニア– 日々のしごと

● トラブルシューティング全般● Q&A回答● パフォーマンスチューニング

など● ライフワーク

– 自由なソフトウェアの普及● オープンソースではない

● ブログ– 漢のコンピュータ道– http://nippondanji.blogspot.com/

今日は個人として参加しています。

Page 4: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

MySQL Clusterとは!

Page 5: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

MySQLの姉妹製品

● MySQLのストレージエンジンとして使える。– CREATE TABLE hoge (…) ENGINE NDB;

● トランザクション対応● 並列分散型のデータベース● HA機能● ハイパフォーマンス● コミュニティ版は GPLv2

Page 6: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

動作イメージ

データノード

SQL ノード

アプリケーション アプリケーション アプリケーション

NDB API

通常のMySQLプロトコル

管理ノード

SQL ノード SQL ノード

データノードデータノード

データノード

データノード

MGM API

MySQLサーバー

Page 7: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

速いの?

● 結論: 1台の性能では InnoDBのほうが上– ただし NDB APIは爆速

● ノードを並べてナンボ– データノード

● 負荷分散● データ量の増加

– SQL ノード● SQL解析の負荷分散

● ノードを増やしても性能が伸びない処理もある– 少ししか行を取ってこないスキャン

● sysbenchが遅い!!

Page 8: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

MySQL Clusterでできること

高可用性●SPOF の排除●HA 機能搭載●遠隔地へのレプリケーション

パフォーマンス●スケールアウト●リアルタイム処理●NoSQL

低価格●GPL 版は無償●商用ライセンスもお手頃 http://www­jp.mysql.com/products/●コモディティなハードウェアで構築可能

Page 9: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

3種類のノード

● 管理ノード– クラスターの構成情報を管理– 各種操作を発行

● データノード– データとトランザクションを司る

● SQL ノード /API ノード– NDB ストレージエンジンを搭載した MySQL サーバ

● NDB API を経由してデータノードへアクセス– アプリケーションが SQL ノードを介さず直接 NDB API

を叩くことも可。( API ノード)

Page 10: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

シェアードナッシング= No SPOF

ノードグループ 1

データノード 1

データノード 2

フラグメント 1プライマリ

フラグメント 3セカンダリ

フラグメント 1セカンダリ

フラグメント 3プライマリ

ノードグループ 2

データノード 3

データノード 4

フラグメント 2プライマリ

フラグメント 4セカンダリ

フラグメント 2セカンダリ

フラグメント 4プライマリ

Page 11: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

ひとつコケても大丈夫!!

ノードグループ 1

データノード 1

データノード 2

dead dead

フラグメント 1プライマリ

フラグメント 3プライマリ

ノードグループ 2

データノード 3

データノード 4

フラグメント 2プライマリ

フラグメント 4セカンダリ

フラグメント 2セカンダリ

フラグメント 4プライマリ

Page 12: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

ふたつコケても大丈夫!!

ノードグループ 1

データノード 1

データノード 2

dead dead

フラグメント 1プライマリ

フラグメント 3プライマリ

ノードグループ 2

データノード 3

データノード 4

dead dead

フラグメント 2プライマリ

フラグメント 4プライマリ

Page 13: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

これはアウト!!

ノードグループ 1

データノード 1

データノード 2

dead dead

dead dead

ノードグループ 2

データノード 3

データノード 4

フラグメント 2プライマリ

フラグメント 4セカンダリ

フラグメント 2セカンダリ

フラグメント 4プライマリ

Page 14: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

とりあえずインストール

● パッケージをインストールする● config.iniとmy.cnfを書く● ユーザーやデータディレクトリをつくる● プロセスを起動する

– → → →管理ノード データノード 待つ SQL ノード

Page 15: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

デモ

Page 16: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

パフォーマンスの勘所

Page 17: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

最新のバージョンを使う

● バージョンが新しいほど高速化している!– 6.2

● SQL ノードからデータノードへの接続を複数化– 6.3

● スレッドのバインディング● Distribution Awareness● TC選択のロジックを改善● 主キー /ユニークキーを用いた更新の効率化● 圧縮 LCP/バックアップ● epoll

– 7.0● データノードのマルチスレッド化● メッセージ通信の改善● データノードのオンライン拡張

Page 18: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

最新のバージョンを使う

● つづき– 7.1

● ndbinfo● BLOBへのアクセス高速化

– 7.2● MySQL 5.5● pushdown join● memcachedの追加

– 7.3● MySQL 5.6

– Batched Key Access Join– Semi-Join最適化(サブクエリ)

● 外部キー● NDB APIのボトルネック解消

性能だけでなくバージョンが上がるごとに機能も増えてどんどん便利に!

Page 19: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

非公式ベンチマーク

● 2011/04/11 ( 7.1 )– MySQL Cluster doing 6.82M reads per second

● 8データノードhttp://mikaelronstrom.blogspot.jp/2011/04/mysql-cluster-doing-682m-reads-per.html

● 2011/04/12 ( 7.1 )– MySQL Cluster running 2.46M updates per second!

● 8データノードhttp://mikaelronstrom.blogspot.jp/2011/04/mysql-cluster-running-246m-updates-per.html

Page 20: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

非公式ベンチマーク(つづき)

● 2012/05/16– MySQL Cluster 7.2.7 achieves 1BN update transactions

per minute● 19.5M transactions/s相当● 30データノード、各 8ldmスレッド● http://mikaelronstrom.blogspot.jp/2012/05/mysql-

cluster-727-achieves-1bn-update.html● 2012/05/22

– MySQL Cluster 7.2 achieves 4.3BN reads per minute ● 72M reads/s相当● 30データノード、各 8ldmスレッド● http://mikaelronstrom.blogspot.jp/2012/05/mysql-

cluster-72-achieves-43bn-reads.html

Page 21: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

非公式ベンチマーク(つづき)

● 2012/02/15 ( 7.2 )– 1.05BN QPM using MySQL Cluster 7.2

● 17.5M reads/s相当● 8データノード● 主にスレッドのバインディングによる効果● http://mikaelronstrom.blogspot.jp/2012/02/105bn-qpm-

using-mysql-cluster-72.html

Page 22: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

非公式ベンチマーク(つづき)

● 2012/05/16 ( 7.2 )– MySQL Cluster 7.2.7 achieves 1BN update transactions

per minute● 19.5M transactions/s相当● 30データノード、各 8ldmスレッド● http://mikaelronstrom.blogspot.jp/2012/05/mysql-

cluster-727-achieves-1bn-update.html● 2012/05/22 ( 7.2 )

– MySQL Cluster 7.2 achieves 4.3BN reads per minute ● 72M reads/s相当● 30データノード、各 8ldmスレッド● http://mikaelronstrom.blogspot.jp/2012/05/mysql-

cluster-72-achieves-43bn-reads.html

Page 23: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

スレッド数の調整

● バージョン 7.0以降– MaxNoOfExecutionThreads

● 7.0 〜 7.1 … 最大 8● 7.2 〜 7.3 … 最大 36

– TheadConfig● より細かな指定が可能

– スレッドごとに特定の CPUにバインディング– バインディングするものとしないものの混在が可能

ThreadConfig=ldm{count=4,cpubind=1,2,3,4},\main={cpubind=5},io={cpubind=5},rep={cpubind=6},\tc{cpubind=7},recv={cpubind=8}

Page 24: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

データノードの追加によるスケールアウト

● 主キーを使った検索(ルックアップ)はデータノード数に応じてスケールする

● データノードは最大 48台まで。

SQLノード各データノードに

負荷が均等に分散

Page 25: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

細かい範囲検索が苦手

データノードTC

データノード データノード

SQLノード

1.スキャンリクエスト

2.他のノードへリクエスト

3.データを返送

すべてのデータノードが応答を強いられる

Page 26: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

スキャンの性能特性

● フェッチするレコード数が少ない– データノードが増えてもスキャン回数は頭打ち– 遅い!!

● フェッチするレコード数が多い– データノードで並列処理できるためノード数に応じて処理時間が短くなる

– Engine Condition Pushdownで並列で絞り込みが可能– 速い!!

Page 27: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

Engine Condition Pushdown

データノード

SQLノード

データノード

SQLノード

Pushdownなし Pushdownあり

WHERE 句で絞り込み

WHERE 句で絞り込み

Page 28: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

ユーザー定義パーティション

通常のパーティショニング ユーザー定義パーティショニング

usersテーブル

user_id= 100

user_id= 100

user_id= 100

user_id= 100

user_id= 100

user_id= 100

user_id= 100

diariesテーブル

usersテーブル

diariesテーブル

Page 29: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

ユーザー定義パーティションの効能

● スキャンがスケールアウト– 超重要!!– 特定のデータノードだけに問い合わせれば良くなるため– スケールアウトさせるにはデータノードを追加

● Pushdown Joinにも効果あり

Page 30: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

スキャンの変化

データノードTC

データノード データノード

SQLノード

該当するパーティションのデータノードだけが

応答すれば良い

Page 31: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

レプリケーションによるスケールアウト

データノード

データノード

データノード

データノード

SQLノード

スレーブマスター

INNODBINNODB

スレーブ

INNODBINNODB

スレーブ

INNODBINNODB

更新

SQLノード

SQLノード

JOINアプリケーション

Page 32: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

MySQL Clusterのレプリケーションアーキテクチャ

データノード群

SQL ノード(バイナリログ生成)通常の

SQLノード

通常のSQLノード

通常のSQLノード

SQLによる更新

binloginjectorthread

更新内容を抽出

バイナリログ

スレーブへ

Page 33: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

速いディスク

● インメモリデータベースだけれども・・・– データの永続性のためにたくさんの I/Oが発生する

● 更新をすべて記録する GCP ( REDOログ)● LCP (定期的にメモリのイメージをディスクへ書き出す処理)の速度も重要

● ディスク型テーブル– ディスクの性能に大きく影響を受ける

Page 34: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

sysbenchのサンプル

1 4 8 12 16 32 48 64 96 1280

500

1000

1500

2000

2500

3000

3500

memory ro

memory rw

hdd ro

hdd rw

fio ro

fio rw

1 server machine1 cpu sockets6 cores 12 threads32GB memoryinternal hdd / fusion-iosysbench w/o range tests

Page 35: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

マシンをお借りしました

マシンありがとうございます!!

Page 36: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

BLOBは苦手

● 内部的に BLOB用のテーブルが作成される– JOINが増えるのと同じ

● なるべく使わない– varcharで頑張る(最大サイズをきっちり決める)

● 最大行サイズ 14000バイト– InnoDBと連携

Page 37: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

NoSQLインターフェイス

● SQLよりも数段速い!!– NDB API … C++によるネイティブな API– ClusterJ … Javaバインディング– memcached … ストレージエンジンとして実装– MySQL NoSQL Connector for JavaScript … Javascriptバインディング

● NDB APIが最速● 手軽に使うなら便利なバインディングがオススメ!

Page 38: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

memcached

SQLノード

SQLノード

memcached memcached

N      D      B               A      P      I

データノード群

Page 39: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

まとめ

● MySQL Clusterはこんなときにオススメ!– 更新をスケールしたい– HA機能が欲しい– 超絶高速な JOINが欲しい

● 性能の特性の違いに注意!– 得意、不得意がある– 適切なスケールアウト戦略を選ぶべし!– 豊富な NoSQL API

Page 40: カジュアルにMySQL Clusterを使ってみよう@MySQL Cluster Casual Talks 2013.09

Q&A!!ご静聴ありがとうございました。