2009年05月15日

[Wakame] Amazon EC2 API Toolsを使ってMySQL Slaveを作る (3/n)

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

[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
  • MySQL Slave
    • slave用my.cnfが存在する
      • datadir = /home/wakame/mysql/data-slave/
      • server-id = 2

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に組み込む為の手順の確認で作り始めたスクリプト。
このスクリプト単体でも意外と便利なのでアウトプットしてみた。
1人でも良いので、誰かの役に立てればアウトプットした意味がある。

AWS(Amazon Web Service)を使うと、いろいろな事が簡単に出来る事を実感した。
今回の様に、一度スクリプトを作ってしまえば、その後の作業は物凄く単純化される。
AWSに惚れ直した。

今後、色々なデベロッパーによって面白い使い方がされて行くだろう。
その面白い使い方の1つが「Wakame」になるはずだ!




詳解 シェルスクリプト
アーノルド ロビンス ネルソン・H.F. ベーブ
オライリージャパン
売り上げランキング: 137177
実践ハイパフォーマンスMySQL
ジェレミ・D. ザウドニ デレク・J. ベリング
オライリージャパン
売り上げランキング: 101715
High Performance MySQL 2e
High Performance MySQL 2e
posted with amazlet at 09.05.15
A Lentz
Pragma
売り上げランキング: 6573


半袖 at 20:00│Comments(0)TrackBack(1)Wakame 

トラックバックURL

この記事へのトラックバック

1. 実践ハイパフォーマンスMySQL  [ もぼなもな書房 ]   2009年06月04日 22:45
実践ハイパフォーマンスMySQL データベース概論としても、 なかなか良く書けているのではないかと思います。 MySQL 使いなら持っ...

この記事にコメントする

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