負荷分散を試してみようと思いLinuxでオープンソースのソフトで何か無いのか

グーグルで調べてみたところ下記のようなソフトがあることがわかりました。


・ldirecterd

・keepalived

・ultra monkey


どれを使用するか考えたところ、とりあえず「keepalived」を使用してみようと思います。

その他のに関しては keepalived を使用してみます。

それから、構成としては負荷分散サーバをLB1とLB2を構築してLB自体をVRRPで冗長性を持たせて、

且つ負荷分散される実サーバとして2台のプロキシサーバを構築します。

構成図としては下図のようにし今回はLB1の設定に関して記述します。

※私のページを参考にしていただければ幸いですが、

 参考にしたうえで何か不具合があっても責任はとれませんので、予めご了承ください。


マコトのブログ


とりあえず、仮想環境にCentOS5.5を用意します。

IPアドレス、プロキシ等諸々の基本的な設定を完了したところで実際に keepalived をダウンロードします。


僕はいつもダウンロードするディレクトリは /usr/loca/src に保存しているので、

cd /usr/local/src でディレクトリ移動


そして、keepalivedを下記のサイトよりダウンロードします。

http://www.keepalived.org/download.html

2010年8月27日の時点ではVersion 1.1.20が最新のようなのでkeepalived-1.1.20.tar.gzをwgetでダウンロードします。


wget http://www.keepalived.org/software/keepalived-1.1.20.tar.gz

#tar zxvf keepalived-1.1.20.tar.gz

#cd keepalived-1.1.20
#./configure --with-kernel-version=/usr/src/kernels/2.6.18-194.11.1.el5-i686

※--with-kernel-versionでカーネルソースの場所を指定してください。そうしないと、makeできないようです。

あと、opensslやgccなどが入っていなければyumコマンドなどでインストールしてください。

※原因はまだ分かっていませんが、Use IPVS Framework :の結果が「NO」 --with-kernel-versionの

部分を--with-kernel-dirに変えてみてください。


Keepalived configuration
------------------------
Keepalived version : 1.1.20
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
Use VRRP Framework : Yes
Use Debug flags : No


上記のように結果がなっていれば大丈夫なようです。

「Use Debug flags : No」に関しては特に影響はなさそうです。


続いて私の場合はソースのままで使用するのではなくRPMに変換します。

keepalivedの圧縮ファイルを/usr/src/redhat/SOURCESにコピーしてください。

#cp /usr/local/src/keepalived-1.1.20.tar.gz /usr/src/redhat/SOURCES
#make rpm

コマンド実行後 /usr/src/redhat/RPMS/i386 に移動してください。

keepalived-1.1.20-5.i386.rpmのファイル名でインストール用ファイルが作成されています。

※/usr/src配下にredhatディレクトリがない場合は、yumでredhat-buildをインストールしてみてください。


#rpm -ihv keepalived-1.1.20-5.i386.rpm
インストールが完了します。


さらに設定ファイルを編集します。

#vi /etc/keepalived/keepalived.conf


#############################

! Configuration File for keepalived

global_defs {
notification_email {
system@local.com

}
notification_email_from system@local.com
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
#############################

・notification_email

異常時などに通知する宛先を指定します。複数に送りたいときは開業して違う宛先を入力してください。


・notification_email

メールで通知する際の送信元(from)のアドレスを指定します。


・smtp_connect_timeout 30

メールサーバに接続時のタイムアウトの時間(秒)を指定します。


・router_id

keepalivedサーバのIDを指定します。


#############################

vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 230
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111

}

virtual_ipaddress {
192.168.11.230/24
}
}
#############################


・state

負荷分散サーバ自信をVRRPで冗長を組んだときにMASTERかBACKUPを指定します。


・interface

負荷分散とVRRPで使用するインターフェースを指定します。

・virtual_router_id

VRIDを指定します。冗長構成の場合は同じ値にする必要があります。

※他のVRRPのIDとは重複しないようにしてください。VRRPはマルチキャストでパケットを投げているようですが、

TTLが1の範囲しか届かないようなのでVIPの第四オクテットの数値を使用すれば問題なさそうです。


・priority

冗長性を構成した時の優先度を指定します。数値が高いほうがマスターになります。


・advert_int

VRRPの監視間隔(秒)を指定します。


・authentication

VRRPの認証方法を指定します。auth_typeは認証方法、auth_passはパスワードを指定します。


その他、

・garp_master_delay
ARP信号の送信遅延時間(秒)


・nopreempt
既に起動しているサーバーよりもpriorityの値が高い場合であってもMASTERにならないようにする設定です。

復旧時にファイルバックするのを防ぐことに使用されるかもしれません。

#############################
virtual_ipaddress {
192.168.11.230/24
}
#############################

・virtual_ipaddress

仮想IPアドレスを指定します。今回は記入していませんが、

インターフェースを指定したい場合はeth0等を続けて記述することもできます。

例)192.168.11.230/24 dev eth0


#############################

virtual_server 192.168.11.230 8181 {
delay_loop 6
lb_algo lc
lb_kind DR
nat_mask 255.255.255.0
persistence_timeout 50
protocol TCP

real_server 192.168.11.226 8181 {
weight 5

#   inhibit_on_failure

TCP_CHECK {
connect_port 8181
connect_timeout 3
}
}
real_server 192.168.11.223 8181 {
weight 1

#   inhibit_on_failure
TCP_CHECK {
connect_port 8181
connect_timeout 3
}
}
}
#############################

・virtual_server

実サーバのIPアドレスとポート番号を指定します。


・delay_loop

実サーバの監視感覚時間(秒)


・lb_algo

実サーバの分散方式(rr、wrr、lc、wlc、sh、dh、lblc)を指定します。


・lb_kind DR

負荷分散サーバと実サーバの通信構成(NAT、DR)を指定します。

NAT:実サーバからの応答も負荷分散サーバを経由してクライアントに返します。

DR:実サーバからの応答は負荷分散サーバを経由せずに直接クライアントに返します。

私の場合は負荷分散サーバと実サーバとクライアント端末同一セグメントなのでDR方式を使用しています。


・persistence_timeout

タイムアウト時間(秒)を指定します。


・protocol

負荷分散で使用するプロトコル(TCP、UDP)を指定します。


・real_server

実サーバのIPアドレスとポート番号を指定します。


weight

分散する割合を指定します。


inhibit_on_failure

実サーバがダウンした時に、実サーバを分散対象から削除せずに、weightの値を0にします。

ダウンしたサーバが復旧した際には分散対象に加わります。

僕はinhibit_on_failureをコメントアウトし分散対象から削除するようにして、実サーバがダウンした際には

分散対象の別のサーバにアクセスできるようにしています。


・TCP_CHECK

負荷分散サーバから実サーバへの接続確認を行います。

connect_port:実サーバのポート番号

connect_timeout:タイムアウト時間(秒)を指定します。


分散対象のサーバが複数ある時は

real_serverからTCP_CHECKを対象となるサーバの台数分だけ追加してください。



これまでの設定で一応の設定はできていると思います。

しかし、Keepalivedは仮想MACアドレスを生成しないみたいですね。。。

動画を見ているときに意図的に片側のKeepalivedを停止したら

当然ながら仮想IPのMACアドレスが変わってしまうので停止したままになりました。。。



#service keepalived start

あとはkeepalivedを実行してVRRPの冗長性と、実サーバへの負荷分散具合を確認してください。

もし、うまくいかない場合はファイアーウォール等の設定を確認してみてください。

また実サーバ側でもリダイレクトの設定が必要になるので、次回に記載しようかと思います。