20131113_mysql_on_分散fsセミナー資料

39
Kobe Digital Labo, Inc. 岩瀬 高博 Twitter: @okuyamaoo Mail: [email protected] http://okuyama-project.com/ MySQL on 分散FS 〜NOSQLで構築したファイルシステム上でMySQLを動かす

Upload: takahiro-iwase

Post on 04-Jun-2015

817 views

Category:

Documents


3 download

DESCRIPTION

2013年11月に開催されたdb tech showcaseでのMySQLon分散FSセミナーの資料です

TRANSCRIPT

Page 1: 20131113_mysql_on_分散fsセミナー資料

Kobe Digital Labo, Inc.

         岩瀬 高博 Twitter: @okuyamaoo

Mail: [email protected]

http://okuyama-project.com/

MySQL on 分散FS 〜NOSQLで構築したファイルシステム上でMySQLを動かす

Page 2: 20131113_mysql_on_分散fsセミナー資料

自己紹介 ・岩瀬 高博(@okuyamaoo)  > (株) 神戸デジタル・ラボ所属

業務及び活動 >大規模e-コマースサイトのチューニング、運用 >分散処理、データベースの研究及び適応 >(独)情報通信研究機構 特別研究員      研究領域:大規模Webアーカイブ

>分散KVS okuyama、CEP Setsuna の開発   >OSS、Java、DB、車が好き

Page 3: 20131113_mysql_on_分散fsセミナー資料

1.ファイルシステム?

2.NOSQLファイルシステム

3.MySQLを動かす

今日のお話し

Page 4: 20131113_mysql_on_分散fsセミナー資料

ファイルシステムとは?

Page 5: 20131113_mysql_on_分散fsセミナー資料

ファイルシステム? ・そもそもファイルシステムとは?

・内蔵のHDDやSSD、外付けディスク、ネットワーク上の ストレージ(NFS等)などの記憶デバイスを等価的に扱う仕組み。

Wikipediaより

Page 6: 20131113_mysql_on_分散fsセミナー資料

ファイルシステムが利用する機器 ・ファイルシステムが利用しているハードは?

・HDD 最も主流な記憶装置。 内臓する円盤に磁気を散布してそこにデータを記憶。 それを磁気ヘッドと言われる目のようなもので読み込む。

・SSD 徐々に浸透してきている記憶装置 HDDの様に円盤やヘッドなどの稼働部を持たず、 フラッシュメモリにデータを記憶。

・ioDrive 最近特に注目度の高い超高速デバイス。 NANDフラッシュメモリを記憶部に持ち、接続方式を PCIeとすることでSSDを超える速度を発揮する。

Page 7: 20131113_mysql_on_分散fsセミナー資料

ファイルシステムの動き ・どのようにデータを格納しているか?

・ではアプリケーションから書き出されたデータは どのように格納されているか?

Page 8: 20131113_mysql_on_分散fsセミナー資料

ファイルシステムの動き ・どのようにデータを保存しているか?

・すごくおおざっぱに表現すると巨大な配列として 保存されている。

全てバイトデータとして扱い、先頭からあらかじめ決められた サイズ分だけ塊として分割しつつ、配列のように保存していく。

このサイズは最近では4096byteが主流

Page 9: 20131113_mysql_on_分散fsセミナー資料

ファイルシステムの動き ・どのようにデータを取り出すか?

・先ほどの配列に対して位置を指定して取り出す。

ここのデータを取り出す

例えば先ほどのファイルの1バイトから2048バイトを取り出す場合

この2つを取り出す

5000バイトから12000バイトを取り出す場合は?

Page 10: 20131113_mysql_on_分散fsセミナー資料

ファイルシステムが遅い時 ・よくHDDが遅いといわれる原因は?

このように円盤上にデータが 保存されている。 連続してデータを取り出す場合は、 先頭から順にデータを取り出せば よいので、高速に取り出せる。

ではこのように離れた場所のデータを 読み込みたい場合はどうするか? 円盤とヘッドが動いてデータの場所まで 移動しないといけない。 この移動に時間がかかる

Page 11: 20131113_mysql_on_分散fsセミナー資料

ファイルシステムが遅い時 ・SSDはなぜ速い?

