サーバー設定 · 3 min read · Oct 08, 2025

2台のサーバーでXenを実行する完璧な負荷分散および高可用性Webクラスター - ページ6

12. 負荷分散装置の設定 (lb1, lb2)

12.1 負荷分散装置でのIPVSの有効化

まず、負荷分散装置でIPVSを有効にする必要があります。IPVS (IP Virtual Server) は、Linuxカーネル内でトランスポート層の負荷分散を実装しており、いわゆるLayer-4スイッチングです。

echo ip_vs_dh >> /etc/modules
echo ip_vs_ftp >> /etc/modules
echo ip_vs >> /etc/modules
echo ip_vs_lblc >> /etc/modules
echo ip_vs_lblcr >> /etc/modules
echo ip_vs_lc >> /etc/modules
echo ip_vs_nq >> /etc/modules
echo ip_vs_rr >> /etc/modules
echo ip_vs_sed >> /etc/modules
echo ip_vs_sh >> /etc/modules
echo ip_vs_wlc >> /etc/modules
echo ip_vs_wrr >> /etc/modules

次に、これを行います:

modprobe ip_vs_dh
modprobe ip_vs_ftp
modprobe ip_vs
modprobe ip_vs_lblc
modprobe ip_vs_lblcr
modprobe ip_vs_lc
modprobe ip_vs_nq
modprobe ip_vs_rr
modprobe ip_vs_sed
modprobe ip_vs_sh
modprobe ip_vs_wlc
modprobe ip_vs_wrr

12.2 負荷分散装置にUltra Monkey (パッケージ) をインストール

以下の手順で負荷分散装置にUltra Monkey (パッケージ) をインストールします:

apt-get install ipvsadm ldirectord heartbeat

12.3 負荷分散装置でのパケット転送の有効化

負荷分散装置はApacheノードにトラフィックをルーティングできる必要があります。したがって、負荷分散装置でパケット転送を有効にする必要があります。次の行を/etc/sysctl.confに追加します:

vi /etc/sysctl.conf

# パケット転送を有効にする
net.ipv4.ip_forward = 1

次に、これを行います:

sysctl -p

12.4 heartbeatとldirectordの設定

次に、heartbeat用の3つの設定ファイルを作成する必要があります(いくつかのテキストエディタで編集する場合は、スペースとタブに注意してください。ldirectordは非常に厳密です!):

lb1とlb2で

vi /etc/ha.d/ha.cf

logfacility local0
bcast eth0 # Linux
mcast eth0 225.0.0.1 694 1 0
auto_failback on
node lb1.example.com
node lb2.example.com
respawn hacluster /usr/lib/heartbeat/ipfail
apiauth ipfail gid=haclient uid=hacluster

重要:ノード名として、両方の出力を使用する必要があります:

uname -n

vi /etc/ha.d/haresources

lb1.example.com \
 ldirectord::ldirectord.cf \
 LVSSyncDaemonSwap::master \
 IPaddr2::192.168.1.106/24/eth0/192.168.1.255 \
 IPaddr2::192.168.1.107/24/eth0/192.168.1.255

IPアドレス192.168.1.106と107は、後でウェブサイト(example.comおよびyoursite.com)に使用されます。

このファイルは、lb1またはlb2のいずれで作成を開始しても、両方のノードで同じである必要があります!

vi /etc/ha.d/authkeys

auth 3 3 md5 somerandomstring 

somerandomstringは、lb1とlb2の2つのheartbeatデーモンが相互に認証するために使用するパスワードです。ここに自分の文字列を使用してください。3つの認証メカニズムの中から選択できます。私はmd5を使用します。なぜなら、最も安全だと思うからです。

/etc/ha.d/authkeysはrootのみが読み取れる必要があるため、次のようにします:

chmod 600 /etc/ha.d/authkeys

ldirectordは実際の負荷分散装置です。アクティブ/パッシブ設定で2つの負荷分散装置(lb1.example.comとlb2.example.com)を構成します。これは、1つのアクティブな負荷分散装置があり、もう1つはホットスタンバイで、アクティブなものが失敗した場合にアクティブになります。これを機能させるために、ldirectord設定ファイル/etc/ha.d/ldirectord.cfを作成する必要があります。これもlb1とlb2で同一でなければなりません。

