| ■ 【ぷろじぇくと ぞうさん】 〜E-Bananaサーバ 構築日記〜
|
第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日目に続く。
解析
|