2011年2月8日火曜日

LVSを利用したロードバランサーの構築方法


前回はロードバランサー(LB)について書きましたが今回は実際にLVSを用いてLBを構築してみます。


LVSの仕組み


LVSについては前回の記事で紹介しましたが、Linuxを高パフォーマンス、高可用性(HA)を持つサーバを作るプロジェクトや機能です。



準備


VMwareでゲストを3つ作る。


  1. LVS

  2. WEB01(ApacheなどのWEBサーバを導入しててください)

  3. WEB02(ApacheなどのWEBサーバを導入しててください)


LVSにはネットワークアダプターを2つにしてください。


片方はNATかブリッジ、もう片方はホストオンリー。



WEB01/WEB02に関してはネットワークアダプターは1つで、ホストオンリーにしてください。



OS


LVSはOSのkernelバージョンに影響します。


2.6以上であれば基本的に問題ありません。(標準では2.4 2.6に導入されています)



kernelバージョン確認



uname -r






  • 最新CentOS 32bit でも 64bitどちらも可


http://mirror.centos.org/centos/5/isos/



オプション(必須ではない)

LVSで本番運用を目指す場合は、できるだけOSを軽くしたいのでインストール時にcustomを選択し、base + editorのみインストールします。


kernelのバージョンが古くIPVSに対応していない場合はkernelを再構築する必要がありますが、それ以外の場合は特に必要ありません。



【LVS】インストール作業



baseとeditorのみをインストールした場合はコンパイラーやライブラリーが殆どインストールされていないのでインストールします。



yum install gcc libnl-devel kernel-devel openssl-devel ipvsadm





ipvsadmをソースからインストールする場合

ipvsadmはLVSに接続されるクライアントのウェイトを設定したり、LVSに接続したり、LVSから切り離したりなどLVSを操作するコマンドをサポートします。


上記でyumと一緒にインストールした場合はこの作業は不要です。


ipvsadmをダウンロードします。


http://www.linuxvirtualserver.org/software/kernel-2.6/



現在利用しているkernelのリンクを作成します。


現在使用しているkernelはuname -rで調べられます。



ln -s /usr/src/kernels/2.6.18-194.1.AXS3-i686 /usr/src/linux



tar -zxvf ipvsadm-1.24.tar.gz


cd ipvsadm-1.24


make


make install




ポートフォワーディングを有効にする

sysctl -w net.ipv4.ip_forward=1



  • 永続的に変更する


vim /etc/sysctl.conf



net.ipv4.ip_forward = 1




VIPを設定する

現在ゲストOSのLVSには、2つのIPが割り振られていると思います。



ifconfig



eth0 Link encap:Ethernet HWaddr 00:0C:29:A9:E1:AE


inet addr:172.16.0.129 Bcast:172.16.0.255 Mask:255.255.255.0


inet6 addr: fe80::20c:29ff:fea9:e1ae/64 Scope:Link


UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1


RX packets:3344953346 errors:0 dropped:0 overruns:0 frame:0


TX packets:3344935139 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:1000


RX bytes:1933681498 (1.8 GiB) TX bytes:760781469 (725.5 MiB)


Interrupt:67 Base address:0x2000


eth1 Link encap:Ethernet HWaddr 00:0C:29:A9:E1:B8


inet addr:10.1.0.134 Bcast:10.1.0.255 Mask:255.255.255.0


inet6 addr: fe80::20c:29ff:fea9:e1b8/64 Scope:Link


UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1


RX packets:7718486 errors:0 dropped:0 overruns:0 frame:0


TX packets:7669463 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:1000


RX bytes:510259346 (486.6 MiB) TX bytes:574126235 (547.5 MiB)


Interrupt:75 Base address:0x2080


lo Link encap:Local Loopback


inet addr:127.0.0.1 Mask:255.0.0.0


inet6 addr: ::1/128 Scope:Host


UP LOOPBACK RUNNING MTU:16436 Metric:1


RX packets:604367655 errors:0 dropped:0 overruns:0 frame:0


TX packets:604367655 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:0


RX bytes:190831055 (181.9 MiB) TX bytes:190831055 (181.9 MiB)





このeth0にはさらに1つの仮想IPアドレス(VIP)を設定します。


冗長構成ではない場合はVIPを設定する意味は殆どありませんが、冗長構成に移行する際にあらゆる設定ファイルを書き換えなければならない点とipvsadmを利用するためにVIPを設定します。


VIPは冗長化された構成内で共通に使えるIPを指定しルータ間や今回であればLVS間で利用することになります。


本来IPはユニークな物ではなければなりませんが、あえて重複させマスターにはVIPを割り当てマスターがダウンした際はバックアップにVIPを割り当てる事で冗長化します。


Linuxの場合は比較的簡単にVIPを設定することができます。




以下のコマンドは172.16.0.252というIPをデバイスeth0に割り当て、そのラベル名はeth0:lvs-vipという意味になります。ラベル名は適当な物で大丈夫です。



ip addr add 172.16.0.252 label eth0:lvs-vip dev eth0



これで、eth0に2つのIPが割り当てる事ができました。


ifconfigコマンドを打つとeth0がエイリアスされているのが伺えると思います。


172.16.0.252がVIPになります。今後、WEBへのアクセスは172.16.0.252を利用します。





