月曜日, 12月 17, 2007

引越し

最近、更新もしてませんが、ドメインが切れるので引っ越します。
新しいアドレスは、
http://infology2.blogspot.com/
の予定です。

月曜日, 3月 05, 2007

Amazon Elastic Compute Cloud (Amazon EC2)

Amazon EC2、正確には「Amazon Elastic Compute Cloud (Beta)」です。
コンピュータリソースを従量制で貸してくれるサービス。
今流行のSecond Lifeもこのサービスを利用しているらしいです。
実際、「従量制」のイメージとはうらはらに、安いです。

インスタンス(仮想ホスト、またはCPUやメモリと呼べばいいのか)を1時間借りると、0.1ドル。
1GBのネットワークトラフィック(外部向けのみ課金)で、0.2ドル。
1GBのストレージを1ヶ月借りて、0.15ドル。
なんか、おこづかい程度の金額ですね。

Webサービスなら結構なトラフィックでも月2万円もあれば済みそうです。
それくらいなら事業の初期投資として高額じゃないですし、しかも拡張性も高い。
後からリソースを追加するのも楽ですし。
リソース足りない!なんてあたふたしなくていいわけですな。ボタン一発。
なんといってもメンテナンスが圧倒的に楽なので、これは使わない手はないですね。

というわけで使ってみました。

まず、Amazon Web Servicesにアカウントを作成します。
ここでクレジットカードの情報なんかも必要になります。

次にAmazon Simple Storage Service (Amazon S3)に登録。
これはストレージのみのサービスで、EC2ではこのサービスをストレージとして利用します。

で、EC2に申し込み。
まだベータなサービスなので、承認に時間がかかります。
いたずらにユーザーを増やさないようにしてるんですかね。
僕は申し込んでから1ヶ月くらい待たされました。

承認のメールが届いたら早速挑戦。

基本的にはEC2のページの下の方にあるテクニカルドキュメントを読みながらそのとおりに実行すれば終わりです。
まあ、せっかくなのでまとめると。

-------------------------------------------------------------------------------------

# aptitude install sun-java5-jre
でJAVAをインストール。aptのsources.listにnon-free contribがないと見つかりません。

次にAmazon Web Servicesのページで証明書を作成。といっても「作成」ボタンを押すだけです。
秘密鍵、公開鍵をダウンロードして保存します。
ここでは~/ec2/以下に保存したことにします。

Amazon EC2 Resource CenterからCommand Line Toolsをダウンロード。
展開したbinとlibをそれぞれ~/ec2/binと~/ec2/libに移動します。
ちなみにWindows版もLinux版も一緒に入ってます。新しいな。

.bashrcに以下を追加。
export EC2_HOME=~/ec2
export PATH=$PATH:$EC2_HOME/bin
export EC2_PRIVATE_KEY=~/ec2/pk-HKZYKTAIG2ECMXYIBH3HXV4ZBZQ55CLO.pem
export EC2_CERT=~/ec2/cert-HKZYKTAIG2ECMXYIBH3HXV4ZBZQ55CLO.pem

source ~/.bashrc
で読み込みます。

これで準備は終わりです。

# ec2-describe-images -x all
で利用可能なイメージを表示させることができます。
自分で作ることも可能ですが、これの中から利用しても不便はないです。というか、面倒だし。

# ec2-add-keypair gsg-keypair
で作成したホストにログインするための鍵を作成できます。
表示されたものを適当に保存しておきます。
パーミッションを0400にするのをお忘れなく。

# ec2-run-instances ami-5bae4b32 -k gsg-keypair
利用可能なイメージの中から好きなイメージを選択して、起動します。
ami-*で始まるIDとすぐ上で作成した鍵を指定します。

# ec2-describe-instances
でインスタンスの状態を確認します。
ステータスが「running」になっているインスタンスが見つかるはずです。

# ec2-authorize default -p 22
22番ポートでの接続を許可します。
# ec2-authorize default -p 80
Webサービスを開始したい場合は80番を指定します。

# ssh -i id_rsa-gsg-keypair root@ec2-72-44-33-55.z-2.compute-1.amazonaws.com
ec2-describe-instancesで表示されるアドレスにログインできます。

# ec2-terminate-instances i-f8618691
ec2-describe-instancesで表示されるIDを指定して停止させることができます。
ピークを過ぎたら、これでお金を節約します。

-------------------------------------------------------------------------------------

あとはもう普通にホスティングされているホストと同じように利用できます。

正直言って、これはすごいですね。
もうホスティングサービスなんていらない感じがします。
サーバー買う手配したり、電源気にしたりしなくて済みます。
しかもこっちのほうが早くて、(たぶん)安いです。

大きな会社だったら個人情報がどうこうとかありそうですけどね。

月曜日, 2月 05, 2007

OpenDNS

フリーのDNSサーバー。
キャッシュの方のサーバーです。

「安全」で「速く」て「賢い」らしいです。

なにが「安全」かというと、既知のフィッシングサイトをブロックしてくれるんですね。
だから、info1ogy.info(lが1)みたいな分かりづらいものも大丈夫なわけです。
UTF-8のURLだと、ますますわかりづらい(というか、判別不可能)になってしまうので、なかなかいいですね。

紹介では、「ローカルのキャッシュサーバーよりも速い」と書いてあります。
ほとんどの人はキャッシュサーバーの設定を最適にしていないかららしいです。
ネットワーク分の遅延はあるけど、サービス全体でみたら速いみたい。
試してみると、たしかに速い。。。屈辱的です。

ほかにも、打ち間違いなんかを勝手に推測してくれたりもします。
微妙ですが、悪くないかも。

ちなみにこれら機能は、オン・オフをWeb上で切り替えることができます。
他にもクエリーの統計なんかもWebから見れます。なんか凝ってるな。


とりあえず、かなり気に入ったのでしばらく使ってみることにします。

水曜日, 1月 31, 2007

LVM を利用したバックアップ

LVMを利用してXenのディスクをバックアップします。

LVMにはスナップショットの機能がついているので、これを利用すればファイルシステムレベルでの不整合は発生しなくなります。
DBのトランザクションなんかはまた別の話なので、そういうときはアプリケーションで用意されたバックアップを使いましょう。

まず、仮想マシンをいったん停止します。
xm pause dns1.infology.info

次にLVMのスナップショットを作成します。
lvcreate -s -L 1G /dev/xm129/dns1.infology.info-disk
-L で指定するサイズはバックアップの間にこのディスクに加えられる変更のサイズよりも大きくないといけません。このあたりは経験するしかないですね。

スナップショットの作成が済んだら、仮想マシンを動かします。
xm unpause dns1.infology.info
スナップショットの作成はとても早いので、ここまでに必要な時間は数秒です。
LVSheartbeatを使った冗長化が済んでいれば、まず問題にならない程度ですね。

バックアップを作成します。
dd if=/dev/xm129/lvol0 of=/backup/dns1.infology.info.disk
lvol0はスナップショットの名前です。
紛らわしいときは、作成時に -n オプションで自由に名前をつけることができます。

バックアップが終了したら、スナップショットを削除します。
lvremove /dev/xm129/lvol0


ちなみに復元したいときには、
dd if=/backup/dns1.infology.info.disk of=/dev/xm129/dns1.infology.info-disk
とします。

LVM (Logical Volume Manager) と Xen

LVM(Logical Volume Manager)を使います。

というのも、それまでファイルのディスクイメージでXenを使っていました。
間違って電源が落ちたときに、イメージファイルがことごとく壊れたんですね。
やはり、数ギガバイトのファイルというのは無理がありそうです。

DebianではOSのインストール時にLVMの利用を選択できます。
すべて自動で進めていって、最後にサイズだけ変更します。
そのままだとディスク全体がひとつのLV(Logical Volume)になってしまいます。

Xenの仮想マシンにディスクを割り振るのも、ツールを使うと意識せずにできます。
xen-create-image などで仮想マシンを作成すると、LVの作成もやってくれます。

LVMを使うと、ループバックデバイスの設定も必要ありません。
また、Xenのマニュアルによると、パフォーマンスもよいらしいです。
将来、ディスクサイズの変更が必要になった場合もLVMを利用していると簡単に対応できるので、まったくいいこと尽くめです。

火曜日, 12月 19, 2006

Debian GNU/Linux で heartbeat を使う

ldirectord を使って高い可用性と拡張性をもつシステムを作りました。
あれ、でもまだひとつ足りません。
そう、LVS自体がSPOF(Single Point Of Failure、故障すると取替えがきかない部分)になってしまったんですね。
なので、これを冗長化します。

これには heartbeat を使います。
まず、aptitude install heartbeat でインストール。
次に、/usr/share/doc/heartbeat/ にある authkeys、ha.cf.gz、haresources.gz を /etc/ha.d/ にコピーします。
authkeys はパーミッションを0600に変更、残りの2つのファイルは gunzip で解凍します。

ここの設定は、それぞれがローカルネットワーク用のeth0、外部向けのeth1を持っている場合です。ひとつしかなければもっと簡単です。

ha.cf
-------------------------------------------------------------------------------------
keepalive 2
deadtime 10
warntime 10
initdead 10
mcast eth0 225.0.0.1 694 1 0
node xvm249
node xvm250
-------------------------------------------------------------------------------------
↑に書いた行のコメントを外して、値を変更します。
最初の辺りの数字は時間です。デフォルトは長すぎるので。
mcastはマルチキャストの意味。
ブロードキャストでもいいのですが、他にもheartbeatを利用した共有を行うつもりなのでマルチキャストにしました。
node はuname -nで出力される名前。参加するホスト分書きます。

haresources
-------------------------------------------------------------------------------------
xvm249 59.106.42.202/28/eth1
-------------------------------------------------------------------------------------
共有するリソースを書きます。
それぞれ、マスターのホスト名とIP、イーサネットの名前を書きます。

authkeys
-------------------------------------------------------------------------------------
auth 2
2 sha1 KYif6FQMB5XmeQT1I7CuYEEQrbQNGCsF
-------------------------------------------------------------------------------------
上のふたつの行を有効にして、パスワードは適当に決めます。
makepasswd -c 32 なんかで作れます。

IPsecを使えばここはなんでもいいです。
認証や暗号化はIPsecに統一したほうが、全体のコストは安上がりでしょう。

これでheartbeatの設定は終わりです。
でも、共有するリソースをheartbeatに開放しないといけません。
/etc/network/interfaces から59.106.42.202を削除します。
でもそうすると、割り当てるIPがなくなるので、boot時にeth1が起動しません。
iface eth1 ...
の代わりに、
up ifconfig eth1 up
を書いて、起動だけするようにしておきます。
結局IPv6のリンクローカルアドレスが割り当てられます。

さらにLVSの設定が必要です。
というのも、テーブルの内容は静的なので同期を取って置けますが、厳密にはTCPのコネクションの情報なども共有しなければいけないからです。
これには、dpkg-reconfigure ipvsadm を実行して、一方のホストをmaster、もう一方をbackupに設定すればできます。

こうすれば同期を取ることができますが、名前からわかるように双方向ではありません。
双方向のパッチもあります。でも、かなり細かい部分なので、僕は本家にマージされるのをのんびり待ちます。

ここまでやると、夜中にシステムダウンで起こされることもなくなります。

金曜日, 12月 15, 2006

Debian GNU/Linux で ldirectord を使う

ldirectord はバックエンドのサーバー群を監視して、自律的にテーブルを書き換えるLVSの拡張です。
もうちょっと具体的に言うと、バックエンドのサーバーに不具合が起きて停止すると、それを発見してリクエストをそちらに送らなくしたりします。
逆に、それまで停止していたサーバーが復帰するとまたリクエストを送るようにしたりするわけですね。

これって、高可用性の要件を満たすのに、めちゃくちゃ有効です。
しかも、ipvsadmと大して手間は変わりません。

まず、aptitude install ldirectord でインストール。
cp /usr/share/doc/ldirectord/ldirectord.cf.gz /etc/ha.d/
gunzip ldirectord.cf.gz
で設定ファイルをコピーします。

設定はこのファイルのサンプルを参考にすればマニュアル見なくても大体わかります。
とりあえずHTTPの設定はこんな感じです。
-------------------------------------------------------------------------------------
# Global Directives
checktimeout=3
checkinterval=1
fallback=127.0.0.1:80
autoreload=yes
#logfile="/var/log/ldirectord.log"
#logfile="local0"
quiescent=yes

# A sample virual with a fallback that will override the gobal setting
virtual=59.106.42.202:80
real=192.168.0.1:80 gate
real=192.168.0.2:80 gate
fallback=127.0.0.1:80 gate
service=http
#request="index.html"
#receive="Test Page"
#virtualhost=some.domain.com.au
scheduler=rr
#persistent=600
#netmask=255.255.255.255
protocol=tcp
-------------------------------------------------------------------------------------

設定が終わったら、/etc/init.d/ldirectord start で起動します。

これで192.168.0.1と192.168.0.2のサーバーを監視して、動いているサーバーにHTTPリクエストを割り振ることができます。
もちろん、重みをつけたり、分散アルゴリズムを指定することもできます。

最後に dpkg-reconfigure ipvsadm を実行してOSの起動時にipvsadmが実行されないようにします。これはもういりません。

木曜日, 12月 14, 2006

LDAP の複製

LDAPの複製です。
slapd のバージョン2.2までは、slurpdを使ってデータをコピーします。
バージョン2.3からは syncrepl を使います。これが便利!

2つの方法の違いは、データの複製を行うサーバーです。
slurpdはマスターがスレーブに対してデータの送信を行います。
sycreplはスレーブからマスターのデータを取得します。
なので、slurpdの場合はマスターの設定変更が必要になるわけですね。
これは、すでに運用中の場合には結構大きな問題です。
それに対して、syncreplの場合はマスターの設定が必要ないので、すでに運用しているLDAPを拡張するのがとても簡単です。

スレーブ側の設定ファイルに、以下を追加します。

syncrepl rid=123
provider=ldap://ldap0.kumicho.net
type=refreshOnly
interval=00:00:10:00
searchbase="dc=kumicho,dc=net"
scope=sub
attrs="*"
schemachecking=off
bindmethod=simple
binddn="uid=kumicho,dc=kumicho,dc=net"
credentials=password

これだけで複製が行えます。
上の設定を見たら想像つきますが、これは普通の検索です。
なので、データの一部だけを複製することも可能です。
また、データを取得するためのユーザーでバインドする必要があります。

認証の方法は"simple"を利用しているので、IPsecを利用しましょう。
もうTLSなんて時代遅れ。