| ■ 【ぷろじぇくと ぞうさん】 〜E-Bananaサーバ 構築日記〜
|
第22日目:〜外伝V〜 ロードバランサーを作れ! (その9)〜
|
どうも、('A`)です。
前回の日記で急きょ追加で報告しましたが、matdが動きましたー!
むむむさん、ありがとうございました。
ココのむむむさんの説明に書かれた内容(特に879番の内容)にそって修正したら、
無事稼働しました。
えーと、どこを直したかと言いますと
・3台のコンテンツ部サーバ(banana261、banana205、banana274)のlo0に対して
「206.223.147.161」のIPを付与した
(/etc/rc.conf に1行追加)
という事です。
先ほど紹介したスレで注目した文面は以下の内容です。
879 :root▲▲ ★:2008/04/03(木) 14:06:08 ID:???0 ?DIA(100256)
ちと時間とれそうなので、続きを。
IPdアドレスの振り方ですが、
・u1の外向けインタフェース(em0やvr0等)
・s1〜s3の*ローカルインタフェース*(lo0)
に、同じIPアドレスを振ります。
実際の処理をするs1〜s3サーバの lo0 に振るのがポイントです。
これにより「自分にはIPdアドレスが振られている」ということが認識され、
かつ、lo0 のIPアドレスは外には決して見えないので、
外部から見た場合、IPアドレスがバッティングしてしまうことがありません。
外部からはu1につけられたIPdだけが見えることになります。
ちょっとだけ先回りして言っておくと、
>>847
> データを送り届けられたm2の本体部分は「IP荷札」の「送信先IPアドレス」が、
> 自分のIPアドレスと一致したら、それは確かに自分のものだ、と認識します。
これに関係しています。
|
えー、、、まったく気づきませんでした。お恥ずかしい限りです。
そうだよなあ、matd側で共通IPを設定していても、受け取り側のサーバで指定して
いなかったら、メッセージ自体取れないもんなあ。
ここで「ローカルインターフェース(lo0)って何?」という人がいるかもしれませんので
ちょっと説明します。
例えばサーバ上でifconfigコマンドを実行すると、そのサーバ内で管理・把握されている
ネットワークの情報が表示されます。
# ifconfig
vr0: flags=8843 mtu 1500
inet 206.223.147.75 netmask 0xffffff00 broadcast 206.223.147.255
inet6 fe80::230:18ff:fef6:2331%vr0 prefixlen 64 scopeid 0x1
ether 00:30:18:f6:23:31
media: Ethernet 10baseT/UTP
status: active
plip0: flags=108810 mtu 1500
lo0: flags=8049 mtu 16384
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
#
|
太文字で表示されているのはOS(FreeBSD)で把握しているネットワーク機器の装置
記号名をあらわしています。
「vr0」はイーサネットネットワークカードを意味します。
(ネットワークカードのメーカー・機種によって、表示される記号名が変わってきます。
このサーバでは VIA VT6102 Rhine-II を使っているので、vr0となります。)
「plip0」はプリンタとかで使用するパラレルインターフェースを意味します。
そして「lo0」がローカルインターフェースを意味します。
これはローカルループバックとも呼ばれ、OSが提供している仮想インターフェイスです。
(NICの様に物理的な装置として存在していません。)
マシン内部に仮想のネットワークを設け、ネットワーク機器とOS・アプリケーション
ソフトの間で送信/受信を行います。
そしてこの一連の通信はあくまでも「マシン内部」においてのみ発生するので、
ネットワーク機器から外部への通信は一切発生しません。
いわば「内輪で使うネットワーク」といったところでしょうか。
このローカルインターフェースにはOS側で便宜上「127.0.0.1」というIPアドレスを
付与しています。つまりサーバ内部では「127.0.0.1」という名前で問い合わせが
発生したら、それは「lo0のことだっ」と認識する訳です。
むむむさんの説明では、この「lo0」に「206.223.147.161」というアドレス(名前)を
割り当ててあげましょう、という事を言っている訳です。
そうする事で、例えば外部から「206.223.147.161って人、いますかー?」と聞かれたら
サーバのOS側(ネットワーク管理)は「ああ、lo0の事だよ。伝えておくよ。」という
反応をします。
もし「206.223.147.161」というアドレス(名前)が何処にも付与されていないと、
同じ問い合わせを受けた時に「ん、そんな奴はいないよ。」となってしまいます。
そこで3台の受け取り用サーバ(banana261、205、274)の /etc/rc.conf に
ifconfig_lo0="inet 206.223.147.161 netmask 255.255.255.255"
の1行を追加し、かつスーパーユーザモードから
ifconfig lo0 inet 206.223.147.161 netmask 255.255.255.255
を実行しました。
これでlo0に「206.223.147.161」が付与されて、外部からの「206.223.147.161」宛の
問い合わせを受け取れる様になりました。
[訂正 2008/04/07]
上記で「ローカルインターフェース(lo0)のIPアドレスを変更する」と書きましたが、
その後むむむさんから特化型スレで「変更ではなく追加するのがよろし」、とのご指摘を
受けました。
確かに・・・ローカルインターフェースのアドレス(127.0.0.1)が他のサービスで使われていたら
正常に動作しなくなりますよね。
なので、大急ぎで /etc/rc.conf を以下の様に修正しました。
ifconfig_lo0_alias0="inet 206.223.147.161 netmask 255.255.255.255"
これでサーバ再起動時はlo0に「127.0.0.1」と「06.223.147.161」の2つのIPが
付与される事になります。
(「inconfig_lo0 は指定しないの?」と疑問に思われる人がいるかもしれませんが、
「127.0.0.1」はOS側で自動的に付与するので、わざわざ指定する必要はありません。)
あとは現在稼働中のサーバ上のlo0のIPを修正するのですが、まずは
ifconfig lo0 inet 127.0.0.1 netmask 255.0.0.0
を実行します。これでlo0が「127.0.0.1」に戻ります。(netmaskに指定する値に注意!)
次に、
ifconfig lo0 inet 206.223.147.161 netmask 255.255.255.255 alias
を実行します。(最後の alias を忘れずに指定する事)
これでlo0に2つのIPが付与され、有効となります。
実際に ifconfig コマンドで確認すると、以下の様になります。
# ifconfig lo0 inet 127.0.0.1 netmask 255.0.0.0
# ifconfig lo0 inet 206.223.147.161 netmask 255.255.255.255 alias
# ifconfig
vr0: flags=8843 mtu 1500
inet 206.223.147.225 netmask 0xffffff00 broadcast 206.223.147.255
ether 00:30:18:b0:02:05
media: Ethernet 10baseT/UTP
status: active
plip0: flags=108810 mtu 1500
lo0: flags=8049 mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x3
inet6 ::1 prefixlen 128
inet 127.0.0.1 netmask 0xff000000
inet 206.223.147.161 netmask 0xffffffff
#
|
(訂正は以上で終わりです)
むむむさんの説明を読みながらmatdの具体的な動きのイメージを掴もうとした際に、
('A`)は頭の中でこんなイメージ(というか妄想)を作りました。
「週刊コミックを連載している漫画家にファンレターが送られてきた時」を
イメージしてしまいました。
(「なんじゃ、こりゃ?」と思わないで下さい。('A`)は昔からドラマ仕立てで
イメージを作って理解する、という癖がありまして・・・)
以下で3つのシーンに分けて、図を交えて説明してみますね。
(各シーン毎でストーリ、図、解説の3つを書いてみました。)
【第一部】
ある処に('A`)(ペンネーム:206.223.147.161、本名:www.dokuo.zansu.com)の
ファン<`∀´>がいました。
ある日、<`∀´>は('A`)に手紙を書きました。
「('A`)、うちの親戚がおまえのファンだ!サイン送れや!」
そして<`∀´>はその手紙をポストに投函しました。
郵便局(゚Д゚)では手紙に書かれた本名(www.dokuo.zansu.com)からペンネーム
(206.223.147.161)を割り出し、編集部( `э´)に手紙を送りました。
編集部( `э´)では送られてきた手紙を受取りました。確かに編集部の
名簿にペンネーム(206.223.147.161)が登録されているので、間違って届いた
ものではないようです。しかし編集部のフロアには('A`)は存在していません。
そこで('A`)の編集担当J( 'ー`)しに居場所を聞いてみる事にしました。
J( 'ー`)し:「('A`)君は3か所の仕事場を持っているの。でも応対に出るのは
各仕事場の部屋の住人がおこなっているわ。
本名(www.dokuo.zansu.com)で問い合わせても気づいてもらえない
かもしれないから、ペンネーム(206.223.147.161)を書いておくと
呼び出してもらえるかも。
今日はどこにいるか聞いていないけど、まずは手帳に書いてある
この部屋に転送しておきましょう。部屋番号は「00:30:18:b0:02:61」よ。」
( `э´):「よし、判った。手紙転送しておくわー」
かくして<`∀´>からの手紙は('A`)がいると思われる仕事場の部屋番号が
追記され、送られました。。。
|

--[解説]--
あらすじ&図の中で出てきたJ( 'ー`)しが「matd」です。
matdが稼働しているサーバでは、「206.223.147.161」をNICに登録しておく事で
公に「206.223.147.161」宛のメッセージを受け付けられる様にしています。
そしてmatdは「206.223.147.161」宛にメッセージが来た事をNIC経由で
ネットワーク管理から知らされた時(図では (1)に該当)、自分が把握している
転送先(これは/usr/local/etc/matd.cf 中で targets= で記載されている
MACアドレス)から1つを選びます。
そして届けられたメッセージにMACアドレスの情報を新たに付け加えてから、
NIC経由で転送します。(図では (2)に該当)
【第二部】
('A`)の仕事場の一つである(´・ω・`)(名前は206.223.147.165、部屋番号は
00:30:18:b0:02:61)の部屋が入っているアパートに手紙が届きました。
アパートの管理人(^_^;)が(´・ω・`)の処に手紙を持って上がりこんできました。
(^_^;):「(´・ω・`)さん、手紙ですよー」
(´・ω・`):「はーい。あれ、、、宛先の名前が「206.223.147.161」に
なっている・・・」
(^_^;):「ちょっと変だと思ったんだけどね。でも部屋番号はあなたの番号
だったから持ってきたのですが。」
(´・ω・`):「うーん、でも僕の名前は「206.223.147.165」なんだけどなあ。」
(^_^;):「そうですか。それじゃあ宛先不明となりますねえ、、、
ん?ちょっと奥の部屋に何か書かれていますが・・・」
(´・ω・`):「え?」に
とその時、突然「206.223.147.161の部屋」と小さい字で書かれた奥の部屋から
ヌーっと('A`)が顔を出しました。
('A`):「あ、どうも。('A`)です。その手紙、俺宛のものだと思いますので、、、」
(´・ω・`):「うわぁ、いつの間に居るの?!」
('A`):「あー、ゴメン。部屋の中で作業に没頭していたんだけど、どうも名前が
呼ばれているなと思って、顔出したんだ。
扉のところにも念の為に名前書いておいてるから・・・」
(^_^;):「ま、何はともあれ、この手紙が迷子にならずに済みましたね。
じゃあ、確かにお渡ししましたよ。」
('A`):「はい、ありがとうございました。」
手紙を受け取った('A`)は再び奥の部屋に引きこもりました。
|

--[解説]--
('A`)が顔を出していた「206.223.147.161の部屋」と小さい字で書かれた
奥の部屋がサーバに設定された「ローカルインターフェース」の部分です。
最初(´・ω・`)イーサネットネットワークカードの処にメッセージが届きましたが
(図では (1) に該当)、それはメッセージ内の2つの宛先情報の1つ(MACアドレス)が
一致したからです。
しかしイーサネットネットワークカードには「206.223.147.165」という
IPアドレスが予め付与されていて、それがもう1つの宛先情報(IPアドレス)と
一致していません。(図では (2)に該当)
そこで(^_^;)OS側(ネットワーク管理)では他に「06.223.147.161」のIPを持っている
インターフェースが無いか調べる事になります。
その時、ローカルインターフェース側で「206.223.147.161」が設定されている事が
判り、メッセージがローカルインターフェース(lo0)に受け渡されます。
(図では (3)に該当)
こうして「ロードバランサー(( `э´) & J( 'ー`)し)」から転送されたメッセージが
受け取り先サーバ(コンテンツ部)に宛先不明とならずに受信されます。
【第三部】
手紙を受け取った('A`)は中身を読みました。
「また<`∀´>か・・・この忙しい時に。でもサイン送らないと後で大変な
事になるだろうなあ。」
そこで('A`)はアシスタント君(・∀・)にお願いして('A`)の代わりに<`∀´>宛に
サインを送ってもらおうと思いました。
アシスタント君(・∀・)はアパートの中にいて、住人のお願い事を「携帯電話」経由で
受付て代わりに処理してくれる人です。ただし彼もなぜか引きこもり体質なので、
アパートの外に手紙とか小包とかを送る時は(´・ω・`)にお願いしているようです。
('A`)はさっそく携帯で(・∀・)と連絡を取りました。
(・∀・):「もしもーし!」
('A`):「あ、(・∀・)君。('A`)だけど、実はお願いがあってさ・・・」
(・∀・):「はい、お願いって何でしょう?」
('A`):「実はある処に('A`)のサインを送って欲しいんだ。アパートの中にある
やつでいいから。
宛先の情報だけど、住所は(゚Д゚)、名前は<`∀´>だから。
よろしくねー」
(・∀・):「はーい!」
(・∀・)君は早速アパート内にあるサイン(www.dokuo.zansu.com/index.html)を
手に('A`)から聞いた宛先といつもの様に('A`)のペンネームと本名を差出人として
書きました。
そして(・∀・)君は(´・ω・`)の処に「携帯電話」で連絡を入れました。
(´・ω・`):「やあ、(・∀・)君。今日はどうしたの?」
(・∀・):「えへへ、実は1つお願いがありまして・・・」
(´・ω・`):「また郵便局に手紙を送って、という事かい。たまには自分で送ったら?」
(・∀・):「いやあ、それはちょっとできなくて。
あ、手紙はお部屋の前の箱の中に入れてありますので、よろしくです。」
(´・ω・`)が部屋の前に置いてある箱の中を見ると1通の封筒が入っていました。
宛先もちゃんと書いてあります。(´・ω・`)はそれをポストに投函しました。
やがて・・・
<`∀´>の元に郵便局(゚Д゚)から届きました。開封していると確かに('A`)の
サインが入っていました。
<`∀´>:「これで親戚にも顔が立った。ウェハハハハハ!」
そして今日もどこかでまた同じ事が繰り返されているようです・・・
|

--[解説]--
('A`)ローカルインターフェースは受け取ったメッセージを(・∀・)Apacheに
渡します。これはApacheのhttpd.confで「Listen 80」(サーバ内であれば80番
ポート経由でどのインターフェースからの要求も受け付ける)という設定が
されているからです。(図では (1)に該当)
メッセージに基づいて処理された結果と受け取った宛先情報から返信メッセージを
(・∀・)Apacheが作り、(´・ω・`)イーサネットネットワークカードに渡します。
(図では (2)に該当)
('A`)ローカルインターフェースは外部と通信できない事は既に知られていて、かつ
返信先が外部であるので(´・ω・`)イーサネットネットワークカードに渡るのです。
(図では (3)に該当)
(´・ω・`)イーサネットネットワークカードは返信メッセージを受け取ると、その
宛先に向かってメッセージを送信します。
(図では (4)に該当)
説明を書いていると背後から人の気配が・・・お、久しぶりの(^_^;)さんです。
(^_^;):「どうだい、調子は?」
('A`):「(^_^;)さん、 matdが動きましたよ!ブラウザでページも見れます。」
(^_^;):「ほうほう、試してみよう。。。おおっ、ページが切り替わるなあ。
んで、次は?」
('A`):「えーと、次はロードバランサーをucarpを使って二重化してダウン時に
切り替わる様にする事です。ただ、サーバを同じスイッチに繋いだり
外付けのNICを手配して取り付けたりする必要があるので、数日は
その事前準備にかかるかと・・・」
(^_^;):「うーん・・・」
('A`):「えーと、どうしましたか?」
(^_^;):「いやね、ロードバランサーの二重化は進めてもらうにして、もっと大切な
事があると思うんだが・・・」
('A`):「え、え、、、何でしょう?」
(^_^;):「受取先サーバがダウンした時にはロードバランサーの方で自動的に
切り離しとか振り先の変更とか、今の状態でできるの?」
('A`):「うっ、え、あー」
(^_^;):「それができないとロードバランサーがたとえ動いていても振り先変更とか
対応してくれなかったら、ダウンしたサーバに振られる事態も発生して
外から見れなくなる、って事になるでしょ。
DNSラウンドロビンでサーバがダウンした時と変わりないじゃないか。」
('A`):「うー、うー、、、そうですね。」
(^_^;):「じゃあ次はその対応を頼むよ。またね。」
|
やっとmatdが動いて振り分けの部分ができたかなあ、とホッとしていたのですが、
またお題が出てしまいました。
・・・でもどうやって自動的に切り離しとか振り先変更とかするのかなあ。
ucarpは使えないし。。。
何故なら相互監視するなら誤検知を防ぐ為、専用のネットワークが必要になる。
そうなると結局1サーバについて2回線・2つのスイッチポートが必要になってしまう。
それだと結局資源をいっぱい使って、かつ特別なネットワーク環境が無いといけない事に
なっちゃうんじゃないだろうか・・・
またスレを読んで調べよう。
それでは、また。
|
|
|
|
|
21日目に戻る。 23日目に続く。
解析
|