MySQL

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)

2008年11月03日

「MySQL ユーザコンファレンス2008」へ行って来た

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

2008/10/30〜2008/10/31 東京

MySQL ユーザコンファレンス 2008

今回は二日目だけ参加。
二日目はチューニングに関するセッションが2つ。

NEC_3693 NEC_3696

とても奇麗なビル。
東京駅と直結しているので便利だ。

NEC_3700 NEC_3699

受付と、受付付近。
去年はまだSunに買収されてなかった。
今年はSun。お金のかけかたが違う。
受付は綺麗どころが揃っていた。

NEC_3701

受付付近では各セッションの状況が中継されている。

NEC_3694

事前登録者優先で席が決まる。
登録してない人はキャンセル待ち。

会場整理専門の人が誘導。
去年は居なかったなぁ。

NEC_3695

去年はランチまでもが無料だった。
今年はランチ無し。残念。

NEC_3697 NEC_3698

去年同様、同時通訳してくれるのが他カンファレンスとは違う。

NEC_3702 NEC_3703

プレゼント抽選会。
今年も何も当たらなかった…
クジ運ないな。

NEC_3704

受付横に巨大なMySQLイルカ

NEC_3705 NEC_3706

懇親会
MySQLエンジニアも参加。
こう言うことでもない限り知り合うきっかけがない。
何名かと名刺交換。

NEC_3707 NEC_3708
NEC_3709

あっという間に食料が無くなった。



まとめ

  • 今回、凄く良かったと思ったのはGURU BAR
    • GURU BARとは、MySQLエンジニアが直接質問に答えてくれる場
    • 恐らく普段なら有料なのだろう
    • ここぞとばかりに質問して来た

ぜひ、また来年も参加したい。



半袖 at 01:25|PermalinkComments(2)TrackBack(0)

2008年07月19日

High Performance MySQL

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

High Performance MySQL
High Performance MySQL
posted with amazlet at 08.07.19
Baron Schwartz Peter Zaitsev Vadim Tkachenko Jeremy D. Zawodny Arjen Lentz
Oreilly & Associates Inc
売り上げランキング: 3436

Amazonさんから届いた。
  • MySQL 5.1対応
  • ページ数は初版の2倍強
  • 管理者だけでなく開発者向けの内容
斜め読みしただけでも充実した内容である事が分かる。
この本でしばらく楽しめそうだ。

この夏、オススメの1冊。


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

2008年06月29日

第4回MySQL ウィークリーセミナー「MySQLパフォーマンスチューニング」

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

2008/06/27(金) 恵比寿


NEC_2995
Powered by PICS


前回に続き、今回も最前席。
気になった箇所だけツマミ食い。

  • 設定を間違えるとパフォーマンス低下に繋がるケース
  • show statusの結果と内容、その意味。
  • ばらつきの少ないインデックスは無意味の可能性あり。
    例:性別(男,女)。ばらついているからこそインデックスの意味がある
  • SELECT STARAIGHT_JOIN * from tbl1, tbl2...。
    SQL文にかかれたテーブル順に処理を行う
  • SHOW [FULL] PROCESSLIST。
    FULLが無い場合は出力が10バイト以内となる。

実践ハイパフォーマンスMySQL
ジェレミ・D. ザウドニ デレク・J. ベリング
オライリージャパン
売り上げランキング: 47782

もう一度読み直して理解度増加。

2008/10/30と2008/10/31、
『MySQL User Conference Japan 2008』が開催されるとの事。
これは行くしかない。



変更履歴

2008/06/30 11:13
MySQL Users Conference 2008の開催期間修正
× 2008/10/30と2008/10/30
○ 2008/10/30と2008/10/31


半袖 at 15:10|PermalinkComments(2)TrackBack(0)

2008年06月14日

第3回MySQL ウィークリーセミナー 「MySQL ストレージエンジン徹底比較」へ行って来た

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

2008/06/13(金) 恵比寿


