April
Sub-archives
Apr 27, 2009
チャレンジリーグ 春の長良川クリテ
今年最初のレース頑張ってきました。
突然寒くなったものだ。長島の駅から出て走っていたら半袖ジャージでは寒かった。風も強くて押し返される感じで。
スポーツIに出て5周目で死亡。ホームストレートに入ってついてけなかった。まだ厳しいです…。
OCFS2の実験
OCFS2を実験してみた。
NFSの代わりに使ったりするということだったので、サーバとクライアントという図式でサーバが調整を行うのだと思っていたら違っていた。各サーバーが共有のブロックデバイスを持ち、各サーバーが互い協調して書き込みをする仕組みだった。つまりFCやiSCSIで共有ディスクを接続して運用するということになる。
今回の実験ではLinuxのiscsitargetを使った。iscsitargetでiSCSIディスクを提供するサーバーを1台用意して2台のクライアントからiSCSIでブロックデバイスを共有。そしてOCFS2でマウントする構成を取った。kernelは 2.6.26-2-{686,amd64}で実験。
iSCSIの設定
ざっと書く。iSCSIなりFCなりで共有ディスクがすでにあるなら飛ばす。
iscsitargetをインストールしてLVMのボリュームをiSCSIで公開する。LVMで/dev/vgmain/iscsi0というボリュームを作成して/etc/ietd.confにTarget iqn.2009-04.com.example:storage.iscsi0
Lun 0 Path=/dev/vgmain/iscsi0,Type=blockio
としてiSCSIのディスクを公開する。
クライアント側ではopen-iscsiをインストールする。iscsi_discoverを使ってiscsiのディスクをブロックデバイスとして登録できるところまでやる。例えば /dev/sdaなりに登録されたとする。
OCFS2の設定
次にOCFS2の設定を行なう。クライアント側でocfs2-toolsをインストール。debconfでブート時に起動されるように設定する。
/etc/ocfs2/cluster.confを設定する。
node:このファイルは各クライアントで同じ内容を持つ必要がある。
name = client0
cluster = ocfs2
number = 0
ip_address = 192.168.1.100
ip_port = 7777
node:
name = client1
cluster = ocfs2
number = 1
ip_address = 192.168.1.101
ip_port = 7777
cluster:
name = ocfs2
node_count = 4
mkfs.ocfs2を実行してiSCSIのデバイスにOCFS2のファイルシステムを作成する。
# mkfs.ocfs2 /dev/vgmain/ocfs/etc/fstabに次のように設定。書かないと /etc/init.d/ocfs2 が起動しない。
mkfs.ocfs2 1.4.1
Cluster stack: classic o2cb
Filesystem label=
Block size=4096 (bits=12)
Cluster size=4096 (bits=12)
Volume size=1073741824 (262144 clusters) (262144 blocks)
9 cluster groups (tail covers 4096 clusters, rest cover 32256 clusters)
Journal size=67108864
Initial number of node slots: 4
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Writing backup superblock: 0 block(s)
Formatting Journals: done
Formatting slot map: done
Writing lost+found: done
mkfs.ocfs2 successful
#
/dev/sda /mnt/ocfs ocfs2 _netdev 0
そのあとに o2cbとocfs2を再起動する。
# /etc/init.d/o2cb restart
Stopping O2CB cluster ocfs2: OK
Unloading module "ocfs2": OK
Unmounting ocfs2_dlmfs filesystem: OK
Unloading module "ocfs2_dlmfs": OK
Unloading module "ocfs2_stack_o2cb": OK
Unmounting configfs filesystem: OK
Unloading module "configfs": OK
Loading filesystem "configfs": OK
Mounting configfs filesystem at /sys/kernel/config: OK
Loading stack plugin "o2cb": OK
Loading filesystem "ocfs2_dlmfs": OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
Setting cluster stack "o2cb": OK
Starting O2CB cluster ocfs2: OK
# /etc/init.d/ocfs2 restart
Stopping Oracle Cluster File System (OCFS2) OK
Starting Oracle Cluster File System (OCFS2) OK
#
というところで終了。かなり簡単。
NVIDIAのドライバー
やっと173.14.18のドライバーが入った。
ということでxorg-7.4に家のPCが上がる。
Apr 21, 2009
な、なんだってー
OracleがSunを買収!!!!!
えーと、MySQLってどうなるんだ?
業界的にはいろいろあるんだろうけど、あのSunがあのSunが、という感じ。自分がSunOS4でUNIXの世界に飛び込み…長い時間を過ごし。寂しい話だ。
Apr 16, 2009
tokyocabinet-haskellのdeb化
tokyocabinet-haskellをdebにした。
ちょうどtokyocabinet-1.4.14が入ったのでtokyocabinet-haskellのdebianizeができるようになった。
cdbsを使うと非常に楽。rulesは2行だけ書けばよかった。controlにlibghc6-tokyocabinet-devなどをずらずら書いていくだけ。あとは適当。でdebuildとやったら途中で止まる。
dh_haskell_shlibdepsがまずい。ディレクトリ名からライブラリ名を調べているのだが、ライブラリ名にハイフンが含まれていると誤認識する(foo-bar-0.1 => fooとなってしまう)。#524143 というレポートになった。手元で修正してきちんと動くようになった。
DAMももうすぐ通過するだろうからそのときまでに今のやっつけからまともなパッケージに改善しておこう。
hskkservでTokyo Cabinetを使う
辞書にTokyo Cabinetを使う。
やっつけ実装がplain辞書を毎度毎度HashTableにするすごい処理だった。ま、これは駄目なのはわかっていた。tokyocabinet-haskellを導入したのでplain辞書をTokyo CabinetのHash DBに変換するツールをまず書く。そのあとhskkserv本体でTokyo Cabinetを使うように変更。インターフェイスは似ているので辞書を引く部分を若干変更して終了。
pgpool-IIをPITRでリカバリ
前回はrsyncでリカバリーをおこなったが今回はPITRを使う。
やってしまえば簡単な話なんだが、それまでにいろいろ試行錯誤。結果的にPITRのことがわかるようになった。流れは次のとおり。
- WALのアーカイブログを取るように設定
- pg_functionの設定(省略)
- pgpool.confの設定とリカバリーのスクリプトの作成
まずそれぞれのクラスターがWALのアーカイブをするように設定する。cl0,cl1/postgresql.confの設定を行う。
archive_mode = on
archive_command = 'cp -f %p archive_log/%f'
と設定する。archive_command を
test ! -f archive_log/%f && /bin/cp %p archive_log/%f'
という説明もあるのだが、これやるとエラーになってしまう。
次にpgpool関係の設定。recovery_1st_stage.shを以下のとおり。色々デバッグメッセージが出るので注意。
#!/bin/bash -vx
CLUSTER=$(basename $(cd $(dirname $0);pwd ))
if [ $CLUSTER = cl0 ]; then
PORT=5433
else
PORT=5434
fi
MASTER_BASEDIR=$1
RECOVERY_HOST=$2
RECOVERY_BASEDIR=$3
psql -h localhost -p $PORT -c "select pg_start_backup('pgpool-recovery')" postgr
es
echo "restore_command = 'cp -v $RECOVERY_BASEDIR/archive_log/%f %p'" > $MASTER_BASEDIR/recovery.conf
rsync -av $MASTER_BASEDIR/ $RECOVERY_BASEDIR/
rm -f $RECOVERY_BASEDIR/postmaster.pid
rm -f $MASTER_BASEDIR/recovery.conf
psql -h localhost -p $PORT -c 'select pg_stop_backup()' postgres
次にrecovery_2nd_stage.shを設定する。
#! /bin/bash -vx
CLUSTER=$(basename $(cd $(dirname $0);pwd ))
if [ $CLUSTER = cl0 ]; then
PORT=5433
else
PORT=5434
fi
MASTER_BASEDIR=$1
RECOVERY_HOST=$2
RECOVERY_BASEDIR=$3
psql -h localhost -p $PORT -U postgres -c 'select pg_switch_xlog()' postgres
rsync -av $MASTER_BASEDIR/archive_log/ $RECOVERY_BASEDIR/archive_lo
それぞれのファイルを$PGDATAの中に配置。
pgpool.confは次のように設定。
recovery_1st_stage_command = 'recovery_1st_stage.sh'
recovery_2nd_stage_command = 'recovery_2nd_stage.sh'
これで同じようにpcp_recovery_nodeを動かせばいい。いろいろと雑だが一応動く。
Apr 14, 2009
HaskellでTokyo Cabinet
HaskellでTokyo Cabinetを使おうとした。
Tokyo CabinetのHaskell bindingはあった。だけど、DebianのTokyo Cabinetが古いのでコンパイルができない(最新は1.4.x・Debianは1.2.x)。これをなんとかしないと先に進まない。先が長いな。
paco
Paco is a source code package organizer for Unix/Linux systems, originally written to aid package management when installing an LFS system.
pgpoolAdminをインストール
pgpoolを使うのに便利なのかねと思って入れてみた。
まあ、単なるWeb UI提供だけだったので、びっくりする機能はなかった。結局recoveryの部分は自分でやるのかーという話。
それはそうとして、起動がwebからだとwww-dataで起動されるのでいろいろファイルの権限が問題に。/var/run/postgresqlが当然書き込めない。
setfacl -m u:www-data:rwx /var/run/postgresql
とやってACLで問題を解消しておいた。
pgpool-IIをテスト
pgpool-IIでレプリケーション+オンラインリカバリーのテストをしてみた。
いまいちドキュメントがわかりにくい。書いてあることは書いてあるんだけど、なんとなくわかりにくい。
recoveryの方法はrsyncでやった。PITRはそれ自体がどうなのかよくわかってないのでパス。
構成として1台のPCにpgpoolとPostgresのクラスターを2つ用意した。
環境はpgpool-II 2.2 / PosrgreSQL 8.3
レプリケーションまでの手順
debianのpgpool-IIのバージョンが古いので自分でコンパイルしてインストールした。# pg_createcluster 8.3 cl0とやってクラスターを二つ作る。
# pg_createcluster 8.e cl1
/usr/local/etc/pgpool.confを設定。長いので関係あるとこだけ抜粋。pidの場所とかは自分でどうぞ。
replication_mode = true
replication_stop_on_mismatch = true
次がリカバリーに関係する部分
recovery_user = 'postgres'バックエンドのクラスターの定義
recovery_password = ''
recovery_1st_stage_command = 'pgpool_recovery'
recovery_2nd_stage_command = 'pgpool_recovery'
replication_timeout = 5000pcp.confの設定は省力。
backend_hostname0 = 'localhost'
backend_port0 = 5433
backend_weight0 = 1
backend_data_directory0 = '/var/lib/postgresql/8.3/cl0'
backend_hostname1 = 'localhost'
backend_port1 = 5434
backend_weight1 = 1
backend_data_directory1 = '/var/lib/postgresql/8.3/cl1'
/etc/postgres/8.3/cl[01]/pg_hba.conf は
host all all 127.0.0.1/32 trustとりあえずこうしておく。ここまでやってreplicationがはいるようになった。
次はオンラインリカバリー
pgpool-IIのソースのpgpool-II-2.2/sql/pgpool-recoveryに移動する。Cの拡張をいれる必要があるので、ここでmake; make installを実行。このあと各クラスターを再起動。
psql -U postgres -p 15432 -f pgpool-recovery.sql template1を実行。/var/lib/postgresql/8.3/pgpool_recoveryを作成。
#! /bin/sh/var/lib/postgresql/8.3/pgpool_remote_start
if [ $# -ne 3 ]
then
echo "pgpool_recovery datadir remote_host remote_datadir"
exit 1
fi
datadir=$1
DEST=$2
DESTDIR=$3
rsync -v -aurz --delete $datadir/global/ $DESTDIR/global/ &
rsync -v -aurz --delete $datadir/base/ $DESTDIR/base/ &
rsync -v -aurz --delete $datadir/pg_multixact/ $DESTDIR/pg_multixact/ &
rsync -v -aurz --delete $datadir/pg_subtrans/ $DESTDIR/pg_subtrans/ &
rsync -v -aurz --delete $datadir/pg_clog/ $DESTDIR/pg_clog/ &
rsync -v -aurz --delete $datadir/pg_xlog/ $DESTDIR/pg_xlog/ &
rsync -v -aurz --delete $datadir/pg_twophase/ $DESTDIR/pg_twophase/ &
wait
#! /bin/bashこのふたつのファイルは /var/lib/postgresql/8.3/cl[01]のそれぞれにコピーしておく。
if [ $# -ne 2 ]
then
echo "pgpool_remote_start remote_host remote_datadir"
exit 1
fi
DEST=$1
DESTDIR=$2
pg_ctlcluster 8.3 $(basename $DESTDIR) start
想定手順
実際の運用はこんな手順かな。cl0を止めた、あるいは勝手に止まった想定。# pg_ctlcluster 8.3 cl0 stopてな具合です。
# /usr/local/bin/pcp_detach_node 30 localhost 9898 postgres postgres 0
# /usr/local/bin/pcp_recovery_node 30 localhost 9898 postgres postgres 0
NVIDIAのドライバーをアップグレード
いろいろ苦労する。
びっくりしたのがnvidia-kernel-sourceのモジュールを入れようとしたらGeForce 5200はサポート外だったこと。legacyのほうのモジュールを入れろと。legacyは2.6.29でコンパイルできない。なのでいまだに2.6.26。えー。
Apr 08, 2009
今年もJVNの証明書をインストールしたよ
もはや何がなんだか。
去年は間違った操作で削除しても困らなかった。今年も今日ログインして終わる気がする。
Apr 07, 2009
sourceforge.jpでDarcsを使う
sourfceforge.jpでDarcsのリポジトリの運用を試みた。
- shellサーバーにはdarcsは入っている。(1.0.9)
- しかし、webサーバーにはdarcsは入ってないのでdarcswebをインストールするのにちょっと工夫が必要
- それより問題なのがhttpでリポジトリを公開できない。_darcsというファイル名が問題のようだ。_はダメなの?
- という話のチケットを送ったら即座に対応してくれたので問題ない。
AsteriskNOW-1.5.0
CentOS 5ベースになったAsteriskのディストリビューション。
CentOSと同様にインストールができる。Webで管理画面が立ち上がるのまで確認。管理ツールがFreePBXに変更されたということで、使い方ってどうなんだ?
Apr 05, 2009
JavaScriptにはブロックスコープがない
そうですかそうですか。
本格的にAjaxの関係でJavaScriptを最近よく書くようになった。ごりごり書いていると変数の参照に関してトリッキーな、というか手抜きというか、やばい臭いがプンプンするコードが書けてしまうなあということに気付く。今までJavaScriptは入門書もロクに読まずに書いていたのでわかっていなかったが、それは単純な話だった。
JavaScriptにはブロックスコープがない。
おそろしい話だ。
Apr 04, 2009
metacity + firefox3 がひどい件(まだ続き)
相変わらず駄目だね。2.24.0-2でも。
fireforx-remoteで呼ぶと今のworkspaceにウィンドウが飛んでくる件。
バグレポートは上がっていたはずなんだけど。うーん、なんで放置されているんだろう。
しゃーないのでUbuntuからパッチを持ってきて自分でbuildしたら直った。そのまま持ってくるにはHardyとsidでパッケージ名が変更されているので無理でした。どのパッチが正解なのかまだわからないけど。
tcpdumpが動かん
tcpdumpが動かん。wiresharkも動かん。
パケットキャプチャしようとしたらtcpdumpもなにもかもが動かない。
# tcpdumplibpcap(Bug#517098)が原因らしい。linux-image-2.6.26-1-amd64だと駄目だとさ。686-bigmemでやったら動いた。む。
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
01:22:26.123874 7d:c0:00:00:00:00 (oui Unknown) > yy:zz:00:xx:xx:xx
(oui Unknown) Null Information, send seq 0, rcv seq 0, Flags [Command],
length 4294967282
01:22:26.123874 01:80:c2:00:00:00 (oui Unknown) Unknown SSAP 0x92 >
00:00:00:00:00:00 (oui Ethernet) STP Supervisory, Receiver Ready, rcv
seq 69, Flags [Final], length 4294967282
tcpdump: pcap_loop: corrupted frame on kernel ring mac offset 94 + caplen 168 > frame len 160
2 packets captured
3 packets received by filter
0 packets dropped by kernel
#
Haskell SKK ServerがEmacsで動かない
自作のHaskell SKK ServerがEmacsで動かない。
uim-skkだと動いたのだが、Emacs-SKKだと駄目。変換されずにそのまま固まる。なんだろう…。他のskkservの挙動を見ても変なことしてないのになあと。パケットキャプチャをしてみたら…あれ?Emacs-SKKがLFを最後に送ってない。どーなってんだろう。これが原因か?
IO.getLineを使うと改行されるまで待つのがまずいらしい。IO.getCharで一文字ずつ読んでスペースが来たら一区切りで返すという処理を書いたら、Emacsでも動くようになった。dbskkd-cdbの附属の文書にはLFで終わるって書いてあったけど…。SKK serverの正しいプロトコルって何だろう…。
Apr 02, 2009
Haskell SKK Server
Haskellでなんか実用的なものを作るぞ。
Haskellで実用的なものをつくりたい、ということでSKKサーバを作ってみた。プロトコルは簡単なのでちょこちょこっと応答部分を作って辞書はSKK-JISYO.LをHashTableで格納して。50行ぐらいで書けた。大体動くようになったので入れ替えてテストしてみるか。
ただ、起動するたびにHashTableを再生成では大変なのでそこはなんかDBを使うようにしなればならない。それは別のお話。
ISS観測
ISS(国際宇宙ステーション)が名古屋から見えるとのことで待っていた。
この前つけた太陽電池パネルのおかげで金星よりも明るくなったISS。JAXAのサイトを参考にすると4/1の19:25頃に見えるということで待っていた。さてさて、どっちかなーと思って空を見回してみたら間違いなくあれだね、異様に明るい高速で移動する輝点が。ああ、これは間違いない。この明るさと移動の早さはおかしな感覚。あれが数百kmもの上を飛んでいるとは思えない。
しばらく見ていたら沈む前に見えなくなった。地球の陰に入ったということかな?4/3にも見えるということなので楽しみにしていよう。

