水曜日, 11月 29, 2006

LVS の DR ( Direct Routing )

LVSの2回目です。
以前はNATを使っていましたが、今回はDR(Direct Routing)を使います。

DRを使う利点は、こちらのほうがパフォーマンスが高いことです。
NATでは返答のパケットもLVSを通ることになりますが、DRは直接返事を返すので負荷が低いわけです。
それ以外にも、設定がシンプルになるという利点もあります。
欠点はこのホストをゲートウェイに使用できなくなることです。
まあ、複数のホストがなければLVSを使う利点もないので、これはさほど欠点にもなりませんが。
以前、DRを使うにはARPテーブルを操作しなければいけないと思ったんですが、LVSとゲートウェイを別のホストにすればそれも必要ないです。

NAT用に設定していた場合は、設定を戻します。
DRの場合にはフォワードの設定は必要ありません。
/etc/sysctl.conf の変更を戻します。
net.ipv4.conf.default.forwarding=1
の行をコメントアウトして、sysctl -p を実行します。

iptables のフォワードの設定やNATテーブルの設定も必要ありません。削除します。
------------------------------
#!/bin/sh

vip='50.106.42.193'
localnet='192.168.0.0/16'
bind1='192.168.0.5'
bind2='192.168.0.6'

ipvsadm -C

ipvsadm -A -t $vip:53
ipvsadm -a -t $vip:53 -r $bind1 -g
ipvsadm -a -t $vip:53 -r $bind2 -g
ipvsadm -A -u $vip:53
ipvsadm -a -u $vip:53 -r $bind1 -g
ipvsadm -a -u $vip:53 -r $bind2 -g
-------------------------------------
新しい設定ファイルはこうなります。

でも、もうiptablesと照らし合わせる必要がないので、別の場所に保存します。
dpkg-reconfigure ipvsadm
を実行します。
起動時に保存されたテーブルの復元、終了時に現在の設定を保存するか聞かれるので、yesにします。
上の新しい設定ファイルを一度実行したら、
/etc/init.d/ipvsadm stop
/etc/init.d/ipvsadm start
を実行して、テーブルの情報が保存され、ちゃんと復元されることを確認します。
そしたら設定ファイルは削除してしまいましょう。

最後にVIP(ここでは50.106.42.193)のネットマスクを255.255.255.255にします。
このあたりは少しトリッキーですが、同じIPをもつホストを複数用意するためにこの操作が必要になります。

これでLVS側の設定は終わりです。

バックエンドの実サーバーでも同じような操作が必要になります。
ifconfig lo:0 50.106.42.193 netmask 255.255.255.255 up
を実行してループバックアドレスにLVSのアドレスを割り当てます。
次に、
route add -host 50.106.42.193 dev lo:0
で、このアドレスがループバックアドレスに送られるように設定します。

もし、これらのホストのデフォルトゲートウェイがLVSサーバーだったら、これを別のホストに変更します。

これで設定は完了です。
もしバックエンドの実サーバーが別のネットワークにある場合には、トンネルを利用します。
が、そんなことあんまりしないですよね。。

金曜日, 11月 24, 2006

Xen で 4つ以上の DomainU を起動する

Xen(aptからではなく、公式サイトから取ってきた)は普通に動作させると、4つまでしか仮想マシンが起動しません。

で、この問題について、あちこちでいろいろ書かれてますが、あまりいい方法はありませんでした。

結局のところ、menu.lstの中で、
title Xen 3.0 / XenLinux 2.6
kernel /boot/xen-3.0.3-0.gz console=vga max_loop=64
module /boot/vmlinux-syms-2.6.16.29-xen root=/dev/sda1 ro console=tty0 max_loop=64
module /boot/initrd.img-2.6.16.29-xen
のように、max_loop=をつけて起動します。
これで、カーネルがmax_loop個のループバックデバイスを利用できるようになります。

さらに、/sbin/MAKEDEV を編集して、
loop)
for part in 0 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
do
makedev loop$part b 31 $part $disk
done
;;
の part in 以下の数字をたくさん書いて、loop デバイスを必要な数だけ作ります。
max_loopを64にしたので、63まで書くつもりでしたが、途中で力尽きました。

