パネルディスカッション MySQLの独自性と優位点 - MySQLカンファレンス2007


MTVでMySQLをどう使っているか?

  • MTV JAPAN patrick Bolduan,
  • 開発環境でかなり使っている
  • オープンソースを利用していきたい
  • 使いやすい。MySQLはフリーなので迅速に仕事ができる。ベンダーと交渉がいらない。ダウンロードしてすぐ使える
  • 開発環境をロールアウトしてプロダクションで使えるのがよい

なぜMySQLを使うことにしたか?

  • MTV JAPAN patrick Bolduan,
  • 個人的に他のオープンソースとともに8〜9年使っていた
  • MySQLに親しんでいた。MTVに移ってからもそれを使い続けたかった

安定性、パフォーマンス、使いやすさについて、MTVの例についてどのように考えているか

  • MySQL AB Monty,
  • もう使っていたということで追加努力が必要なかった
  • 一番は使いやすさではないだろうか
  • patrick,
  • Yes.

MySQLエンタープライズ分野においてどこが違うのか

  • MySQL AB Brian Aker,
  • GUIが日本語を含めて国際化されている
  • いろいろ

テクノロジーに関して

MySQLプロキシってなに?

  • MySQL AB Monty,
  • MySQLサーバーの前に置いて、
  • ロードバランシングができる
  • クエリのリライトができる
  • ロギングができる
  • カスタマイズしやすい

MySQLプロキシはなぜフリーにしたのか?

  • CEO Marten,
  • オープンソースでフリーなほうが優れたものになると思った
  • フリーであってもビジネス上の意味を引き出すこともできる

優先順位が低くなった項目はあるか?

  • 現在はコミュニティではないだろうか
  • 司会;異議あり。製品についての優先順位を。
  • Monty,
  • 新しいフューチャーのフィードバックを受けて...(答えになってない?)

フューチャーについて

5.1のフューチャーに興味は?

  • MTV patrick,
  • 開発リソースは限られている
  • 新しいのに行く前にテストしたい
  • 開発コミュニティからの強いプッシュはあるだろう
  • MySQL AB Brian Aker,
  • テストケースの数が増えている
  • 5.0から5.1で2倍になった
  • テストケースのドキュメント化はされていない
  • MTV patrick,
  • テストケースがどれだけ多くても確認は必要だ

XAMPPについてお話ください

  • XAMPP Kai Seidler,
  • XAMPの概略
  • テストは非常に時間がかかる
  • 我々のパッケージは非常に短時間でセットアップできる

あなたの関心は?

  • いろいろやってきたが半分ぐらいはインストールについてだった
  • ダウンロード数は?
  • 5年くらいやってきたけど...現在月々40万ぐらい

XAMPPはMySQLと対立になる?

  • CEO Marten,
  • 間に入るだけで対立にはならないよ

普及率について

  • 長所の一つとして接続/切断が簡単
  • 今まではコネクションのコストは低くなかった
  • MySQLでブログも簡単に作れるようになった

コミュニティについて、どのようにスタートした?

  • XAMPP Kai Seidler
  • もう覚えてないけど...
  • 2,3年前かな..バグトラックもあったし...
  • MySQLはほとんどバグが無くてコンパイルもやりやすい
  • 使い勝手がよいのでむしろ一緒にやらなくてもできる
  • MySQL AB Monty,
  • 実務的なものにしていこうと、リリースしていった
  • できる限りメールに返答していった

ユーザーとしてどう?

  • MTV Patrick
  • コマーシャルな関係になったわけだけど...(以下よくわからず)

コミュニティから何を得られる?

  • MTV Patrick,
  • 同じ目的の人々がコミュニティに参加していることは安心できる

MySQLのビジネスモデルの独自性は?

  • CEO,
  • コミュニティは時間を使ってサポートを得る
  • 時間を使いたくなければ、お金を出してサポートを得る

バーチャルな企業だけどどう?

  • Brian Aker,
  • ちゃんと小切手で給料もらってるからバーチャルじゃないよ(笑)
  • どこでも仕事ができる。自宅で、砂浜で

