YAPC::Asiaのスライドで予告していた通り、実際に弊社のいくつかのサービスで使っている my.cnf を公開しました。
github: https://github.com/kazeburo/mysetup/tree/master/mysql
今回、公開した理由はMySQl Beginners Talksの発表の中でも触れている通りです。MySQLのソースコード中に含まれるサンプルのmy.cnfが最近のサーバハードウェアや運用に合わなくなって来ているという状況で、自分の設定にイマイチ自信が持てていない人は少なくないはず。そこで各社秘伝のタレ的な my.cnf をOpen & Shareすることで、モダンなmy.cnfを作り上げる事ができるんじゃないかという考えの下、今回 github にて公開しました。
ファイルは4つあり、それぞれ MySQL 4.0、5.1、5.5、そしてテスト中のMySQL 5.6用のMySQLの設定ファイルです。
my.cnf について捕捉
説明がまったくないと公開しても意味がなさそうなので、少し補足です
サーバ環境
このmy.cnfが前提する環境は次の通りです
- MyISAMは使わず、InnoDBのみ。MySQL 5.1以降ではInnoDB Pluginを使用する
- サーバは 16GBのメモリを搭載し、そのメモリをMySQLがすべて使える
MyISAM系のメモリ設定は少なめにして、物理メモリの多くをinnodb_buffer_poolに割り振っています
ホスト名とserver-id
この2つの箇所は、サーバに設置する際にプログラムにより置き換えられます
prompt = '\u@<HOSTNAME> mysql>'
server-id = <SERVER_ID>
<HOSTNAME> は「\h」でも構わないと思いますが、弊社のサーバではhostnameとサービス上のサーバ名が異なる場合があるので管理サーバに問い合わせて埋め込んでいます。server-idはIPアドレスの第三オクテット、第四オクテットから自動計算されます
IPADDR=$(/sbin/ifconfig |grep -A 1 eth1 |grep inet|awk -F: '{print $2}'|awk '{print $1}')
SID=$(perl -e '@l=split /\./,$ARGV[0];print $l[2]*256+$l[3]' $IPADDR)
HOSTID=$(curl -s http://host-manager/lookup)
sed -i "s/<SERVER_ID>/$SID/" /path/to/my.cnf
sed -i "s/<HOSTNAME>/$HOSTID/" /path/to/my.cnf
チューニングのポイント
サーバによって次のような変更を行っています。
まず、サーバに搭載するメモリによって innodb_buffer_pool を変更します
innodb_buffer_pool = メモリの75%
書籍やWebサイトでは80%程度と書かれていますが、自分が今まで使ってきた環境では75%以上にするとSwapしてしまいます
仮想マシンなどIO性能が落ちる場合は以下の設定を変更します
innodb_write_io_threads = 8 => 少なめに
innodb_read_io_threads = 8 => 少なめに
innodb_log_file_size = 128M => 少なめに
innodb_flush_log_at_trx_commit = 1 => 2に変更
MySQL5.1以降で逆に、SSDなど高速なデバイスが使用する際は
innodb_io_capacity = 2000〜
この設定を追加しています。
さいごに
今回公開したmy.cnfのforkやpullreqは大歓迎です。そして自分も含め、MySQLの設定についての知識がもっと広がっていったらいいなと思っています