レンタルサーバー
BIG-server.com
簡単・はやい・大容量・どんな目的にもマッチするレンタルサーバー
HOME プライス お見積もり・プラン選択 お申し込み ユーザーサポート お問い合わせ

■ 【ぷろじぇくと ぞうさん】 〜E-Bananaサーバ 構築日記〜

1日目 2日目 3日目 4日目 5日目 6日目 7日目
8日目 9日目 10日目 11日目 12日目 13日目 14日目
15日目 16日目 17日目 18日目 19日目 20日目 21日目
22日目 23日目 24日目 25日目 26日目 27日目 28日目
29日目 30日目 31日目 32日目 33日目 34日目 35日目
36日目 37日目 38日目 39日目 40日目 41日目 42日目
43日目 44日目 45日目 46日目 47日目 48日目 49日目
50日目 51日目 52日目 53日目 54日目 55日目 56日目
57日目 58日目 59日目 60日目 61日目 62日目 63日目
64日目 65日目 66日目 67日目 68日目 69日目 70日目
71日目 72日目 73日目 74日目 75日目 76日目 77日目
目次に戻る
第26日目:〜外伝V〜 ロードバランサーを作れ! (その10)〜

どうも、('A`)です。
長かったCoffee Breakも終わり、やっとロードバランサーに戻る事ができました。
(^_^;)さんからお題として出された「フロントの自動切り離し・復旧」についてやっと
とりかかれます。
さあ、調べるぞっ!

で、2chの色んなスレを見てみたのですが、見つからないなあ。
というか、このスレで気になる書き込みを見つけました。

10 :root▲▲ ★:2008/01/11(金) 23:51:30 ID:???0 ?PLT(82008)
■最近のトピックスとかメモとか(1)

・バックヤード系サーバの旧bananaサーバ置き換え
・Varnish 悪くないらしい(年末に萌え系の方から聞きました)
・FreeBSD 7.0R/6.3R ようやく出るらしい
- 7.0R では旧cobraはSMP化できるのか?
- 7.0R は ZFS よりジャーナリングのほうが面白そうかも

・memories2 = banana3000 無事デビュー

・雪だるまで乗り越えていない番組
- ラピュタ
- アニソン三昧

・フロントが落ちた場合の自動切り離し・復旧のしかけをどうするか ←(えっ!?)

自動切り離しって無いのか・・・orz
あれ?でも携帯(c.2ch.net)だと、よく「xxx.2ch.net切離し中。。。(xxx)」って表示されて
いるよなあ。どうやって実現しているんだろう。
2chのLove Affairスレではこんな事が書かれていました。

14 :こうすけ ★:2008/02/16(土) 14:57:49 ID:???0
現状c.2ch.net側の仕様
bgとの通信の timeout は1秒にした。
timeout が発生したら 120秒間は timeout 発生のサーバへのリクエストは
受け付けない。(切り離し中。。。表示)

前回落ちたときは timeout は5秒です。
一部c-docomo5、c-docomo6、c20、c209は切り離し処理できていたとかも。。。
それ以外は切り離し処理は行えていませんでした。
(所定のディレクトリに書き込みパーミッションがなかったため)

確かc.2ch.netは [バランサー] - [フロントエンド] - [バックエンド] の3重構造だったなぁ。
実際にデータを取得しに行くのはバックエンド(bgサーバ)だから、そこで2chのサーバとの
通信状況を見て、切り離し表示とかを行なっているのか。
・・・ってか、これはフロントの場合の話じゃないな。
フロントに異常が発生した時は手動で復旧するしかないのかなあ・・・


あれこれ調べても見つからないなら、、、
自分で考えて試しに作ってみよう、そうしよう。
(ってか、こんな事言って大丈夫なんだろうか、俺('A`)・・・)
まずは「切り離されなければならない状況の判定方法」を決めておこう。

フロントエンドの動作状況のケースとしては以下の5つが考えられます。
  1) サーバそのものがダウンしている(pingも通じない)
  2) サーバにはpingが通じるが、サーバ上の各アプリケーションが動作しない
    (よく('A`)はこの状態を「脳死状態」と呼んでいます)
  3) Apacheのプロセスだけがダウンしている
    (SSHや他のサービス群は正常に動作している)
  4) Apacheのプロセスは動いているが、正常に応答を返さない
    (SWAPが発生しまくったりとか、大量のコネクションが発生したりとかが大半ですが、
    稀にApacheのプロセスそのものが正常に動作していない、というケースもあります。)
  5) Apacheも正常に稼働し、応答を返す

