「MySQL Casual Talks vol.2」に参加してきたよ、のメモ

MySQL


第1回に引き続き、"あまりカジュアルではない?"が定説となりつつあるw「MySQL Casual Talks」の第2回が開催されたので、行ってきました。前回に引き続き面白かったので、自分のメモ書きを貼り付けておきます。
(全然追いついてないメモも多いし、スピード感たっぷりだったので間違った記載もあるかもですが、そこはご了承を...)

# 例によって、発表資料が出揃ったらそちらを見ていただいた方が良いです。


ちなみに、第1回のメモエントリは、、

追記

このエントリでもまとめ的に、公開された資料も紹介させていただいておりますw

MySQLでNoSQL (@oinume)

  • 生沼さん、実はMySQLは3.23の頃からさわってる!
  • 謝罪: 今回はFusion-ioの話はしないw

アメーバピグ

  • ユーザ数800万人超
  • 2009/2サービス公開
  • アーキテクチャ
    • Webサーバ x35台、Socketサーバ x70台、memcachedサーバ x4台、Fusion-io+MySQL x6台
  • トラフィック: 約2.1Gbps
  • 同時接続数: 100000
  • Webサーバへは、36000req/s
  • Socketサーバへは、160000req/s
  • DBへは、52000qps

ピグでのMySQLの使い方

  • RDBMSとしては使っていない
  • IndexPersisterを実装して使っている
    • アプリではSQLを書かない
    • fetch - 複数レコード取得
    • count, exists, remove, save...

パフォーマンスチューニング

  • MySQLのSlow Queryをみる
    • でも、それだけだとわからんので・・・
  • クライアント側でもスロークエリ的なのを出力
  • Javaのスタックトレースも出している

遅いパターンの改善

  • 大量のload(細かいデータの取得)
    • MySQLサーバのContext Switchが激しい
    • in句をうまく使う
  • 大量データのfetch
    • key以外のカラムで絞り込めない
    • 絞り込みたいカラムを別テーブルを作って作成
    • 将来的には1回のfetchで取得できる件数を制限したい

KVSとして使うメリット

  • 生SQLが書けない
    • JOINできない
    • 基本的にINDEXの効かないクエリが投げられない
  • ALTER TABLEもできない
  • MongoDBなどのKVSに移行しやすい

僕たちが失ったもの

  • キー以外でのカラムでの絞り込み
    • 特定のカラムでソート
    • 毎回アプリでソートロジックを書いている
  • カラムの型変換

まとめ

メリット・デメリットあります

超カジュアルに使うMySQL (@tasukuchan)

View more presentations from Tasuku Suenaga

  • グニャラくん
    • DeNA!!に転職したばかり!
    • 前職では、Senna/groongaの開発とか

MySQLをもっとカジュアルに使おう

まずはMySQL

  • 最初の選択肢として
    • 運用実績のない運用は大変
      • システムを維持する人件費
    • 運用担当者の気持ちになる
      • 自分が24h/365dをかけてお守りができるか
    • MySQLは枯れている

カジュアルスキーマ

  • idは贅沢にBIGINT
    • JSON/XMLをvalueカラムに保存
    • natural_key/created/updatedは別カラムで
  • インデックス必要だったら、別のテーブル作成する
    • FriendFeed方式

スキーマの動的変更

  • カラム追加すればいいんじゃね?
  • 動的なカラム追加は遅い
    • MySQLのALTER TABLEは遅い

カラムの動的追加

  • openarkkit
    • MySQL便利グッズ詰め合わせ
  • oak-online-alter-table
    • 別の一時テーブルを新スキーマで作成
    • 元テーブルからデータコピー
    • 差分補正
    • リネーム
  • OnlineSchemaChange.php by facebook
    • 基本的にはoak-online-alter-tableと同じ

ちょっとした工夫

  • MessagePack+Snappy
    • データ容量も圧縮できる
    • 6割くらい縮むらしい
    • I/Oも減る

まとめ

運用担当者を大事にしよう

