Wakame
2009年10月22日
■急募:"Wakame 1.0"開発協力者!
株式会社あくしゅでは"Wakame 1.0"の開発者を募集しています!
Wakameは次世代データセンターには欠かせないクラウドコントローラとして、今後大幅に機能拡張していきます。
Rubyでミドルウェアを開発してみたいという意欲あふれる方は是非お問い合わせください。
■仕事内容
- "Wakame 1.0"の使用目的を拡大するために、ミドルウェア部分の機能拡張を実施
- "Wakame 1.0"を使いやすくするために、GUIの追加開発を実施
- "Wakame 1.0"を分かりやすくするために、ドキュメントの整備を実施
■募集要項
- 下記(A)(B)(C)の知識・技術セットをいずれかお持ちの方
- Ruby, 現在のWakame, メッセージング, 並列処理, Xenなどのハイパーバイザの知識
- JavaScript, XHTML, Ruby on Rails, http通信(REST), ユーザビリティ, 画面設計の知識
- HTML, ドキュメンテーション
- システムの設計が得意で、オブジェクト指向を理解している方
- 人とのコミュニケーションが好きな明るい方
- 期間:2009年11月初旬〜2010年3月下旬
■条件
応募期限は10/26(月)までです。
それ以降10/30(金)までに一度仕事内容や関わり方をミーティング形式でご相談させていただきましてその後、弊社基準で判断してからお見積もりをお願いします。
■一言
設立3年目の若い会社です。
来年からは「世界のクラウドソリューションを」をテーマに事業展開していく予定です。
そのために今後は弊社で開発している"Wakame"を機能拡張し、より高度なプロダクトへと躍進させていきます。
あなたもぜひ、この新しいチャンスに乗ってみませんか?
■連絡先
Twitter: @axsh_co_ltd
E-mail: r_at_axsh_dot_net (_at_と_dot_は適宜文字列を置換してください)
2009年07月24日
今月はWakame三昧だった
2009/07/24(金)、ようやく0.4.2をリリース出来た。
マイナーバージョンアップにしては盛り沢山。
▼http://rubyforge.org/frs/shownotes.php?release_id=37164より
== 0.4.2 2009-07-24 * Add Web API for master control. (Note that the API design is not fixed yet) * Rewrote the CLI to use HTTP instead of old DRb interface. * Add support for agent less resource. * Add LockQueue to avoid confliction when multiple actions run. * Add MySQL_Slave resource. * Add Elastic IP resource. * Add Elastic Load Balancer resource. * Add Nginx resource.
次は0.4.3か0.5.0か。
みんなで使い始めると足りない機能が色々見えて来る。
「Wakame」の進化は、まだまだこれからだ。
2009年07月02日
「"Wakame"で始めるクラウドコントロール」公開中
連載が終わってから告知し忘れたままである事に気づく。
gihyo.jpさんにてwakameの特集が掲載されてます。
自分も執筆に参加。
まさかこんな日が来るとは思ってもみなかった。
2009年05月26日
[Wakame] PostgreSQLもスケール対象へ (3/n)の続編
予告通り、今回はオンラインリカバリを実行してみる。
- node1(PostgreSQL)
- オンラインリカバリ用にnode1の鍵作成
- オンラインリカバリ用にnode2に鍵登録
- リカバリスクリプト配置
- pgpool-II
- 対象ノードを登録
- pgpool-IIを再起動
- node2をノードから外す
- node2に対してリカバリを実行
- pgbenchしてみる?
作業内容: node1(PostgreSQL)
▼作業が面倒なので、あらかじめUNIXアカウントpostgresになっておく
node1$ sudo su postgres
▼node1の鍵作成
node1$ ssh-keygen -t dsa -N "" 鍵のファイル名を問われるので、デフォルトファイル名で問題なければEnter
▼node2に鍵を登録
node1$ cat /var/lib/postgresql/.ssh/id_dsa.pub | ssh (node2) "cat >> /var/lib/postgresql/.ssh/authorized_keys"
▼リカバリスクリプト配置
pgpool-IIによるレプリケーションとオンラインリカバリからスクリプトを拝借。
node1$ cd /usr/local/pgsql/data node1$ chmod +x recovery_1st_stage.sh node1$ chmod +x recovery_2nd_stage.sh node1$ chmod +x pgpool_remote_start
作業内容: pgpool-II
pgpool-II$ cd /usr/local/pgpool2/etc pgpool-II$ sudo vi pgpool.conf listen_addresses = '*' port = 9999 pcp_port = 9898 # for debian socket_dir = '/var/run/postgresql' pcp_socket_dir = '/var/run/postgresql' backend_socket_dir = '/var/run/postgresql' # Logging directory logdir = '/tmp' # pid file name pid_file_name = '/var/run/postgresql/pgpool.pid' # Replication mode replication_mode = true # Health check user health_check_user = 'nobody' # node1 backend_hostname0 = '192.168.1.123' backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/usr/local/pgsql/data' # node2 backend_hostname1 = '192.168.1.124' backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/usr/local/pgsql/data' recovery_user = 'postgres' recovery_1st_stage_command = 'recovery_1st_stage.sh' recovery_2nd_stage_command = 'recovery_2nd_stage.sh'
▼pgpoolを起動
pgpool-II$ sudo -u postgres /usr/local/pgpool2/bin/pgpool -n &
▼pcp_node_infoでノード情報を確認
pgpool-II$ /usr/local/pgpool2/bin/pcp_node_info 100 192.168.1.122 9898 postgres postgres 0 192.168.1.123 5432 1 1073741823.500000 pgpool-II$ /usr/local/pgpool2/bin/pcp_node_info 100 192.168.1.122 9898 postgres postgres 1 192.168.1.124 5432 1 1073741823.500000
pgpoolのノード対象となっている事を確認。
この時、node2のPostgreSQLは停止状態にあるにも関わらず、pcp_node_infoではステータスが「1」となっている。
一度pgpoolへ接続すると状態に変化が現れた。
pgpool-II$ psql -h localhost -p 9999 pgpool-II$ /usr/local/pgpool2/bin/pcp_node_info 100 192.168.1.122 9898 postgres postgres 0 192.168.1.123 5432 2 1073741823.500000 pgpool-II$ /usr/local/pgpool2/bin/pcp_node_info 100 192.168.1.122 9898 postgres postgres 1 192.168.1.124 5432 3 1073741823.500000
ノードの状態がそれぞれ、node1は「2」、node2は「3」となった。
▼node2をクラスタから切り離す
pgpool-II$ /usr/local/pgpool2/bin/pcp_detach_node 100 192.168.1.122 9898 postgres postgres 1
出力が無いので、無事に切り離されたのかが良く分からない。
pgpool-II$ /usr/local/pgpool2/bin/pcp_node_info 100 192.168.1.122 9898 postgres postgres 1 192.168.1.124 5432 3 1073741823.500000
pcp_node_infoで確認してみると、状態は「3」のまま。
▼オンラインリカバリを実行
pgpool-II$ pcp_recovery_node 100 192.168.1.122 9898 postgres postgres 1
メッセージが出力されないので、成功したのか失敗したのかが分かりづらい。
pgpool-II$ ./pcp_node_info 100 192.168.1.122 9898 postgres postgres 1 192.168.1.124 5432 1 1073741823.500000
どうやら成功したようだ。
pgpool-recoveryを使うと簡単にノードを追加出来るね。
今後の予定
- 図を使ってpgpool-recoveryを使ったオンラインリカバリのまとめ
- AWS(Amazon EC2, Amazon EBS)を使ってノード増殖検証
関連エントリ
- [Wakame] PostgreSQLもスケール対象へ (1/n)
- [Wakame] PostgreSQLもスケール対象へ (2/n)
- [Wakame] PostgreSQLもスケール対象へ (3/n)
[Wakame] PostgreSQLもスケール対象へ (2/n)の続編
前回の予定を変更し、今回はpgpool-IIの追加設定。
オンラインリカバリ検証は次回予定。
今回の前提条件として、pgpool-IIがインストールされている事。
作業内容は前回のエントリを参照。
作業の流れ
作業対象サーバは2台で、pgpool-IIとノード(PostgreSQL)。
重要なのはアーカイブログの有効化とpgpool-recoveryの組み込み。
- pgpool-II
- pcpアカウント作成
- pgpool-recoveryビルド
- ノード(PostgreSQL)
- pgpool-recoveryを配置
- initdbコマンドでdataディレクトリ作成
- アーカイブログ用ディレクトリ作成
- configを変更しアーカイブログを有効化
- pgpool-recoveryをPostgreSQLに組み込む
作業内容: pgpool-II
▼PCP コマンドの設定より
pgpool-II では PCP コマンドと呼ばれるインタフェースを通して pgpool-II の停止やデータベースノードに関する情報の表示を行います。
PCP コマンドを使用するにはユーザ認証が必要になるので、ユーザ名とパスワードを pcp.conf ファイルに設定します。
pcp.conf ファイルの書式は以下のように 1 行ごとにユーザ名と MD5 ハッシュに変換されたパスワードを : で区切ったものです。
pcp用アカウントを設定して行く
▼pcpアカウント用パスフレーズ生成
$ /usr/local/pgpool2/bin/pg_md5 postgres e8a48653851e28c69d0506508fb27fc5
md5sumコマンドと何が違うのか…
$ echo -n postgres | md5sum e8a48653851e28c69d0506508fb27fc5 -
当たり前だけど、ハッシュ値は同じだ。
echoだと「-n」をつけ忘れる可能性があるので、pg_md5を使うのがベター。
▼pcp用アカウント追加
$ cd /usr/local/pgpool2/etc/; pwd /usr/local/pgpool2/etc $ sudo cp -pi pcp.conf.sample pcp.conf $ sudo vi pcp.conf $ diff pcp.conf.sample pcp.conf 28a29 > postgres:e8a48653851e28c69d0506508fb27fc5
▼pgpool-recoveryをビルドするための準備
$ sudo apt-get install postgresql-server-dev-8.3
▼pgpool-recoveryをビルド
$ cd sql/pgpool-recovery/ $ make
▼pgpool-recoveryのインストール先ディレクトリ作成
$ sudo mkdir /usr/local/pgsql $ sudo mkdir /usr/local/pgsql/lib $ sudo mkdir /usr/local/pgsql/share
▼pgpool-recoveryのインストール先ディレクトリを変更したので、パス変更
$ perl -pi -e 's,\$libdir,/usr/local/pgsql/lib,' pgpool-recovery.sql
▼pgpool-recoveryをインストール
$ sudo cp -pi pgpool-recovery.so /usr/local/pgsql/lib/. $ sudo cp -pi pgpool-recovery.sql /usr/local/pgsql/share/.
作業内容: ノード(PostgreSQL)
▼PostgreSQL用ディレクトリ準備
$ sudo mkdir /usr/local/pgsql $ sudo chown postgres:postgres /usr/local/pgsql
psqlコマンドなどはDebianパッケージでインストールされている物とする
▼pgpool-IIからノードへpgpool-recoveryを配置
$ cd /usr/local/pgsql $ sudo mkdir lib $ sudo mkdir share $ scp (pgpool-II):/usr/local/pgsql/lib/pgpool-recovery.so ./lib/pgpool-recovery.so $ scp (pgpool-II):/usr/local/pgsql/share/pgpool-recovery.sql ./share/pgpool-recovery.sql
▼initdbコマンドでdataディレクトリ作成
$ sudo -u postgres /usr/lib/postgresql/8.3/bin/initdb -D /usr/local/pgsql/data
▼archive_logの準備
$ sudo -u postgres mkdir /usr/local/pgsql/data/archive_log/ $ sudo -u postgres chmod 700 /usr/local/pgsql/data/archive_log/
▼postgresql.conf変更 アーカイブログを有効化
$ sudo vi /usr/local/pgsql/data/postgresql.conf listen_addresses = '*' archive_mode = on archive_command = 'cp %p /usr/local/pgsql/data/archive_log/%f'
▼pg_hba.conf変更
$ sudo vi /usr/local/pgsql/data/pg_hba.conf local all all trust host all all 127.0.0.1/32 trust host all all 192.168.1.0/24 trust host all all ::1/128 trust
pgpool-IIからの接続を許可する
▼PostgreSQLを起動
$ sudo -u postgres /usr/lib/postgresql/8.3/bin/pg_ctl -D /usr/local/pgsql/data start
▼pgpool-recoveryをpostgresに組み込む
$ sudo -u postgres psql -c "\i /usr/local/pgsql/share/pgpool-recovery.sql" template1 CREATE FUNCTION CREATE FUNCTION
オンラインリカバリを検証する為の受け皿は整った。
今後の予定
- オンラインリカバリ検証
関連エントリ
翔泳社
売り上げランキング: 34255
2009年05月20日
[Wakame] PostgreSQLもスケール対象へ (1/n) の続編
前回の予告通り、今回はpgpool-II 2.1以降をインストールする。
http://pgfoundry.org/projects/pgpoolを確認すると、2009/05/20現在「2.2.2」が最新版。
今回はpgpool-II 2.2.2をインストールする。
作業記録
▼事前準備
$ sudo apt-get install libpq-dev
pgpool-IIをビルドするにはpg_configコマンドが必要なので、libpq-devをインストールしておく必要がある。
$ which pg_config /usr/bin/pg_config
pg_configコマンドの存在を確認。
▼pgpool-IIのソースパッケージをダウンロード
$ wget http://pgfoundry.org/frs/download.php/2191/pgpool-II-2.2.2.tar.gz
▼tar ballを伸長
$ tar zxvf pgpool-II-2.2.2.tar.gz
▼ビルドとインストール
$ cd pgpool-II-2.2.2/; pwd /home/axsh/work/pgpool-II-2.2.2 $ ./configure --prefix=/usr/local/pgpool2 $ make $ sudo make install
▼config用意
$ cd /usr/local/pgpool2/etc/; pwd /usr/local/pgpool2/etc $ sudo cp -pi pgpool.conf.sample pgpool.conf $ sudo vi pgpool.conf $ diff pgpool.conf.sample pgpool.conf 17c17,18 < socket_dir = '/tmp' --- > #socket_dir = '/tmp' > socket_dir = '/var/run/postgresql' 21c22,23 < pcp_socket_dir = '/tmp' --- > #pcp_socket_dir = '/tmp' > pcp_socket_dir = '/var/run/postgresql' 24c26,27 < backend_socket_dir = '/tmp' --- > #backend_socket_dir = '/tmp' > backend_socket_dir = '/var/run/postgresql' 60c63,64 < pid_file_name = '/var/run/pgpool/pgpool.pid' --- > #pid_file_name = '/var/run/pgpool/pgpool.pid' > pid_file_name = '/var/run/postgresql/pgpool.pid' 177a182,185 > backend_hostname0 = '127.0.0.1' > backend_port0 = 5432 > backend_weight0 = 1 >
configのコメントには「Debianではこの設定値」と書かれていて、
Debianユーザーには優しいコメントとなっている。
▼pgpool-IIを起動
$ sudo -u postgres /usr/local/pgpool2/bin/pgpool -n
pgpoolコマンドに「-n」を付けるとforegroundで起動する。
「daemontools」でプロセス管理させる事も検討したい。
▼postgresへの接続テスト
$ psql -p 9999 -d postgres
Password:
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# \q
問題なくpgpoolへ接続出来た。
課題
- pgpool-IIの起動管理
- 個人的にはdaemontoolsで管理したい所だ
- オンラインリカバリとの相性がどうなのか分からないので
- →とりあえず保留
今後の予定
- オンラインリカバリ検証
- 作ったスクリプトがあればそのスクリプト
関連エントリ
翔泳社
売り上げランキング: 6803
「Wakame」で「PostgreSQL」を使えるようにしたい
WakameでPostgreSQLを使えるなら使ってみたい
Wakameに興味を持って下さった方々から、
こう言った声を少なからずとも、いや、意外と多く聞く様になった。
だったら、PostgreSQLもどうにかしよう。
個人的には久しぶりにPostgreSQLに触れる機会となった。
PostgreSQLでレプリケーション構成を構築するには「pgpool-II」を使うと良いらしいよ
噂の真相を突き止めるべく、検証してみる事にした。
作業記録
作業環境
| ディストリビューション | Debian GNU/Linux 5.0.1 |
| カーネル | 2.6.18-6-xen-amd64 |
| postgresql | 8.3.7-0lenny1 |
| pgpool2 | 1.3-2 |
PostgreSQLをインストール
$ sudo apt-get install postgresql
PostgreSQLアカウント作成
$ sudo -u postgres createuser -P axsh Enter password for new role: Enter it again: Shall the new role be a superuser? (y/n) y
psqlでpostgresに接続テスト
$ psql -d postgres
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# \q
pgpool-IIをインストール
$ sudo apt-get install pgpool2
pgpool-IIにノードを追加
$ cd /etc; pwd /etc $ sudo cp -pi pgpool.conf pgpool.conf.0 $ sudo vi pgpool.conf $ diff pgpool.conf.0 pgpool.conf 149a150,153 > backend_hostname0 = '127.0.0.1' > backend_port0 = 5432 > backend_weight0 = 1 >
pgpool-IIを再起動
$ sudo /etc/init.d/pgpool2 restart
pgpool-IIへ接続テスト
$ psql -d postgres -p 5433
Password:
Welcome to psql 8.3.7, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# \q
繋がった
LISTENポートを調べてみる
$ sudo netstat -nap |grep -w LISTEN tcp 0 0 0.0.0.0:9898 0.0.0.0:* LISTEN 8378/pgpool tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1069/sshd tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 7613/postgres tcp 0 0 127.0.0.1:5433 0.0.0.0:* LISTEN 8378/pgpool tcp6 0 0 :::22 :::* LISTEN 1069/sshd
| ポート番号 | 内容 |
|---|---|
| 5432 | postgres |
| 5433 | pgpool |
| 9898 | pgpool communication manager |
なるほど
面白機能は pgpool-II 2.1からだった…
pgpool-IIには、1.x系と2.x系が存在していた。
しかも、使いたくなるような機能は2.1から実装されている事が判明。
▼pgpool-IIによるレプリケーションとオンラインリカバリの「pgpoolの歴史」より
| プロダクト | バージョン | リリース時期 | 主な追加機能 |
|---|---|---|---|
| pgpool | ver1 | 2004.4 | コネクションプール機能、(2台による)同期レプリケーション機能 |
| pgpool | ver2 | 2004.6 | 負荷分散機能 |
| pgpool-II | ver1 | 2006.9 | パラレルクエリー、2台以上の同期レプリケーション機能 |
| pgpool-II | ver2 | 2007.11 | オンラインリカバリ |
ノードを新規追加するにはオンラインリカバリが重宝するはずだ。
オンラインリカバリの検証もまた必要となる。
Debianパッケージが古い
Debianパッケージだと、pgpool-IIの1.3が最新となっている。
$ dpkg -l pgpool2 Desired=Unknown/Install/Remove/Purge/Hold | Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend |/ Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad) ||/ Name Version Description +++-==============-==============-============================================ ii pgpool2 1.3-2 connection pool server and replication proxy
2007.11にリリースされたのに、Debianにしてはパッケージが古いね。
sidにしてみたらどうなるのか気になったので調べてみても、やはり1.3だ。
→http://packages.debian.org/sid/pgpool2
よって、ソースパッケージからインストールするしかない…訳だ。
今後の予定
- pgpool-II 2.1のインストール
- オンラインリカバリ検証
- 作ったスクリプトがあればそのスクリプト
ゴールはWakameに乗せる事。
ワクワクして来たぞ。
翔泳社
売り上げランキング: 71946
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
2009年05月14日
[Wakame] Amazon EC2 API Toolsを使ってMySQL Slaveを作る (1/n) の続編
前回予告した通り、今回はAmazon EBSのVolume操作するシェルスクリプト。
今回の作業前提条件は、
- Amazon EC2 API Toolsがインストールされ、動作する事
- さらに、rootアカウントでAmazon EC2 API Toolsが動作する事
※前回はUNIXアカウント「ubuntu」で作業を行っていたので、rootにて同じ作業をするだけ。
3つのファイル
今回使うのは3つのファイル。
- _wakame-common.sh
- 共通設定
- wakame-ebs-mysql-master-create-volume.sh
- Amazon EBS Volume作成
- wakame-ebs-mysql-master-delete-volume.sh
- Amazon EBS Volume削除
▼_wakame-common.sh
# Amazon EBS
ebs_master_size=1 # 1G
ebs_master_fstype=ext3 # filesystem
ebs_master_dev=/dev/sdm # device name
ebs_master_mnt=/home/wakame/mysql/data # mount point
ebs_slave_dev=/dev/sdn # device name
ebs_slave_mnt=/home/wakame/mysql/data-slave # mount point
# Amazon EC2
ec2_instance_id=$(curl -s -f --retry 3 http://169.254.169.254/2008-02-01/meta-data/instance-id/)
ec2_zone=$(curl -s -f --retry 3 http://169.254.169.254/2008-02-01/meta-data/placement/availability-zone/)
ec2_local_ipv4=$(curl -s -f --retry 3 http://169.254.169.254/2008-02-01/meta-data/local-ipv4)
# mysqld master
mysqld_master_mnt=${ebs_master_mnt}
mysqld_master_dir=${mysqld_master_mnt} # datadir
mysqld_master_admin_host=127.0.0.1 # MySQL Masterのホスト名(or IPアドレス)
mysqld_master_admin_user=root # MySQL Masterの管理ユーザー名
mysqld_master_acl='%' # MySQL Masterへの接続元制限
# master.info
mysqld_master_info_host=${ec2_local_ipv4} # Slaveから見たMasterのホスト名(or IPアドレス)
mysqld_master_info_user=wakame-repl # レプリケーション用ユーザー名
mysqld_master_info_pass=wakame-slave # レプリケーション用パスワード
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} \
}
▼wakame-ebs-mysql-master-create-volume.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
##
## check phase
##
[ -b "${ebs_master_dev}" ] && { echo "already attached: ${ebs_master_dev}"; exit 1; }
df ${ebs_master_dev} >/dev/null 2>&1 && { echo "already mounted: ${ebs_master_dev}"; exit 1; }
# create volume ...
[ -z "${ebs_master_size}" ] && { echo "plese set ebs_master_size"; exit 1; }
echo "$ ec2-create-volume -z ${ec2_zone} -s ${ebs_master_size}"
ebs_master_volume=$(ec2-create-volume -z ${ec2_zone} -s ${ebs_master_size} | awk '{print $2}')
sleep 1
[ -z "${ebs_master_volume}" ] && { echo "can't get ebs_master_volume"; exit 1; }
echo ebs_master_volume:${ebs_master_volume}
echo
# attach ebs_master_volume ...
[ -z "${ebs_master_dev}" ] && { echo "please set ebs_master_dev"; exit 1; }
[ -z "${ebs_master_fstype}" ] && { echo "please set ebs_master_fstype"; exit 1; }
mount | grep -q ${ebs_master_dev} && { echo "not mounted: ${ebs_master_dev}"; exit 1; }
echo "$ ec2-attach-volume -d ${ebs_master_dev} -i ${ec2_instance_id} ${ebs_master_volume}"
ec2-attach-volume -d ${ebs_master_dev} -i ${ec2_instance_id} ${ebs_master_volume}
echo
for i in 1 2 3 4 5 6 7 8 9 10; do
echo -n ". "
sync
[ -b "${ebs_master_dev}" ] && break
sleep 1
done
echo
[ -b "${ebs_master_dev}" ] || { echo "not available: ${ebs_master_dev}"; exit 1; }
# format ...
echo "$ yes | mkfs -t ${ebs_master_fstype} ${ebs_master_dev} >/dev/null 2>&1"
yes | mkfs -t ${ebs_master_fstype} ${ebs_master_dev} >/dev/null 2>&1
sync
echo
# mount ...
[ -z "${ebs_master_mnt}" ] && { echo "please set ebs_master_mnt"; exit 1; }
[ -d "${ebs_master_mnt}" ] || mkdir ${ebs_master_mnt}
mount ${ebs_master_dev} ${ebs_master_mnt} >/dev/null 2>&1
mount | grep ${ebs_master_dev}
df ${ebs_master_dev} >/dev/null 2>&1 || { echo "not available: ${ebs_master_dev}"; exit 1; }
echo
# done
exit 0
▼wakame-ebs-mysql-master-delete-volume.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
##
## check phase
##
[ -b "${ebs_master_dev}" ] || { echo "not found: ${ebs_master_dev}"; exit 1; }
df ${ebs_master_dev} >/dev/null 2>&1 || { echo "not found: ${ebs_master_dev}"; exit 1; }
# 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 found: ${ebs_master_dev}; exit 1; }
echo ${ebs_master_volume}
echo
# unmount...
echo "$ umount ${ebs_master_mnt}"
umount ${ebs_master_mnt}
for i in 1 2 3 4 5 6 7 8 9 10; do
echo -n ". "
sync
sleep 1
mount | grep ${ebs_master_dev} -q || break
done
echo
# detach volume...
echo "$ ec2-detach-volume ${ebs_master_volume}"
ec2-detach-volume ${ebs_master_volume}
for i in 1 2 3 4 5 6 7 8 9 10; do
echo -n ". "
sync
sleep 1
ec2-describe-volumes | grep ${ec2_instance_id} | grep ${ebs_master_dev} | grep attached -q || break
done
echo
# delete volume...
echo "$ ec2-delete-volume ${ebs_master_volume}"
ec2-delete-volume ${ebs_master_volume}
for i in 1 2 3 4 5 6 7 8 9 10; do
echo -n ". "
sync
sleep 1
ec2-describe-volumes | grep ${ec2_instance_id} | grep ${ebs_master_dev} | grep deleting -q || break
done
echo
# done
echo "$ ec2-describe-volumes"
ec2-describe-volumes
exit 0
スクリプトの準備
適当な作業ディレクトリを作成し、そのディレクトリにファイルを保存する。
# mkdir -p work/wakame # cd work/wakame
3つのスクリプトをそれぞれコピー&ペースト
# cat > _wakame-common.sh (コピー&ペースト) ^D # cat > wakame-ebs-mysql-master-create-volume.sh (コピー&ペースト) ^D # cat > wakame-ebs-mysql-master-delete-volume.sh (コピー&ペースト) ^D
実行可能状態にしておく
# chmod +x ./wakame-ebs-mysql-master-create-volume.sh # chmod +x ./wakame-ebs-mysql-master-delete-volume.sh
動作実行例
# ./wakame-ebs-mysql-master-create-volume.sh $ ec2-create-volume -z us-east-1b -s 1 ebs_master_volume:vol-d656b4bf $ ec2-attach-volume -d /dev/sdm -i i-f9047990 vol-d656b4bf ATTACHMENT vol-d656b4bf i-f9047990 /dev/sdm attaching 2009-05-14T05:11:46+0000 . . $ yes | mkfs -t ext3 /dev/sdm >/dev/null 2>&1
# ./wakame-ebs-mysql-master-delete-volume.sh vol-d656b4bf $ umount /home/wakame/mysql/data umount: /home/wakame/mysql/data is not mounted (according to mtab) . $ ec2-detach-volume vol-d656b4bf ATTACHMENT vol-d656b4bf i-f9047990 /dev/sdm detaching 2009-05-14T05:11:46+0000 . $ ec2-delete-volume vol-d656b4bf VOLUME vol-d656b4bf . $ ec2-describe-volumes VOLUME vol-d656b4bf 1 us-east-1b deleting 2009-05-14T05:11:38+0000
Amazon EBS Volumeの追加削除までが行える事を確認出来た。
Amazon EBSで困った事、気付いた事
いくつかハメられたポイントがあった
- 見た目はローカルデバイスである為、ネットワーク越しである事を忘れがち
- →その次の操作をして良い状態に遷移してない事が多い!!
確実性を持たせる為に、
- create直後にattachしない事
- attach直後にmkfsしない事
- detach直後にdeleteしない事
- →適度にsleepとsyncを入れ、Amazon EBS Volumeの状態が遷移した事を確認してから次の作業を行う事
これに気付くまでに、何度も同じ過ちを犯してしまった…。
スクリプト内にsleepとsyncが登場しているのは、これらを考慮している為だ。
次回は
MySQLのdatadirにAmazon EBS Volumeをマウントした設定。
- MySQL Master
- datadirにAmazon EBSを使う
- MySQL Masterのdatadirのsnapshot生成
- MySQL Slave
- 生成したsnapshotからMySQL Slave用のdatadirを作成
変更履歴
- 2009/05/15 16:30
- _wakame-common.shの内容修正
- ec2_local_ipv4を追加
- mysqld_master_info_hostの値を${ec2_local_ipv4}へ
オライリージャパン
売り上げランキング: 117000
2009年05月11日
ミッション: WakameにMySQL Slave自動追加機能を実装
自分がRubyを使い慣れてないので、手慣れているシェルスクリプトで動作を確認する。
動作確認後、Wakameコードに手を入れて行く。
まずは環境構築
必要な物は下記の通り。
EC2関連の利用までの手順は、今回省略する。
- Javaのランタイムパッケージ
- Amazon EC2 API Tools
- AWSの証明書(pk.pemとcert.pem)
ec2-api-toolsの環境設定
UbuntuであればJavaのランタイムパッケージをapt-getするだけ。
もしもUbuntu9.04以降であればec2-api-toolsもapt-getでインストール可能。
- パッケージインストール
- default-jre-handless
- ec2-api-tools
- 環境変数設定
- JAVA_HOME
- EC2_HOME
$ sudo apt-get install default-jre-headless $ export JAVA_HOME=/usr $ wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools-1.3-30349.zip $ unzip ec2-api-tools-1.3-30349.zip $ sudo mv -i ec2-api-tools-1.3-30349 /usr/local/ $ sudo ln -s /usr/local/ec2-api-tools-1.3-30349 /usr/local/ec2-api-tools $ export EC2_HOME=/usr/local $ /usr/local/ec2-api-tools/bin/ec2-version 1.3-30349 2008-12-01
次に、環境変数の設定。
pk.pemとcert.pemの保存先を指定する。
- 環境変数設定
- EC2_PRIVATE_KEY
- EC2_CERT
ダウンロード時のpk.pemとcert.pemのファイル名はもっと長い。
pk-********.pemとcert-********.pemと言ったファイル名だ。
今回は汎用性を持たせる為、pk.pemとcert.pemとした。
$ cd ~/ $ mkdir .ec2 $ chmod 700 .ec2 $ cd .ec2 $ cat > pk.pem 内容をコピー&ペースト ^D $ cat > cert.pem 内容をコピー&ペースト ^D $ export EC2_PRIVATE_KEY=$HOME/.ec2/pk.pem $ export EC2_CERT=$HOME/.ec2/cert.pem $ env | egrep ^EC2_ EC2_HOME=/usr/local/ec2-api-tools EC2_PRIVATE_KEY=/home/ubuntu/.ec2/pk.pem EC2_CERT=/home/ubuntu/.ec2/cert.pem
これで準備完了。
$ /usr/local/ec2-api-tools/bin/ec2-describe-instances RESERVATION r-4042d229 650811885664 wakame-default INSTANCE i-93ed9dfa ami-c25eb9ab ec2-75-101-199-66.compute-1.amazonaws.com domU-12-31-39-00-64-68.compute-1.internal running hansode0m1.small 2009-05-11T05:15:30+0000 us-east-1b aki-714daa18 ari-7e4daa17
動作確認としてec2-describe-instancesを実行。
Amazon EC2 API Toolsの動作を確認出来た。
次回は
今回は数多くblogで触れられている内容なので、面白く無い…
次回はMySQLのdatadirとして利用するAmazon EBS。
volumeの作成・削除をするシェルスクリプトを紹介予定。
オライリージャパン
売り上げランキング: 114475
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を使ったレプリケーション設定をご紹介予定。
オライリージャパン
売り上げランキング: 63543
Pragma
売り上げランキング: 27866
2009年05月04日
インスタンスのメタデータを出力したい
WakameにMySQLのレプリケーション設定を組み込むための調査で書いたシェルスクリプトをblogにアウトプット。
Instance Metadataに書かれている通り、
http://169.254.169.254/2008-02-01/meta-data/からメタデータを取得出来る。
具体的に何が出て来るのかざっくり見たかったので、シェルスクリプトを書いた。
dump-meta-data.sh
root@ip-10-251-91-3:~/.ec2# cat dump-meta-data.sh
#!/bin/sh
api_base_uri=http://169.254.169.254/2008-02-01/meta-data/
retrieve_meta_data() {
curl -s -f --retry 3 ${api_base_uri}$1
}
meta_data() {
local param=$1
echo ${param} | egrep '/$' -q && {
for i in $(retrieve_meta_data ${param}); do
meta_data ${param}${i}
done
} || {
echo -n "${param} = "
echo $(retrieve_meta_data ${param})
}
}
meta_data /
exit 0
実行結果
root@ip-10-251-91-3:~/.ec2# ./dump-meta-data.sh /ami-id = ami-3c7f9855 /ami-launch-index = 0 /ami-manifest-path = unakatsuo-ami/wakame-0.2-snapshot20090409.manifest.xml /ancestor-ami-ids = ami-9225c0fb ami-4d24c124 ami-be3adfd7 ami-bd1cf9d4 ami-f51aff9c ami-1c5db975 ami-75b0571c ami-8f9176e6 ami-e29f788b ami-59e30430 ami-59ea0d30 ami-bbe80fd2 ami-cef413a7 ami-94f215fd ami-f3ff189a ami-e6fd1a8f ami-bfc720d6 ami-67c4230e ami-72c4231b ami-a9c423c0 ami-bac92ed3 ami-19d43370 ami-81df38e8 ami-b7dd3ade ami-85dd3aec ami-76dc3b1f ami-35dc3b5c ami-0adc3b63 ami-17d93e7e ami-3327c05a ami-3626c15f ami-8c0cebe5 ami-ae1ff8c7 ami-b91ff8d0 ami-6d1ef904 ami-0f668166 ami-2365824a ami-2b6a8d42 ami-de7295b7 /block-device-mapping/ami = sda1 /block-device-mapping/ephemeral0 = sda2 /block-device-mapping/root = /dev/sda1 /block-device-mapping/swap = sda3 /hostname = ip-10-251-91-3.ec2.internal /instance-id = i-cf9ee9a6 /instance-type = m1.small /kernel-id = aki-873bdcee /local-hostname = ip-10-251-91-3.ec2.internal /local-ipv4 = 10.251.91.3 /placement/availability-zone = us-east-1a /public-hostname = ec2-75-101-215-22.compute-1.amazonaws.com /public-ipv4 = 75.101.215.22 /public-keys/0=hansode = /ramdisk-id = ari-853bdcec /reservation-id = r-3bfa6c52 /security-groups = wakame-default
なるほど。
今回使う事になったのは下記2つ。
EBSのボリューム作成時に使う。
- /instance-id
- /placement/availability-zone
2009年04月23日
2009/04/22 Wakameリリース
4月から関わっていたプロジェクト。
あくしゅ社内では2008/11から開発が始まっていた。
自動でサーバを増減させる仕組み
Wakameがやるのは、
サーバの負荷状況によって、サーバの増減を自動的に行う事。
例えばこんな時に、Wakameが活躍する。
- サーバ過負荷「予期せぬ大ヒット!」
- 有名サイトや有名ブログからリンクを張られた
- TVや雑誌で紹介された
- →サーバを用意してないし、増加するにも間に合わない
- 季節モノ「キャンペーンサイト」
- ある時期はアクセスが多い
- 季節が過ぎるとアクセスが少ない
- →アクセス数が減ったらサーバを減らしたい
Wakameがサーバの増減を面倒見てくれるので、
サーバエンジニアにお願いしなくて済む。
結果的に、サーバの運用コストと人件費の削減に繋がる。
自分で自分の首を絞める?
先に述べたように、サーバエンジニアの仕事が減る。
Wakameにやらせたい事を記述してしまえれば、
サーバエンジニアとしての自分の仕事がなくなってしまう訳だ。
た、、、大変だ!?
いやいや、、、
Wakameに設定を記述するにはサーバの事を知らないと出来ない事。
いろんなアプリケーションの設定をWakameにさせるのが自分の仕事。
減るどころか、むしろ、増える気がする。
興味を持った方へ
Amazon EC2にてAMIを公開しているので、Getting Startedを参考に試せます。
WakameはRubyで書かれており、RubyForge: Wakameにてソースコードが公開されてます。
ご意見・ご感想、お待ちしております。
Wakame関連ページ
売り上げランキング: 3138




