ioDrive+MySQL勉強会でチラリと紹介したMySQL Percona Serverですが、並列処理やDiskI/Oに配慮された設計だけではなく、それ以外にも様々な強みがあるので紹介していきたいと思います。
Percona関連の日本語情報はまだまだ少ないようですので、自分の復習も兼ねて基本的なところから少しずつ書いていきます。
はじめに
表記について
記事の書き方について
わかりやすくするため記事を小分けにして長期に渡って書く予定です。そのため気分によって途中で別ジャンルの記事を挟むこともありますが、ちゃんと続けます。バージョンについて
5.5.8あたりの時によく調べましたが、現時点での最新である下記バージョンで再調査しつつ書いていきます。別記事でも書きますが、XtraBackupは重大なバグを含むバージョンがあるので、最新を使うべきです。Perconaを採用する理由
DiskI/Oに配慮された設計であるため、ioDriveやSSDを利用する上ではより性能の向上を望め、HDDにおいてもより安定した調整を行うことができます。これは主に MySQLサーバの my.cnf の話になります。他に便利な外部ツールが多くあり、XtraBackupによるバックアップはロックを必要としなかったり、差分バックアップを取ることができます。
また、Percona Toolkitの中には、オンライン(ロック・サービス停止無し)でスキーマ変更を行うことができるツールなど、多くの便利ツールを含んでいるので要チェックです。
リンク情報
Percona総合
Blog
Blog記事
インストール方法
公式のWikiはこちら。ここでの説明はDebian Squeezeでのaptですが、yum用も配布されています。
鍵の登録
1 2 |
gpg --keyserver hkp://keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A gpg -a --export CD2EFD2A | apt-key add - |
インストール
レポジトリを記述します。/etc/apt/sources.list.d/mysql_percona.list
1 2 |
deb http://repo.percona.com/apt squeeze main deb-src http://repo.percona.com/apt squeeze main |
インストールします。依存関係でclientやlibaio1も入ってくれます。
1 2 3 4 5 6 |
apt-get update apt-get install percona-server-server-5.5 # 確認と停止 lsof -i:3306 /etc/init.d/mysql stop |
起動の確認がとれたら、いったん停止しておきます。
パスはMySQL Community Serverのdebだと /opt になりますが、Perconaはオーソドックスに /usr と /etc に必要なものが全て入ります。
ついでにXtraBackupとToolkitも入れておきます。
1 |
apt-get install xtrabackup percona-toolkit |
my.cnfの作成
具体的な内容は割愛しますが、まずは普段利用している通常のMySQLのmy.cnfをそのまま持ってくればOKです。/etc/mysql/my.cnf
1 |
割愛 |
データディレクトリとログディレクトリの作成
ここではioDriveを利用している前提で、ioDriveを /fio にマウントしているものとします。そして、その下に必要なディレクトリをこのような構成で作成します。
1 2 3 4 5 6 7 |
/fio/ ... ioDriveマウントディレクトリ。*F*usion-io *io*Drive の略のつもり ├ mysql/ ... データディレクトリ (datadir) ├ mysql_tmp/ ... tmpディレクトリ (tmpdir) └ mysql_log/ ... 各種ログ置き場 ├ bin/ ... MASTERバイナリログ (log-bin, log-bin-index) ├ relay/ ... SLAVEリレーログ (relay-log, relay-log-index, relay-log-info-file) └ system/ ... エラーログやスロークエリログ (log-error, slow_query_log_file) |
最後のシステムログはどこでもいいですが、それ以外は全てioDriveに保存しないとパフォーマンスが劣化します。
まずデータディレクトリを移動します。
もしmy.cnfのInnoDBログファイルのサイズがデフォルトの5MBではない場合は削除しておきます。(削除しなかったら起動に失敗してエラーログで気づきます)
1 2 3 4 5 |
cd /fio mv /var/lib/mysql /fio/mysql # InnoDBログファイルとデータを削除 rm /fio/mysql/ib* |
移動ではなく新規作成の場合は
1 |
mysql_install_db --datadir=/fio/mysql --user=mysql |
次にディレクトリを作成します。
1 2 3 4 |
cd /fio mkdir -m0700 mysql_tmp mysql_log mkdir -m0700 mysql_log/bin mysql_log/relay mysql_log/system chown -R mysql:mysql mysql_tmp mysql_log |
起動します。失敗したら、エラーログを確認して修正してから再実行してください。
1 |
/etc/init.d/mysql start |
ユーザ権限の整理
もしパッケージインストール時にrootパスワードを空にしてしまっていたら、設定しておきます。
1 |
mysqladmin -u root password RootPassword |
次にユーザ権限を整理します。作成内容は主に下記の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# mysql -u root -p mysql mysql> # サービス用 GRANT ALL ON test.* TO test@localhost IDENTIFIED BY 'TestPassword'; # レプリケーション用 GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO repl@"10.%" IDENTIFIED BY 'ReplPassword'; # 監視用(from snmpd, nagios-nrpe-server, Nagios, etc...) GRANT USAGE, SELECT, REPLICATION CLIENT ON *.* TO 'monitor'@'localhost' IDENTIFIED BY 'MonitorPassword'; GRANT USAGE, SELECT, REPLICATION CLIENT ON *.* TO 'monitor'@'127.0.0.1' IDENTIFIED BY 'MonitorPassword'; GRANT USAGE, REPLICATION CLIENT ON *.* TO 'monitor'@'10.%' IDENTIFIED BY 'MonitorPassword'; DELETE FROM user WHERE Password = ''; FLUSH PRIVILEGES; exit; |
あとはサービスに応じてSUPER, RELOAD, FILE あたりを付与しておいてください。
ログローテート
パッケージに /etc/logrotate.d/percona-server-server-5.5 を含んでいるので、これを再利用します。
1 2 3 |
mv /etc/logrotate.d/percona-server-server-5.5 /etc/logrotate.d/mysql_percona vim /etc/logrotate.d/mysql_percona |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# - I put everything in one block and added sharedscripts, so that mysql gets # flush-logs'd only once. # Else the binary logs would automatically increase by n times every day. # - The error log is obsolete, messages go to syslog now. /fio/mysql_log/system/error.log /fio/mysql_log/system/slow-queries.log { daily rotate 7 missingok create 640 mysql adm compress sharedscripts postrotate test -x /usr/bin/mysqladmin || exit 0 # If this fails, check debian.conf! MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf" if [ -z "`$MYADMIN ping 2>/dev/null`" ]; then # Really no mysqld or rather a missing debian-sys-maint user? # If this occurs and is not a error please report a bug. if ps cax | grep -q mysqld; then exit 1 fi else $MYADMIN flush-logs fi endscript } |
ログはmvした形だと続きが記録されなくなるので、flush-logsが実行されています。
インストール手順は以上です。
今後はあと数回、Percona Serverについて書いて、その次に長い長いXtraBackupにいこうと思っています。
気長によろしくお願いします。