分散していることのメリットデメリットは?

  • CEO,
  • もともとグローバルになろうと初日から始めた
  • Googleと重なるところはある
  • 世界中から優秀なエンジニアを集めることができる

日本について

  • CEO,
  • 3年前に日本は重要だと思った。投資が必要だ
  • 東京にオフィスがあるがたとえば北海道からももちろんOK。バーチャルな会社だから

質疑応答

  • Oracleとかと比べることは意味ないの? どんな比較でもいいんだけど...
  • CEO 同じ速度がでるかは比較できる
  • Monty
  • Brian 技術的には根本的に違う。ストレージを切り替えることができるとか
  • Patrick Oracleはセットアップはうまくいくけど、頭痛がする。認定された人がいないといけない。PHPOracleをつなぐのに4日かかったりする。複雑すぎて。MS SQLは、Windowsを買い足さないといけない。Apacheを動かすのはそれほどでもないけど、DBになるとODBCのドライバーを探さないといけない。セットアップが難しい。
  • XAMPP Kai Oracleを使うときは知っている人を探さなくてはいけない。

国内大手メディア企業における MySQL Cluster 導入事例 - MySQLカンファレンス2007

http://www.mysql-ucj2007.jp/details/j21.html

MySQL Clusterとは?

  • 4.1から標準で利用できるようになっている
  • 高可溶性を目的としている
  • 共有ディスクを必要としない
  • RAIDの0/1をイメージしてもらえばいい
  • 現在はUnix/Linux系のみ対応
  • データ処理を複数ノードで分割
  • データは全ノードで同期

クラスタ構成案

MySQL+DRBD

  • 今、MySQL社がイチオシ
  • Linux用のノード間データコピー
  • MySQL社が作ってるわけじゃないけど
  • Heartbeatなどクラスタリングツールと併用
  • 共有ディスクが不要なActive/Standby構成

3rdベンダ製HAソフト利用

  • 共有ディスクにデータを格納
  • たとえばLifekeeper

MySQL Cluster

  • オンメモリDBの内容を双方向コピー
  • MySQLの標準機能
  • 共有ディスクが不要なActive/Active
  • オンメモリデータベースとして動作し、データは完全同期

MySQLアーキテクチャ概要

  • 接続管理/セキュリティ -> パーサ、オプティマイザ、実行、キャッシュ -> ストレージエンジン
  • データ管理機能のストレージエンジンを選択可能
    • クラスタもエンジンの一つ"ndbcluster"として実装

SQL層とデータ層の分離

事例:某メディア企業 情報サイト

記事データ管理データベース
  • DBはPCサーバ2ノード構成
  • MySQLサーバとデータノードが同居
    • 簡易構成ながら冗長性を確保
    • 参照系データはMySQLサーバ上のMyISAM
    • 更新系データはデータノード(ndbcluster)
  • システムの特徴
    • 参照が大半 コメント書き込みの更新あり
    • クエリはシンプル
    • 企業ブランドにとってクリティカルなシステム

システム構成概要

  • ロードバランサ/Webサーバにより、APサーバへのアクセスを制御し、DBの負荷を分散
  • APサーバからはConnector/Jのフェールオーバー機能を利用して耐障害性を確保
  • DBサーバはPCサーバ2台、共有ディスクは無し
  • オンラインで更新されるデータは、NDBDプロセス上のテーブルに配置
  • 参照のみのデータは書くサーバのMysqldプロセス上のMyISAMテーブルに配置
  • ...

APサーバ障害の場合

MySQLサーバ障害の場合

データノード(ndbdプロセス)障害の場合

MySQL Cluster導入メリット

  • コストメリット
    • 外部ストレージ不要 (50万円前後以上)
    • クラスタソフトウェア不要(50万円前後以上)
    • 外部ストレージありの場合、障害発生の可能性がある箇所が増加し設計、テストの工数が増加。外部ストレージの冗長化構成が必要なケースも
  • 設計の横展開可能
    • シンプルな構成なので他システムでも利用可
  • スケールアウト構成
    • 必要な箇所だけサーバを塚することで、柔軟なシステム拡張が可能。ただし、データノードの追加時は要検証。

