[tf0054@divers-high bird]$ db_dump -p tiedbfile
VERSION=3
format=print
type=hash
db_pagesize=4096
HEADER=END
/r/r/r.png
204,222
DATA=END
[tf0054@divers-high bird]$
水曜日, 4月 30, 2008
[Linux] bdbのダンプ
以外に忘れるのでメモベースで。
月曜日, 4月 28, 2008
[PostgreSQL] PgQ続き(PerlでConsumer)
キューに入ったジョブを処理するプログラムを作りたいのだが、Pythonのフレームワークが提供されているのみでなかなか(Python以外で)書くことが難しい。何をどう呼んだら登録されるのか分からないし。。。
なので、大枠を例のままPythonを使って動かし、肝心の処理関数(通常はProcess_batch())だけをPerlで記述するためのTIPS。
(Inline::Pythonのおかげで)上のプログラムでは各イベントを処理する部分だけ、procEvent()関数に切り出せていると思うので、これを書き換えればよい(=Perlで処理が書ける)です。
一部設定ファイルの指定は配列で渡さないとだめなのですが、Perlから渡すとなぜか上手くいかないので内部で宣言してしまっていますが、、、また調べます。
初めて使いますが、Inline::Pythonって便利ですね。これだあればアドオンモジュールをPythonで書かなくてはならない某商用アプリなんかも倒せそう。
なので、大枠を例のままPythonを使って動かし、肝心の処理関数(通常はProcess_batch())だけをPerlで記述するためのTIPS。
#!/usr/bin/perl
use Data::Dumper;
use Sys::Syslog;
use Inline Python => <<'END_OF_PYTHON_CODE';
import sys, os, pgq, skytools
import syslog ,time
class zConsumer(pgq.Consumer):
def __init__(self, service_name, db_name):
self.procEvent = perl.procEvent;
pgq.Consumer.__init__(self, service_name, db_name, ["/tmp/var/mqueue/consumer.ini"])
def process_batch(self, src_db, batch_id, ev_list):
for ev in ev_list:
d = ev.data
self.log.debug ("event: %s | type: %s | extra1: %s" % (d, ev.type, ev.extra1))
if not self.procEvent(ev):
ev.tag_retry()
else:
ev.tag_done()
END_OF_PYTHON_CODE
my $objPgq = zConsumer->new("mqueue_consumer","src_db");
#print Dumper($objPgq);
$objPgq->start();
# イベント処理関数は、この関数を差し替えることでPerlで書けます
sub procEvent{
openlog(__FILE__, 'cons,pid', 'local4');
syslog('debug', 'this is Inline test');
closelog();
print Dumper(shift);
}
(Inline::Pythonのおかげで)上のプログラムでは各イベントを処理する部分だけ、procEvent()関数に切り出せていると思うので、これを書き換えればよい(=Perlで処理が書ける)です。
一部設定ファイルの指定は配列で渡さないとだめなのですが、Perlから渡すとなぜか上手くいかないので内部で宣言してしまっていますが、、、また調べます。
初めて使いますが、Inline::Pythonって便利ですね。これだあればアドオンモジュールをPythonで書かなくてはならない某商用アプリなんかも倒せそう。
日曜日, 4月 27, 2008
[PostgreSQL] PgQ続き(メンテナンス)
PgQでは、各キューそれぞれに3つのイベント格納用テーブルが用意してあり、それらを順繰りに使うことでバキューム対象となるデッドタプルが増えたテーブルをキュー処理に使わないようにし、ディスクIOを減らしている(らしい)。
tickerって5分に一度メンテナンスをしているが、上記のようなことをやっていたのですね。関数(PostgreSQLのPgQを仕込んだデータベースに格納された関数)が、下記が順に呼ばれています。
・maint_rotate_tables_step1(実際のローテートを行う)
・maint_rotate_tables_step2(その際にTXを付け替える)
・maint_tables_to_vacuum(バキューム対象テーブルをリストする)
ちなみに、ソース的には実際のバキューム処理はskytools-2.1.6/python/pgq/maint.pyに含まれています(あとTXってのはPgQ独自のトランザクションNo?のことだと思います)。
tickerって5分に一度メンテナンスをしているが、上記のようなことをやっていたのですね。関数(PostgreSQLのPgQを仕込んだデータベースに格納された関数)が、下記が順に呼ばれています。
・maint_rotate_tables_step1(実際のローテートを行う)
・maint_rotate_tables_step2(その際にTXを付け替える)
・maint_tables_to_vacuum(バキューム対象テーブルをリストする)
ちなみに、ソース的には実際のバキューム処理はskytools-2.1.6/python/pgq/maint.pyに含まれています(あとTXってのはPgQ独自のトランザクションNo?のことだと思います)。
土曜日, 4月 26, 2008
[PostgreSQL] PgQ続き(リトライ他)
ジョブの戻し方おいて、リトライキューやフェイルキューにちゃんと入るかの実験、、をしていたらSkyTools(v2.1.6)にバグ発見(但しもうCVSでは修正されていました)。
こけさせるconsumer.pyは以下のようなやつで。
これによりリトライキューに入ることを確認。
ちなみに、consumerが稼動した最終時刻をみるためには以下。
というか日本語でも英語でも、Skytools全体がそうですが、特にconsumerのサンプルがまったくなくて困惑です(tag_retryなんてものクラス説明から見つけた)。
こけさせるconsumer.pyは以下のようなやつで。
#!/usr/bin/python
import sys, os, pgq, skytools
import syslog
class Mailer(pgq.Consumer):
def sendWelcomeMail(self, params):
syslog.openlog("skycon")
syslog.syslog(params)
syslog.closelog()
return False
def process_batch(self, src_db, batch_id, ev_list):
for ev in ev_list:
d = ev.data
self.log.debug ("event: %s | type: %s | extra1: %s" % (d, ev.type, ev.extra1))
if not self.sendWelcomeMail(d):
ev.tag_retry()
else:
ev.tag_done()
if __name__ == '__main__':
script = Mailer("mailer_daemon","src_db",sys.argv[1:])
script.start()
これによりリトライキューに入ることを確認。
tf0054=# select * from pgq.retry_queue;
-[ RECORD 1 ]--+------------------------------
ev_retry_after | 2008-04-26 01:30:40.307409+09
ev_id | 15
ev_time | 2008-04-26 01:15:17.024847+09
ev_txid |
ev_owner | 1
ev_retry | 1
ev_type | welcome_email
ev_data | root@gmail.com
ev_extra1 |
ev_extra2 |
ev_extra3 |
ev_extra4 |
tf0054=#
ちなみに、consumerが稼動した最終時刻をみるためには以下。
tf0054=# select * from pgq.subscription;
-[ RECORD 1 ]-+------------------------------
sub_id | 1
sub_queue | 1
sub_consumer | 1
sub_last_tick | 2118
sub_active | 2008-04-26 06:38:03.550572+09
sub_batch |
sub_next_tick |
tf0054=#
というか日本語でも英語でも、Skytools全体がそうですが、特にconsumerのサンプルがまったくなくて困惑です(tag_retryなんてものクラス説明から見つけた)。
金曜日, 4月 25, 2008
[PostgreSQL] PgQ続き(設定ファイル)
それぞれpgqadm.py用と、consumer.py(キュー処理用の準備すべきプログラム)用の設定ファイルは以下のとおりでやってみます(昨日の続き)。
pgqadm.ini
consumer.ini
pgqadm.ini
[pgqadm]
job_name = ticker_test
db = dbname=tf0054 port=5432 host=127.0.0.1
# how often to run maintenance [minutes]
maint_delay_min = 5
# how often to check for activity [secs]
loop_delay = 0.1
logfile = /tmp/var/log/%(job_name)s.log
pidfile = /tmp/var/pid/%(job_name)s.pid
use_skylog = 0
consumer.ini
[mailer_daemon]
job_name = mailer_daemon
src_db = dbname=tf0054
pgq_queue_name = mailer
logfile = /tmp/var/log/%(job_name)s.log
pidfile = /tmp/var/pid/%(job_name)s.pid
木曜日, 4月 24, 2008
[PostgreSQL] PgQ
いまいち使い方が分からなかったPgQ(SkyToolsの一部であるジョブキューの仕組み)のお試しが出来たのでメモ.やることとしては,
と言った感じ.こちらのサイトを参考にしたが,トリガを作ってイベント登録をさせる仕組みが面倒だったので直接インサートして実験.
また,サンプルのconsumerデーモンのPythonソースが一部実装されてないので,以下な感じで補完することが必要。
これを以下のとおり実行して、
syslogにデータでるところまで確認できました.また,使える関数などはこちらで見られます.あれ?でも,,,
- pgqadm.pyを使うためにPYTHONPATH環境変数をexport(skytools/lib/ython2.4/site-packages)
- 適用するデータベースを作る(ここでは"XXX"とする)
- pgplsqlがそのデータベースで使えるか確認(pg_languageカタログ/無いならcreatelang)
- share/skytools以下のsqlスクリプトを流す(txid.sql>pgq_ext.sql>pgq.sqlの順?)
- キューを"select * from pgq.create_queue(’mailer’)"で作成
- psqlで接続し"select * from pgq.queue"で確認
- tickerデーモンを起動する(例えば"../bin/pgqadm.py ./pgqadm.ini ticker -d")
- consumerデーモンをpythonで作る(※下にサンプルソースを掲示)
- consumerデーモンを起動する(例えば"../var/consumer.py consumer.ini -v")
- キューに入れてみる(入れるものをイベントと言う.例えば"select pgq.insert_event('mailer','welcome_email','tf0054@gmail.com')")
と言った感じ.こちらのサイトを参考にしたが,トリガを作ってイベント登録をさせる仕組みが面倒だったので直接インサートして実験.
また,サンプルのconsumerデーモンのPythonソースが一部実装されてないので,以下な感じで補完することが必要。
#!/usr/bin/python
import sys, os, pgq, skytools
import syslog
class Mailer(pgq.Consumer):
def sendWelcomeMail(self, params):
syslog.openlog("skycon")
syslog.syslog(params)
syslog.closelog()
return True
def process_batch(self, src_db, batch_id, ev_list):
for ev in ev_list:
d = ev.data
self.log.debug ("event : %s | type : %s | inserted by : %s" % (d, ev.type, ev.extra1))
if not self.sendWelcomeMail(d):
sys.exit(1)
ev.tag_done()
if __name__ == '__main__':
script = Mailer("mailer_daemon","src_db",sys.argv[1:])
script.start()
これを以下のとおり実行して、
./consumer.py ../etc/consumer.ini &
syslogにデータでるところまで確認できました.また,使える関数などはこちらで見られます.あれ?でも,,,
- tickerは何をしてくれるんだっけ?
- pgqadmのinstallってしてなかったけどいいの?
土曜日, 4月 12, 2008
木曜日, 4月 10, 2008
[Linux] unexpected zero page
レンタルサーバにZABBIXを入れてリソースを検証こめて見ているのですが、障害によるリブートがあったらしく、ZABBIX_SERVERが起動しなくなった。ログを見ていると、
PosrgreSQLを使っているので以下コマンドを実行して解消。
22439:20080410:024033 Query::select min(clock) from history_uint where itemid=18450
22439:20080410:024033 Query failed:PGRES_FATAL_ERROR:ERROR: index "history_uint_1" contains unexpected zero page at block 13758
HINT: Please REINDEX it.
PosrgreSQLを使っているので以下コマンドを実行して解消。
zabbix=> reindex index history_uint_1;
REINDEX
zabbix=> \q
火曜日, 4月 08, 2008
[Linux] amebloもですね
アメブロでもリファラでの画像閲覧禁止がなされているんですね。
確かに直リンクなどは論外ですが、しかしgoogleリーダなどから写真が見られないのはちょっと。。ということでY!同様にリファラプロキシで対応。
Y!とちがって普通に組むとgzip圧縮応答されたり、HOSTヘッダによるリダイレクトが入ったりと、いくつかはまりました。。
確かに直リンクなどは論外ですが、しかしgoogleリーダなどから写真が見られないのはちょっと。。ということでY!同様にリファラプロキシで対応。
Y!とちがって普通に組むとgzip圧縮応答されたり、HOSTヘッダによるリダイレクトが入ったりと、いくつかはまりました。。
土曜日, 4月 05, 2008
[Linux] ebb
libevを使った高速httpd。Rubyな香りがしていますが、これ単体で使うことができそうです。
nginxやlighttpdと比較してどうなのでしょう。
clipped from ebb.rubyforge.org |
nginxやlighttpdと比較してどうなのでしょう。
登録:
投稿 (Atom)