akiyan.com 管理人メモ
2007-09-11 MySQLカンファレンス2007 1日目 リアルタイムレポート
注:このレポートはかなりの割合でスライドの内容の写しで、ときどき話していることを絡めています。まとめがすごいんじゃなくてプレゼンスライドの内容がすごくまとまってるってことですよー
MySQLユーザーカンファレンス2007に来ています。会場カコヨス!
Matz氏登場 - MySQLカンファレンス2007
- こんにちは。Rubyのまつもとです。
- MySQLに詳しくないのに、どうしても断れないコネクションを通して依頼されたので来ました(会場笑)
- MySQLのことはわからないからオープンソースについて話すよ
- ソフトウェアが無価値だった牧歌的な時代の話から
フリーソフトウェア
自由なソフトウェア
- 実行する自由
- 学習する自由
- 修正する自由
- 再配布する自由
is GPL.
オープンソース(1998)
マーケティング用語
Just for Fun - それが僕には楽しかったから : Linus Torbalds
Linux
オープンソースOS
MySQL
- 高機能より高性能
- OSSビジネスの成功例
- MySQL AB
LAMP
- Linux
- Apache
- MySQL
- Perl/Python/PHP ... Ruby
Ruby
Ruby on Rails
- 高生産性
- 「仕事にも使えるかも」
From Java to Ruby
エンタープライズOSS
昔
- 信頼できない
- 理解できない
- 使えない
現在
- 「案外、使えるかも」
- 「普及してる」
- 「活用してる」
- 主要なコンポーネント
- 欠かせない
- 成功への鍵
MySQL高可用性ソリューションの概要 - MySQLカンファレンス2007
高可用性とは?
- 障害が発生してもシステム内のリソースが利用可能な状態に保たれること
- カテゴリは2つ
- ハーウェア
- ソフトウェア
- 連続化要請
- 無停止サービス
- フェイルオーバ時もサービスを中断しない
- 非常に高水準の可用性(不必要なことも多い)
- フォールトトレランス
- SPOF(Single point of failure)
- フェイルオーバ
高可用性の要件と必要考慮事項
スケールアップとスケールアウトの違い
MySQLはスケールアウト型
- スケールアップ
- 垂直的
- 高価
- スケールアウト
- 水平的
- OSS
レプリケーションとは?
クラスタリングとは?
- あるコンポーネントに問題が起こると、冗長ノードがサービスを提供
MySQL Clusterの解説
- スライド中心なので割愛
- スライドはダウンロード公開されるはず
DRBDおよび Heartbeat による高可用性MySQL:MTVジャパン、モバイルサービス - MySQLカンファレンス2007
MTV Flux/MTV Mobile DB projectにおけるMySQL構成の話
- Master/Slave
- MySQL Cluster
- MySQL社から「まだやらないほうがいい」と言われた(会場笑)
DR:BD/Heartbeat HA Master 構成
- スケール的にはSingle Masterよりちょっといい
- アプリに関して
- Single masterとほぼいっしょ
- フェイルオーバーが十分早いのでたいした影響がない
- Heartbeatに関して
- 設定が大切 間違えの余裕がない
- peerの接続が特に注目点
- 本番化する前にテスト
- mysqld
- ノード移管が簡単
- プライマリとセカンダリのmysqlを同時起動しないことが大切
- Heartbeatにおまかせ
- DR:BD
よかったこと
悪かったこと
MySQL パフォーマンスチューニング&ベンチマーク - MySQLカンファレンス2007
http://www.mysql-ucj2007.jp/details/e13.html
Agenda
- An introduction to Benchmarking
- data structures
- query optimisation and query cache
- etc..
Why Benchmark?
- Allows tracking of performance over time
- application
- SQL snippet
- ..
- You get load and stress information
- ever wondered if for the job InnoDB or MyISAM would be better? Or if running on Linux or FreeBSD made more sense?
The Good Scientists Guide to Benchmarking
- The scientific method suggests changing only one variable at a time
- The scientific method suggests repetition, more than once to verify results. If results vary greatly, think about taking averages
- Repeat, rinse , repeat , rinse!
- 少なくとも3回は。
The Good Scientists Guide to Benchmarking II
- Isolate your environment
- Use a different MySQL instance
- Savle all configurations!
Benchmarking Tools
- super-smack
- Flexible tool for measuring SQL script performance
- mysqlslap (like ab; in MySQL 5.1)
- MyBench
- SysBench
- For raw comparisons of different MySQL versions/platforms
- Apache Bench
Benchmarking Tools II
- SHOW commands in MySQL
- SHOW PROCESSLIST | STATUS | INNODB STATUS
- SHOW PROFILE - in 5.0.37 and above, Community Contribution, Linux only
- EXPLAIN and the Slow Query Log
- MyTop
- vmstat/ps/top/gprof/oprofile (and contents of procinfo)
Slow Query Log
- log_slow_queries=/var/lib/mysql/slow-queries.log
- long_query_time=2
- Then, use mysqldumpslow
- In 5.1, you can log these details ...
-
-
EXPLAIN basics
- Provides the execution plan chosen by the MySQL optimiser for a...
「オンラインで読んで」
EXPLAIN columns
- select_type
- table
- ...
「オンラインで読んで」
Scans and seeks
- A seek, jumps into a random place to fetch needed data.
- A scan will jump to the start of the data...
When do you get a full table scan?
- No WHERE conditions
- No index on any field in WHERE condition
- When your range returns a large number of rows, i.e. too many records in WHERE condition
- Pre-MySQL 5, using OR in a WHERE clause
- SELECT * FROM
Subqueries
- Don't use them; replace with a JOIN
- unique_subquery: results are known to be distinct
- index_subquery: otherwise
- Co-related subqueries are worse
- ...
Indexes
Good Schema Practice
- Use small data types
- Is a BIGINT really required?
- Small data types allow more index and data recoreds to fit into a single block of memory
- Normalise first, de-normalise later
- Generally, 3NF works pretty well
正規化しすぎない。
Storing IP addresses
- IP addresses always become an INT UNSIGNED
- Each subnet corresponds to an 8-byte division of the underlying INT UNSIGNED
- From string to int? Use INET_ATON()
- From into to ...
Query Cache
- スライド
- たくさんのストレージエンジンがある
- Understand your applications read/write ratio for most effective use
- Compromise between CPU usage and read performance
- Remember that the bigger your query cache, you may not see better performance, even if your application is read heavy
Query Cache Invalidation
キャッシュの無効化
- Coarse invalidation designed to prevent CPU overuse
- ...
- Thusm any modification to any table referenced in the SELECT will invali...
Choosing a Storage Engine
- MySQLs strong point: many engines MySQLはたくさんエンジンがあるよ
- Use InnoDB for most operations (esp. OLTP), except:
- big, read only tables
- high volume streaming tables(logging)
- specialised needs (have special engines)
- Tune InnoDB wisely
PBXがブログとかにいい。
- MyISAM
- Good for logging, auditing, data warehousing
- Archive
- Very fast insert and table scan performance めちゃ速いよ
- Read only. Good for archiving, audit logging
- 内部的にgzipしてるよ
- Memory
Quick InnoDB Tuning Tips
- innodb_file_per_table
- innodb_buffer_pool_size = (memory * 0.80)
- innodb_flush_log_at_trx_commit
- innodb_log_file_size - keep it high, however recovery time increases (4GB が最大)
Real World MySQL Use (RWMU)
- Run many servers
- Your serious application cannot run on "the server"
- "Shared nothing" architecture
- make no single point of contention in the system
- Scales well, just by adding cheap nodes
- If it works for Google, it will work for you!
RWMU: State and Session Information
- Dont keep state within the application server
- Key to being stateless: session data
- Cookies are best validated by checksums and timestamps(encrypting is a waste of CPU cycles)
RWMU: Caching
- 動的コンテンツには向かない
- Cache full pages, all in application, and include the cookie
- Use mod_cache, squid , and the Expires header to control cache times
- A novel way: cache partial pages!
- pre-generate static page snippets, then bind them in with dynamic content ...
RWMU : Data Partitioning
- replication is great for read heavy applications
- Write intensive applications should look at partitioning
- Partition with a global master server in mind
- Give out global PKs and cache heavily (memcached)
- ...
- Consider the notion of summary databases
RWMU: Blobs
- Large binary object storage is interesting
- Image data is best kept in the filesystem, just use metadata in DB to reference server and path to filename
- Try the Amazon S3 storage engine?
- ...
RWMU: Misc.tips
- Unicode - use it Unicodeはもう当たり前
- Use UTC for time
- Think about replication across geographical boundaries
- sql_mode might as well be strict
- Keep configuration in version control
- Then consider puppet or slack for management of various servers
Resources
- MySQL Forge and the Forge Wiki
- MySQL Performance Blog
- Planet MySQL
- #mysql-dev on irc.freenode.net
- chat with developers, and knowledgeable community members
services </plug>
- http://www.mysql.com/training/
- 日本語における認定が今月末(2007年9月末)から始まる
質疑応答
- Email me: colin@mysql.com
- Cathe me on IRC, at #mysql-dev: ccharles
新ストレージエンジン Falcon のアーキテクチャ詳細技術解説 - MySQLカンファレンス2007
MySQLアーキテクチャの解説
- ストレージエンジンがプラガブル
- 5.1では共有ライブラリ化して動的に組み込めるようになる
- InnoDBのかわりにfalconを使う
Falconとは
- MySQL ABにより現在開発中の、トランザクション対応のストレージエンジン
- 開発中で完成してない。alpha版
- Jim Starkey氏を中心に開発
- InnoDBをほぼ全ての点で上回ることを目指している
- まもなくベータ版が登場。
- MySQL 6.0で安定版を搭載予定
- 思想:現代的なハードウェア環境をフル活用できるRDBMSを目指す
InnoDBとの主な差異
- クラスタ索引を採用していない
- 行ベースのレプリケーション(Binary Logging)のみをサポートし、文ベースのレプリケーションをサポートしない
- 分離レベル「Read uncommitted」をサポートしない
ほかのストレージエンジンとの比較
図
Falconのアーキテクチャ概略
- 4つのメモリ領域に分けて開設 Record Cache, Page Cache, Log Cache, System Cache
- できるだけ多くのレコードをRecord Cacheに乗るようにしてある
- Record CacheはPage Cacheよりもオーバーヘッドが少ない
プロセス/スレッド
- MySQLはマルチスレッド型アーキテクチャ
- 接続1個に対してスレッドを1個割り当てて動作
- Falcon専属の、バックグラウンドで動作するスレッドがある
- mutexをラッピングして排他制御 (SyncObjects)
ファイルの読み書き
シリアルログファイル、データファイル
- シリアルログファイルはREDOログに相当。ただし、サイズは固定ではない
- 未コミットの情報はデータファイルに書かれない
- ロールバックの高速化
- ランダムI/Oの回数が減る
- コミットした情報は最終的にデータファイルに反映される
- Falconの「グループコミット」機能はきわめて高性能
表領域(テーブルスペース)
- Oracleの秤量域と類似
- 任意のファイルを割り当てられるため、I/O分散が可能
- Falconのほかに、T.1以降でMySQL Clusterが...
インデックス構成
- ルート -> ブランチ -> Leaf
- クラスタ索引/セカンダリ索引という区別はない。全部この形
- RecordNumberは現在4バイト固定(安定版までに変更予定)
- ゆえにインデックスサイズは(クラスタ索引に比べて)さほど大きくならない
- ページはI/Oの最小単位。サイズは可変(2KB-32KBとなっているが安定版までにどうなるかはわからない)
インデックス値の圧縮
- 接尾辞の圧縮
- 数値型:末尾のゼロを圧縮
- 文字列型:末尾の空白を圧縮
- 接頭辞の圧縮
- 各ページの先頭のインデックス値は圧縮しない
- 2番目以降のインデックス値は、開始何倍とが先頭のインデックス値と一致するかを調べ、その分を圧縮する
- うまくいくと60%ぐらい圧縮できる
- 圧縮処理をするので当然CPUは使っちゃう。on/off切り替え可能にするか検討中
インデックスアクセラレータ
レコードの取得
- インデックスを検索し、レコード番号を取得
- レコード番号から実際のレコードを取得
- メインのレコードの取得はキャッシュから行われる
データ型と消費サイズ
- GIS型を含む全MySQLデータ型をサポート
- 整数型を含む全データ型が可変長として扱われる
- 消費サイズはデータ型ではなく、実際の値に応じて変わる
- どのデータ型であろうと値に応じて圧縮する
FalconはTEXT/BLOB型を別メモリ領域に管理する
AUTO_INCREMENTの動作の違い
- FalconはInnoDBと違う。
- FalconはMyISAMと同じ。
- FalconとMyISAMは最後にInsertされた値をもとにする
- InnoDBはmax関数でとれた値をもとにする
トランザクション、ロック、MVCC
- 行レベルロッキング
- SELECTはロックをかけない。更新系処理と競合しない。InnoDBも同じ
- ブロックするSELECT FOR UPDATEもサポート
- AUTO_INCREMENTの割り当てにテーブルロックをかけない
- 重くなるので。5.1で改善される
- 分離レベルとしてRead Commited, Repeatable Readをサポート
- Serializableもサポート予定
- ロックエスカレーションは発生しない。InnoDBも同じ
- デッドロックの検知は自動で行う
- ロックをかけないカラム、インデックスの追加/削除
- ロストアップデートの自動検知
- Next Keyロッキングは発生しない
ロストアップデートの自動検知
- ロストアップデートとは
- Falconの動作を、設定でInnoDBと同じにすることもできる(デフォルトで同一にする方向)
Next-Key Lockingとは (InnoDBのロック制御)
- InnoDBログファイルとバイナリログの不整合をっふせぐために必要な実装
- Insert INTO t1 .. SELECT .. FROM t2
- t2に対して共有ロックをかける
- UPDATE t1 SET xx WHERE non_index_column=x;
- フルテーブルスキャンになる。スキャンしたレコード全体に対して排他ロックをかける
- UPDATE t1 SET xx WHERE non_unique_index_column=x;
- 当該インデックスと、その前後に対して排他ロックをかける
- セッション1:INSERT INTO t1 SELECT * FROM t2
- セッション2:INSERT INTO t2 VALUES(...)
- セッション2がセッション1よりも前に終わったとする
- バイナリログの中身は、順番が逆転する
- Next-Key Lockingはこれを防ぐための実装
FalconではNext Key Lockingは発生しない
- 同時実効性の低下は5.1で回避される
参考資料
- マイコミジャーナル: Falcon徹底リサーチ
- MySQL Developer Zone: Falcon in depth ベータ版リリース後に公開
- MySQLオンラインマニュアルにて http://dev.mysql.com/doc/falcon/en/index.html
- MySQL Forge http://forge.mysql.com/wiki/Falcon