MySQL Clusterで大変だったこと

  • ソフトウェア品質は要改善
  • 複数の致命的なバグ(signal 11発生など)に直面
  • その後のバージョンでは改善傾向
    • Bug #25668 (mysqldダウン) 5.0.36にて修正
    • Bug #26176 (Signal11発生) ...
    • ...
  • パフォーマンス
    • WHERE句つきのSELECT文が遅いことがある
      • INDEX無しのカラムを検索すると遅い
      • engine_condition_pushdouwn=ON で改善
    • JOINの多いSQL文で性能問題
      • 使用上の制限。一部のクエリを修正して回避
    • パラメタチューニング(特にチェックポイント関連)が複雑
  • データ量の制限
    • オンメモリデータベースであるため、64bit版サーバの利用検討

まとめ

  • 安価で手軽に使えるクラスタソリューション
    • PCサーバとMySQLだけでOK
    • 2台でも十分な可用性
  • 広がる用途と可能性
    • アプリケーションの変更はほとんど不要
  • 技術サポートは有償で提供中

質疑応答

  • オンメモリからの書き込みのタイミングは?
    • ディスクにバイナリログで書き込まれているので、そこから復旧は可能
    • ときどき書き込み
    • もうちょっと検証が必要
  • システム電源が一気に落ちたときはどうなる?
    • やってみましょう(笑)
  • 同時更新の制御は?
  • データ量の限界は?
    • そんなに大きなデータで検証はしてない
    • テスト上一番大きいときで4GBでした
  • インターネット上でMySQL Clusterをセットアップした経験はあるか?
    • やってない
    • 現在、それは想定して作られていないと思われる

MySQL Cluster 入門 & 詳細解説 - MySQLカンファレンス2007


MySQL Clusterとは?

  • MySQL Clusterは、ストレージエンジンである
  • 高可用性
  • ハイパフォーマンス
  • インメモリ
  • Shared Nothing
  • クラスタ
  • ストレージエンジン

高可用性

  • 99.999% Uptimeのために設計されている
  • ノーロックで、オンラインバックアップ
  • NoOfReplicas

ハイパフォーマンス

  • Not BEGIN to COMMIT Through Parallelism
  • ひとつのトランザクションを速くするのではなくシステム全体を速くする
  • インメモリ (4.1 and 5.0)
  • メインメモリにインデックス
  • Check point to disk
    • フレキシブルで設定も十分できる

Shared Nothing

  • 安いハード
  • 安い接続(イーサネットなど)
  • 高価なShared Diskは不要

クラスタリング

  • 全てアクティブ

ストレージエンジン

  • ENGINE=NDBCLUSTER

何がMySQL Cluster?

  • Data Nodes
    • Nodegroupが2つ <= NoOfReplicas=2
  • RAID1のようにパラレルにデータを返す
  • Management Server(ndb_mgmd)
  • SQL Nodes (mysqld)
    • sometimes called API nodes

マネジメントサーバーの設定例

[ndbd default]
NoOfReplicas= 2
DataMemory= 400M
IndexMemory= 32M
DataDir= /usr/local/mysql/cluster

[ndbd]
HostName= 192.168.0.40

[ndbd]
HostName= 192.168.0.41

[ndb_mgmd]
DataDir= /usr/local/mysql/cluster
HostName= 192.168.0.42

[mysqld]
[mysqld]
[mysqld]

基本的なモニタリング

$ /usr/local/mysql/bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1 (not connected, accepting connect from 192.168.0.1)
id=2    @127.0.0.1 (mysql-5.1.19 ndb-5.2.3, Nodegroup: 0, Master)

[ndb_mgmd(MGM)] 1 node(s)
id=3    @192.168.0.1 (mysql-5.1.19 ndb-6.2.3)

[mysqld(API)]   6 node(s)
id=4   @192.168.0.1 (mysq-5.1.19 ndb-6.2.3)
id=5 (not connected, accepting connect from any host)
id=6 (not connected, accepting connect from any host)
id=7 (not connected, accepting connect from any host)
id=8 (not connected, accepting connect from any host)
id=9 (not connected, accepting connect from any host)
$ /usr/local/mysql/bin/ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=1    @127.0.0.1 (mysql-5.1.19 ndb-6.2.3, starting, Nodegroup: 0)
id=2    @127.0.0.1 (mysql-5.1.19 ndb-6.2.3, Nodegroup: 0, Master)