んで、('A`)なりの考えでは「切り離されなければならない状況」は 1) 〜 4) までです。
つまり、「Apacheがちゃんと返事しなかったら、切り離すべき」という事です。
本当はApacheが正常に動作しているか、という判定は非常に難しいんですけどね。
(サーバの負荷は各サーバによってまちまちだし、「ブラウザからのページ表示には
時間がかかるけどダウンロードツールとか使った80番ポートでの通信は正常」、という
ケースもありますから。)
ある程度の割り切りも必要かな、と思います。

ではどうやって「Apacheが正常に応答を返す」事を確認するのか?
ちょっとroot兄(・∀・)に相談してみます。

('A`):「あのさあー、相談があるんだけど・・・」
(・∀・):「うん、何だい?この間のDHCP構築の様なのは自分でやってね。」
('A`):「いやあ、Apacheが動いているかどうか確かめたいんだ。何か方法ある?
     実はかくかく、しかじかで(、と上で述べた5パターンを説明)・・・」
(・∀・):「・・・要は対象のサーバのApacheと通信できているか知りたいんだね?」
('A`):「そのとおーり!(by 児玉 清)」
(・∀・):「アタック25かよっ・・・なら、話は簡単。2chはどうやっているのか
     知らないけど、('A`)が構築したサーバ達の構成と動作判定の基準を
     考えたら、サーバからページが取れたかで判断すればいいと思うよ。」
('A`):「え、それだけ?ページが取れたかって、Apacheのステータスコードで
    判定するの?」
(・∀・):「いいや。確かに本来だとステータスコードで判断すべきかもしれない。
     ただ、今回('A`)が意外と割り切った判定基準を作ったから、ステータス
     コードの判定よりももっとシンプルな判定の動作にしようかな、と。
     例えば対象のサーバ達に対して定期的にドキュメントルートに設置
     されているindexページを取りに行く。
     (root権限付以外の Banana & T-Banana サーバだと設置しているから。)
     そうすると、
       ・Apacheが正常な状態  → ページデータが返ってくる
       ・Apacheが異常(止まっていたり、応答できないくらい重い)
                   → 何も返ってこない
     という動きになる。後は実物(ページ)がとれたかをチェックすればいい。」
('A`):「なるほど。でもさあ、例えばApacheの設定でユーザ権限(User と Group)が
    wwwじゃないものを指定しているサーバだったら、その場合 403 (Forbidden)
    にならないか?」
(・∀・):「その場合は 403のページが返ってくるだろ。それが返ってきた時点で
      応答は正常にできていると判断できるじゃないか。
      実を言うとステータスコードでの判定って、すごく大変なんだよ。
      例えばデータが取れてブラウザ上では正常にページが表示されても、
      内部的には302のコードが返ってきたりとか、さ。」
('A`):「あ、うーん、そうか。なんかできるかも・・・」

そしてroot兄(・∀・)に以前設置し稼働させたmatdについて説明しました。
matdの基本機能と設定ファイルの内容について話していると、こんな事を言ってきました。

(・∀・):「これはCGI書いてroot権限で動かした方がいいなあ。」
('A`):「え、書いてくれるの?」
(・∀・):「しゃあないじゃん。まず各サーバからページを取ってくるのにタイムアウトの
     時間を調整できる様にする必要がある。('A`)だったらシェルスクリプトを
     書いてwgetでページを持ってくるという『力技』を考えたりするだろうな・・・」
('A`):「うん、俺CGI書けないから・・・」
(・∀・):「簡単なんだけどなあ。。。で、シェルスクリプトだと、まず結果を判定する
     箇所の記述が複雑になるんだ。それに実際運用する過程でタイムアウトの
     時間の変更とか対象サーバの追加・削除とかでその都度シェルスクリプトを
     書き換える、なんて事になるよ。Perlでなら、そこも簡単に済む。」
('A`):「おう、おう!すごいや!」
(・∀・):「じゃあ、さっそく仕様を考えよう。」
('A`):「あ、対象のサーバリストは一般ユーザでも修正できる様にしたいなあ・・・」
(・∀・):「それは大丈夫だよ。matd.cfを修正するCGIはroot権限で動かすし、
     ファイルの読み込み権限さえ付いていれば大丈夫だ。
     さあ、さあ、早く仕様を頂戴よ。」

その後2人で「あーでもない、こーでもない」と話し合った結果、こんなCGIを作って
動かしてみよう、という事になりました。

1) CGIは起動時に対象サーバのリストファイルを読み込む。
2) 対象サーバのリストファイルには以下の情報が書かれている。
  ・対象サーバのホスト名
  ・対象サーバのホスト名でのURL (例えば http://banana261.maido3.com/ とか)
  ・対象サーバのMACアドレス (例えば banana261 なら 00:30:18:b0:02:61)
  ・ページ取得の際のタイムアウト(待ち時間、単位は秒)
  ・振り分け時の「重み」(整数)
    ※「重み」とは各サーバへの振り分けの割合を示します。
      例えばサーバ1〜3への振り分けを「1:2:3」にする、という時の
      "1"とか"2"とかがこれに当たります。
3) CGIは各対象サーバに対してリストに書かれたURLにアクセスする
  もし正常に取得できたらページデータが記録される。
  もし取得時にタイムアウトになったら、何も残らない
  この動作を対象サーバの数だけ実施する。
4) ページ取得の処理が終了したら、「ページを取得できた」サーバのMACアドレスを
  内部テーブル上に一時記録する。
5) matdの設定ファイル(matd.cf)の雛型を読み込む。
6) 読み込んだmatdの雛型に記述されている「振り分け先サーバ」の記述部分に
  一時記録していたMACアドレスを列挙して、設定ファイル(新)を作成する。
7) 出来上がった設定ファイル(新)と現在のmatd.cfの中身を比較する。
8) 2つのファイルが一致していたら、CGIは処理を終了する。
  もし内容が違っていたら設定ファイル(新)の内容にmatd.cfを書き換えて、
  matdを再起動し、処理を終了する。
9) CGI自体はroot権限でcronから定期的(1分間隔とか)に動かす。
  そして対象サーバの  リストは一般ユーザで修正が可能とする。
  (振り分けサーバの追加や削除、振り分け時の「重み」をユーザがコントロール
  できる様にする。)


CGIを使ってのmatdの再起動の動きを図解しなきゃ、と思っていると、またまた
root兄(・∀・)がやってきました。

(・∀・):「おーい、('A`)! matdって今どうやって動かしているの?」
('A`):「え、今はシェルスクリプトで直接叩いて動かしているよ。」
(・∀・):「再起動する時は?」
('A`):「えーと、プロセスを探して1度killコマンドで終わらせてからもう1度
    シェルスクリプトで動かしてる。。。」
(・∀・):「アチャー!それじゃあ再起動の処がうまくいかないよ。。。
     よしっ、daemontoolsに登録してそこから動かす様に変更しておく。」
('A`):「あ、それお願い。助かったー!」
(・∀・):「ってか、実は登録は簡単なんだけどなぁ・・・」
('A`):「やり方も教えて、ね。」
(・∀・):「・・・」

ともあれ、心強い味方が現われて(^_^;)さんからの「フロントの自動切り離し・復旧」という
お題への挑戦(と言ったら言い過ぎか・・・)が始まりました。
ただroot兄(・∀・)は最近公私ともに忙しいから、まずはdaemontoolsへの登録を
やってもらおう。
CGIの方は作っていく過程で(たぶんだけど)仕様変更とかも起きるだろうから・・・
('A`)の方はそれまでにお絵かき(図解)を頑張ろう。
どこまでできたか、は次回の日記をお楽しみに。
それでは、また


25日目に戻る。   27日目に続く。

1日目 2日目 3日目 4日目 5日目 6日目 7日目
8日目 9日目 10日目 11日目 12日目 13日目 14日目
15日目 16日目 17日目 18日目 19日目 20日目 21日目
22日目 23日目 24日目 25日目 26日目 27日目 28日目
29日目 30日目 31日目 32日目 33日目 34日目 35日目
36日目 37日目 38日目 39日目 40日目 41日目 42日目
43日目 44日目 45日目 46日目 47日目 48日目 49日目
50日目 51日目 52日目 53日目 54日目 55日目 56日目
57日目 58日目 59日目 60日目 61日目 62日目 63日目
64日目 65日目 66日目 67日目 68日目 69日目 70日目
71日目 72日目 73日目 74日目 75日目 76日目 77日目
目次に戻る

いま一番お得なページ! 解析
Copyright (C) 1997-2008, big-server.com. All Rights Reserved. server@maido3.com
レンタルサーバー BIG-server.com
Powered By Maido3.com