2012年2月22日水曜日

SUZ-LAB謹製 CentOS AMI (6.2.1 32bit ap-northeast-1)

スズキです。

下記をアップデートしました。
SUZ-LAB謹製 CentOS AMI (6.0.5 32bit ap-northeast-1)
AMIを「suz」で検索してもらえれば、
811118151095/suz-lab_ebs_centos-core-i386-6.2.1
として見つかるはずです。

アップデート内容は下記となります。

▼カーネルも含めOSのバージョンを6.2にアップデート
"SUZ-LAB CentOS AMI"を6.0から6.2に(カーネルも)アップデート

▼"nrpe"のインストール(結局いつもインストールしてるので)

"epel"のパッケージをインストールします。
# yum -y install nrpe

▼"monit"の設定ファイル名を変更(アップデートしたら動かなくなったので)

アップデートした"monit"の設定ファイル"/etc/monit.conf.rpmnew"を
"/etc/monitrc"にリネームします。
(古い設定ファイル"monit.conf"は削除します)
# cd /etc/
# mv monit.conf.rpmnew monitrc
# rm monit.conf
# /etc/init.d/monit start
Starting monit: Starting monit daemon with http interface at [localhost:2812]
                                                           [  OK  ]

Enjoy!
--------
http://www.suz-lab.com

"SUZ-LAB CentOS AMI"を6.0から6.2に(カーネルも)アップデート

スズキです。

以前、カーネルのアップデート(2.6.32-71.29.1 → 2.6.32-220.4.2)
を試したのですがブートできなくなってしまって、
それ以降、ずっとできないものと思っていました…

しかし出来ました!
カーネルをアップデートすると、アタッチしているEBSのデバイスファイルが
"/dev/xvda1"から"/dev/xvde1"に変更されていたのが問題でした!

ということでアップデート方法です。

まずは、アップデート前のカーネルやOSのバージョンです。
# uname -a
Linux ip-10-156-21-210 2.6.32-71.29.1.el6.i686 #1 SMP Mon Jun 27 18:07:00 BST 2011 i686 i686 i386 GNU/Linux
# cat /etc/redhat-release 
CentOS Linux release 6.0 (Final)

今までは、上記のことから"yum"のアップデートからカーネル類を外していたのですが、
今回は"yum.conf"から、その"exclude=kernel*"の記述を外し、アップデートします。
# cd /etc/
# diff yum.conf.old yum.conf
13d12
< exclude=kernel*
# yum -y update
新しいカーネルがインストールされていることがわかります。
# ls -1 /boot/
System.map-2.6.32-220.4.2.el6.i686
System.map-2.6.32-71.29.1.el6.i686
config-2.6.32-220.4.2.el6.i686
config-2.6.32-71.29.1.el6.i686
efi
grub
initramfs-2.6.32-220.4.2.el6.i686.img
initramfs-2.6.32-71.29.1.el6.i686.img
symvers-2.6.32-220.4.2.el6.i686.gz
symvers-2.6.32-71.29.1.el6.i686.gz
vmlinuz-2.6.32-220.4.2.el6.i686
vmlinuz-2.6.32-71.29.1.el6.i686
この状態でリブート後、カーネルとOSのバージョンを確認すると、 OSは"6.2"になっていますが、カーネルはまだ"2.6.32-71.29.1"のままです。
# uname -a
Linux ip-10-156-21-210 2.6.32-71.29.1.el6.i686 #1 SMP Mon Jun 27 18:07:00 BST 2011 i686 i686 i386 GNU/Linux
# cat /etc/redhat-release
CentOS release 6.2 (Final)
カーネルのバージョンアップを行うには、"/boot/grub/menu.lst"を 新しいカーネルのものに変更する必要があります。
# cd /boot/grub/
# diff menu.lst.old menu.lst
6,7c6,7
<         kernel /boot/vmlinuz-2.6.32-71.29.1.el6.i686 ro root=/dev/xvda1
<         initrd /boot/initramfs-2.6.32-71.29.1.el6.i686.img
---
>         kernel /boot/vmlinuz-2.6.32-220.4.2.el6.i686 ro root=/dev/xvde1
>         initrd /boot/initramfs-2.6.32-220.4.2.el6.i686.img
また最初に述べましたが、ルートディスクのデバイスファイルも "/dev/xvda1"から"/dev/xvde1"に変更する必要があります! 当然、"/etc/fstab"のルートデバイスの記述も同様に変更します。
# cd /etc/
# diff fstab.old fstab
1c1
< /dev/xvda1      /        ext4   defaults       1 1
---
> /dev/xvde1      /        ext4   defaults       1 1
この状態でリブート後、カーネルとOSのバージョンを確認すると、 無事カーネルもアップデートされ、最新の"CentOS 6.2"になっていることがわかります。
# uname -a
Linux ip-10-153-59-73 2.6.32-220.4.2.el6.i686 #1 SMP Tue Feb 14 00:24:28 GMT 2012 i686 i686 i386 GNU/Linux
# cat /etc/redhat-release 
CentOS release 6.2 (Final)
最後に、もう利用していない古いカーネルを削除します。
# yum erase kernel-2.6.32-71.29.1.el6
SUZ-LAB謹製 CentOS AMI 6.2 Comming Soon! -------- http://www.suz-lab.com