SSDはHDDと違い円盤にデータを保存しない。 データを取り出す際に物理的な位置を意識した 移動などの時間をともなわず、データが保存さて いる記憶素子上から即取り出せるため高速。

つまり1つのデータの塊に アクセスするのが凄く速い

Page 12: 20131113_mysql_on_分散fsセミナー資料

分散ファイルシステム ・分散ファイルシステムとは?

・各筐体の持つファイルシステムを束ねて1つの

ファイルシステムに見せる仕組み。負荷分散、容量拡大が出来る

利用 分散FS

Page 13: 20131113_mysql_on_分散fsセミナー資料

NOSQLファイルシステム

Page 14: 20131113_mysql_on_分散fsセミナー資料

NOSQLの特性 ・NOSQL 特にKVSの特性は?

・KVSは1つのデータへのアクセスが速い。

Page 15: 20131113_mysql_on_分散fsセミナー資料

NOSQLの特性 ・例えば分散KVSのokuyamaの性能

・okuyamaは分散しスケールアウトが可能なKVS ストレージにメモリ、圧縮メモリ、ディスクなどが選べる

okuyamaはメモリストレージを利用 メモリで合ってもWALログでデータは永続化される。

サーバ2台で 10万QPS

Page 16: 20131113_mysql_on_分散fsセミナー資料

NOSQLの特性 ・NOSQL特にKVSの特性は?

・これは先ほどのSSDの良いところに似てませんか?

Page 17: 20131113_mysql_on_分散fsセミナー資料

NOSQLの特性 ・KVSは1つのデータの取り出しが高速

・これは先ほどのSSDの良いところに似てませんか?

そこで、okuyamaを記憶装置として利用できる

ファイルシステムを作ってみました

Page 18: 20131113_mysql_on_分散fsセミナー資料

okuyamaとは?

Page 19: 20131113_mysql_on_分散fsセミナー資料

okuyamaとは? ・okuyamaはJavaで実装されたNOSQLの一種

Page 20: 20131113_mysql_on_分散fsセミナー資料

okuyamaとは? ・どのような機能をもっているか?

Page 21: 20131113_mysql_on_分散fsセミナー資料

okuyamaとは? ・どのような機能をもっているか?

分散KVS

・OSS ・完全冗長化(SPOFなし) ・無停止でのスケールアウト ・100台以上のサーバ規模での 稼働実績

ストレージ特性

・非永続型 or 永続型(WALログ方式) ・メモリ or ディスク or メモリ+ディスク  特性別ストレージ ・ストレージ間の互換性 ・仮想メモリ機能 ・独自圧縮機能 ・パーティション機能

アクセス

・独自プロトコル(Ascii) Java、PHP、Ruby用が存在 ・memcached互換 ・CAS、加減算、Multi系も対応 ・バックアップ等のクライアントも有り ・Hadoop連携

データ構造

・Key-Value構造 ・Tagの付与 ・有効期限付きデータ ・全文検索用Index

Page 22: 20131113_mysql_on_分散fsセミナー資料

okuyamaとは? ・どのような機能をもっているか?

分散KVS

・OSS ・完全冗長化(SPOFなし) ・無停止でのスケールアウト ・100台以上のサーバ規模での 稼働実績

ストレージ特性

・非永続型 or 永続型(WALログ方式) ・メモリ or ディスク or メモリ+ディスク  特性別ストレージ ・ストレージ間の互換性 ・仮想メモリ機能 ・独自圧縮機能 ・パーティション機能

アクセス

・独自プロトコル(Ascii) Java、PHP、Ruby用が存在 ・memcached互換 ・CAS、加減算、Multi系も対応 ・バックアップ等のクライアントも有り ・Hadoop連携

データ構造

・Key-Value構造 ・Tagの付与 ・有効期限付きデータ ・全文検索用Index

分散構成を作ることが可能

Page 23: 20131113_mysql_on_分散fsセミナー資料

okuyamaを利用した分散FS ・分散ファイルシステムとして利用する

ファイルシステムとしてokuyamaをマウント出来る仕組みを開発

mount

Page 24: 20131113_mysql_on_分散fsセミナー資料

okuyamaFuse ・FUSEを利用してデータ格納先をokuyamaへ

