• [mysql][Apache] mod_log_sql関連のベンチマーク

    前回設定した項目についてベンチマークをとりました。 今回のテストケースは 通常のaccess_log(ファイル)に保存 BufferedLogsディレクティブをONにしたaccess_log mod_log_sql+MyISAMストレージエンジン mod_log_sql+Archiveストレージエンジン の4つです。 それぞれ上記設定をしたwebサーバに、apacheのabコマンドを使ってテストしました。``` # /usr2/apache2/bin/ab -c 100 -n 10000 http://example.com/ 1度に100ユーザ同時接続し、合計で10000回リクエストをかけています。 リクエストをかけると、以下のようなシンプルなレスポンスが帰ってきます。 これは静的ファイルで用意されています。 test テストケース リクエスト数/秒 1に対する割合 1 7598.81 100% 2 8670.88 114.1% 3 4340.90 56.7% 4 3119.29 41.0% mod\_log\_sqlを使うと、MyISAMを用いた場合はもともとの57%弱、Archiveに至っては40%程度しかパフォーマンスが出ていません。結構性能が落ちていますね。 INSERTパフォーマンスは、ArchiveだとMyISAMの1.5倍くらいあると聞いていたので、Archiveのほうがパフォーマンスがよくなると予測していたのですが、そのような結果にはなりませんでした。同時接続数とか条件で変わってくるのかもしれませんが、今回は検討しません。 続いて、ログファイルのサイズについて検討します。 dbに保存されたデータについては、``` SHOW TABLE STATUS LILE 'access\_log'\\G \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 1. row \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* Name: access\_log Engine: ARCHIVE Version: 10 Row\_format: Compressed Rows: 119070 Avg\_row\_length: 11072 Data\_length: 2764858 Max\_data\_length: 1318343040 Index\_length: 0 Data\_free: 0 Auto\_increment: NULL Create\_time: 2008-12-02 16:30:49 Update\_time: 2008-12-02 16:30:49 Check\_time: NULL Collation: utf8\_general\_ci Checksum: NULL Create\_options: Comment: 1 row in set (0.
  • [mysql][Apache] mod_log_sqlを使ってApacheのアクセスログ(access_log)をmysqlのARCHIVEストレージエンジンに保存する

    mod_log_sqlを使って、Apacheのアクセスログをmysqlに保存する設定をしたときのメモです。 アクセスログを保存するmysqlのストレージエンジンには、前からずっと気になっていたARCHIVEストレージエンジンを使用しました。 ■ ARCHIVEストレージエンジンについて ロギングや監査用途に向いている。SELECT、INSERT命令しか使えない INSERTのパフォーマンスはMyISAMの1.5倍、InnoDBの3.5倍 データは圧縮して格納(圧縮率70~80%) インデックスは非対応 一般ユーザーの利用率は5%程度 すべて以前行ったセミナーでもらった資料より抜粋です。 ■ ログを保存するデータベースを作成 mysqlのインストールは完了しているものとして割愛します。 ただmysqlをソースからビルドしてインストールする場合には、configure時に–with-archive-storage-engineオプションを追加しないとARCHIVEストレージエンジンは使用できません。 現在のMySQLでARCHIVEストレージエンジンが有効かどうかを調べるには以下のようにします。``` mysql> show variables like ‘have_archive’; +—————+——-+ | Variable_name | Value | +—————+——-+ | have_archive | YES | +—————+——-+ 1 row in set (0.00 sec) 結果にYESと出ればARCHIVEストレージエンジンを使用できます。 もしNOと出た場合には、--with-archive-storage-engineオプションをつけて再度mysqlをビルドする必要があります。 続いてログ保存用のデータベースを、apachelogsという名前で、ストレージエンジンをARCHIVEで作成します。 /etc/my.cnfに以下のように設定してデフォルトのストレージエンジンをARCHIVEにします。設定後にmysqlを再起動します。 [mysqld] default-storage-engine=archive ストレージエンジンの設定方法は他にも色々あります(テーブル作成時に設定とか、alter tableとか)が、ここでは割愛します。 続けてログを保存するデータベースの設定をします。 mysql> create database apachelogs; Query OK, 1 row affected (0.00 sec) mysql> use apachelogs; Database changed mysql> grant INSERT, CREATE ON apachelogs.
  • [MySQL]MySQLのレプリケーションでマスタとスレーブの両方の機能を持つサーバの設定

    MySQLのレプリケーションで、サーバをチェーン状もしくはピラミッド状に構成するような場合、あるスレーブサーバをを別のマスタとして設定する方法です。 例えば、以下のサーバBのようなものを想定しています。 サーバA → サーバB → サーバC サーバBでは通常のスレーブの設定に加えて、バイナリーログを吐き出すようにすればいいだけだと思ったらうまく行きませんでした。 /etc/my.cnf にて [mysqld] log-bin=mysql-bin 調べた結果、log_slave_updatesというオプションが必要だということがわかったのでこれを追加したらうまくいきました。 /etc/my.cnf にて [mysqld] log-bin=mysql-bin log_slave_updates あとは再起動して設定を反映すればバイナリログに書き込まれます。 # /etc/rc.d/init.d/mysql restart
  • [MySQL][勉強会]MySQLウィークリーセミナーに参加(パフォーマンスチューニング編)

    6月29日にMySQLウィークリーセミナーに参加してきました。 相変わらす、勉強会とかセミナーのまとめが遅いので反省です(PHP勉強会も残っているな。。。)。 当初の予想通りやはり人気があったらしく、急拠2回にわけて開催されることになりました。 最初の申し込みには間に合わなかったのですが、追加募集で滑り込むことができました。 パフォーマンスとは ・パフォーマンスの指標 スループット レスポンスタイム/レイテンシ(遅延) スケーラビリティ 上記の組み合わせ これらの指標について、平均値だけではなくばらつきも見る必要ある。 キューイング 複数のユーザ/リクエストがある場合に発生 レスポンスタイム = キューイングによる遅延 + 実行時間 ホッケースティック(システムが飽和状態になると、キューイングによる遅延が急激に増大する現象) パフォーマンスの改善時に、キューイングの遅延と実行時間のどちらを改善するか重要(実行時間の短縮がキューイングの遅延を改善する) 実行時間 ボトルネックの特定 ・ネットワーク ・CPU ・ディスク ・ロック ・… 間接的な計測 ・webページ表示のためのクエリ実行時間の合計 直接的な計測 ・CPU利用率 ・ディスクIOのレイテンシ ・ネットワークトラフィック ・処理待ちプロセス数 ・同時実行中のクエリ数 ・… ベンチマークテストの注意点 実行方法と、結果の読み取りを間違えると意味がなくなる バージョンを変えると改善していることも その他、ありがちな間違い ・データサイズが違う(本番10GBなのに1Gでテスト) ・データやリクエストのばらつきを考慮しない ・1ユーザだけでテストするとか ・実際の運用環境と違うアプリケーション特性下でのテスト ・ベンチマークテストのクライアントに負荷がかかっていて性能が出ない パフォーマンスチューニングをする際の注意事項 他の可能性を考える(メモリ増やすとか) 本当にそのパフォーマンスが必要かどうか 常に全体像を把握しておく(ボトルネックとか。) チューニングのプライオリティーを確認しておく ・全部をやることは多くの場合無駄 ・コストとのトレードオフ パフォーマンスチューニングTIPs MySQL アーキテクチャは以下のようになっている。``` クライアント ↓ コネクションスレッドプール ↓ クエリキャッシュ ↓ パーサー ↓ オプティマイザ ↓ ストレージエンジン
  • [Ubuntu][MySQL] Ubuntu+Senna+MySQLで全文検索エンジンの設定

    UbuntuにSennaを使ってMySQLで全文検索を行うためのインストールを行いました。 ○MeCabインストール 以下よりソースをダウンロード``` $ tar zxvf mecab-0.97.tar.gz $ cd mecab-0.97 $ ./configure –with-charset=utf8 (※下記参照) $ make $ su $ sudo make install ※configureで以下のようなエラーが出たら checking if g++ supports namespaces (required) … no checking if g++ environment provides all required features… no configure: error: Your compiler is not powerful enough to compile MeCab. If it should be, see config.log for more information of why it failed. これを実行して再度configureする $ sudo apt-get install g++
  • [MySQL][勉強会]MySQLウィークリーセミナーに参加(ストレージエンジン徹底比較編)

    もう先週のことですが、MySQLのウィークリーセミナーに行ってきました。無料セミナーで、しかも会社から徒歩数分の距離だったのでとてもよかったです。 今回の内容はMySQLストレージエンジンについての内容でした。 各ストレージエンジンの利用状況 MyISAMが70% InnoDBが60% Memoryが10% 他は5%以下 会場にいた人(50名くらい)のストレージエンジン利用状況は、InnoDB 3,4割、Memory数名、Archive 0名でした。 ストレージエンジンの選択 ストレージエンジンは用途によってパフォーマンスに違いが出るので最適なものを選択する必要ある(以下一例) ArchiveストレージエンジンのINSERT処理性能は、MyISAMの1.5倍、InnoDBの3.5倍ある(でもSELECTとINSERTしか使えない) CSVストレージエンジンでCSVファイルをMySQLにロードする場合、10億件のデータも0.00secでできると資料にあった(でもインデックス利用付加、トランザクション非対応。パフォーマンスもそれほどでもないらしい) などなど。。。 各MySQLストレージエンジンの説明 ・MyISAMストレージエンジン おなじみの、MySQLデフォルトのストレージエンジン テーブルを圧縮可能(圧縮後は読み取り専用) Fulltext、GISインデックス(調査)をサポート Concurrent Insert というテーブルロック中にもインサートできる機能をサポート ・InnoDBストレージエンジン MySQL5.1からはプラグインとして実装される。 トランザクション対応 サーバ障害後の自動リカバリ機能あり 外部キー利用可能 クラスタードインデックス ・Memory(旧HEAP)ストレージエンジン メモリ上に情報を格納するテーブルを作成。非常に高速。 メモリ上にデータとインデックス配置。ディスク上にはテーブル定義ファイルのみ(.frm) 固定長レイアウトのみ インデックスのアルゴリズム選択可能(HASHまたはBTREE) BLOB型およびTEXT型は格納不可 サーバが再起動したときにはデータは全て失われてしまう ・Blackholeストレージエンジン /dev/null的なストレージエンジン。これはどのような場面で使えるのか?``` master │ │ ↓ ↓ slave slave ←Blackhole ストレージエンジン │ │ ↓ ↓ slave… slave… 上のような構成でレプリケーションを行う場合、真ん中のslaveは次のスレーブにデータを受け渡すだけでデータ自体は保持する必要がないつまりバイナリログを受け渡す機能だけを提供したいような場面で使えるようである。 スレーブの台数がマスタに比べてすごく多いとき、レプリケーション遅延対策を行うような場合には使えそう。 **・FEDERATED** 別のサーバ上のテーブルに接続するテーブル。ローカルサーバに表の定義があって、リモートサーバに実データが格納されている。 ローカルサーバでの定義 CREATE TABLE foo … ENGINE=FEDERATED CONNECTION='mysql://user@host/db/table’