[ndb_mgmd(MGM)] 1 node(s)
id=3    @192.168.0.1 (mysql-5.1.19 ndb-6.2.3)

[mysqld(API)]   6 node(s)
id=4   @192.168.0.1 (mysq-5.1.19 ndb-6.2.3)
id=5 (not connected, accepting connect from any host)
id=6 (not connected, accepting connect from any host)
id=7 (not connected, accepting connect from any host)
id=8 (not connected, accepting connect from any host)
id=9 (not connected, accepting connect from any host)

CREATE TABLE

CREATE TABLE t1 (
  pk1 INT PRIMARY KEY AUTO_INCREMENT,
  v   VARCHAR(100)
) ENGINE=NDB(NDBCLUSTER);

SHOW CREATE TABLE

mysql> SHOW CREATE TABLE t1\G
*** 1. row ***
       Table; t1
Create Table: CREATE TABLE `51` (
  `pk1` int(11) NOT NULL AUTO_INCREMENT,
  `v` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`pk1`)
)ENGINE=ndbcluster DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

Don't see ENGINE=NDB?

  • SHOW WARNINGS is your friend

Clusterで問題がおきたときは

  • Cluster Logをチェックする
    • ログで90%の確率で原因がわかる
    • On Management Server, ndb_X_cluster.log
  • 設定をチェックする
  • ネットワークやファイアウォールをチェックする

MySQLクラスターを使う

  • ENGINE=NDBCLUSTER or ENGINE=NDB

レプリケーションと同じじゃないの?

Cluster vs レプリケーション

標準的なスペックについて

  • 参照キーはなし
  • フルテキストインデックスはなし

ノードの復旧

  • 新しいマシンを用意する

Node failureの場合はトランザクション

  • 続行している。

mysqlサーバーが壊れたら

  • APはもうひとつのmysqlサーバーへ接続しにいく
  • ロードバランシングと同じ

冗長構成

  • Management Serverを増やしてもいいけど管理者の負担も増えるよ

ポイント

  • Stableがあり、developmentもある
  • MySQL Clusterの認証がある。日本語はまだですごめんなさい
  • 新しい知識が必要
  • ハイパフォーマンスを考慮

詳細解説へ続く。

通信について

  • 通常はイーサネット
  • めちゃ安いから
  • しかし最速ではない
  • ギガビットイーサで十分なパフォーマンスが出る

ハートビート

  • Between data nodes and API nodes
  • ハートビートが足りないときはそのノードがダウンしていると判断する

テーブル

  • テーブルにはすべてPRIMARY KEYがある
  • HASHアルゴリズムを採用する
  • インデックスは3種類
    • primary index
    • unique hash index
    • orderd tree index

(ディスク、メモリ)スペース使用量への配慮

  • 5.1では可変カラムをサポートした
  • インデックスが多いとメモリ食うよ
  • インデックスの無いカラムをディスクのみに保存することもできる
  • ディスクカラムは固定サイズ
  • ストレージ要件は予測可能
  • ndb_size.pl
    • レポートを出してくれる

(ここでしばらくトピック化できる話じゃなくなってきたので深い眠りへ...)

質疑応答

  • ノードの追加はどうするのか?
    • ダイナミックなノード追加は今のところできない
    • 現在での代案としては、別のノードグループを作ってレプリケーションしてSwitchする

MySQL 5.1 の詳細解説 - MySQLカンファレンス2007


Table/Index パーティショニング

  • 全てのエンジンで使えるようにした
  • 5.1で実現

パーティショニング例

レンジパーティショニング

ハッシュパーティショニング

キーパティショニング

リストパーティショニング

サブパーティショニング

パーティショニングで90%短縮!


フルテキスト/プラグイン Enhancements

  • 2004年、Sennaがやってきた

XML Xpath サポート

  • 5.1で実験的に。
  • Address parts in XML document
  • Allows manipulation of
    • Strings
    • Booleans
    • Numbers
  • Models XML document as tree of nodes