2012年2月21日火曜日

PostgreSQL(9.1)でレプリケーション

スズキです。

PostgreSQL(9.1)でホットスタンバイのDBへのレプリケーションを試してみます。

マスターデータベースとスレーブ(ホットスタンバイ)データベースは、
下記のようにインストールされているものとします。
CentOS(6.2) & PostgreSQL(9.1) & PostGIS(1.5)

【マスターDBでの作業】

あらかじめPostgreSQLを停止しておきます。
# su - postgres
$ /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data stop

"postgresql.conf"を調整します。
$ cat postgresql.conf
...
listen_addresses = '*'
#listen_addresses = 'localhost'
...
wal_level = hot_standby
#wal_level = minimal
...
max_wal_senders = 2
#max_wal_senders = 0
...
wal_keep_segments = 8
#wal_keep_segments = 0 
...
hot_standby = on
#hot_standby = off

PostgreSQLを起動しておきます。
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/data/postgresql.log start

レプリケーション用のユーザーを作成します。
$ /usr/local/pgsql/bin/psql 
postgres=# CREATE ROLE repluser LOGIN REPLICATION PASSWORD 'replpass';
CREATE ROLE

"pg_hba.conf"を調整します。
$ cat pg_hba.conf
...
host    replication     repluser        10.0.0.0/8            md5
※AWS上から(10.0.0.0/8)から"repluser"でアクセスできるようにします。

PostgreSQLを再起動します。
$ /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/data/postgresql.log restart

【スレーブDBでの作業】

あらかじめPostgreSQLを停止しておきます。
# su - postgres
$ /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data stop

データベースクラスタを削除します。
$ cd /usr/local/pgsql/data
$ rm -rf *

ベースバックアップを取得します。
$ /usr/local/pgsql/bin/pg_basebackup -D /usr/local/pgsql/data -x -P -h 10.150.117.75 -U repluser
Password: 
42536/42536 kB (100%), 1/1 tablespace
$ ls -1
PG_VERSION
backup_label
base
global
pg_clog
pg_hba.conf
pg_ident.conf
pg_multixact
pg_notify
pg_serial
pg_stat_tmp
pg_subtrans
pg_tblspc
pg_twophase
pg_xlog
postgresql.conf
postgresql.log

"recovery.conf"を作成し調整します。
$ cp /usr/local/pgsql/share/recovery.conf.sample recovery.conf
$ cat recovery.conf
...
standby_mode = on
#standby_mode = off
...
primary_conninfo = 'host=10.x.x.x port=5432 user=repluser password=replpass'
#primary_conninfo = ''          # e.g. 'host=localhost port=5432'
...

PostgreSQLを起動します。
$ /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l /usr/local/pgsql/data/postgresql.log start

これで、マスターデータベースの変更がスレーブ(ホットスタンバイ)データベースに
レプリケーションされます。
(スレーブ(ホットスタンバイ)データベースでの読み取りはできます)

次は"cryptsetup"に戻ろう...
--------
http://www.suz-lab.com

2012年2月20日月曜日

CentOS(6.2) & PostgreSQL(9.1) & PostGIS(1.5)

スズキです。

CentOS(6.2)にPostgreSQL(9.1.2)をインストールし、
PostGIS(1.5.3)も利用できるようにしてみました。

CentOS(6.2)はもちろん「SUZ-LAB謹製 CentOS AMI」です。

【PostgreSQLのインストール】

依存パッケージのインストール
# yum -y install readline-devel

PostgreSQLのインストール
# curl -OL ftp://ftp2.jp.postgresql.org/pub/postgresql/source/v9.1.2/postgresql-9.1.2.tar.gz
# tar xvzf postgresql-9.1.2.tar.gz
# cd postgresql-9.1.2
# ./configure
# make
# make install