FUSEとはLinux系のファイルシステムを ユーザプロセスで自由に作成できる仕組み。

okuyamaFs

データは全てokuyamaに格納され、ファイルのメタ

情報なども全て格納される。

Page 25: 20131113_mysql_on_分散fsセミナー資料

MySQLを動かす

Page 26: 20131113_mysql_on_分散fsセミナー資料

MySQL on okuyamaFuse ・Fuseで実装したファイルシステムは

一般的なファイルシステムとして利用可能

mount

okuyamaFuse上でMySQLを動かす

Page 27: 20131113_mysql_on_分散fsセミナー資料

MySQL on okuyamaFuse ・目的は?

・ランダムなアクセスが得意なKVS-FS上で

MySQLを動かした場合の性能を検証。

・検証結果からMySQLのディスクへの

 アクセスプランに最適なFSの検討

Page 28: 20131113_mysql_on_分散fsセミナー資料

・MySQLでの性能測定

Page 29: 20131113_mysql_on_分散fsセミナー資料

テスト内容 ・テスト環境 MySQL稼働環境 ・CentOS6.4(64bit)

・MySQL5.5  > InnoDB  >O_DIRECTオプション利用

  ・Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz ✕ 2 ※物理6Core 仮想 12コア ✕ 2

  ・メモリ64GB

・SATA-7200rpm ✕1 / SSD(Intel DC S3700 Series) ✕ 1

Page 30: 20131113_mysql_on_分散fsセミナー資料

テスト内容 ・テスト環境 okuyama稼働環境(3台) ・CentOS6.4(64bit)

  ・Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz ✕ 2 ※物理6Core 仮想 12コア ✕ 2

  ・メモリ64GB

・SATA-7200rpm ✕1

 これら全てインテル株式会社様、

クリエーションライン株式会社様に

検証用としてご提供頂きました!!

Page 31: 20131113_mysql_on_分散fsセミナー資料

テスト内容 ・テスト内容 ・sysbenchを用いてOLTPテスト(トランザクション回数) ※OLTPテストとは参照系/更新系両方の混在テスト

・MySQLへの同時接続数を2〜100に増やしながら、   1分間当たりのトランザクション回数を測定

・MySQLの”datadir”をSATA、SSD、okuyamaFuseに それぞれに変更し検証

sysbench version 0.4.12を利用    テスト用データは100万件とした

Page 32: 20131113_mysql_on_分散fsセミナー資料

サーバ構成 MySQL on SATA/SSD

MySQL on okuyamaFuse ローカルディスクを見ない

Page 33: 20131113_mysql_on_分散fsセミナー資料

テスト結果 トランザクション/秒

SATAに比べると圧倒的に速い。 SSDに比べると約65%程度の性能

同時接続数

Page 34: 20131113_mysql_on_分散fsセミナー資料

14:38:28.619: read:/mysqldata/ibdata1 offset:109363200 buf.limit:16384 14:38:28.627: read:/mysqldata/ibdata1 offset:102596608 buf.limit:16384 14:38:28.633: read:/mysqldata/ibdata1 offset:139051008 buf.limit:16384 14:38:28.634: read:/mysqldata/ibdata1 offset:107429888 buf.limit:16384 14:38:28.639: read:/mysqldata/ibdata1 offset:168738816 buf.limit:16384 14:38:28.648: read:/mysqldata/ibdata1 offset:168755200 buf.limit:16384 14:38:28.653: read:/mysqldata/ibdata1 offset:117489664 buf.limit:16384 14:38:28.653: read:/mysqldata/ibdata1 offset:117522432 buf.limit:16384 14:38:28.658: read:/mysqldata/ibdata1 offset:117506048 buf.limit:16384 14:38:28.661: read:/mysqldata/ibdata1 offset:137396224 buf.limit:16384 14:38:28.668: read:/mysqldata/ibdata1 offset:126484480 buf.limit:16384 14:38:28.669: write path:/mysqldata/ib_logfile0 offset:3025920 isWritepage:false buf.limit:1024 14:38:28.676: write path:/mysqldata/ib_logfile0 offset:3026944 isWritepage:false buf.limit:1024 14:38:28.677: fsync 14:38:28.724: read:/mysqldata/ibdata1 offset:144719872 buf.limit:16384 14:38:28.725: read:/mysqldata/ibdata1 offset:160104448 buf.limit:16384 14:38:28.732: read:/mysqldata/ibdata1 offset:143097856 buf.limit:16384 14:38:28.736: write path:/mysqldata/ib_logfile0 offset:3029504 isWritepage:false buf.limit:1536 14:38:28.743: write path:/mysqldata/ib_logfile0 offset:3031040 isWritepage:false buf.limit:512 14:38:28.744: fsync

