[an error occurred while processing this directive]
■ 【ぷろじぇくと ぞうさん】 〜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日目
78日目 79日目 80日目 81日目 82日目 83日目 84日目
85日目 86日目 87日目 88日目 89日目 90日目 91日目
92日目 93日目 94日目 95日目 96日目 97日目 98日目
99日目 100日目 101日目 102日目 103日目 104日目 105日目
106日目 107日目 108日目 109日目 110日目 111日目 112日目
113日目 114日目 115日目 116日目 117日目 118日目 119日目
120日目 121日目 122日目 123日目 124日目 125日目 126日目
127日目 128日目 129日目 130日目 131日目 132日目 133日目
134日目 135日目 136日目 137日目 138日目 139日目 140日目
141日目 142日目 143日目 144日目 145日目 146日目 147日目
148日目 149日目 150日目 151日目 152日目 153日目 154日目
155日目 156日目 157日目 158日目 159日目 160日目 161日目
162日目 163日目 164日目 165日目 166日目 167日目 168日目
169日目 170日目 171日目 172日目 173日目 174日目 175日目
176日目 177日目 178日目 179日目 180日目 181日目 182日目
183日目 184日目 185日目 186日目 187日目 188日目 189日目
190日目 191日目 192日目 193日目 194日目 195日目 196日目
197日目 198日目 199日目 200日目 201日目 202日目 203日目
204日目 205日目 206日目 207日目 208日目 209日目 210日目
211日目 212日目 213日目 214日目 215日目 216日目 217日目
218日目 219日目 220日目 221日目 222日目 223日目 224日目
225日目 226日目 227日目 228日目 229日目 230日目 231日目
232日目 233日目 234日目 235日目 236日目 237日目 238日目
239日目 240日目 241日目 242日目 243日目 244日目 245日目
246日目 247日目 248日目 249日目 250日目 251日目 252日目
253日目 254日目 255日目 256日目 257日目 258日目 259日目
260日目 261日目 262日目 263日目 264日目 265日目 266日目
267日目 268日目 269日目 270日目 271日目 272日目 273日目
274日目 275日目 276日目 277日目 278日目 279日目 280日目
281日目 282日目 283日目 284日目 285日目 286日目 287日目
288日目 289日目 290日目 291日目 292日目 293日目 294日目
295日目 296日目 297日目 298日目 299日目 300日目 301日目
302日目 303日目 304日目 305日目 306日目 307日目 308日目
309日目 310日目 311日目 312日目 313日目 314日目 315日目
316日目 317日目 318日目 319日目 320日目 321日目 322日目
323日目 324日目 325日目 326日目 327日目 328日目 329日目
330日目 331日目 332日目 333日目 334日目 335日目 336日目
337日目 338日目 339日目 340日目 341日目 342日目 343日目
344日目 345日目 346日目 347日目 348日目 349日目 350日目
351日目 352日目 353日目 354日目 355日目 356日目 357日目
358日目 359日目 360日目 361日目 362日目 363日目 364日目
第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日目
78日目 79日目 80日目 81日目 82日目 83日目 84日目
85日目 86日目 87日目 88日目 89日目 90日目 91日目
92日目 93日目 94日目 95日目 96日目 97日目 98日目
99日目 100日目 101日目 102日目 103日目 104日目 105日目
106日目 107日目 108日目 109日目 110日目 111日目 112日目
113日目 114日目 115日目 116日目 117日目 118日目 119日目
120日目 121日目 122日目 123日目 124日目 125日目 126日目
127日目 128日目 129日目 130日目 131日目 132日目 133日目
134日目 135日目 136日目 137日目 138日目 139日目 140日目
141日目 142日目 143日目 144日目 145日目 146日目 147日目
148日目 149日目 150日目 151日目 152日目 153日目 154日目
155日目 156日目 157日目 158日目 159日目 160日目 161日目
162日目 163日目 164日目 165日目 166日目 167日目 168日目
169日目 170日目 171日目 172日目 173日目 174日目 175日目
176日目 177日目 178日目 179日目 180日目 181日目 182日目
183日目 184日目 185日目 186日目 187日目 188日目 189日目
190日目 191日目 192日目 193日目 194日目 195日目 196日目
197日目 198日目 199日目 200日目 201日目 202日目 203日目
204日目 205日目 206日目 207日目 208日目 209日目 210日目
211日目 212日目 213日目 214日目 215日目 216日目 217日目
218日目 219日目 220日目 221日目 222日目 223日目 224日目
225日目 226日目 227日目 228日目 229日目 230日目 231日目
232日目 233日目 234日目 235日目 236日目 237日目 238日目
239日目 240日目 241日目 242日目 243日目 244日目 245日目
246日目 247日目 248日目 249日目 250日目 251日目 252日目
253日目 254日目 255日目 256日目 257日目 258日目 259日目
260日目 261日目 262日目 263日目 264日目 265日目 266日目
267日目 268日目 269日目 270日目 271日目 272日目 273日目
274日目 275日目 276日目 277日目 278日目 279日目 280日目
281日目 282日目 283日目 284日目 285日目 286日目 287日目
288日目 289日目 290日目 291日目 292日目 293日目 294日目
295日目 296日目 297日目 298日目 299日目 300日目 301日目
302日目 303日目 304日目 305日目 306日目 307日目 308日目
309日目 310日目 311日目 312日目 313日目 314日目 315日目
316日目 317日目 318日目 319日目 320日目 321日目 322日目
323日目 324日目 325日目 326日目 327日目 328日目 329日目
330日目 331日目 332日目 333日目 334日目 335日目 336日目
337日目 338日目 339日目 340日目 341日目 342日目 343日目
344日目 345日目 346日目 347日目 348日目 349日目 350日目
351日目 352日目 353日目 354日目 355日目 356日目 357日目
358日目 359日目 360日目 361日目 362日目 363日目 364日目

いま一番お得なページ! 解析
[an error occurred while processing this directive]