XPath


RSSでのXPath


アーカイブエンジン Enhancements

  • I/Oのオペレーションが2倍になった
  • メモリの要求が少なくなった
  • AUTO INCREMENTをサポート
    • Unique key support
    • Non-unique key support

MySQL Cluster Disk-Based Data


Row-Based Replication

  • New replication option - statement-based replication retained
  • Handles all replication scenarios (daterministic, etc.)
  • Safest from of replication
  • Common to most other RDBMS's
  • Statement-based approach still available
  • Mixed mode available thet does statement and row-based replication

タスクスケジューラ

  • New object - "Event"
  • Create one-time or recurring tasks
  • Execute SQL, block of SQL, or stored procedure
  • Multiple threads used for task execution
  • Can kill running task
  • Only supported via row-based replication

イベント例




Alterの高速化、インデックスの追加削除の高速化

インポートの高速化

  • New option for mysqlimport utility
  • --use-threads option allows DBA to specify multiple threads
  • Particularly well-used by MySQL Cluster

データベースの管理性

  • SHOW PROCESSLIST command now system table
  • General and Slow Query Log now system tables
  • Can easily query tables to find all or just inefficient SQL
  • General/Slow Query Log use CSV engine and can be read by MS Excel

New Performance/Load Testing Utility

  • その名は "mysqlslap"
  • Simulates many concurrent connections to MySQL server
  • Repetitively runs designated SQL load
  • Can test multiple engines
  • Performs creation of test schema and population of data

MySQLSlap例

  • ab(apache bench)と同じルック&フィール


memcache Engine

HTTP Engine


質疑応答

  • EventでOptimizeするのあぶなくない?Optimazeは何か改善されたの?
  • オーバーヘッドについて

InnoDB のパフォーマンスチューニング - MySQLカンファレンス2007


(「InnoDB」は「いんのでーびー」と言うらしい...今まで「いのでーびー」と言ってました)

InnoDBをなぜ使うか

クラッシュリカバリ

  • MyISAMはデータ量の増大とともに時間がかかる
  • InnoDBはデータ量の増大との相関がない

InnoDBチューニングの王道的アプローチ

  • クエリを改善して全体的に処理効率を上げる
  • データサイズをできるだけ小さく
  • メモリをできるだけ多く積む

コミット性能(同期書き込み)

  • innodb_flush_log_at_trx_commit=1,0,2
    • 0 1秒ごと
    • デフォルト:1 コミットのたびに同期書き込み
    • 2 1秒またコミットのたび
  • マスターは1を推奨

同期書き込みのパフォーマンス

  • fsync() (あるいはO_SYNC + write, fdatasync()) の速度に依存
  • ディスクに対する同期書き込み1回の所要時間
    • シーク待ち時間 4ms
    • 回転待ち 4ms
    • 転送時間 1ms
  • 合計 9ms

同期書き込みのパフォーマンス向上

  • ライトキャッシュの使用
  • トランザクション間隔を適切にとる
    • 「1件ごとにコミット」は避ける
  • グループコミット機能
    • DBの機能
    • ある時間内に同時にきたコミットをいっぺんに同期書き込み
    • 5.0でのInnoDBは、バイナリログと併用するとグループコミットがきかない

テーブル設計やSQLの記述はきわめて重要

  • SQL文の実行計画には注意する
    • インデックスの効果的な利用
    • 複雑なSQL文をシンプルにする
    • EXPLANの結果に気を配る
  • サマリーテーブルの導入などは効果的

よくある問題

  • 主キーは重複しないようにUUIDにした
  • とりあえずインデックスつけた
  • ...

クラスタインデックスと主キー

  • クラスタインデックス
    • 主キー値をキーに、残りの列値を全て取得
  • セカンダリインデックス
    • インデックス値をキーに主キー値を取得
    • クラスタインデックスから...
  • このため、主キー検索は高速になり、それ以外のインデックスによる検索の性能は落ちる

