Hatena::ブログ(Diary)

kazuhoのメモ置き場

2009-10-29

(特にMyISAMを使っていた)ウェブ屋さんがInnoDBを使う場合の設定項目

InnoDBMyISAMと比較して安全(OSクラッシュや電源断が発生してもテーブルが壊れない)分、書き込みが遅い。データベース屋さんからすると、それは当然のことでMyISAMがおかしいんだ、ということになり、だからバッテリバックアップ機能のついたRAIDカードを使うんだ、という話になる。でも、MyISAMを使っているウェブ屋さんの現場では、場合によって多少データが消えてもかまわないから、安いハードウェアで大量のアクセスを捌きたい... って乖離があるんじゃないかなーと思ってる。

そのような場合には、my.cnf の innodb_flush_log_at_trx_commit パラメータを調整することで、MyISAMに比肩する書き込み速度を得ることができる(そのかわり、クラッシュや電源断の場合は、設定によって直近1秒以内の変更が失われる)。

他のパラメータも含めて書いておくと、データベース専用サーバ (on linux) の場合は、

[mysqld]
...
innodb_buffer_pool_size=3072M     # innodbに割り振るメモリ。実メモリの75%程度
innodb_log_buffer_size=256M       # あまり大きくしても意味がないような気がする...
innodb_flush_log_at_trx_commit=0  # 毎秒1回データをディスクに書き出し
innodb_flush_method=O_DIRECT
innodb_file_per_table
...

あたりが自分の好み。/etc/sysctl.conf も編集して、

vm.swappiness = 5

とか書いておくと、InnoDBバッファプールがスワップアウトされる可能性が減って幸せになれる(ことがあるかも)。

linux 以外、あるいは Apache と同居させるような小規模な運用では、O_DIRECT せずに

innodb_buffer_pool_size=512M      # 実メモリの10-20%?
innodb_log_buffer_size=128M
innodb_flush_log_at_trx_commit=0
innodb_file_per_table

として、OSバッファキャッシュを使うという手もあると思う。そんなにいっぱいデータベース立てた経験ないけど、ベストプラクティスがどのあたりなのか興味があるので、あえて書いてみた。


なお、SATA HDDを使ってるようなケースでは、

% sudo hdparm -W 0 /dev/sda  # 必要なら sdb や sdc も。

して、ディスクの書き込みバッファを無効化しておく必要がある(そうでないと電源断時にデータが壊れる)。これはデータベースソフトウェアに限らない話だけど。


参考:

Open database life: MyISAMとInnoDBのどちらを使うべきか

MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.12 InnoDB の起動オプションおよびシステム変数

お客様がお探しのページは見つかりませんでした|KLab株式会社

redhat.com

hagaeru3seihagaeru3sei 2009/10/29 11:18 マニュアルにもありますがinnodb_buffer_pool_sizeは実メモリサイズの最大80%にした方がいいようです。
仕事では大体70%前後で割り当ててます。

http://dev.mysql.com/doc/refman/5.1/ja/innodb-parameters.html

hagaeru3seihagaeru3sei 2009/10/29 11:43 すみません。Apacheと同居の場合だけ見てました。

kazuhookukazuhooku 2009/10/29 13:06 www お気になさらず。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証