2009年05月08日
手軽にスナップショット取得し、手軽にスレーブをセットアップしたい
複数のMySQL Slaveを作る際の手順が、どうも面倒臭い。
手軽に作成する方法を模索していたら、master.infoをあらかじめ作成する方法に辿り着いた。
- masterに「server-id」と「log_bin」の設定し、mysqld起動(または再起動)
- レプリケーション用MySQLアカウント作成
- masterのテーブルロック
- masterのデータ領域のスナップショット作成
- 「SHOW MASTER STATUS」を実行し、ログファイルとポジションをメモ
- slaveにスナップショットを伸長
- slaveに「server-id」の設定し、mysqld起動
- slaveにて「CHANGE MASTER TO」を実行すると、master.infoが生成される
- master.infoの情報を基に、レプリケーションが行われ、更新されて行く
- →だったら、master.infoを先に作っておいても良いんじゃないか?
master.infoを先に作る
先の手順でも触れた様に、「CHANGE MASTER TO」をすると、master.infoが生成される。
と言う事は、master.infoを作っておけば「CHANGE MASTER TO」を実行しなくて済むはずだ。
その仮説のもとに、master.infoをあらかじめ作ってみたら「CHANGE MASTER TO」を実行しなくても見事同期に成功した。
▼master.infoのフォーマットは下記ページより
http://dev.mysql.com/doc/refman/5.1/ja/slave-logs-status.html
| 行 | 説明 |
|---|---|
| 1: | ファイル内のライン番号 |
| 2: | マスタのバイナリログ名 |
| 3: | マスタのバイナリログ内の現在位置 |
| 4: | マスタのホスト名 |
| 5: | マスタに接続するためのユーザ名 |
| 6: | マスタに接続するためのパスワード |
| 7: | マスタに接続するためのネットワークポート |
| 8: | インターバル時間(秒) |
| 9: | サーバがSSL接続をサポートするかどうかを示す |
| 10: | 証明機関(CA)に使用したファイル |
| 11: | 証明機関(CA)へのパス |
| 12: | SSL証明書のファイル名 |
| 13: | SSL節夫z国使用している暗号法名 |
| 14: | SSLキーファイル名 |
▼サンプルmaster.info
1: 14 2: mysql-bin.000002 3: 98 4: 192.0.2.10 5: repl 6: password 7: 3306 8: 60 9: 0 10: 11: 12: 13: 14:
1行目は14で固定。
2行目〜7行目は「CHANGE MASTER TO」指定項目で見慣れたもの。
8行目〜14行目も固定。(SSL使用時は必要に応じて変更)
一撃スナップショット生成スクリプト「make-mysql-repl-snapshot.sh」
ここまでのスナップショット生成手順をまとめると、下記の通り。
- mysql> FLUSH TABLES WITH READ LOCK;
- datadir/master.infoを生成
- スナップショット作成
- mysql> UNLOCK TABLES;
- ※必要に応じてmaster.infoは削除。しなくても良い。
手順が分かればスクリプトを書ける。
一撃でスナップショットを生成するスクリプトを作成してみた。
#!/bin/sh
#
# http://blog.hansode.org/
#
export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin
# mysqld masterの管理項目
mysqld_master_dir=/var/lib/mysql # datadirのパス
mysqld_master_admin_host=127.0.0.1 # MySQL Masterのホスト名(or IPアドレス)
mysqld_master_admin_user=root # MySQL Masterの管理ユーザー名
# master.info生成用設定項目
mysqld_master_info_host=192.0.2.1 # Slaveから見たMasterのホスト名(or IPアドレス)
mysqld_master_info_user=repl # レプリケーション用ユーザー名
mysqld_master_info_pass=password # レプリケーション用パスワード
mysqld_master_info_port=3306 # Slaveから見たMasterのポート番号
# この例では、ホスト名とユーザー名の指定のみ行っている
# 必要に応じて -p などを追加して下さい
mysql_command() {
cat | mysql \
-h${mysqld_master_admin_host} \
-u${mysqld_master_admin_user} \
-s
# -p${mysqld_master_admin_pass} \
# -P${mysqld_master_admin_port} \
}
# connect test
echo "SHOW MASTER STATUS" | mysql_command >/dev/null || {exit 1;}
#
echo "... flush tables with read lock;";
echo "FLUSH TABLES WITH READ LOCK;" | mysql_command
#
echo "... show master status;";
mysqld_master_status=$(echo "SHOW MASTER STATUS;" | mysql_command)
set ${mysqld_master_status}
mysqld_master_binlog_file=$1
mysqld_master_binlog_pos=$2
#
echo "... make master.info"
cat <<EOS > ${mysqld_master_dir}/master.info
14
${mysqld_master_binlog_file}
${mysqld_master_binlog_pos}
${mysqld_master_info_host}
${mysqld_master_info_user}
${mysqld_master_info_pass}
${mysqld_master_info_port}
60
0
EOS
#
chmod 0644 ${mysqld_master_dir}/master.info
chown mysql:mysql ${mysqld_master_dir}/master.info
#
snapshot_id=$(date +%Y%m%d%H%M%S)
snapshot_file=/tmp/mysqld-${snapshot_id}.tar.gz
echo "... make snapshot: ${snapshot_file}"
cd ${mysqld_master_dir}/../
tar zcpf ${snapshot_file} $(basename ${mysqld_master_dir})
#
echo "... unlock tables;";
echo "UNLOCK TABLES;" | mysql_command
#
rm -f ${mysqld_master_dir}/master.info
exit 0
実行例
$ ./make-mysql-repl-snapshot.sh ... flush tables with read lock; ... show master status; ... make master.info ... make snapshot: /tmp/mysqld-20090508081942.tar.gz ... unlock tables;
あとはスナップショットをSalveのdatadirに伸長するだけ。
作業まとめ
master$ sudo vi /etc/my.cnf + [mysqld] + server-id = 1 + log_bin master$ sudo /etc/init.d/mysql restart master$ ./make-mysql-repl-snapshot.sh master$ scp /tmp/mysqld-%Y%m%d%H%M%S.tar.gz slave:/tmp/
slave$ sudo vi /etc/my.cnf + [mysqld] + server-id = 2 slave$ sudo /etc/init.d/msyql stop slave$ cd /var/lib slave$ sudo mv -i mysql _mysql slave$ sudo tar zxvpf /tmp/mysqld-%Y%m%d%H%M%S.tar.gz slave$ sudo /etc/init.d/msyql start
大分簡略化されたけど、これでもまだ手順が多い。
master.info生成法は「簡易量産型」
2台以上のスレーブを作成する時、特に重宝する。
master.info生成法のメリットをまとめてみると、
- スナップショットをdatadirに伸長した後、mysqldを起動するだけでslaveになる
- master.info生成時に「SHOW MASTER STATUS」の情報を一度メモするだけで良い
- slave設定時に「CHANGE MASTER TO」を実行せずに済む
Wakameに組み込む為の検証
今回の内容はWakameに組み込む為の検証の1つ。
次回はAmazon EC2/S3/EBSを使ったレプリケーション設定をご紹介予定。
実践ハイパフォーマンスMySQL
posted with amazlet at 09.05.08
ジェレミ・D. ザウドニ デレク・J. ベリング
オライリージャパン
売り上げランキング: 63543
オライリージャパン
売り上げランキング: 63543
High Performance MySQL 2e
posted with amazlet at 09.05.08
A Lentz
Pragma
売り上げランキング: 27866
Pragma
売り上げランキング: 27866

