2009年05月08日

[Wakame] 一味違ったMySQLレプリケーション設定「CHANGE MASTER TOをせず、あらかじめmaster.infoを作っておく」

livedoorClipに登録 | このエントリーをはてなブックマークに追加 | del.icio.usに登録 | MM/Memoに登録

手軽にスナップショット取得し、手軽にスレーブをセットアップしたい

複数のMySQL Slaveを作る際の手順が、どうも面倒臭い。
手軽に作成する方法を模索していたら、master.infoをあらかじめ作成する方法に辿り着いた。

  1. masterに「server-id」と「log_bin」の設定し、mysqld起動(または再起動)
  2. レプリケーション用MySQLアカウント作成
  3. masterのテーブルロック
  4. masterのデータ領域のスナップショット作成
  5. 「SHOW MASTER STATUS」を実行し、ログファイルとポジションをメモ
  6. slaveにスナップショットを伸長
  7. slaveに「server-id」の設定し、mysqld起動
  8. slaveにて「CHANGE MASTER TO」を実行すると、master.infoが生成される
  9. master.infoの情報を基に、レプリケーションが行われ、更新されて行く
  10. →だったら、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」

ここまでのスナップショット生成手順をまとめると、下記の通り。

  1. mysql> FLUSH TABLES WITH READ LOCK;
  2. datadir/master.infoを生成
  3. スナップショット作成
  4. mysql> UNLOCK TABLES;
  5. ※必要に応じて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
ジェレミ・D. ザウドニ デレク・J. ベリング
オライリージャパン
売り上げランキング: 63543
High Performance MySQL 2e
High Performance MySQL 2e
posted with amazlet at 09.05.08
A Lentz
Pragma
売り上げランキング: 27866


半袖 at 18:50│Comments(0)TrackBack(0)Wakame 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