LVS(Linux Virtual Server)を使ってロードバランサーを構築してみる。

· 4 min read
LVS(Linux Virtual Server)を使ってロードバランサーを構築してみる。

LVS(Linux Virtual Server)を使ってロードバランサーを構築してみました。


・構成図

LVSサーバのeth0へ来たHTTPパケットを、BackendのWeb1,web2サーバーへNAT転送してみます。

・構成環境

※VM上で3つの仮想サーバを使用、いずれもOSはCentOS6.8

・WEBサーバ
Apache2.2
PHP5.3

・LVS
ipvsadm(IP Virtual Server version 1.2.1)

ネットワーク設定

ミドルウェアをインストールする前に、バックエンドWebサーバーの両方で
デフォルトゲートウェイを LVS の内側アドレスに設定しておく必要があります。 (例では「10.0.0.1」)

# vi /etc/sysconfig/network

GATEWAY=10.0.0.1 ←ここをLVSサーバのeth1のIPアドレスにする。

webバックエンドサーバの構築

ぶっちゃけapacheがインストールされていればよいですが
せっかくなので実環境に近づける様、drupalをインストールします。
1.必要なパッケージのインストール

# yum install httpd php php-mbstring php-mysql php-dom php-gd

MySQLもインストールする場合は下記コマンドも実施

# yum install mysql-server

2.mysqlの専用ユーザおよび専用データベースの作成
ここではdrupalという名前のユーザとDBを作成します。

create database drupal;
grant all privileges on drupal.* to drupal@localhost identified by '[パスワード]';
flush privileges;
exit

3.DRUPALコア・日本語化ファイルのダウンロード

公式サイトからdrupalの7系のコアファイルと日本語化ファイルをダウンロートします。

# wget https://ftp.drupal.org/files/projects/drupal-7.43.tar.gz
# wget http://ftp.drupal.org/files/translations/7.x/drupal/drupal-7.43.ja.po

※drupalの公式サイトだとdrupal8系がリリースされていますが
要件がphp5.5からなのでCentOS6.8の標準リポジトリではサポートされてないです。
なので必ず7系の最新版をインストールしてください。

4.必要ファイルの展開と設置

# tar zxvf drupal-7.43.tar.gz
# cp drupal-7.43.ja.po drupal-7.43/profiles/standard/translations/
# mkdir /var/www/html/drupal
# cp -R drupal-7.43/* /var/www/html/drupal
# chown -R apache.apache /var/www/html/drupal

5.apacheの設定

# vi /etc/httpd/conf.d/drupal.conf 

NameVirtualHost *:80
<VirtualHost *:80>
    DocumentRoot /var/www/html/drupal
    ServerName drupal.hoge.jp
    ErrorLog logs/drupal.error_log
    CustomLog logs/drupal.access_log common
</VirtualHost>

5.apacheの再起動

# service httpd restart

あとは http://[webサーバ]/drupal にアクセスしてブラウザ上でセットアップしてください。
画像付きの手順があるので、下記を参照してください。

http://qiita.com/crimson_21/items/5af2fe66559275657bf3

インストールが完了して、下記表示になっていれば完成。
このWEBサーバを元に、もう一つのwebサーバを作成します。
※VMインスタンスのコピーについてはここでは割愛します。


LVSサーバ側の設定

1.LVSサーバ(10.0.0.1)にipvsadmをインストールします。

# yum insatll ipvsadm

2.インストールが終わったら、IPパケット転送を有効にするようシステムの設定変更を行う
具体的には/etc/sysctl.confをエディタで開き、以下のように「net.ipv4.ip_forward」の値を「1」に変更すればおk
sysctl -pコマンドで設定反映しておきましょう。

# vi /etc/sysctl.conf

net.ipv4.ip_forward = 1
# sysctl -p     # 再読み込み

3.ipvsadmを起動する

# /etc/rc.d/init.d/ipvsadm start 

ついでに自動起動設定もonにしておきます。

# chkconfig ipvsadm on 

4.ipvsadmを設定する。
まずは、テーブルのクリアを実施

# ipvsadm -C

5.仮想サービスを登録する
LVSサーバの受け側のIPを登録します。
上図で言うと、インターネットからアクセスするときのIPなので
et0のIP、192.168.1.6を指定します。

# ipvsadm -A -t 192.168.1.6:80 -s rr

※コマンド例

ipvsadm [オプション] [プロトコル] [IP:ポート] [スケジュールオプション] [バランスアルゴリズム]
  • オプション
    -A 設定の追加
    -E 設定の変更
    -D 設定の削除
  • プロトコル
    -t tcpのサービスを指定する
    -u udpのサービスを指定する
    -f iptablesのFWMARKが付けられたパケットを指定
  • IP:ポート   サービスIPとポート名を指定する
  • スケジュール
    -s 負荷の割り振り方を指定する
    -p パーシステンスの時間を指定する
    -M -pオプションの処理、クライアントの同一性を判断に
    ここで指定した値を使う事によりグループ化して管理できる
  • ちなみに分散方式は以下があります。
rr ラウンドロビン
wrr ラウンドロビンに重み付けを行える
lc 負荷の少ないサーバへリクエストを飛ばす
wlc 基本的に上記と同じだが、重み付けも行う
lblc クライアントからのリクエストを基本的に同じサーバへ飛ばす、高負荷時は別サーバへ
lblcr 上記と同じだが、レプリケーション機能がつく
sed 応答速度に応じてリクエストを送るサーバを変える
nq アイドルのサーバがあればそこへ、なければsedと同じ動作

今回はわかりやすくするため192.168.1.6の80番ポートに来たアクセスを
LVS配下のサーバに対してラウンドロビン(つまり順番に割り振り)する設定としました。


実サーバを設定する。

LVS配下のバランシングされるサーバを指定します。

# ipvsadm -a -t 192.168.1.6:80 -r 10.0.0.2:80 -m 
# ipvsadm -a -t 192.168.1.6:80 -r 10.0.0.3:80 -m 
ipvsadm [オプション] [プロトコル] [VIP:ポート] [実サーバ指定オプション] [実サーバのIP] [転送オプション]
  • オプション
    -a 追加
    -e 変更
    -d 削除
  • プロトコル 上に書いた物と同じモノが使える。
  • 実サーバ指定オプション
    -r 実サーバを指定する
  • 転送オプション
    -g パケットに何もせず転送
    -i IPトンネルを使って転送
    -m マスカレードをする

・テーブルの確認

# ipvsadm -l 
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.6:http rr
  -> 10.0.0.1:http               Masq    1      0          0
  -> 10.0.0.2:http               Masq    1      0          0

・テストしてみる

実際にhttp://192.168.1.6/drupalにアクセスしてみます。

左側がweb1(10.0.0.1)で、右側がweb2(10.0.0.2)です。
接続元のIPアドレスが192.168.1.3なので、うまく分散されているのがわかります。

ちなみにパケットの転送方式をNATで設定しているので、
apacheのaccess.logはクライアント元のIPのまま記録されます。

DSR(Direct Server Return)方式だとIPアドレスの書き換えを行わないので
Apacheなどのアクセスログに残るのはLVSのアドレスになります。

取り急ぎこんな形での発表となります。
次回はkeepalivedを組み合わせたlvsの設定もご紹介できたらなあと思います。