Wakame

2009年10月22日

[Wakame]Wakameの開発にご協力くださる方を探しています

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

■急募:"Wakame 1.0"開発協力者!

株式会社あくしゅでは"Wakame 1.0"の開発者を募集しています!
Wakameは次世代データセンターには欠かせないクラウドコントローラとして、今後大幅に機能拡張していきます。
Rubyでミドルウェアを開発してみたいという意欲あふれる方は是非お問い合わせください。

■仕事内容

  1. "Wakame 1.0"の使用目的を拡大するために、ミドルウェア部分の機能拡張を実施
  2. "Wakame 1.0"を使いやすくするために、GUIの追加開発を実施
  3. "Wakame 1.0"を分かりやすくするために、ドキュメントの整備を実施
上記の内、得意なもの1つ以上をお願いすることになります。

■募集要項

  • 下記(A)(B)(C)の知識・技術セットをいずれかお持ちの方
    1. Ruby, 現在のWakame, メッセージング, 並列処理, Xenなどのハイパーバイザの知識
    2. JavaScript, XHTML, Ruby on Rails, http通信(REST), ユーザビリティ, 画面設計の知識
    3. HTML, ドキュメンテーション
  • システムの設計が得意で、オブジェクト指向を理解している方
  • 人とのコミュニケーションが好きな明るい方
  • 期間:2009年11月初旬〜2010年3月下旬

■条件

応募期限は10/26(月)までです。
それ以降10/30(金)までに一度仕事内容や関わり方をミーティング形式でご相談させていただきましてその後、弊社基準で判断してからお見積もりをお願いします。

■一言

設立3年目の若い会社です。
来年からは「世界のクラウドソリューションを」をテーマに事業展開していく予定です。
そのために今後は弊社で開発している"Wakame"を機能拡張し、より高度なプロダクトへと躍進させていきます。
あなたもぜひ、この新しいチャンスに乗ってみませんか?

■連絡先

Twitter: @axsh_co_ltd
E-mail: r_at_axsh_dot_net (_at_と_dot_は適宜文字列を置換してください)




半袖 at 14:50|PermalinkComments(0)TrackBack(0)

2009年07月24日

[Wakame] Wakame-0.4.2 Released!!

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

今月は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」の進化は、まだまだこれからだ。



半袖 at 19:35|PermalinkComments(2)TrackBack(0)

2009年07月02日

[Wakame] gihyo.jp「"Wakame"で始めるクラウドコントロール」

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

"Wakame"で始めるクラウドコントロール」公開中


連載が終わってから告知し忘れたままである事に気づく。
gihyo.jpさんにてwakameの特集が掲載されてます。

自分も執筆に参加。
まさかこんな日が来るとは思ってもみなかった。



半袖 at 09:20|PermalinkComments(0)TrackBack(0)

2009年05月26日

[Wakame] PostgreSQLもスケール対象へ (4/n)

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

[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)を使ってノード増殖検証

関連エントリ





半袖 at 18:00|PermalinkComments(0)TrackBack(0)

[Wakame] PostgreSQLもスケール対象へ (3/n)

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

