2010/01/30

引き続きDebian lennyでkeepalivedを使ってみる

前回に引き続き、今回はhttp専用サーバを増やしてみました。 前回導入したapacheはアンインストールしています。

今回のサーバー構成図

keepalivedを導入しているサーバ

  • 10.0.0.2
  • 10.0.0.3

Apacheを導入しているサーバ

  • 10.0.0.5
  • 10.0.0.6

keepalivedをApacheの側に導入しないところがポイントです。 ただDR構成を取るとApacheの側でもVirtual_IPを認識させるための手間が必ず必要になります。

keepalived側で必要な設定

前回のkeepalived.confの内容にVirtual_IPの80番ポートにきたリクエストを振り分ける設定を加えます。

/etc/keepalived/keepalived.confファイル

vrrp_instance VI {
  state BACKUP
  interface eth1
  garp_master_delay 5
  virtual_router_id 200
  priority 101
  nopreempt
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass XXXXXX
  }
  virtual_ipaddress {
    10.0.0.1/24 dev eth1
  }
}

virtual_server 10.0.0.1 80 {
  delay_loop 10
  lb_algo rr
  lb_kind DR
  protocol TCP
  real_server 10.0.0.5 80 {
    weight 1
    HTTP_GET {
      url {
        path /
        status_code 200
      }
      connect_timeout 5
    }
  }
  real_server 10.0.0.6 80 {
    weight 1
    HTTP_GET {
      url {
        path /
        status_code 200
      }
      connect_timeout 5
    }
  }
}

Apacheサーバ側で必要な設定

今回はDR(Direct Routing)構成を取っているので、パケットの受け手になるApacheサーバ側で、10.0.0.1宛てのパケットを自分のものだと認識させる必要があります。

KLabの方が書かれたLVSをNATからDSRへの中では、iptablesを使う方法が書かれています。

$ sudo /sbin/iptables -t nat -A PREROUTING -d 10.0.0.1 -j REDIRECT

これは始めてみる方法で確かに動きます。 ただ、これはlinuxに特化しているようにみえて一般的なのかどうか自信はありません。 DR構成のように、いわゆるMACアドレス変換を行なう場合には、ループバックアドレスにVirtual_IPを設定することで対応するように思えます。

sudo /sbin/ifconfig lo:0 10.0.0.1 netmask 255.255.255.255

いずれかの設定をすれば良いのですが、恒久的にはinterfacesファイルにlo:0の定義を入れるのが簡単そうです。

/etc/network/interfacesファイル抜粋

auto lo:0
iface lo:0 inet static
  address 10.0.0.1
  netmask 255.255.255.255

2010/02/01追記:
iptablesを使う場合にはinterfacesファイルに次のような一行を加える事で対応する事もできます。
post-up /sbin/iptables -t nat -A PREROUTING -p tcp -d 10.0.30.1 -j REDIRECT
最終的にlo:0の追加かiptablesを使うかは、同時に使用するVirtual_IPの数によって判断するのが良いようです。

debianでiptablesを操作するにはスクリプトを準備して、interfacesファイルのpre-up, post-upを加える必要があるので少し手間がかかります。 iptablesを使う方にアドバンテージがあるのかはわからないです。

2010/02/01追記:
この構成ではクライアントのARPテーブルにVirtual_IP宛てのMACアドレスとして10.0.0.5, 10.0.0.6のMACアドレスが登録されてしまいます。 このためarpリクエストを無視する必要が生じます。 /etc/sysctl.confか/etc/sysctl.d/以下にファイルを作成して次の設定を加えます。

/etc/sysctl.confファイル抜粋

net.ipv4.conf.eth0.arp_ignore=1
net.ipv4.conf.eth0.arp_announce=2

まとめ

今回は単純にするためのフロントエンドと本来は裏側に隠蔽されているApacheサーバ群を同じセグメントに配置しました。 本格的なテストには、セグメントを分けないと現実味が薄いように思えます。 ただとっかかりには、これぐらいの構成からスタートするのが良いのではないでしょうか。

また、keepalivedのベストプラクティスについて、まだよくわかっていないところがあります。 少なくともVRRPの設定は両方ともpriorityを同一にして、nopreemptを設定し、stateに書く起動時の初期状態はBACKUPにしておくのは良いマナーに思えます。

やはり「制御する」ことを考えると、もう少しOSやkeepalivedの挙動について理解が必要そうです。 iptablesを使ってMACアドレスが書き換えられたパケットを受領するとは、予想できませんでした。

それと「サーバ/インフラを支える技術」は間違いなく良い本だけれど、 必要な事が漏れなく書かれているわけではないので、これだけで何とかしようとする人には向かないでしょう。

ブラックボックスとしての技術だけを導入して問題を解決しようとしてもそれは不十分で、システム全体をぐるっと抱えて挙動を見渡すだけの少し高いところから見る技術が必要になると思います。

0 件のコメント: