«前の日記(2004-07-14(Wed)) 最新 次の日記(2004-07-19(Mon))» 編集

これ日記なん?


2004-07-15(Thu) [長年日記]

_ レポートサーバ・ロードバランサ4

とーとー正常系がうまく流れるようになった!いやっほう。勝因は設定画面のハードコピーをカラーで印刷して眺めることしばし...a-ha、なるほど勝手に思い込んでただけか。最近文面がまとまってないのでちょっと書いてみよう。 もともと

(a)Apache -> mod_jserv -> Jserv -> 画面プログラム =socket=> 印刷サービス

となってるところを

(b)Apache -> mod_jserv -> Jserv -> 画面プログラム =proxyA = TupleSpace =proxyB=> 印刷サービス

にしてやろうという企み。ちなみにWindows。

当初以下のような仮定(契約でソースが見えない)だったのだが、

画面プログラム側の印刷サービスへのポート指定:固定
画面プログラム側の印刷サービスへのホスト名指定:localhost
印刷サービス側のポート指定:レジストリ
印刷サービス側のホスト名指定:レジストリ

昨日一日無駄足で、今日の昼にa-haしたのは

画面プログラム側の印刷サービスへのポート指定:レジストリ。印刷サービスと同じ値。
画面プログラム側の印刷サービスへのホスト名指定:レジストリ。
印刷サービス側のポート指定:レジストリ。画面側と同じ値
印刷サービス側のホスト名指定:0.0.0.0

だったわけ。

画面プログラム側のホスト名指定をSolarisに向けて、印刷サービスはそのままで、ProxyA,TupleSpace,ProxyBをSolarisに配置させて、ProxyBから印刷サービスを呼び出すと。

TupleSpaceをいったんかましてるのは、印刷サービスの多重度を上げるため。(a)の場合、サーバが複数台あっても、たまたま大量印刷してるところにぶつかった不幸なユーザは待たされちゃう(実際には門前払い...キューインもなしなのね。orz)けど、(b)なら空いてる印刷サービスを使える可能性がある。なんならProxyBに重み付けして、少ページ数専用のサーバ作ってやってもよいわけで。

あとは、印刷サービスの結果のPDFを呼び出すところが画面プログラムと印刷サービスが同一マシンと仮定(ようするに物理パスをURLに単純マッピングしてるだけ、)してるので、CGIでLocationヘッダでふっとばすと。飛ばし先のサーバは印刷サービスからの戻り値に小細工してCGIでカットすると。

ProxyAはタイムアウトするようにしたいので(今は完全に同期モデル)、タイムアウトした場合はキューの画面に飛ばす。んでもって自分のIPかマシン名かで絞込みできるようにしとく必要がある(そうじゃないと他の人のも丸見え)んで、それをどうするか。

単純に取れればいいんだがログファイルやらポート番号やらで確認しなきゃいけなさげ。ProxyAはペアのソケットの情報はわかるから、別プロセスで fport と netstat で画面プログラムのPIDをしらべて、JservログからクライアントIPを割り出すと。これもTupleSpaceを張ってて、要求がきたら調べて返すと。欲しい側がマージすると。

ProxyBの情報もTupleSpaceから供給するようにしたいな。そしたら静的にファイルをサーバの個数分作るなんつーことをしなくてもすむわ、実行時に変えられるわでウマー。

druby万歳、Rinda万歳、Ruby万歳ってまだ終わってないんだった。とにかく咳さん、artonさん(網道編、邪道編はバイブル)、その他Ruby関係者の方にここで勝手に感謝してしまいます。

_ ソース非公開

それにしてもソース非公開ってのアホな戦略だよなー。そんなにノウハウの塊なのかよ。きっと職人芸のようなノウハウだらけに違いないと言ってみるテスト。おかげでこんなに時間かかっちまった。

_ Solarisでの作業は常にroot。

もうね、脱力っていうかなんていうか、おまえらトーシロ?それでも技術屋かと子一時間(ry