Performance Schema活用入門 ([@nippondanji)

View more presentations from Mikiya Okuno

カジュアルにディープな機能を使いこなそう

Performance Schemaって?

  • 情報を収集するためのツール
  • MySQL5.5から搭載
  • ストレージエンジンとして実装
  • きめ細やかな情報を採取できる

MySQLの状況を知りたい

  • うまく動かない?性能が出ない?クエリ結果がおかしい?リソース消費量が多い?

どうして新しい仕掛けが必要か

  • 非破壊検査は難しい
    • 動いているシステムを止めるのはNG

MySQLにも状況を調べる方法はある

  • プロセス監視
    • プロセスが存在するかどうか
      • pgrep -x mysqld
      • mysqladmin ping
  • STATUSコマンド
    • 最も基本的な統計情報が見れる
  • SHOWコマンド
    • 統計情報
    • 現在のステータス
    • ストアドプロシージャで使えれば・・・
  • INFORMATION_SCHEMA
    • SQL標準で定義された情報取得方法
    • SELECTで情報にアクセスできる
  • EXPLAIN
    • クエリの実行結果を表示する
    • チューニングに必須
  • SHOW PROFILE
    • クエリがどこで時間を食っていたかがわかる
  • ログ
  • GDB
    • どんな情報でも見れる
      • 点滴はoptimized away
      • ただし時間が止まる
      • デバッグ情報必須
  • DTrace/SystemTap
    • 動的にプロセスをトレースする
      • 汎用的な仕組み
      • スクリプトできめ細やかな調整ができる
      • SolarisやLinuxでしか使えない
  • DBUGトレース
    • デバッグ版ビルドで利用できるトレース機能
    • 関数の呼び出しとリターン
    • その他必要に応じて情報を出力
    • MySQLで取れるトレースとしては最強だが、情報サイズがでかすぎる

PERFORMANCE_SCHEMA

  • DTraceのSDTに似ている
  • ソースコードに埋め込まれたInstrumentsという観測点から情報を収集
  • 統計情報と履歴を溜め込んでSQLでアクセス
  • Windowsでも使える

オーバヘッドは?

  • CPU
    • 若干あり、無視できない
    • 手持ちのノートPCでパフォ計測
      • PSなし: 2285.76tps
      • PSあり: 1804.77tps
  • メモリ
    • 設定やバージョンにもよるが数百MB

利用シーン

  • 複数のスレーブ群のうちの1個で使ってみるとか
    • 振り分けの重み付けで調整

設定

  • MySQL5.5以上
  • mysql_install_db実行したら自動で作られる

[mysqld]
performance_schema

※動的には変更できない

mysql-5.6-labs-performane-schema

  • MySQL5.6で搭載されるかもしれない機能が追加されている、が実験的なバージョン
  • かなり充実しているらしい。実践的になってきた、と。

カジュアルに使うには?

残念ながらそんな方法はないw

テーブルの種類

  • setup: 各種設定
  • instance: mutex等のインスタンス情報
  • wait event: 各種操作にかかった時間
  • stage event: プロファイリング情報
  • statement event: コマンド実行履歴
  • table io event: テーブルごとのストレージエンジンごとのリクエスト
  • summary: 各種統計情報
  • テーブルへのアクセスにかかる時間の合計、最大、最小、平均値等
  • 直近のステートメントの履歴を表示するテーブルなどもある

数値をみるときのポイント

  • 時間単位はピコ秒
  • よく見るものはビューを定義

まとめ

  • PSは情報を見るための新たな手段
    • まだ発展途上だけど

!ここからLT開始!

MySQL Event Scheduler Casual Vol.1 (@myfinder)

  • Event Schedulerは実運用で使っている
  • Event Schedulerは、指定した時刻に指定した処理を行う(cronみたいなもの)
  • MySQL5.1以上必須
  • 有効にしたら、event_schedulerのユーザでプロセスが立ち上がる
  • 運用の用途
    • パーティショニングしたテーブルのローテート
    • ...
  • 注意点
    • マスタ/スレーブともにONにする
    • 基本的にマスタでのみenable(イベント)にする
    • ...
  • 設定項目を監視すべき
    • show variablesで有効になっているかを監視
    • Eventが操作する対象も監視
    • ...
  • 障害復旧
    • スレーブをマスタに昇格させるとき
    • マスタでON、スレーブにOFFで
    • ...

※スピードについていけず、全体的にメモできていません(><)

MySQL 4.0 Casual (@kazeburo)

  • MySQL4.0
    • 2002/8: 4.0.2 betaリリース
    • 2007/2: 4.0.30

苦労した5つのこと

  • 4.0のソースコードが手に入らない
    • 持っている人の聞いてみる
    • ファイル名でググる
  • innodb_buffer_pool_size
    • 10GBで設定しても2GBで認識
  • secondary index and order by primary key
    • なぜか Using filesort
    • 5.0.48でFix.
  • mysql 4.0 clientが5.1.57のserverにつながらない
    • 5.1.58でFix.
  • GET_LOCKが原因でレプリケーションがいきなり止まる

まとめ

MySQL5.1以上を使いましょうw

MySQL 5.0 -> 5.5 へのアップデートについて (@oranie)

View more presentations from Takashi Narita

  • サービスログの解析用のDBで使ってたので、速い方(5.5)がうれしかった
  • 好きな方法でインストールしなさい
  • データ互換性を考慮して、1度、5.1を経由した方が良い
  • バックアップ => データファイルコピー => dumpデータ
  • mysql_upgradeを使用
    • が、一部は解決しなくて、結局dumpとって入れ直した方がいいかも
  • 5.5にアップデートするには、yum使いたいのでremiレポジトリ使った
  • 5.5に上げたら、変わったor廃止になったオプションを地道につぶしていく

Master n 対 Slave 1 レプリケーションの作り方 (@do_aki)

View more presentations from do_aki

※高速テンポに感動しましたwまともにメモれなかったw

  • マスタn:スレーブ1のレプリケーション
  • change master to を使って...
    • masterを順次切り替え
  • 結果、データ不整合でた
    • change master toでrelay log消えちゃった
    • sql threadの位置を待つのは非効率
  • io threadの位置で待つ
    • master_pos_wait()
  • io threadは、トランザクション途中でも停止する
  • 結果
    • 3秒ごとに参照先を切り替え
    • それで、1ヶ月近く安定稼働

まとめ

  • n:1レプリは実現可能
  • 遅延は必ず発生
    • 集計に便利
  • ソースコードはgithubに!

MHAのこと (@matsunobu)

  • MySQLマスタ障害では、、
    • 非同期なので、一部または全スレーブが倍なりログを受け取っていない可能性
    • そこを自動で補ってくれるのがMHA
  • アーキテクチャ
    • マネージャ(管理サーバ)、ノードで構成
    • MySQL5.0以降で動作
  • マスタが死んだ時に、落としているバイナリログを拾って順次あてていく仕組み
  • pacemaker+DRBDと比べての優位性
    • スタンバイサーバがいらない
    • フェイルオーバの時間が高速
  • MySQL-MMMはHAソリューションではない
  • 任意のスレーブを新マスタにできる
  • フェイルバックするのが面倒
    • が、それはどれも一緒で、楽なのはMySQL Clusterくらい
  • Mobageで全面的に使ってる
    • DeNAに入社すれば様子が見れるよw
  • 日本語のドキュメント
    • 英語版で力つきた
    • DeNA社内には日本語Wikiがあるww
  • テストケース
    • 公開していない
    • DeNAに入社すれば(ry

MySQLでNoSQL (@rkajiyama)

View more presentations from rkajiyama

  • labs.mysql.com
    • 製品品質は別にして、面白いものがたくさんある
  • MySQL5.6
    • NoSQL with Memcached
  • MySQL Cluster 7.2
    • NoSQL with Memcached

2種類のmemcached連携プロダクト

MySQL5.6

  • MySQLサーバにプラグインとしてmemcachedインタフェースを追加
  • アプリからはMySQLサーバに接続
    • プロトコルはmemcached Protocol
  • データ格納先はInnoDB
  • トランザクション利用可能

MySQL Cluster 7.2

  • memcachedにNDB API用ドライバを追加
  • アプリからはmemcachedに接続する
  • データ格納先は、データノード上のndbclusterテーブル
  • トランザクション利用可能
  • レプリケーション利用可能

余談

絶賛されていた鍵本はコチラww

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド