ひとりごと

新しい記事:[1935]  古い記事:[1933] 表示単位 :

ついったー[おとなり日記] かがみさん Y.Kumagaiさん

2007/06/01 (金)

・ ミラーへの道

一部の方はご存知かと思いますが、このページは自宅にて稼動している FreeBSD機を使って表示しています。rootの権限が必要な設定も可能だしCPUパワー使い放題ですのでとても便利なのですが、コケてる時は表示できないという欠点があります。そして当然のことながら「安価な商用ホスティングサービスがコケる可能性よりも自宅サーバがコケる可能性の方がはるかに高い」のです(苦笑)。うちのサイトは入り口だけはプロバイダのWWWサーバを使っていますが中身のほとんどが自宅サーバに依存しているので、コケてしまうと途端に中身の無いサイトに変身してしまいます。

以前は自宅サーバとレンタルサーバの間には越えられない壁があったように思いますが、レンタルサーバ側が何度か容量・機能拡張した結果

という感じでいきなり引越ししても困らないスペックになっているのですね。てなわけで お引越しする訳ではありませんが、緊急時に自宅サーバがコケてても運用可能なミラーを作ってみることにしました。

下記は作成途中に困った事と回避方法。

静的ファイルの転送
うちのレンタルサーバは rsync が受けられるのでこれは簡単。
rsync -va dir1 dir2 dir3 ... ユーザ名@リモートサーバ:/パス/
てな感じで一行で書けます。 もちろん前処理としてsshでパスフレーズ無しでログインできるように設定してあります。
PostgreSQLには下位互換性が無い
自宅サーバは PostgreSQL 8.2.4。対してレンタルサーバは PostgreSQL 7.4.13。別に古いこと自体は結構なのですが、困ったことに自宅サーバで pg_dump したデータがレンタルサーバで読み込めません(T_T)。ど、どうやってデータ持っていくの~~~? と散々悩んだのですが、pg_dump は使わずに copy にてファイル出力し、受け側では copy table from stdin を付け足したファイルを食べさせてあげるとうまくいきました。

実際には下記のようなシェルスクリプトを走らせています
#!/bin/sh
RMTHOST=レンタルサーバのマシン名
RMTUSER=ユーザ名
RMTHOME=/usr/home/ユーザ名とか/
DBHOST=データベースのマシン名
DBUSER=データベース接続ユーザ名

FILE=hoge.out
TMP=/tmp/$FILE

copytable() {
TABLE=$1
LIST=$2
echo "begin;" >>$TMP
echo "delete from $TABLE;" >>$TMP
echo "COPY $TABLE ($LIST) FROM stdin;" >>$TMP
psql kobo<<EOF >>$TMP
copy $TABLE($LIST) to stdout;
EOF
echo '\.' >>$TMP
echo "end;" >>$TMP
echo "" >>$TMP
}

# 作業スクリプトの作成
copytable 'テーブル1' 'id,dt,name,body'
copytable 'テーブル2' 'id,dt,title,body,viewmode'
echo "vacuum;" >>$TMP
gzip -9f $TMP

# リモートマシン上で実行
scp ${TMP}.gz $RMTUSER@$RMTHOST:$RMTHOME
ssh $RMTUSER@$RMTHOST "zcat $FILE |psql -h $DBHOST -U $DBUSER $DBUSER"

rm ${TMP}.gz
じつはこれで作成されるファイルは1.5MBぐらいになるので転送には時間がかかります。実際の運用では copy の際に1日分とか範囲を限定すると良いと思います。なお、自動で行う場合はpsqlのパスワードを ${HOME}/.pgpass に記入する必要があります。
スクリプト内でのホストの区別
PHPとかは共通で使いまわしたいので同一スクリプトの中で条件分岐する必要があります。いろいろ方法はあるかと思いますが、rsync対象外の場所に PHP ファイルを置いて require してみました。根っこの .htaccess内で PHPのinclude_pathを設定してあげるとrequireするファイルを使い分けられて便利です。 で、この中で変数セット。変数の他にもデータベース接続関数を作っておくと呼び出し元の修正が楽です。
mod_rewrite
こっちはかなり困りました。前項ならスクリプト内ですみますが、こちらは .htaccess をいじる必要があります。.htaccessっていまいちよくわかんないし、いじってると Internal Error とか出るから嫌いだ(笑)。てことで、さっぱりわからないから苦肉の策で /etc/rc.conf に apache_flags="-DTORIYU" と書いて httpd の起動時に無理やりdefineし、.htaccessで
<ifdefine TORIYU>
RewriteBase /~takatani/hoge/
</ifdefine>
<ifdefine !TORIYU>
RewriteBase /gallery/
</ifdefine>
みたいなことをしてみました。動けばいいのさ・・・はぅ

てな感じで、だいぶ動くようになってきました。目的はお引越しでも完全なフェイルオーバーでもなく、「自宅サーバがコケてる時に表示できる場所」ですので、書き込み系の処理は実装しませんし同期もリアルタイムである必要はありません。それを踏まえた上で現在動いているのが これとかこれ

とりあえず枝葉のページに関しては全部出来たので、後は差分更新の仕組みとプロバイダの静的ファイルのリンクを状況に応じてすりかえる仕組みを作ればよいかなーと思います。

# こゆのは出来上がってから書くのがよいと思うのですが、しばらく時間が取れなくなる
# と思うので忘れないようにメモ書き(^^)
[つっこみ]

新しい記事:[1935]  古い記事:[1933] 表示単位 :
※このページへのリンクは自由です。リンクの方法については[つっこみ]で表示されるページの最後をごらんください。
たかたに(takatani@mars.dti.ne.jp)