postgresユーザーとデータディレクトリの作成
# adduser postgres
# mkdir /usr/local/pgsql/data
# chown postgres.postgres /usr/local/pgsql/data

データベースクラスタの作成
# su - postgres
$ /usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
$ ls -1 /usr/local/pgsql/data/
PG_VERSION
base
global
pg_clog
pg_hba.conf
pg_ident.conf
pg_multixact
pg_notify
pg_serial
pg_stat_tmp
pg_subtrans
pg_tblspc
pg_twophase
pg_xlog
postgresql.conf

PostgreSQLの起動と確認
$ /usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data start
server starting
$ /usr/local/pgsql/bin/psql 
psql (9.1.2)

【PROJ.4のインストール】

# curl -OL http://download.osgeo.org/proj/proj-4.7.0.tar.gz
# tar xvzf proj-4.7.0.tar.gz
# cd proj-4.7.0
# make
# make install

【GEOSのインストール】

# curl -OL http://download.osgeo.org/geos/geos-3.3.2.tar.bz2
# bunzip2 geos-3.3.2.tar.bz2
# tar xvf geos-3.3.2.tar 
# cd geos-3.3.2
# ./configure
# make
# make install

【PostGISのインストール】

PostGISのインストール
# curl -OL http://postgis.refractions.net/download/postgis-1.5.3.tar.gz
# tar xvzf postgis-1.5.3.tar.gz
# cd postgis-1.5.3
# ./configure --with-pgconfig=/usr/local/pgsql/bin/pg_config
# make
# make install

共有ライブラリの認識
# /sbin/ldconfig

PostGISの利用
$ /usr/local/pgsql/bin/createdb sample
$ /usr/local/pgsql/bin/psql -d sample -f /usr/local/src/postgis-1.5.3/postgis/postgis.sql

次はPostgreSQL(9.1)のレプリケーションを試す予定。(明日の朝までに...)
--------
http://www.suz-lab.com

2012年2月15日水曜日

SimpleDBのドメイン内のデータを一覧表示(NextTokenに注意)

スズキです。

SimpleDBはRDBのSELECTのようなクエリーが発行でき、
条件に該当するデータを取得することができます。

しかし、一回のAPIリクエストで取得できるデータ数は100件までで、
それ以降を取得するには、「NextToken」というものを利用して、
再度同様のクエリーをAPIでリクエストする必要があります。

具体的には、100件以上該当データがある場合、レスポンスにNextTokenが含まれ、
そのNextTokenを指定して、再度同様のクエリーをリクエストする形になります。
当然、次の100件でもデータが取りきれない場合は、レスポンスに同様に
NextTokenが含まれるので、それを用いて再度リクエストすることになります。

上記を考慮すると、すべてのデータを取得するには、NextTokenがあるかぎり、
複数のリクエストを行う必要があります。

ということで、PHPで簡単に作ってみました。

<?php
require_once(AWS_SDK_PATH . "/sdk.class.php");
date_default_timezone_set("Asia/Tokyo");

$sdb = new AmazonSDB(
    array("key" => SDB_KEY_ACCESS, "secret" => SDB_KEY_SECRET)
);
$sdb->set_region(AmazonSDB::REGION_APAC_NE1);

$query = "SELECT * FROM log WHERE uid >= '0' ORDER BY uid DESC";
$option = array();
do {
    $response = $sdb->select($query, $option);
    foreach($response->body->SelectResult->Item as $item) {
        print($item->Name . "\t");
        foreach($item->Attribute as $attribute) {
            print($attribute->Name  . ":");
            print($attribute->Value . "\t");
        }
        print("\n");
    }
    if(isset($response->body->SelectResult->NextToken)) {
        $option["NextToken"] = $response->body->SelectResult->NextToken;
    } else {
        $option["NextToken"] = null;
    }
} while($option["NextToken"] != null);

exit(0);
?>

実行すると下記のようになります。

# php list-data.php
4f3b67cf5396d8.04566676 uid:1 timestamp:1329293263 action:1 
4f3b65774e50c6.59284865 uid:1 timestamp:1329292663 action:1 
4f3b64ab8239a8.32909808 uid:1 timestamp:1329292459 action:1 
4f3b649b3a3cd1.62613728 uid:1 timestamp:1329292443 action:1 
4f3b625e9e17f1.40124430 uid:1 timestamp:1329291870 action:1 
4f3b58032f0737.20329909 uid:1 timestamp:1329289219 action:1
...

これ応用すれば、SipmleDBのバックアップも簡単に作れるかも。
--------
http://www.suz-lab.com