NEC_2872
Powered by PICS


一番前の席。
満席だった。

各種ストレージエンジンの紹介。

今までストレージエンジンの使い分けを意識した事が無かった。
そんな自分には大変興味深い内容だった。



個人的に使ってみたくなったストレージエンジン


  • Archive
    • INSERTとSELECTのみ
    • MyISAMと比べるとINSERTが1.5倍速い
    • 変更しないデータ、ログ等向け
    • データを圧縮して格納(70%〜80%)
  • Blackhole
    • Slave台数が多い場合に使う
    • 多段のSlaveがある場合に効果を発揮
    • 中間に位置するSlaveでBlackhole設定
      • この時、バイナリログさえあればよい。
      • SQL処理が不要となるのでIO負荷軽減となる
  • Merge
    • 複数テーブルを1つに見せる
    • 例えば月別のログテーブルをMergeで1つに見せる
    • 実態は複数

Falcon


  • なるべくキャッシュ(メモリ)を使う
  • rollbackはInnoDBよりも数倍速い
  • 外部キーは対応しない
    • 今後ストレージエンジンでは外部キーを実装しない方向性
    • MySQLサーバ側で外部キーを扱うらしい
    • よって、そのうち外部キーを使えるようになるはず



次回も参加したい


第4回 6月27日(金)15:00-17:00
「MySQLパフォーマンスチューニング」
MySQLのパフォーマンス監視のツボ

面白そうだ。


実践ハイパフォーマンスMySQL
ジェレミ・D. ザウドニ デレク・J. ベリング
オライリージャパン
売り上げランキング: 11671


半袖 at 14:00|PermalinkComments(2)TrackBack(0)

2008年06月12日

my.cnfの優先順位

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

読み込まれる順番


忘れてたのでメモ
  1. /etc/my.cnf
  2. DATADIR/my.cnf
  3. ~/.my.cnf
ここに該当しないmy.cnfを読み込んでいるサーバがある。
接続して各種確認出来ない状態…。
psコマンドの実行結果があるだけでも大分違う。
さて困ったぞ。



現場で使える MySQL (DB Magazine SELECTION)
松信 嘉範
翔泳社
売り上げランキング: 32833


半袖 at 13:55|PermalinkComments(2)TrackBack(0)

2008年06月05日

mysql_connect()のwarning

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

時々出るPHPのWarning


 PHP Warning:  mysql_connect(): Lost connection to MySQL server at 'reading authorization packet', system error: 0 in /path/to/foo.php on line 123

この時はnetstatで確認するとTIME_WAITとなっている数が物凄いになってる。

この状況を解消しようとして、
/proc/sys/net/ipv4/tcp_tw_recycleを変更するのは危険か。

渡されたRHEL4.5では「0」となっている。


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

2008年05月24日

phpmybenchをコミット - mybenchをPHPに移植

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

mybench - simple benchmarking tool for MySQL


mybenchはPerlで書かれたMySQLのベンチマークツール。
PHPに移植したのがphpmybench。

CodeReposに登録した。
http://coderepos.org/share/browser/lang/php/phpmybench/trunk

PHPで書かれたプログラムの
テストやベンチマークを取るのに使える。


半袖 at 13:40|PermalinkComments(0)TrackBack(0)

2008年05月23日

低パフォーマンスMySQLの原因は「sync_binlog = 1」

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

レプリケーション・マスターの書き込みが遅過ぎる


IOに問題があるのかどうかを切り分ける為にbonnie++で性能評価してみた。
これと言って問題の無い数値が出て来た。



MySQLの設定に問題があるに違いない


my.cnfのパラメタを色々見比べてみた。
その中に気になるパラメタがあった。

sync_binlog = 1

試しにコメントアウトしてみたら速くなった…。
135倍速かった。

しかし、、、
条件が変わってしまうので設定は元のまま。
そのまま性能評価項目を埋めないと行けない。

時間だけが過ぎて行く。