クラスタインデックスの特性を生かす

  • 主キーは必ず定義する
  • 可能な限り主キーでLookupする
  • INSERT系処理は、主キー値を昇順に割り当てる
  • 主キーそのものの更新はコストがかかる
    • 設計上もよくない
  • 主キーのサイズは小さくする
    • セカンダリインデックスのサイズに影響する
    • UUIDよりも整数型
    • AUTO_INCREMENTについては注意が必要
  • セカンダリインデックスだけで完結するクエリを書く

AUTO_INCREMENTとスケーラビリティ

  • InnoDBのAUTO_INCREMENTの実装
    • テーブルロックを一時的にかける
    • 同時INSERTが増えれば競合により性能が落ちる
    • 明示的に値を割り当てる場合でも同様
  • MySQL5.1で実装の変更

巨大な列の扱いには注意

  • InnoDB Buffer Poolには全ての列が読み込まれる
  • ので、Text型は分けたほうがよいときがある

メモリ領域を有効に使う(ヒット率を上げる)

  • SELECTで列名指定しなくてもInnoDBバッファプールには読み込まれる
    • MySQLサーバからクライアントには返されない
  • 1対1関連が効果的な場合がある

データ型と文字エンコーディング

  • 内部的にMEMORY(またはMyISAM)のテンポラリテーブルを作ることがある
    • EXPLAINで"Using temporary"と出る場合
    • 主にグループ関数を使う場合にこのパターンになる
    • TEXT/BLOGを含む場合はMyISAMになる
    • tmp_table_size, max_heap_table_size(デフォルト16MB)
  • MEMORYは実際の列値ではなく、定義したデータがたぶんだけメモリを確保する
  • 文字コード変換はCPUを使うのでできるだけ避ける

RDBMSとメモリ領域に関する一般論

  • 全体論(特に読み取り)に関して
    • OSキャッシュは汎用的である一方、RDBMSのキャッシュはRDBMS用に最適化されている
    • RDBMS cache <-> OS cacheのやりとりはコストがかかるので避けられるなら避けた方がよい
    • だからRDMBS cacheを活用した方が速いはず
  • 更新に関して
    • RDBMSのキャッシュサイズと、チェックポイントの頻度には強い相関がある
    • 高頻度のチェックポイント...

innodb_buffer_pool_size

  • パラメータの意味
    • InnoDBバッファプールサイズ
    • デフォルト8MB
    • Dirtyな(更新された)領域の合計がこの値に近づくとチェックポイント
    • Dirtyでない領域は、サイズが圧迫されるとたんに退避される
  • 設計指針
    • デフォルト値は少なすぎる
    • InnoDB専用構成であればRAMの7〜8割を割り当てて良い

チェックポイントに影響のあるパラメータ

  • innodb_log_file_size(5MB), innodb_log_files_in_group(2)
    • デフォルト少なすぎ
  • innodb_max_dirty_pages_pct(90)
    • パーセント単位
    • この値を上回ると強制的にチェックポイント
    • 通常デフォルトでok
  • innodb_doublewrite(ON)
    • 保険でディスクに2回書き込む方式
    • リカバリの確実性をあげる実装

InnoDBとロック生業

  • 行レベルロック
  • SELECTはロックをかけない
  • ロックエスカレーションは発生しない
  • Next-Key Lockingによる不整合防止

Next-Key Locking

  • InnoDBログファイルとバイナリログの不整合を防ぐために必要な実装

Next-Key Lockingの無効か

  • innodb_locks_unsafe_for_binlog
    • Next Key Lockingを無効化する
    • Statementベースのバイナリログだと、不整合を起こす危険がある
    • ...
  • MySQL 5.1
    • 分離レベルをREAD COMMITTEDにすることと、バイナリログを「Row Based」にすることで無効化できる

