第一前提として、スロークエリーのログを保存できるようにしておく。
log-slow-queries=/mnt/log/mysql-slow.log
long_query_time=5
log-queries-not-using-indexes

これは、自分の環境だけなのか mysql-slow.log を予め作っておく必要がある。
mySQLが勝手に生成してくれない。
今も謎。仕様?
# mkdir /mnt/log/mysql-slow.log
# chmod 666 /mnt/log/mysql-slow.log

ログローテーションで使うのでrootのアイパスをmy.cnfに追記しておく。
[mysqladmin]
password = "hogehoge"
user = root

そしてmysqldを再起動。

設定ファイルのテンプレートがyumでmySQLをいれたら入ってたのでそれを利用

# cp /usr/local/mysql/share/mysql/mysql-log-rotate /etc/logrotate.d/

/mnt/log/mysql-slow.log {
notifempty
daily
rotate 3
missingok
compress
postrotate
# just if mysqld is really running
touch /mnt/log/mysql-slow.log
chmod 666 /mnt/log/mysql-slow.log
if test -x /usr/local/mysql/bin/mysqladmin && \
/usr/local/mysql/bin/mysqladmin ping &>/dev/null
then
/usr/local/mysql/bin/mysqladmin flush-logs
fi
endscript
}

上記のようなログファイルが生成されないという問題があるので、無理やりファイルを作ってローテーションする。

そもそもローテーションしないといけないくらいログが溜まること自体問題なのだけど、1ファイルがでかくなり過ぎるのは精神衛生上もよくないので一応やっておく。

8月 19th, 2010mmeasure

mmeasureはmySQLの負荷を監視、チューニングのアドバイスを提供してくれるツールです。
今まで知らなかったけど、けっこう古いツールです。
そのままだとmySQL5.1以上は動きません。

cactiでもお馴染のグラフ生成に必要なrrdtoolをインストール
# yum install rrdtool

mmeasureの最新版をダウンロード&展開
# cd /usr/local
# wget http://prdownloads.sourceforge.jp/mmeasure/18557/mmeasure-1.0.7.tar.gz
# tar xvzf mmeasure-1.0.7.tar.gz

mmeasure.confを修正する
# cp mmeasure_template.conf mmeasure.conf

このテンプレートがデフォルトでは設定項目が足りなくて動かないという頑固者。
生成する画像の設定
WEBDIR="$PATH_MMEASURE/web/images/graphs"
WIDTH="400"
WIDTH_SMALL="400"
WIDTH_LARGE="400"
HEIGHT="100"
HEIGHT_SMALL="100"
HEIGHT_LARGE="100"
IMAGEFORMAT="gif"

rrdtoolのパスを変更
PATH_RRDTOOL="/usr/bin/rrdtool"

mySQL関連の設定を変更
MYSQL_HOST=localhost
MYSQL_USER=root
MYSQL_PASSWORD=hogehoge
#MYSQL_PORT=3306
#MYSQL_SOCKET=/tmp/mysql.sock
MYSQL_SLOW_QUERY_LOG="/mnt/log/mysql-slow.log" # なければmy.iniで設定する

mySQL5.1だと起動はするものの数分したらコケるので下記のように男らしく修正
原因はtable_cacheがtable_open_cacheという名前に変わった為。
参考: mmeasuer 1.0.7を無理矢理mysql 5.1に対応させる
find /usr/local/mmeasure/ -type f -print0 | xargs -0 grep -l --null table_cache | xargs -0 perl -i.bak -p -e 's/table_cache/table_open_cache/g;'

同じような原因で、総クエリー回数以下の値を取得できないので、show statusをshow global statusにかえてやる。
find /usr/local/mmeasure/ -type f -print0 | xargs -0 grep -l --null table_cache | xargs -0 perl -i.bak -p -e 's/show status/show global status/g;'

これでmmeasure本体の設定は完了。

続いて、webで表示させるツールなのでhttpdも修正
/etc/httpd/conf.d/mmeasure.conf を作成

Alias /mmeasure/ "/usr/local/mmeasure/web/"
<Directory /usr/local/mmeasure/web/>
AuthUserFile /usr/local/mmeasure/web/.htpasspwd
AuthGroupFile /dev/null
AuthName "User Verification"
AuthType Basic
require valid-user
AddDefaultCharset euc-jp
</Directory>

mmeasure.shを起動
/usr/local/mmeasure/daemon/mmeasure.sh start

mmeasure.shを再起動
/etc/init.d/httpd restart

http://hogehoge.com/mmeasure/ にアクセスするとページが表示される。

注意点として、
「過去のインデックス未使用クエリー内訳」にページャーとかがついてるわけでないので、インデックス未使用クエリーが多いとずらーっと1ページに表示されしまう。

レプリケーションの設定のメモ。
まずマスターとなるサーバーで設定。
/etc/my.confを編集

[mysqld]
datadir=/mnt/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
log-bin
server-id=10
log-bin=mysql-bin
log-bin-index=mybin.index
expire_logs_days=14

log-binでバイナリログを保存しますよの宣言
server-idはスレーブと重複しないサーバーIDのようなもの。
log-bin=mysql-binとlog-bin-index=mybin.indexはバイナリログのファイル名。
mysql-bin.000001のようになります。
ここで指定したら/mnt/mysqlにバイナリログは蓄積されていきます。
指定しなかった場合、俺の環境では/var/run/mysqlに溜まりEC2のHDを圧迫してたので必須でした。
expire_logs_daysはログのローテーションの期間です。2週間サイクルにしています。

mySQLを再起動したらSQLを発行する度にバイナリログに書き込まれていきます。

スレーブの設定で使う読み取りバイナリログの読み取り開始位置を確認しておく。
mySQLにログイン
> SHOW MASTER STATUS;
Fileがlog-bin.000001
Positionが128
となってたのでそれをメモる。

ログインついでにスレーブからの接続専用のユーザーを作成する
> GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'replrepl';

スレーブと同期を取るために一旦mySQLを止める。
下記のようにしてスレーブにデータディレクトリをごっそり持っていきます。
rsync -avz -e ssh /mnt/mysql root@ec2-174-129-***-**.compute-1.amazonaws.com:/mnt

続けてスレーブのmy.confを設定
[mysqld]
datadir=/mnt/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
relay-log=relay-bin
server-id=14
master-host=ec2-174-129-**-**.compute-1.amazonaws.com
master-user=repl
master-password=replrepl
replicate-do-db=access
expire_logs_days=14

relay-log=relay-binでリレーされたらログがrelay-bin.000001という形で蓄積されていきます。
master-hostでマスターのサーバーのホスト名を
master-userとmaster-passwordで接続情報を登録しておきます。
replicate-do-dbで指定したDBだけリレーションするようにします。この場合accessのいうデータベースだけリレーションします。

次にmySQLにログイン。
バイナリログがまったくなければ
> start slave;
だけでもいけるかも。
>change master to master_host = 'ec2-174-129-**-**.compute-1.amazonaws.com', master_port = 3306, master_user = 'repl', master_password = 'replrepl', master_log_file = 'mysql-bin.00001', master_log_pos = 128;
start slave;

ここで先ほどメモった読み取り開始位置を入力する。

これでレプリケーションが始まる。
マスターで何かinsertしてスレーブに反映されていればOK。
レプリケーションされてなければmysqld.logを確認する。