vi /etc/ha.d/ldirectord.cf

checktimeout=5
checkinterval=5
autoreload=no
logfile="/var/log/ldirectord.log"
quiescent=no
#fork=yes

#SMTP用
virtual=192.168.1.106:25
        real=192.168.1.104:25 gate
        fallback=192.168.1.105:25 gate
        service=none
        scheduler=wlc
        protocol=tcp
        checktype=connect
virtual=192.168.1.107:25
        real=192.168.1.104:25 gate
        fallback=192.168.1.105:25 gate
        service=none
        scheduler=wlc
        protocol=tcp
        checktype=connect

#DNS用 - CONNECTは動作しません。パッチが必要ですが、PINGはOKです
virtual=192.168.1.106:53
        real=192.168.1.104:53 gate
        fallback=192.168.1.105:53 gate
        service=none
        scheduler=wlc
        checktype=ping
        protocol=udp
virtual=192.168.1.106:53
        real=192.168.1.104:53 gate
        fallback=192.168.1.105:53 gate
        service=dns
        scheduler=wlc
        checktype=ping
        protocol=tcp
#HTTP用
virtual=192.168.1.106:80
        real=192.168.1.104:80 gate
        real=192.168.1.105:80 gate
        service=http
        request="ldirectord.php"
        receive="MySQLに接続されました"
        scheduler=wlc
        protocol=tcp
        checktype=negotiate
        persistent=28800
virtual=192.168.1.107:80
        real=192.168.1.104:80 gate
        real=192.168.1.105:80 gate
        service=http
        request="ldirectord.php"
        receive="MySQLに接続されました"
        scheduler=wlc
        protocol=tcp
        checktype=negotiate
        persistent=28800

#ウェブメール用
virtual=192.168.1.106:81
        real=192.168.1.104:81 gate
        fallback=192.168.1.105:81 gate
        service=http
        request="ldirectord.php"
        receive="MySQLに接続されました"
        scheduler=wlc
        protocol=tcp
        checktype=negotiate
virtual=192.168.1.107:81
        real=192.168.1.104:81 gate
        fallback=192.168.1.105:81 gate
        service=http
        request="ldirectord.php"
        receive="MySQLに接続されました"
        scheduler=wlc
        protocol=tcp
        checktype=negotiate
#POP3用
virtual=192.168.1.106:110
        real=192.168.1.104:110 gate
        fallback=192.168.1.105:110 gate
        service=pop
        checktype = connect
        scheduler=wlc
        protocol=tcp
#IMAP用
virtual=192.168.1.106:143
        real=192.168.1.104:143 gate
        fallback=192.168.1.105:143 gate
        service=imap
        scheduler=wlc
        protocol=tcp
#HTTPS用
###HTTPSを使用する場合はこの部分のコメントを外してください
#virtual=192.168.1.106:443
#        real=192.168.1.104:443 gate
#        real=192.168.1.105:443 gate 2
#        service=http
#        request="ldirectord.php"
#        receive="MySQLに接続されました"
#        scheduler=wlc
#        protocol=tcp
#        checktype=negotiate
#        persistent=28800
#
#virtual=192.168.1.107:443
#        real=192.168.1.104:443 gate
#        real=192.168.1.105:443 gate 2
#        service=http
#        request="ldirector.html"
#        receive="テストページ"
#        scheduler=wlc
#        protocol=tcp
#        checktype=negotiate
#        persistent=28800
#IMAP SSL用
virtual=192.168.1.106:993
        real=192.168.1.104:993 gate
        fallback=192.168.1.105:993 gate
        service=imaps
        scheduler=wlc
        protocol=tcp
#POP3 SSL用
virtual=192.168.1.106:995
        real=192.168.1.104:995 gate
        fallback=192.168.1.105:995 gate
        service=pops
        checktype = ping
        scheduler=wlc
        protocol=tcp
#MONIT監視用 #1
virtual=192.168.1.106:10001
        real=192.168.1.104:10001 gate
        checktype = on
#MONIT監視用 #2
virtual=192.168.1.106:20001
        real=192.168.1.105:20001 gate
        checktype = on