考察 ・結果から実際にokuyamaFuseをデバッグ   IOを全てロギング特性を見る

1行がMySQLからのI/O

Page 35: 20131113_mysql_on_分散fsセミナー資料

考察 ・結果から実際にokuyamaFuseをデバッグ

14:38:28.619: read:/mysqldata/ibdata1 offset:109363200 buf.limit:16384 14:38:28.627: read:/mysqldata/ibdata1 offset:102596608 buf.limit:16384

14:38:28.633: read:/mysqldata/ibdata1 offset:139051008 buf.limit:16384 14:38:28.634: read:/mysqldata/ibdata1 offset:107429888 buf.limit:16384 14:38:28.639: read:/mysqldata/ibdata1 offset:168738816 buf.limit:16384 14:38:28.648: read:/mysqldata/ibdata1 offset:168755200 buf.limit:16384 14:38:28.653: read:/mysqldata/ibdata1 offset:117489664 buf.limit:16384 14:38:28.653: read:/mysqldata/ibdata1 offset:117522432 buf.limit:16384 14:38:28.658: read:/mysqldata/ibdata1 offset:117506048 buf.limit:16384 14:38:28.661: read:/mysqldata/ibdata1 offset:137396224 buf.limit:16384 14:38:28.668: read:/mysqldata/ibdata1 offset:126484480 buf.limit:16384 14:38:28.669: write path:/mysqldata/ib_logfile0 offset:3025920 isWritepage:false buf.limit:1024 14:38:28.676: write path:/mysqldata/ib_logfile0 offset:3026944 isWritepage:false buf.limit:1024 14:38:28.677: fsync 14:38:28.724: read:/mysqldata/ibdata1 offset:144719872 buf.limit:16384 14:38:28.725: read:/mysqldata/ibdata1 offset:160104448 buf.limit:16384 14:38:28.732: read:/mysqldata/ibdata1 offset:143097856 buf.limit:16384 14:38:28.736: write path:/mysqldata/ib_logfile0 offset:3029504 isWritepage:false buf.limit:1536 14:38:28.743: write path:/mysqldata/ib_logfile0 offset:3031040 isWritepage:false buf.limit:512 14:38:28.744: fsync 14:38:28.769: read:/mysqldata/ibdata1 offset:134873088 buf.limit:16384 14:38:28.772: read:/mysqldata/ibdata1 offset:103497728 buf.limit:16384

Readが圧倒的に多い

offsetがバラバラ ※offsetは読み込み開始位置

Page 36: 20131113_mysql_on_分散fsセミナー資料

まとめ ・okuyamaをファイルシステムにしてみた結果

・ランダムな書き込み、読み込みが発生する場合は SATAよりも高い性能が見込めることはわかった okuyamaサーバが複数台のためIO分散されている。

・データベースのIOを細かく調査出来るため、 利用シーンに合わせてチューニング出来る可能性がある ※今回のテストではReadが多いため、okuyama側の Readチューニングが効果的など

 ・NOSQL(分散KVS)を余すこと無く利用するこんな構成も

Page 37: 20131113_mysql_on_分散fsセミナー資料

アプリケーションキャッシュ

AP サーバ

こんな構成も?? okuyamaFuseをマウントし構築 ローカルディスクレスなども

APキャッシュとしてMemcached等の 代わりにokuyamaをそのまま利用

mount

Page 38: 20131113_mysql_on_分散fsセミナー資料

最後に ・Information Web   http://okuyama-project.com/

Development http://sourceforge.jp/projects/okuyama/

Facebook http://www.facebook.com/okuyama.jp okuyamaとokuyamaFuseは全てオープンソースで公開しています

Page 39: 20131113_mysql_on_分散fsセミナー資料

Thank you!