実践ハイパフォーマンスMySQL
ジェレミ・D. ザウドニ デレク・J. ベリング
オライリージャパン
売り上げランキング: 138677


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

2008年05月13日

[MySQL] 特定データベース、特定テーブルを指定したレプリケーション設定

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

特定情報に特化したスレーブ


理由は色々あるだろう。
  • 全テーブルをレプリケーション対象にしたくない
  • 全テーブルだとI/O負荷が高いので、過負荷テーブル別にスレーブを分散したい

slave側のmy.cnf変更


[mysqld]セクションに設定追加。
テーブルが複数ある場合は、テーブル数分の設定が必要。
slave$ sudo vi /etc/my.cnf

[mysqld]
replicate-do-table=dbname.table0
replicate-do-table=dbname.table1
replicate-do-table=dbname.table2
....
設定反映
slave$ sudo /etc/init.d/mysql restart



検証


slaveでtable0の存在を確認できれば成功
  1. masterにtable0が無い事を確認
  2. slaveにtable0が無い事を確認
  3. masterでtable0を作る
  4. slaveでtable0が作成されている事を確認
slaveでignore0が存在しない事を確認出来れば成功。
  1. masterにignore0が無い事を確認
  2. slaveにignore0が無い事を確認
  3. masterでignore0を作る
  4. slaveでignore0が作成されてない事を確認
念のためtable1とignore1も検証。
複数テーブルを指定しても意図した動作になった。


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

2008年05月08日

RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(5/n) - Dovecotの設定

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

メールを受信


PostfixはMTAなので、POP3用サーバが別途必要。
今回はMySQLと連動叶なDovecotを使った。



設定概要


virtualドメイン用アカウントvpostmail(uid:12000,gid:12000)
スプールディレクトリ/var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/
設定ファイル/etc/dovecot-mysql.conf



作業内容


dovecotをMySQL対応にする。
# yum install dovecot-mysql
dovecot.confの修正。
imapとpop3を使えるようにする。
結果的に設定ファイルはシンプルなものになった。
# cd /etc/; pwd
/etc
# cp -pi dovecot.conf dovecot.conf.0
# vi dovecot.conf
protocols = imap pop3

auth default {
  mechanisms = plain
  passdb pam {
  }
  passdb sql {
    args = /etc/dovecot-mysql.conf
  }
  userdb passwd {
  }
  userdb sql {
    args = /etc/dovecot-mysql.conf
  }
  user = root
}
MySQL用の設定。
※12000はvpostmailのuidとgid。
# cat /etc/dovecot-mysql.conf
driver = mysql
connect = host=localhost dbname=postfix user=postfix password=********
default_pass_scheme = MD5
user_query = SELECT concat('/var/lib/vpostmail/domain/', maildir) as home, 12000 as uid, 12000 as gid FROM mailbox WHERE username = '%u' AND active = '1'
password_query = SELECT username as user, password FROM mailbox WHERE username = '%u' AND active = '1'
設定を反映させる
[root@www etc]# /etc/init.d/dovecot reload
Stopping Dovecot Imap:                                     [  OK  ]
Starting Dovecot Imap:                                     [  OK  ]
POPの確認
$ telnet localhost 25
user foo@example.com
pass ********
list
retr 1
.....
ここで認証が通れば問題なし。

複数バーチャルドメイン対応メール環境が出来上がった。



関連リンク



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

RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(4/n) - Postfixの設定

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

構成イメージはvpopmail


vpopmailの様なディレクトリ構成にする。



設定概要


