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の設定もご紹介できたらなあと思います。