| ■ 【ぷろじぇくと ぞうさん】 〜E-Bananaサーバ 構築日記〜
|
第18日目:〜外伝V〜 ロードバランサーを作れ! (その6)〜
|
どうも、('A`)です。
前回の日記で書いた通り、ロードバランサーのテスト環境構築の見直しを行なっています。
まずはIPの大台が唯一違っていたサーバをIP変更する要請を出すと共に、DNSの設定を
修正する、という作業を進めています。(トホホ・・・)
そして前回heartbeatに代わる相互監視機能のソフトウェアとしてucarpが登場しました。
現在ロードバランサー用として確保している2台のサーバ(banana260と261)にさっそく
インストールしてみようと思います。
前回の日記で「相互監視機能は後回し」と書きましたが、テスト用サーバが全部そろうまでに
時間があるので、確認できるところまで済ませておきます。
まずは2台のサーバにインストールされているheartbeatをアンインストールします。
(サーバの中をすっきりさせる意味で行ないます、ハイ。)
以下のコマンドを実行します。
pkg_delete heartbeat-1.2.4
rehash
|
次にucarpのインストールに進みますが、そもそも('A`)の頭の中では「ucarpって何?」
というレベルなので、ちょっと基礎情報を仕入れてみました。
まあ、ucarpのソース(ソース自体はココから取得できます。)中のREADMEファイルを
読んだりしただけなのですが・・・
今から('A`)なりに説明を書いてみます。
【ucarpの概要】
READMEの最初に書いている事を自己流で翻訳してみると、こんな内容です。
(READMEの実物はココに置いておきましたので、英語が得意な人は読んでみて下さい。)
・ucarpは2つのホストで自動フェイルオーバーを提供するために仮想IPアドレスを
共有するソフトウェアである。
・ucarpは特許などで肥大化したVRRP(Virtual Router Redundancy Protocol:
仮想ルータ冗長プロトコル)に代わるものとしてOpenBSDで開発された、特許などの
心配がないCARP(Common Address Redundancy Protocol:一般的なアドレス冗長
プロトコル)をユーザランドで扱える(言い換えると一般ユーザ権限で動作する)様に
簡略化した形で実装化されたものである。
・CARPプロトコルの長所は以下の4点が挙げられる。
1)オーバヘッドがとても少ない
2)暗号化されたメッセージ
3)異なるOS間での相互運用が可能
4)ホスト間で(通信の為の)特別&専用のネットワークリンクを必要としない
※「フェイルオーバー」というのはメインのサーバに障害が発生した場合、代替サーバが
処理を引き継ぐ機能を言います。
「('A`)が何を言ってるのか、さっぱり判らないー!」という人がいるかもしれませんが、
英語が得手でないので許してね。
(というかucarpについての日本語紹介ページとかほとんど無いので、難儀しています。)
【ucarpのインストールと注意事項】
ucarpをインストールするにあたっての注意事項としては、パケットキャプチャライブラリ
(libpcap)が既にインストールされている事が必須となります。
インストール方法は2つあります。
1) ソースからインストールする。
前述のソース(コレです)を使って以下のコマンドでインストールします。
fetch http://download.pureftpd.org/pub/ucarp/ucarp-1.2.tar.gz
tar zxvf ucarp-1.2.tar.gz
cd ucarp-1.2/
./configure
make install-strip
|
2) Ports(バイナリ)をインストールする。
この日記ではおなじみのpkg_addコマンドを使ってインストールします。
pkg_add -r ucarp-1.2 (FreeBSD 6.2Rの場合)
|
※FreeBSD 6.2RのPortsを提供しているFTPサーバはもうほとんど無いかもしれません。
その場合には6-STABLEで提供されているパッケージ(ucarp-1.3)を以下のコマンドで
入れてみて下さい。
(例として日本サイトの3号機(ftp3)から取ってくる、という形にしてみました。)
pkg_add -r ftp://ftp3.jp.freebsd.org/pub/FreeBSD/ports/i386/packages-6-stable/All/ucarp-1.3.tbz
|
ちなみに('A`)は 2)の方法でインストールしました。
これは第13日目の日記でmatdのコンパイルエラーが起きた件に関連して、pkg_add で
libpcap をインストールした後 1)の方法でインストールすると、ライブラリの参照先が
違ってくるのでエラーになると考えられたからです。
まあ手作業でlibpcapのライブラリを修正してからインストールすればうまくいくのかも
しれませんが、あまりイレギュラーな処理は行なわない形で進めていく方が良いかと
思いました。
いずれ時間が出来たら、libpcapの参照先の問題について別に調べようと思ってます。
【ucarpを動かす為の準備】
2台のサーバにucarpをインストールしたら、動かす為に以下の準備作業を行ないます。
1) 2台のサーバで共通で使用するIPアドレスを1つ用意する。
→ これは各サーバが持っているIPとは別のIPを割り当てます。
('A`)の場合には今回 206.223.147.161 を用意しました。
2) 起動用のスクリプトを用意する。
→ ucarpを起動する際に指定するパラメータは /usr/local/sbin/ucarp -h を
実行すると以下の様に表示されます。
--interface=[if] (-i [if]): bind interface [if]
--srcip=[ip] (-s [ip]): source (real) IP address of that host
--vhid=[id] (-v [id]): virtual IP identifier (1-255)
--pass=[pass] (-p [pass]): password
--preempt (-P): becomes a master as soon as possible
--neutral (-n): don't run downscript at start if backup
--addr=[ip] (-a [ip]): virtual shared IP address
--help (-h): summary of command-line options
--advbase=[seconds] (-b [seconds]): advertisement frequency
--advskew=[skew] (-k [skew]): advertisement skew (0-255)
--upscript=[file] (-u [file]): run [file] to become a master
--downscript=[file] (-d [file]): run [file] to become a backup
--deadratio=[ratio] (-r [ratio]): ratio to consider a host as dead
--shutdown (-z): call shutdown script at exit
--daemonize (-B): run in background
--facility=[facility] (-f): set syslog facility (default=daemon)
|
ここで最低限必要な設定についてだけ解説します。
・--interface=[if] (-i [if]): bind interface [if]
→ 通信を行なうネットワークデバイス(NIC)の装置記号名を記述する。
(bananaサーバの場合には、ここは vr0 となります。)
・--srcip=[ip] (-s [ip]): source (real) IP address of that host
→ サーバの実IPを記述する。
banana260の場合には 206.223.147.160、
banana261の場合には 206.223.147.165 となります。
・--vhid=[id] (-v [id]): virtual IP identifier (1-255)
→ 2サーバで使用する「仮想IP」の識別子を指定します。
今回の場合には 1 とします。
・--pass=[pass] (-p [pass]): password
→ ucarp間で通信を行なう際に使用するパスワードを記述する。
(セキュアな通信を行なう為に、このパスワードを使っています。)
ほにゃらら
・--preempt (-P): becomes a master as soon as possible
→ 自分がバックアップとして稼働し、相手(マスタ)がダウンした時に
すぐに自分がマスタとして動く、という事を記述する。
・--addr=[ip] (-a [ip]): virtual shared IP address
→ 2サーバで使用する共通のIP(仮想IP)を記述する。
今回の場合には 206.223.147.161 とします。
・--upscript=[file] (-u [file]): run [file] to become a master
→ 自分自身がマスタとして稼働する際に実行するスクリプトを記述する。
ここでは /var/ucarp/vip-up.sh とします。
この内容については 3)で説明します。
・--downscript=[file] (-d [file]): run [file] to become a backup
→ 自分自身がバックアップ機として稼働する際に実行するスクリプトを記述する。
ここでは /var/ucarp/vip-down.sh とします。
この内容については 3)で説明します。
・--shutdown (-z): call shutdown script at exit
→ 終了時にシャットダウンスクリプトを呼び出す。
(特別なスクリプトを準備しなくても良いみたい。「おなじない」か?)
以上の内容で次のシェルスクリプトを作ります。
スクリプト名:ucarp.sh
内容:
#!/bin/sh
/usr/local/sbin/ucarp \
--preempt --interface=vr0 --srcip=206.223.147.160 --vhid=1 \
--pass=ほにゃらら --addr=206.223.150.161 \
--upscript=/usr/local/etc/vip-up.sh --downscript=/usr/local/etc/vip-down.sh \
--shutdown
|
3) upscript、downscriptを用意する。
→ 2) で紹介したupscript、downscriptで指定するスクリプトを作成する。
最低限必要な内容としては、「共用(仮想)IP」の追加と削除が挙げられます。
(upscriptでNICに共用IPをエイリアスの形で追加し、downscriptで共用IPを
NICから削除します。)
(upscript)
スクリプト名:vip-up.sh
内容:
#!/bin/sh
_VIP="206.223.147.161"
ifconfig vr0 $_VIP netmask 255.255.255.255 alias
(downscript)
スクリプト名:vip-down.sh
内容:
#!/bin/sh
_VIP="206.223.147.161"
ifconfig vr0 $_VIP delete
|
※ここではIPの追加・削除だけを記述していますが、他のスクリプトの実行や停止なども
必要であればここで記述すると良いかも。
4) 各スクリプトを設置するディレクトリを用意する。
→ ('A`)の場合あっちこっちにスクリプトを置くと、どこに置いたか判らなくなるので
一か所にまとめて設置します。
(場所は /var/ucarp というディレクトリを作って、この中に置きます。)
設置する際にはパーミッションは実行可能状態(例えば755とか)に設定する。
【実際のucarpの動き】
準備ができたところで、実際に動かしてみましょう。
本来ですとdaemontoolsとかで起動や実行制御を行なうのが普通ですが、
bananaサーバではdaemontoolsへの登録等が複雑な設定を必要とするので、
今回はスクリプトをバックエンドで起動させ、マスター&バックアップの
切り替わりを見てみようと思います。
まずbanana260でucarpを起動します。するとNICにIP(206.223.147.161)が
追加され、マスタとして稼働します。
banana260# /var/ucarp/ucarp.sh &
[1] 3518
banana260# [INFO] Local advertised ethernet address is [00:30:18:b0:02:60]
[WARNING] Switching to state: MASTER
[WARNING] Spawning [/usr/local/etc/vip-up.sh vr0]
banana260# ifconfig
vr0: flags=8843 mtu 1500
inet 206.223.147.160 netmask 0xffffff00 broadcast 206.223.147.255
inet 206.223.147.161 netmask 0xffffffff broadcast 206.223.147.161
ether 00:30:18:b0:02:60
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
banana260#
|
次にbanana261でucarpを起動します。するとNICにIP(206.223.147.161)が
追加され、マスタとして稼働します。
と同時に、banana260側ではマスタ→バックアップに切り替わり、NICから
IP(206.223.147.161)が削除されます。
[banana261側]
banana261# /var/ucarp/ucarp.sh &
[1] 3211
[INFO] Local advertised ethernet address is [00:30:18:b0:02:61]
[WARNING] Switching to state: MASTER ←MASTERになる
[WARNING] Spawning [/usr/local/etc/vip-up.sh vr0]
banana261# ifconfig
vr0: flags=8843 mtu 1500
inet 206.223.147.165 netmask 0xffffff00 broadcast 206.223.147.255
inet 206.223.147.161 netmask 0xffffffff broadcast 206.223.147.161
ether 00:30:18:b0:02:61
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
banana261#
[banana260側]
banana260# [WARNING] Switching to state: BACKUP ←BACKUPに変更
[WARNING] Spawning [/usr/local/etc/vip-down.sh vr0]
[WARNING] Preferred master advertised: going back to BACKUP state
banana260# ifconfig
vr0: flags=8843 mtu 1500
inet 206.223.147.160 netmask 0xffffff00 broadcast 206.223.147.255
ether 00:30:18:b0:02:60
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
banana260#
|
('A`)いやあ、ほとんど瞬時に切り替わったなあ・・・
後はucarpをdaemontoolsで動かす方法を確立すれば、監視機能(二重化)は完成かな。
隣ではあぶらみくん( `э´)が必死になってサーバを作っている最中です。
(今日中には完成するかな、かな・・・)
完成したら、明日はmatdを使った振り分け部分の構築に進みます。
あ、明日は月次処理があるから日記書けるかなあ。ちょっと心配ですが頑張ります。
それでは、また。
|
|
|
|
|
17日目に戻る。 19日目に続く。
解析
|