[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

オンラインリカバリを検証する為の受け皿は整った。

今後の予定

  • オンラインリカバリ検証

関連エントリ



PostgreSQL徹底入門 第2版
浅羽 義之 石田 朗雄 稲葉 香理 永安 悟史
翔泳社
売り上げランキング: 34255


半袖 at 16:15|PermalinkComments(0)TrackBack(1)

2009年05月20日

[Wakame] PostgreSQLもスケール対象へ (2/n)

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

[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で管理したい所だ
    • オンラインリカバリとの相性がどうなのか分からないので
    • →とりあえず保留

今後の予定

  • オンラインリカバリ検証
  • 作ったスクリプトがあればそのスクリプト

関連エントリ




PostgreSQL徹底入門 第2版
浅羽 義之 石田 朗雄 稲葉 香理 永安 悟史
翔泳社
売り上げランキング: 6803


半袖 at 20:05|PermalinkComments(0)TrackBack(1)

[Wakame] PostgreSQLもスケール対象へ (1/n)

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

Wakame」で「PostgreSQL」を使えるようにしたい

WakameでPostgreSQLを使えるなら使ってみたい

Wakameに興味を持って下さった方々から、
こう言った声を少なからずとも、いや、意外と多く聞く様になった。

だったら、PostgreSQLもどうにかしよう。
個人的には久しぶりにPostgreSQLに触れる機会となった。

PostgreSQLでレプリケーション構成を構築するには「pgpool-II」を使うと良いらしいよ

噂の真相を突き止めるべく、検証してみる事にした。


作業記録

作業環境

ディストリビューションDebian GNU/Linux 5.0.1
カーネル2.6.18-6-xen-amd64
postgresql8.3.7-0lenny1
pgpool21.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
ポート番号内容
5432postgres
5433pgpool
9898pgpool communication manager

なるほど


面白機能は pgpool-II 2.1からだった…

pgpool-IIには、1.x系と2.x系が存在していた。
しかも、使いたくなるような機能は2.1から実装されている事が判明。

pgpool-IIによるレプリケーションとオンラインリカバリの「pgpoolの歴史」より

プロダクトバージョンリリース時期主な追加機能
pgpoolver12004.4コネクションプール機能、(2台による)同期レプリケーション機能
pgpoolver22004.6負荷分散機能
pgpool-IIver12006.9パラレルクエリー、2台以上の同期レプリケーション機能
pgpool-IIver22007.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

よって、ソースパッケージからインストールするしかない…訳だ。


今後の予定

  1. pgpool-II 2.1のインストール
  2. オンラインリカバリ検証
  3. 作ったスクリプトがあればそのスクリプト

ゴールはWakameに乗せる事。
ワクワクして来たぞ。



PostgreSQL徹底入門 第2版
浅羽 義之 石田 朗雄 稲葉 香理 永安 悟史
翔泳社
売り上げランキング: 71946


半袖 at 14:25|PermalinkComments(1)TrackBack(1)

2009年05月15日

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

livedoorClipに登録 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|PermalinkComments(0)TrackBack(1)

2009年05月14日

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

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

[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をマウントした設定。

  1. MySQL Master
    • datadirにAmazon EBSを使う
    • MySQL Masterのdatadirのsnapshot生成
  2. MySQL Slave
    • 生成したsnapshotからMySQL Slave用のdatadirを作成

変更履歴

2009/05/15 16:30
_wakame-common.shの内容修正
  • ec2_local_ipv4を追加
  • mysqld_master_info_hostの値を${ec2_local_ipv4}へ



詳解 シェルスクリプト
アーノルド ロビンス ネルソン・H.F. ベーブ
オライリージャパン
売り上げランキング: 117000


半袖 at 16:10|PermalinkComments(0)TrackBack(1)

2009年05月11日

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

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

ミッション: 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の作成・削除をするシェルスクリプトを紹介予定。




詳解 シェルスクリプト
アーノルド ロビンス ネルソン・H.F. ベーブ
オライリージャパン
売り上げランキング: 114475


半袖 at 18:05|PermalinkComments(0)TrackBack(2)

2009年05月08日

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

livedoorClipに登録 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|PermalinkComments(0)TrackBack(0)

2009年05月04日

[Wakame] Amazon EC2のインスタンスMetadataをダンプ

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

インスタンスのメタデータを出力したい

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


半袖 at 16:55|PermalinkComments(0)TrackBack(0)

2009年04月23日

[Wakame] Wake Wakame!!

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

2009/04/22 Wakameリリース

4月から関わっていたプロジェクト。
あくしゅ社内では2008/11から開発が始まっていた。


自動でサーバを増減させる仕組み


Wakameがやるのは、
サーバの負荷状況によって、サーバの増減を自動的に行う事。

例えばこんな時に、Wakameが活躍する。

  • サーバ過負荷「予期せぬ大ヒット!」
    • 有名サイトや有名ブログからリンクを張られた
    • TVや雑誌で紹介された
    • →サーバを用意してないし、増加するにも間に合わない
  • 季節モノ「キャンペーンサイト」
    • ある時期はアクセスが多い
    • 季節が過ぎるとアクセスが少ない
    • →アクセス数が減ったらサーバを減らしたい

Wakameがサーバの増減を面倒見てくれるので、
サーバエンジニアにお願いしなくて済む。

結果的に、サーバの運用コストと人件費の削減に繋がる。


自分で自分の首を絞める?


先に述べたように、サーバエンジニアの仕事が減る。

Wakameにやらせたい事を記述してしまえれば、
サーバエンジニアとしての自分の仕事がなくなってしまう訳だ。

た、、、大変だ!?

いやいや、、、
Wakameに設定を記述するにはサーバの事を知らないと出来ない事。
いろんなアプリケーションの設定をWakameにさせるのが自分の仕事。
減るどころか、むしろ、増える気がする。



興味を持った方へ


Amazon EC2にてAMIを公開しているので、Getting Startedを参考に試せます。
WakameはRubyで書かれており、RubyForge: Wakameにてソースコードが公開されてます。

ご意見・ご感想、お待ちしております。


Wakame関連ページ





半袖 at 11:00|PermalinkComments(0)TrackBack(0)