その他のパラメータ

  • innodb_thread_concurrency
    • innodb内部でのスレッド数
    • デフォルト8
    • マルチコアCPUのスケーラビリティ問題は5.0.30で大幅に改善
    • 0にすることで最大のスループットを得られることが多い
    • 接続の増加によって急激に落ちるようであれば、4〜20程度で調整すると良い
  • innodb_support_xa
    • バイナリログとInnoDBログファイルの同期をとる(2相コミット)
    • 5.0から
    • デフォルトON
  • innodb_autextend_increment
    • 単位時間あたりのデータほげほげ
    • デフォルト8MB すくない
  • innodb_file_per_table
    • テーブルごとにファイルを作成
    • デフォルトoff
  • table_cache
    • 同時実効性をあげるための重要なパラメータ
    • 目安は 同時接続数 x テーブル数
    • 1024〜2048が一般的
  • thread_cache
    • 切断した後に、再接続を軽いコストでできるようにするためのキャッシュ
    • コネクションプールを使わない場合に効果的
    • 数百程度にすることも珍しくない

5.1での変更内容

  • AUTO_INCREMENTの同時実効性の向上
  • 透過的なテーブルの圧縮(オプション)
    • row_format=COMPRESSED engine=InnoDB
    • CPU使用率が若干増加す
  • インデックスの追加/削除が高速になる
    • 5.0までは1行1行処理してた
    • 5.1からはインデックス領域だけの再作成ができるようになった
    • 6.0ではオンラインで再作成の予定
  • Next Key Lockignの無効か
  • ...

シャットダウン時間の短縮

  • シャットダウン時に行われる処理
    • InnoDBバッファプール全領域のチェックポイント
  • シャットダウン時間の短縮方法
    • SET GLOBAL innodb_max_dirty_pages_pct=0;
    • しばらくまつ
    • SHOW GLOBAL STATUS like 'innodb_buffer_pool_pages_dirty';
      • この値がゼロに近づく(十分に小さくなる)のを待つ
    • mysqladmin shutdown

ALTER TABLE, LOAD DATAの高速化

  • SET GLOBAL ...trx_commit=0
  • 処理
  • 1

大量の更新処理

  • InnoDBはDELETEやUPDATEが行われてもすぐには削除しない
  • Purge用のスレッドが物理的な削除を行う
  • 更新処理の負荷が非常に高いと、Purgeが追いつかないことがある
    • SHOW INNODB STATUSの,"TRANSACTIONS"を見る
  • 多少性能を落として安定させることもできる
    • innodb_maxDirty_pages_pctを低い値にする
    • ...

マスターでは耐障害性、スレーブでは性能を追求

  • innodb_flush_log_at_trx_commit
    • マスター1
    • スレーブはほとんどのケースで0でおk
  • innodb_log_file_size
    • チェックポイント時間に影響
    • 大きめにとる
    • ...

マスターInnoDB、スレーブMyISAM/MEMORYの是非

  • スレーブが途中で止まったときの対処に留意する
  • SQLスレッドからの更新があるので、実際には参照オンリーではない
    • ALTER TABLEや巨大なUPDATEは、MyISAMだと参照をブロックしてしまう

ハードウェア選択

  • メモリ
    • 最も重要
    • 64bitがほとんど
    • 16GBめずらしくない
  • ディスク
    • RAID 1+0
      • 5は書き込み主体のアプリケーションに向かない
    • RAIDチャンクサイズ(ストライピングサイズ)
      • 最小I/O単位である、InnoDBのブロックサイズは16KB
      • 小さいチャンクサイズだと、1回の読み書きで複数のディスクにまたがった処理が必要
      • →トータルのランダムI/Oサイズが増え、スループット低下
      • 256KB程度が典型的
    • ライトキャッシュ+バッテリーバックアップ

InnoDBがハードウェアを生かし切るために - MySQLカンファレンス2007

  • コアだよ
  • ソース変更しちゃうよ
  • 資料はダウンロード可能になるよ

多CPUの有効利用について

  • 基本方針は「不要な待ちを発生させない」
  • 排他の期間は極力短い方がよい。
  • マルチコア(マルチCPU)の恩恵は5.0.30を使わないと受けられない(Buffer Poolの排他制御において)

(コアすぎてまとめられない!)

RAIDの有効利用について

  • 基本方針は「遠慮せずに読み書きする」
  • 書き込みはとにかく遠慮せずにどんどん書き込む
  • 読み込みは並列にどんどん読み込む

レポートはこれで終わりです。ほぼリアルタイムで打ち込んでほとんど校正してないのでtypoだらけかもしれません。指摘があればゆるりと直していきます。

ありがとうございました。