virtualドメイン用アカウントvpostmail(uid:12000,gid:12000)
スプールディレクトリ/var/lib/vpostmail/domain/
設定ファイル/var/lib/vpostmail/etc/*.cf



作業内容


バーチャルドメイン用アカウント作成。
# /usr/sbin/useradd -u 12000 -s /bin/false vpostmail
バーチャルドメイン用にmain.cf修正
# pwd
/etc/postfix
# cp -pi main.cf main.cf.0
# vi main.cf
# diff main.cf.0 main.cf
> virtual_gid_maps = static:12000
> virtual_uid_maps = static:12000
> virtual_mailbox_limit   = 51200000
> virtual_minimum_uid     = 1001
> virtual_transport       = virtual
> virtual_mailbox_base    = /var/lib/vpostmail/domain
> virtual_mailbox_domains = mysql:/var/lib/vpostmail/etc/mysql_virtual_domains_maps.cf
> virtual_mailbox_maps    = mysql:/var/lib/vpostmail/etc/mysql_virtual_mailbox_maps.cf
> virtual_alias_maps      = mysql:/var/lib/vpostmail/etc/mysql_virtual_alias_maps.cf
メールボックス用ディレクトリ。
今回は/var/lib/vpostmail/配下に作っていく。
# mkdir /var/lib/vpostmail/
# cd /var/lib/vpostmail/; pwd
/var/lib/vpostmail
# mkdir etc domain
vpostmailアカウントが
domainディレクトリにファイルを書き込むのでオーナーを変更する。
# chown vpostmail:vpostmail domain
Postfix-mysql用設定
# cd etc/; pwd
/var/lib/vpostmail/etc

# vi mysql_virtual_alias_maps.cf
user     = postfix
password = ********
hosts    = localhost
dbname   = postfix
query    = SELECT goto FROM alias WHERE address='%s'

# vi mysql_virtual_domains_maps.cf
user     = postfix
password = ********
hosts    = localhost
dbname   = postfix
query    = SELECT description FROM domain WHERE domain='%s'

# vi mysql_virtual_mailbox_maps.cf
user     = postfix
password = ********
hosts    = localhost
dbname   = postfix
query    = SELECT concat(maildir,'Maildir/') FROM mailbox WHERE username='%s'
/var/lib/vpostmail/domain/$(domain)/$(local-part)/Maildir/としたいので、
concatを用いて「Maildir/」を追加する。
これにより、後に設定するdovecotの管理が簡単になる。

etc配下のconfigにはMySQL用パスワードが載ってるので読めないようにする。
オーナーをpostfixへ変更。
# cd ../; pwd
/var/lib/vpostmail
# chown -R postfix:postfix etc/
# ls -ld etc/
drwx------  2 postfix postfix 4096 May  7 20:35 etc/
設定内容確認
# /etc/init.d/postfix check
問題なければ反映
# /etc/init.d/postfix reload
Reloading postfix:                                         [  OK  ]
送信テスト
$ telnet localhost 25
helo localhost
mail from:foo@example.net
rcpt to:bar@example.com
data
Subject: test

test
test
.
quit
ログ確認
# tail -F /var/log/maillog
.....
エラーが出てなければOK


次回はPOP3サーバの設定



関連リンク



半袖 at 18:40|PermalinkComments(0)TrackBack(1)

RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(3/n) - PostfixAdminの設定

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

管理ツールで管理負荷軽減


エンジニアであればコマンドラインからの作業で事足りる。
納品する場合など、相手がエンジニアとは限らない。
管理ツールを導入する事により、覚える事は最小限。

今回はメールアカウント管理ツールとしてPostfixAdminを使う。



環境概要

PostfixAdmindirectory/var/lib/postfixadmin/
URIhttp://postfixadmin.example.com/
Mailbox$(domain)/$(local-part)
MySQLdb_hostlocalhost
db_namepostfixadmin
db_userpostfix
db_pass********

ユーザー用Maildirディレクトリデザイン補足


今回、
『$(local-part)@$(domain)』のメールボックスを、
『$(domain)/$(local-part)』となるようにする。
これは単にvpopmailの構成が好きだったから。

PostfixAdminで設定する。
設定すべき変数が下記2つ。
$CONF['domain_path']'NO'(無し)
'YES'$(domain)/
$CONF['domain_in_mailbox']'YES'$(local-part)@$(domain)
'NO'$(local-part)

今回の設定。
$CONF['domain_path']'YES'
$CONF['domain_in_mailbox']'NO'



作業内容


# mkdir -p /var/lib/postfixadmin
# cd /var/lib/postfixadminostfixadmin; pwd
/var/lib/postfixadmin
# wget http://downloads.sourceforge.net/postfixadmin/postfixadmin_2.2.0.tar.gz?modtime=1209482958&big_mirror=0
# tar zxvf postfixadmin_2.2.0.tar.gz
# ln -s postfixadmin-2.2.0 htdocs
Apacheのconfig生成
# cd /etc/httpd/conf/vhosts-available/; pwd
/etc/httpd/conf/vhosts-available
# vi postfixadmin.example.com
.....(省略).....

# cd ../; pwd
/etc/httpd/conf
# ln -s `pwd`/vhosts-available/postfixadmin.example.com `pwd`/vhosts-enabled/
問題なければ反映(reload)
[root@www conf]# /usr/sbin/apachectl configtest
Syntax OK
[root@www conf]# /etc/init.d/httpd reload
Reloading httpd:                                           [  OK  ]
ここではsetup.phpへアクセス出きることのみを確認。
→ http://postfixadmin.example.com/setup.php
※まだ設定途中なのでエラーが多々出る。

DBアクセス用アカウント作成
$ mysql -uroot
mysql> CREATE USER 'postfix'@'localhost' IDENTIFIED BY '********';
mysql> GRANT ALL PRIVILEGES ON `postfix` . * TO 'postfix'@'localhost';
PostfixAdminの設定
# pwd
/var/irokoi/postfixadmin/htdocs
# cp -pi config.inc.php config.inc.php.0
# vi config.inc.php
# diff config.inc.php.0 config.inc.php
31c31
< $CONF['configured'] = false;
---
> $CONF['configured'] = true;
51,53c51,53
< $CONF['database_host'] = 'localhost';
< $CONF['database_user'] = 'postfixadmin';
< $CONF['database_password'] = 'postfixadmin';
---
> $CONF['database_host'] = 'localhost';
> $CONF['database_user'] = 'postfix';
> $CONF['database_password'] = '********';
123c123
< $CONF['domain_path'] = 'NO';
---
> $CONF['domain_path'] = 'YES';
129c129
< $CONF['domain_in_mailbox'] = 'YES';
---
> $CONF['domain_in_mailbox'] = 'NO';
再び http://postfixadmin.example.com/setup.php を確認。
  • 各項目がOKとなる事を確認。
  • 管理アカウント作成を要請されるので、管理アカウントを作成する。
  • この時点でPostfixAdminがtableを生成してくれる
設定内容に問題がなければsetup.phpをリネームする。
※ここでsetup.phpが残っていると管理画面へアクセス出来ない。
# mv -i setup.php setup.php.deleted
管理画面へアクセス出切る事を確認する。
→ http://postfixadmin.example.com/

この時点でドメインとメールアカウントの管理を行えるようになる。
しかし、まだメール配送(Postfix)の設定がない。

続きは次回。



関連リンク



半袖 at 17:55|PermalinkComments(0)TrackBack(1)

RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(2/n) - Postfix入れ替え

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

RHEL4のPostfixでは駄目


出鼻をくじかれる。
Postfixが対応するルックアップテーブル一覧を確認してみた。

$ /usr/sbin/postconf -m
btree
cidr
environ
hash
ldap
nis
pcre
proxy
regexp
static
unix
mysqlが無い!!



Postfixを作り直す


参考にしたページはPostfix + Courier-IMAP

$ pwd
/home/admin/work/rpms
$ mkdir -p {SOURCES,SPECS,BUILD,SRPMS,RPMS/i386}
$ echo "%_topdir $HOME/work/rpms" > ~/.rpmmacros
$ cat ~/.rpmmacros
%_topdir /home/admin/work/rpms
SRPMを取得する
$ cd SRPMS/; pwd
/home/admin/work/rpms/SRPMS
$ wget http://ftp.riken.jp/Linux/centos/5/os/SRPMS/postfix-2.3.3-2.src.rpm
$ rpm -ivh postfix-2.3.3-2.src.rpm
quota修正用パッチ
$ cd ../SOURCES/; pwd
/home/admin/work/rpms/SOURCES
$ wget http://vda.sourceforge.net/VDA/postfix-2.3.3-vda.patch.gz
$ gunzip -d postfix-2.3.3-vda.patch.gz
$ cd ../SPECS/; pwd
/home/admin/work/rpms/SPECS
specファイル修正。
MySQLを使えるようにする。
$ cp -pi postfix.spec /tmp/
$ vi postfix.spec
$ diff /tmp/postfix.spec postfix.spec
2c2
< %define MYSQL 0
---
> %define MYSQL 1
82a83
< Patch10: postfix-2.3.3-vda.patch
136a138
> %patch10 -p1 -b .vda
$ rpmbuild -ba postfix.spec
標準パッケージと入れ替える
$ su
Password:
# apt-get remove postfix
# rpm -ivh ../RPMS/i386/postfix-2.3.3-2.i386.rpm
mysqlが入っている事を確認
$ /usr/sbin/postconf -m
btree
cidr
environ
hash
ldap
mysql
nis
pcre
proxy
regexp
static
unix
OK



関連ページ



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

RHEL4に[Postfix]+[Dovecot]+[PostfixAdmin]+[MySQL]環境構築(1/n) - 序章

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

話を聞いてみると、この構成が一番スマート


メールを環境を構築して欲しい。
そう頼まれた。
  • POPを使いたい
  • 複数ドメインを使いたい
  • アカウント管理をしたい

なるほど。

まだ構築した事がなかったけど、
一番スマートに思えた構成がこれ。

MTAPostfix+MySQL
POP3Dovecot+MySQL
管理ツールPostfixadmin+MySQL)

数エントリに分割して環境構築方法をまとめていく。


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

2008年02月05日

Cache::Memcachedが原因?でサーバ過負荷多発

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

ログインしようとしたら、反応が鈍い


20秒くらい経過して、やっとログインプロンプトが現れた。

「やばい…過負荷だ」

やっとログイン出来た所で、すぐさまapacheをダウンさせた。
最近、apacheにメモリを食いまくられる現象が多発している為だ。



過負荷状態のapacheログ


Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Use of uninitialized value in string eq at /usr/share/perl5/Cache/Memcached.pm line 494.
Memcachedが悪さしてる模様。

それが起因となり、apacheにメモリを食い尽くされ、swapも食い尽くされる。
MySQLへの接続も失敗する始末。



バージョン情報


「Debian GNU/Linux (sid)」を使用
$ dpkg -l | awk '$1 == "ii" && $2 ~ "^(apache|mysql|memcached|libcache-memcached-perl|libapache-mod-perl)" {print $2, $3}'
apache 1.3.34-4.1
apache-common 1.3.34-4.1
apache2-mpm-prefork 2.2.6-3
apache2-utils 2.2.6-3
apache2.2-common 2.2.6-3
libapache-mod-perl 1.29.0.4-4.1
libcache-memcached-perl 1.24-1
memcached 1.2.2-1
mysql-client-5.0 5.0.51-2
mysql-common 5.0.51-2
mysql-server-5.0 5.0.51-2

この過負荷頻発状況から脱出したい。


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

2008年01月30日

泣かないで僕ぅ〜のマリア

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

MySQL、新ストレージエンジンMaria投入 - InnoDBは?より


今回公開されたMariaはストレージエンジンとしてInnoDBの代替となりうるものだ。MySQLのエンジンとしてInnoDBを使うシーンもあるわけだが、InnoDBの開発元であるInnobaseはOracleに買収されて、MySQLがどういった対応をしていくのかが注目されていた。Mariaはそれに対する答えだ。

素敵な名前だ。

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

2008年01月21日

おじいちゃんサーバに渇!200万エントリのテーブルに「ALTER TABLE」

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

ALTER TABLE


mysql> alter table whois modify ......;
Query OK, 2038362 rows affected (1 hour 19 min 8.65 sec)
Records: 2038362  Duplicates: 0  Warnings: 0
固まってるのかと心配になるくらい待たされた…。


半袖 at 23:10|PermalinkComments(0)TrackBack(0)

2007年09月15日

『MySQL Users Conference Japan 2007』へ行ってきた

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

2007年9月11日(火),9月12日(水)に日本科学未来館で開催された
MySQL Users Conference Japan 2007』へ行って来た。

・2007年9月11日(火) 10:30〜17:00
・2007年9月12日(水) 13:00〜19:00

2日間参加。



■1日目: 基調講演





朝1は人が少なかった。
そうと思ってたら、どんどん人が集って来た。
終了前には満席。



■1日目: ランチビュッフェ





ランチはビュッフェスタイル。
何と、無料!





▼選んだ食べ物
・カレー
・スパゲティ
・サラダ
・ポテト
・ガーリックトースト

食べ過ぎ?






窓際に座ったのでお台場が良く見えた。
フジテレビ。





観覧車。



■2日目: セッション





最前列に座った。



■2日目: 出展ブース訪問





全社を回ってスタンプラリー完了。

自分よりデカイ人に遭遇。デカイなぁ。
久々に人を見上げた。



■2日目: レセプション

交流目的のレセプション。
これもまたビュッフェスタイル。無料!





・サラダ
・パスタ





 『ビール?!』

これも仕事。






みんなモリモリ食べまくり。





ステージ横まで移動。
MySQL社の人々がたくさん。

『ブラックウォーター』と言う濃いアルコールが用意されていた。
少しだけのんでみた。濃い…。

無事、MySQLな方と名刺交換成功。






プレゼント抽選会。
いろいろと景品があったにもかかわらず、坊主だった。
サーバ欲しかった。



■総評
・MySQLの技術的な話をたくさん聞けた
・クラスターの基礎から実例まで。これを聞きに行ったようなもの。
・MySQL5.1からHTTPをストレージエンジンとして使える事に衝撃を受けた
・他の技術カンファレンスはエンジニアばかり
・今回のこのカンファレンスは参加者層ビジネス目的。スーツ多い。

是非、来年も開催して欲しい。


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

2007年09月14日

MySQL用語における方言と標準語「MyISAM」

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

MySQL Users Conference Japan 2007へ行って来た。

セッションの参加レポートは後日まとめて書く。
気になったのは、普段耳にする言葉が方言だった事。

■「MyISAM」の読み方

▼標準語
まいあいさむ

▼方言
まいいざむ


技術カンファレンスへ行くと、こう言う発見もある。
今後も各種カンファレンス積極的に参加して行く。


半袖 at 02:30|PermalinkComments(0)TrackBack(0)

2007年08月01日

『MySQL Users Conference Japan 2007』事前登録開始

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

MySQL Users Conference Japan 2007の事前登録が開始された。

> 会期: 2007年9月11日(火), 9月12日(水)
> 入場料: 5,000円(事前申込みの方無料)

早速登録…と思った時には満席となっているセッションが1つあった。
のんびりしていると多少なりとも参加したいセッションが満席にな
ると思ったので登録した。

所属グループの面子に教えたら、珍しく登録した。
今までは自分くらいしかカンファレンスに参加しなかったのにね。
何か心境の変化でも生まれたのだろうか。

9/11(火),9/12(水)はお台場まで遠足


実践ハイパフォーマンスMySQL
ジェレミ・D. ザウドニ デレク・J. ベリング Jeremy D. Zawodny Derek J. Balling 林 秀幸
オライリージャパン (2004/10)
売り上げランキング: 32014



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