2009年05月15日
[Wakame] Amazon EC2 API Toolsを使ってMySQL Slaveを作る (2/n) の続編
前回予告した通り、今回はMySQLのdatadirにAmazon EBS Volumeをマウントした設定。
今回の作業前提条件は、
- MySQL Master
- master用my.cnfが存在する
- datadir = /home/wakame/mysql/data/
- server-id = 1
- log_bin
- master用my.cnfが存在する
- MySQL Slave
- slave用my.cnfが存在する
- datadir = /home/wakame/mysql/data-slave/
- server-id = 2
- slave用my.cnfが存在する
6つのファイル
今回使うのは6つのファイル。
- _wakame-common.sh
- 共通設定
- wakame-ebs-mysql-master-create-volume.sh
- Amazon EBS Volume作成
- wakame-ebs-mysql-master-init.sh
- MySQLのdatadirを初期化
- ※今回初登場
- wakame-ebs-mysql-master-add-repl-user.sh
- MySQLのレプリケーション用MySQLアカウント作成
- ※今回初登場
- wakame-ebs-mysql-master-make-snapshot.sh
- Master datadirからAmazon EBS Snapshot作成
- ※今回初登場
- wakame-ebs-mysql-slave-restore.sh
- Amazon EBS Snapshotからslave用datadir作成
- ※今回初登場
前回登場しているファイルは省略。
▼wakame-ebs-mysql-master-init.sh
#!/bin/sh
#
# http://blog.hansode.org/
# 2009.05.12
#
##
## variables
##
# common
pwd=$(cd $(dirname $0) && pwd)
[ -f ${pwd}/_wakame-common.sh ] && . ${pwd}/_wakame-common.sh
df ${ebs_master_dev} || exit 1
[ -d ${ebs_master_mnt} ] || exit 1
chown mysql:mysql ${mysqld_master_dir}
mysql_install_db --datadir=${mysqld_master_dir}
exit 0
▼wakame-ebs-mysql-master-add-repl-user.sh
#!/bin/sh
#
# http://blog.hansode.org/
# 2009.05.12
#
##
## variables
##
# common
pwd=$(cd $(dirname $0) && pwd)
[ -f ${pwd}/_wakame-common.sh ] && . ${pwd}/_wakame-common.sh
[ -z "${mysqld_master_acl}" ] && { echo "please set mysqld_master_acl"; exit 1; }
echo "GRANT REPLICATION SLAVE, REPLICATION CLIENT, RELOAD ON *.* TO '${mysqld_master_info_user}'@'${mysqld_master_acl}' IDENTIFIED BY '${mysqld_master_info_pass}';" | mysql_command
echo "FLUSH PRIVILEGES;" | mysql_command
exit 0
▼wakame-ebs-mysql-master-make-snapshot.sh
#!/bin/sh
#
# http://blog.hansode.org/
# 2009.05.12
#
##
## variables
##
# common
pwd=$(cd $(dirname $0) && pwd)
[ -f ${pwd}/_wakame-common.sh ] && . ${pwd}/_wakame-common.sh
# ebs_master_volume=
ebs_master_volume=$(ec2-describe-volumes | grep ${ec2_instance_id} | grep ${ebs_master_dev} | grep attached | awk '{print $2}')
[ -z "${ebs_master_volume}" ] && { echo not mounted: ${ebs_master_dev}; exit 1; }
echo ${ebs_master_volume}
echo
# 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
#
echo "$ ec2-create-snapshot ${ebs_master_volume}"
#
ebs_master_snapshot_id=$(ec2-create-snapshot ${ebs_master_volume} | awk '{print $2}')
[ -z "${ebs_master_snapshot_id}" ] && { exit 1; }
#
for i in 1 2 3 4 5 6 7 8 9 10; do
echo -n ". "
ec2-describe-snapshots | grep ${ebs_master_snapshot_id} | grep completed -q && break
sleep 1
done
echo
#
echo "... unlock tables;";
echo "UNLOCK TABLES;" | mysql_command
echo ">>> snapshot_id = ${ebs_master_snapshot_id}"
exit 0
▼wakame-ebs-mysql-slave-restore.sh
#!/bin/sh
#
# http://blog.hansode.org/
# 2009.05.12
#
##
## variables
##
# local
ebs_master_snapshot_id=$1
[ -z "${ebs_master_snapshot_id}" ] && { echo "usage: $0 [snapshot-id]"; exit 1; }
# common
pwd=$(cd $(dirname $0) && pwd)
[ -f ${pwd}/_wakame-common.sh ] && . ${pwd}/_wakame-common.sh
## check phase
[ -b "${ebs_slave_dev}" ] && { echo "already attached: ${ebs_slave_dev}"; exit 1; }
df ${ebs_slave_dev} >/dev/null 2>&1 && { echo "already mounted: ${ebs_slave_dev}"; exit 1; }
## EC2 instance
# create volume
ebs_slave_volume=$(ec2-create-volume --snapshot ${ebs_master_snapshot_id} -z ${ec2_zone} | awk '{print $2}')
[ -z "${ebs_slave_volume}" ] && { echo "can't create volume"; exit 1; }
for i in 1 2 3 4 5 6 7 8 9 10; do
echo -n ". "
ec2-describe-snapshots | grep ${ebs_master_snapshot_id} | grep completed -q && break
sleep 1
done
echo
# attache volume
ec2-attach-volume -d ${ebs_slave_dev} -i ${ec2_instance_id} ${ebs_slave_volume}
for i in 1 2 3 4 5 6 7 8 9 10; do
echo -n ". "
sync
[ -b ${ebs_slave_dev} ] && break
sleep 1
done
# mount ...
[ -z "${ebs_slave_mnt}" ] && { echo "please set ebs_slave_mnt"; exit 1; }
[ -d "${ebs_slave_mnt}" ] || mkdir ${ebs_slave_mnt}
mount ${ebs_slave_dev} ${ebs_slave_mnt} >/dev/null 2>&1
mount | grep ${ebs_slave_dev}
df ${ebs_slave_dev} >/dev/null 2>&1 || { echo "not available: ${ebs_slave_dev}"; exit 1; }
echo
# current volume?
ec2-describe-volumes ${ebs_slave_volume}
# done
exit 0
スクリプトの準備
前回同様の作業ディレクトリへ移動
# cd work/wakame
初登場スクリプト2つをそれぞれコピー&ペースト
# cat > wakame-ebs-mysql-master-init.sh (コピー&ペースト) ^D # cat > wakame-ebs-mysql-master-add-repl-user.sh (コピー&ペースト) ^D # cat > wakame-ebs-mysql-master-make-snapshot.sh (コピー&ペースト) ^D # cat > wakame-ebs-mysql-slave-restore.sh (コピー&ペースト) ^D
実行可能状態にしておく
# chmod +x ./wakame-ebs-mysql-master-init.sh # chmod +x ./wakame-ebs-mysql-master-add-repl-user.sh # chmod +x ./wakame-ebs-mysql-master-make-snapshot.sh # chmod +x ./wakame-ebs-mysql-slave-restore.sh
動作実行例
MySQL Masterのdatadir用にAmazon EBS Volumeを作成
master# ./wakame-ebs-mysql-master-create-volume.sh $ ec2-create-volume -z us-east-1b -s 1 ebs_master_volume:vol-e058ba89 $ ec2-attach-volume -d /dev/sdm -i i-f9047990 vol-e058ba89 ATTACHMENT vol-e058ba89 i-f9047990 /dev/sdm attaching 2009-05-15T03:37:49+0000 . . $ yes | mkfs -t ext3 /dev/sdm >/dev/null 2>&1 /dev/sdm on /home/wakame/mysql/data type ext3 (rw)
MySQL Masterのdatadir用を初期化
master# ./wakame-ebs-mysql-master-init.sh
レプリケーション用MySQLアカウントを追加
master# ./wakame-ebs-mysql-master-add-repl-user.sh
MySQL Masterのmysqldを起動
master# mysql start
MySQL MasterのdatadirからAmazon EBS Snapshotを作成
master# ./wakame-ebs-mysql-master-make-snapshot.sh vol-e058ba89 ... flush tables with read lock; ... show master status; ... make master.info $ ec2-create-snapshot vol-e058ba89 ... unlock tables; . >>> snapshot_id = snap-50c73f39
例では、snapshotのIDが「snap-50c73f39」となった。
先に生成したAmazon EBS Snapshotからslave用datadir作成。
この時、snapshot IDが必要となる。
slave# ./wakame-ebs-mysql-slave-restore.sh snap-50c73f39 . ATTACHMENT vol-3e5ebc57 i-1344387a /dev/sdn attaching 2009-05-15T07:19:14+0000 . . /dev/sdn on /home/wakame/mysql/data-slave type ext3 (rw) VOLUME vol-3e5ebc57 1 snap-50c73f39 us-east-1b in-use 2009-05-15T07:19:01+0000 ATTACHMENT vol-3e5ebc57 i-1344387a /dev/sdn attached 2009-05-15T07:19:14+0000
MySQL Slaveのmysqldを起動
slave# mysql start
レプリケーションの確認
ここはざっくり省略。
- MySQL Master
- 「SHOW MASTER STATUS」で状態を確認
- MySQL Slave
- 「SHOW SLAVE STATUS」で状態を確認
- IOスレッド、SQLスレッドが「YES」である事
- Masterのbinlogポジションと同値である事
本シリーズは3回で終わり
AWSを使ったMySQLレプリケーション作成と設定は今回で終わり。
- [Wakame] Amazon EC2 API Toolsを使ってMySQL Slaveを作る (1/n)
- [Wakame] Amazon EC2 API Toolsを使ってMySQL Slaveを作る (2/n)
- [Wakame] Amazon EC2 API Toolsを使ってMySQL Slaveを作る (3/3)
シリーズを振り返る
Wakameに組み込む為の手順の確認で作り始めたスクリプト。
このスクリプト単体でも意外と便利なのでアウトプットしてみた。
1人でも良いので、誰かの役に立てればアウトプットした意味がある。
AWS(Amazon Web Service)を使うと、いろいろな事が簡単に出来る事を実感した。
今回の様に、一度スクリプトを作ってしまえば、その後の作業は物凄く単純化される。
AWSに惚れ直した。
今後、色々なデベロッパーによって面白い使い方がされて行くだろう。
その面白い使い方の1つが「Wakame」になるはずだ!
オライリージャパン
売り上げランキング: 137177
オライリージャパン
売り上げランキング: 101715
Pragma
売り上げランキング: 6573