これで好きなだけ起動できるようになります。

でもこのやり方、aptitudeとの親和性が低いし、エレガントじゃないですね。

Bind の同期

LVSを導入して、Bind が2つになったので同期を取る必要が出てきました。

Bindで同期を取るには、マスター側とスレーブ側に設定が必要です。

まず、マスター側。
/etc/bind/named.conf.options に
allow-transfer { 2002:3b6a:2aca:0:216:3eff:fe5b:e8d9; };
などと設定します。上のはIPv6アドレスなので、普通はスレーブのIPv4アドレスを書けばいいです。

スレーブ側では、まず /etc/bind/db というディレクトリを作成します。
このディレクトリの所有者はbind.bindにしておきます。
次に、/etc/bind/named.conf.local に、zoneの設定を書きます。
zone "infology.info" {
type slave;
masters { 2002:3b6a:2aca:0:216:3eff:fe2e:b289; };
file "/etc/bind/db/infology.info";
};

これで起動すれば、ファイルが /etc/bind/db/infology.info に作られます。

最後に dig を使って確認します。
dig @slave.host infology.info

LVS (Linux Virtual Server)

LVS (Linux Virtual Server)を使ってみました。
LVSは受け取ったパケットを別のホストに転送して処理させることで、負荷分散や可用性の高い運用ができます。

具体的には、ホストごとに重み付けをして転送することによって負荷分散ができます。
ホストを追加したり、不具合の起きたホストを削除したりするのもできます。
しかもユーザーから見ると、なにも変化がないんですね。これは素敵。

僕のように、少ないIPアドレスで運用している場合には、ひとつのIPでLVSを動かして、実際の処理はサービスごとに別のホストで行うって運用もできます。
Xenと組み合わせて使うと、サービスをホスト間で簡単に移動、追加、削除ができるのでとても便利。使わない手はないですね。


で、利用するには、ipvsadmが必要です。
LVS自体はカーネルに組み込まれていますが、それを操作するツールをインストールしないといけないわけです。
aptitude install ipvsadm
でインストールします。

実はこのipvsadm、iptablesと使い方がよく似ています。
あとで書いてますが、設定する場所も同じです。
ipvsadm -L でリストを表示するのも一緒。
他に便利なのものは、
ipvsadm -L -n --stats で、転送したパケットなどが見れます。

で、とりあえず設定例
まず、/etc/sysctl.conf を変更します。
net.ipv4.conf.default.forwarding=1
のコメントを外し、sysctl -p を実行します。
これは今回の転送方法がNAT型だから必要です。

次に、
------------------------------
#!/bin/sh

vip='50.106.42.193'
localnet='192.168.0.0/16'
bind1='192.168.0.5'
bind2='192.168.0.6'

iptables -F
iptables -t nat -F
iptables -X

iptables -P FORWARD DROP
iptables -A FORWARD -i eth0 -o eth1 -s $localnet -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -d $bind1 --protocol tcp --dport 53 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -d $bind1 --protocol udp --dport 53 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -d $bind2 --protocol tcp --dport 53 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -d $bind2 --protocol udp --dport 53 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A POSTROUTING -s $localnet -d ! $localnet -j SNAT --to-source $vip


ipvsadm -C

ipvsadm -A -t $vip:53
ipvsadm -a -t $vip:53 -r $bind1 -m
ipvsadm -a -t $vip:53 -r $bind2 -m
ipvsadm -A -u $vip:53
ipvsadm -a -u $vip:53 -r $bind1 -m
ipvsadm -a -u $vip:53 -r $bind2 -m
-------------------------------------

これを、/etc/network/if-pre-up.d/ の中に置きます。
もともとの設定があればマージしてください。
名前は適当で構いません。ただし実行可能にしておくこと。
そうすればインターフェイスがupされる時に、テーブルが有効になります。
設定中は直接実行することで、調整も可能です。