virtualはサービスの仮想IP(例:192.168.1.106および107)です。

realはクラスター内の実際のサーバーIP(192.168.1.104および105)です。

fallbackはバックアップサーバーです。実際のIPが失敗した場合、リクエストはフォールバックIPに転送されますが、負荷分散は行われません。

この設定は私の個人的な経験に基づいています。一部のサービスは負荷分散され、他のサービスはそうではありません。メールに関連するすべては負荷分散されていません。1つのメッセージが最初のサーバーに到着し、別のメッセージが別のサーバーに到着するのは望ましくありません(共有ストレージがない限り)。メールのトラフィックが非常に高くない場合、メールを負荷分散する意味はありません(しかし、依然として高可用性です)。DNSも同様です。後で、メッセージを2番目のサーバーにrsyncするので、最初のサーバーが失敗した場合のバックアップが得られます。

ポート81について。ウェブメール用に使用します。また、画像のアップロードのためにeコマースウェブサイトの管理にも使用します。後でweb1.example.comからweb2.example.comへのrsyncを設定しますが、その逆は行いません。基本的に、web2.example.comにファイルをアップロードしたくありません(共有ストレージを使用しない限り)。

この件についての詳細情報を得たい場合は、「ldirectord man」を検索してください。

その後、heartbeatのシステム起動リンクを作成し、ldirectordのリンクを削除します。なぜなら、ldirectordはheartbeatデーモンによって起動されるからです:

update-rc.d -f ldirectord remove

最後に、heartbeat(およびそれに伴いldirectord)を起動します:

/etc/init.d/ldirectord stop
/etc/init.d/heartbeat start

12.5 負荷分散装置のテスト

両方の負荷分散装置が期待通りに機能しているか確認しましょう:

ip addr sh eth0

アクティブな負荷分散装置lb1.example.comは、仮想IPアドレス(192.168.1.106および192.168.1.107)をリストする必要があります:

2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.102/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.106/24 brd 192.168.1.255 scope global eth0
    inet 192.168.1.107/24 brd 192.168.1.255 scope global secondary eth0

ホットスタンバイ(lb2.example.com)は、次のような表示をする必要があります:

2: eth0:  mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:0c:29:34:d7:7e brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.103/24 brd 192.168.1.255 scope global eth0

次に、試してみてください:

ldirectord ldirectord.cf status

アクティブな負荷分散装置(lb1)の出力:

ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 5321

ホットスタンバイ負荷分散装置(lb2)の出力:

ldirectord is stopped for /etc/ha.d/ldirectord.cf

次に、ポートが正しく転送されているか確認します:

ipvsadm -L -n | grep :80

lb1.example.comでは次のような表示がされるはずです:

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.106:80 wlc
  -> 192.168.1.104:80               Route   1      0          0         
  -> 192.168.1.105:80               Route   0      0          0
TCP  192.168.1.107:80 wlc
  -> 192.168.1.104:80               Route   1      0          0         
  -> 192.168.1.105:80               Route   0      0          0

lb2.example.comでは何も表示されないはずです。

最後のテスト:

/etc/ha.d/resource.d/LVSSyncDaemonSwap master status

アクティブな負荷分散装置の出力:

master running (ipvs_syncmaster pid: 5470)

ホットスタンバイの出力:

master stopped

12.6 負荷分散装置のフェイルオーバーテスト

lb1.example.com

/etc/init.d/heartbeat stop

ipvsadmコマンド:

ipvsadm -L -n | grep :80

何も出力されないはずです。

lb2.example.comで

ipvsadm -L -n | grep :80

次のように表示されるはずです:

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.1.106:80 wlc
  -> 192.168.1.104:80               Route   1      0          0         
  -> 192.168.1.105:80               Route   0      0          0
TCP  192.168.1.107:80 wlc
  -> 192.168.1.104:80               Route   1      0          0         
  -> 192.168.1.105:80               Route   0      0          0

lb1.example.comでheartbeatサービスを再起動します:

/etc/init.d/heartbeat start

両方でipvsadmコマンドを再試行すると、lb1.example.comがアクティブになり、lb2.example.comがスタンバイに戻るのが見えるでしょう。

テストがうまくいった場合は、次に進むことができます。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。