eth0 Link encap:Ethernet HWaddr 00:0C:29:A9:E1:AE


inet addr:172.16.0.129 Bcast:172.16.0.255 Mask:255.255.255.0


inet6 addr: fe80::20c:29ff:fea9:e1ae/64 Scope:Link


UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1


RX packets:3344953346 errors:0 dropped:0 overruns:0 frame:0


TX packets:3344935139 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:1000


RX bytes:1933681498 (1.8 GiB) TX bytes:760781469 (725.5 MiB)


Interrupt:67 Base address:0x2000


eth0:lvs-vip Link encap:Ethernet HWaddr 00:0C:29:A9:E1:AE


inet addr:172.16.0.252 Bcast:0.0.0.0 Mask:255.255.255.255


UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1


Interrupt:67 Base address:0x2000


eth1 Link encap:Ethernet HWaddr 00:0C:29:A9:E1:B8


inet addr:10.1.0.134 Bcast:10.1.0.255 Mask:255.255.255.0


inet6 addr: fe80::20c:29ff:fea9:e1b8/64 Scope:Link


UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1


RX packets:7718486 errors:0 dropped:0 overruns:0 frame:0


TX packets:7669463 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:1000


RX bytes:510259346 (486.6 MiB) TX bytes:574126235 (547.5 MiB)


Interrupt:75 Base address:0x2080


lo Link encap:Local Loopback


inet addr:127.0.0.1 Mask:255.0.0.0


inet6 addr: ::1/128 Scope:Host


UP LOOPBACK RUNNING MTU:16436 Metric:1


RX packets:604367655 errors:0 dropped:0 overruns:0 frame:0


TX packets:604367655 errors:0 dropped:0 overruns:0 carrier:0


collisions:0 txqueuelen:0


RX bytes:190831055 (181.9 MiB) TX bytes:190831055 (181.9 MiB)





LVS設定作業


LVSの操作は先ほどインストールしたipvsadmコマンドを利用して行います。




LVS本体の設定

設定したVIPをLVSに追加します。



ex.ipvsadm -A -t VIP:ポート番号 -s 分散方式




ipvsadm -A -t 172.16.0.252:80 -s lc






分散方式

sオプションには次の分散方式が有効です。メジャーな方式のみを紹介します。


rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|



  • rr:順番に各サーバに振分ける、最も単純な方式

  • wrr:設定されたウェイトによって負荷分散する方式。負荷分散するマシンに性能差がある場合などに利用する

  • lc:接続されているコネクション数が最も少ないところに分散する。DBやSMTPなどに有効。

  • wlc:設定されたウェイトと接続されているコネクション数から負荷の低いサーバに振分ける


etc...




クライアントの追加

LVSに接続されるクライアント(リアルサーバ)をLVSに追加します。


今回は通信方式にNATを利用します。


ex. ipvsadm -a -t VIP:ポート番号 -r クライアントのIP 通信方式



ipvsadm -a -t 172.16.0.252:80 -r 10.1.0.100 -m


ipvsadm -a -t 172.16.0.252:80 -r 10.1.0.101 -m





通信方式

通信方式は大きく分け2種類あります



  • g:DSR(DirectServerReturn)方式で行きはLVSにより分散されて来ますが帰りはLVSを通りません。


経路が1つしかないので帰りもLVSを通過しますがIPアドレスの書き換えを行わないのでApacheなどのアクセスログに残るのはLVSのeth1のアドレス(10.1.0.134)が記録されます。


ただし、IPアドレスの書き換えを行わないのでLVSの負荷が低くなりますが、リアルサーバの作業が多くなります。



  • m:NAT方式で行きも帰りもLVSを通過し、Apacheなどに残るIPアドレスは接続元のIPアドレスになります。通常はこの方式でリアルサーバの作業も殆どありませんが、LVSの負荷は高くなります。




リアルサーバ(WEB01/WEB02の設定)


リアルサーバにはLVSのeth1側のIPアドレスをゲートウェイとして指定します。



vim /etc/sysconfig/network


GATEWAY=10.1.0.134



service network restart




クライアントの接続確認


LVS側で以下のコマンドを実行します。



ipvsadm -ln




すると先ほど追加したクライアントが表示されるはずです。




IP Virtual Server version 1.2.1 (size=4096)


Prot LocalAddress:Port Scheduler Flags


-> RemoteAddress:Port Forward  Weight  ActiveConn  InActConn


TCP 172.16.0.252:80 lc


-> 10.1.0.100:80   Masq    1      0    0


-> 10.1.0.101:80   Masq   1      0   0




http://172.16.0.252 にアクセスするとWEB01かWEB02のページが表示されれば完了です。



LVSからクライアントを切り離す


ex. ipvsadm -d -t VIP:ポート番号 -r クライアントのIP





接続できない場合の対処


http://172.16.0.252 にアクセスできない場合は次のような原因が考えられます。



  1. クライアントのデフォルトゲートウェイが間違っている。ネットワークを再起動していない。

  2. クライアントのWEBサーバポートが80ではない。

  3. net.ipv4.ip_forwardが1になっていない。




問題点


LVSによりWEBサーバの冗長化は行えましたが、LVS本体の冗長化は行えてないため単一障害点が存在します。


次はLVS本体の冗長化を行いたいと思います。



参考書





0 件のコメント:

コメントを投稿