今回は3つある転送の方法のうち、NATを利用しました。
DRやTunnelの場合はARPテーブルを操作する必要があるので、また今度。
その代わりに、net.ipv4.conf.default.forwarding=1 の設定が必要でした。

iptablesで普通にNATの設定をした後、実際に処理を行うホストへの転送を許可します。
実は、このNATの設定はLVSには必要ありません。
でも、転送先のホストのデフォルトゲートウェイをこのホストにする必要があるので、普通の通信を行うのに必要です。
ipvsadmでは-Aで転送を行うサービスを指定した後に、-aで転送先を指定します。

これで、2台のホストにDNSの処理が分散されています。
これは相当、簡単で便利です。

水曜日, 11月 22, 2006

Xen DomainU での時刻あわせ

Xenの仮想マシンをいくつもインストールしていると、ちょっと疑問に思います。
「ntpdを仮想マシンごとにインストールする必要あるの?」
でも、不安なのでインストールしてました。

で、結局のところ、ntpdをインストールしても時刻は調整されないようです。
Domain0 の時刻に同期される。
まあ、そのほうがよかったんですが。

どうしても DomainU で個々に時刻を合わせたい場合は、
/proc/sys/xen/independent_wallclock
の値を 1 にしなければいけません。

木曜日, 11月 09, 2006

Debian GNU/Linux で radvd を使う

IPv6にはIPv4でのDHCPのような機能がIPのレイヤーで実装されています。
なので設定がとても楽チンです。

まず、ルーターになるホスト(ここでは6to4トンネルの設定をしたホスト)で、パケットを通過させるようにします。
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding

同じホストでこれから設定する radvd による自動設定を無効にします。
echo 0 > /proc/sys/net/ipv6/conf/all/accept_ra

次に radvd のインストール。
aptitude install radvd

/etc/radvd.conf を以下のようにします。
interface eth0
{
AdvSendAdvert on;
prefix 2002:3b6a:2aca::/64 {};
};

意味は、eth0 につながるホストに 2002:3b6a:2aca:0(/64なので) のネットワークアドレスから始まるIPv6アドレスを自動的に割り当てるようにしています。
デフォルトゲートウェイも同時に設定されます。

これで、スイッチで接続されているホストはすべてIPv6による通信が可能になっています。
ping6 www.kame.net
などと打ってみると、外部のホストと通信できているのがわかります。


ついでにWindowsも使ってみます。

Windows XP でIPv6を有効にするには、コマンドプロンプトで、
ipv6 install
を実行します。

これでIPv6が有効になります。
さきほど設定した radvd からアドレスやルーティングの情報を自動的に受信するので、すぐに使えます。
ping 2001:200:0:8000::42
で、www.kame.netと通信できているのがわかります。

さらに、firefoxのアドレスに、
http://[2001:200:0:8000::42]/
と入れると、IPv6でWebページにアクセスできます。

他にも、poderosaでもIPv6が使えます。
Webとシェルが使えれば十分な感じです。

外向けのサービス以外でIPv4を使わなくてもいいですね。

水曜日, 11月 08, 2006

Debian GNU/Linux で IPv6 を使う (6to4 トンネル)

お金も手間もかけないでIPv6を使ってみます。
kernel 2.6 以降であればネイティブでIPv6をサポートしているのでとっても簡単です。

/etc/network/interfaces に以下を追加します。
auto sit0
iface sit0 inet6 static
address 2002:3b6a:2aca::1
netmask 16
gateway ::192.88.99.1

2002:3b6a:2aca は、IPv4アドレスで決まります。
printf "2002:%02x%02x:%02x%02x\n" 59 106 42 202
とすれば計算できます。後ろの数字がv4のIPアドレス。

::192.88.99.1 は、6to4トンネルのために予約されているアドレスで、あなたから一番近い6to4トンネルに割り当てられます。

あとは、
ping6 www.kame.net
なんてpingを打ってみるとIPv6で通信できているのが確認できます。
まあ、公開されている6to4トンネルを使うので、IPv4よりは遅くなりますが。