Javaアプリケーションのフェールオーバークラスター

プロジェクトが開始されてからしばらく経ちましたが、今度はアプリケーションの計算能力を向上させるときです。 このためにクラスターを構築することが決定されましたが、将来的には簡単にスケーリングできます。 したがって、サーバー間で要求を分散するようにクラスターを構成する必要があります。



このために、Apache、Tomcat6、mod_jk、Heartbeatと同様に、Linux CentOS 5.5で4つのサーバーを使用します。

web1、web2サーバー-Apacheを使用してリクエストを配信し、Heartbeatを使用してフォールトトレランスを提供します。 tomcat1、tomcat2サーバー-Javaアプリケーション用のTomcatサーバー。



ソフトウェアのインストール:



ApacheとHeartbeatを配置します



[root@web1 opt]$ yum -y install httpd heartbeat

[root@web2 opt]$ yum -y install httpd heartbeat








リポジトリにはTomcatの最新の安定バージョンがないため、ミラーからダウンロードすることを好みます



[root@tomcat1 opt]$ wget apache.vc.ukrtel.net/tomcat/tomcat-7/v7.0.21/bin/apache-tomcat-7.0.21.tar.gz

[root@tomcat1 opt]$ tar xvfz apache-tomcat-7.0.21.tar.gz

[root@tomcat1 opt]$ mkdir tomcat $$ mv apache-tomcat-7.0.21 tomcat

[root@tomcat1 opt]$ rmdir apache-tomcat-7.0.21

[root@tomcat1 opt]$ ln -s /opt/tomcat/bin/catalina.sh /etc/init.d/tomcat



[root@tomcat2 opt]$ wget apache.vc.ukrtel.net/tomcat/tomcat-7/v7.0.21/bin/apache-tomcat-7.0.21.tar.gz

[root@tomcat2 opt]$ tar xvfz apache-tomcat-7.0.21.tar.gz

[root@tomcat2 opt]$ mkdir tomcat $$ move apache-tomcat-7.0.21 tomcat

[root@tomcat2 opt]$ rmdir apache-tomcat-7.0.21

[root@tomcat2 opt]$ ln -s /opt/tomcat/bin/catalina.sh /etc/init.d/tomcat








Apacheがweb1サーバーとweb2サーバー上のtomcat1サーバーとtomcat2サーバー間で負荷を分散する方法を学習するには、mod_jkモジュールをApacheに接続する必要があります。

ご使用のバージョンのApache用のmod_jkをダウンロードし、名前を変更して/ etc / httpd / modulesディレクトリに移動します。



[root@web1 opt]$ wget archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.31/i386/mod_jk-1.2.31-httpd-2.2.x.so

[root@web1 opt]$ move mod_jk-1.2.31-httpd-2.2.x.so /etc/httpd/modules/mod_jk.so



[root@web2 opt]$ wget archive.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/linux/jk-1.2.31/i386/mod_jk-1.2.31-httpd-2.2.x.so

[root@web2 opt]$ move mod_jk-1.2.31-httpd-2.2.x.so /etc/httpd/modules/mod_jk.so








app2サーバーについても同じことを行います。



ハートビートのセットアップ:



[root@web1 opt]$ touch /etc/ha.d/authkeys

[root@web1 opt]$ touch /etc/ha.d/ha.cf

[root@web1 opt]$ touch /etc/ha.d/haresources








rootユーザーの読み取り専用パラメーターをファイル/etc/ha.d/authkeysに設定します。そうしないと、ハートビートが開始されません。



[root@web1 ha.d]$ chmod 600 /etc/ha.d/authkeys







そして、2行追加します。 ファイルは両方のノードで同一でなければなりません。



[root@web1 ha.d]$ nano authkeys



auth 2

2 sha1 your-password








web2サーバーについても同じことを行います。



ファイル/etc/ha.d/ha.cfを編集します。 ファイルは両方のノードで同一でなければなりません。



[root@web1 ha.d]$ nano ha.cf



logfacility local0

keepalive 2

deadtime 10

initdead 120

bcast eth0

udpport 694

auto_failback on

node web1

node web2

respawn hacluster /usr/lib/heartbeat/ipfail

use_logd yes

logfile /var/log/ha.log

debugfile /var/log/ha-debug.log








web2サーバーについても同じことを行います。



ファイル/etc/ha.d/haresourcesを編集します。 ファイルは両方のノードで同一でなければなりません。



[root@web1 ha.d]$ nano haresources



web1 192.168.0.1 httpd # ip .








web2サーバーについても同じことを行います。



バランス設定:



両方のWebサーバーの/etc/httpd/conf/httpd.confファイルに次の行を追加します。



LoadModule jk_module modules/mod_jk.so



JkWorkersFile conf/workers.properties

JkLogFile logs/mod_jk.log

JkLogLevel info

JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "

JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories

JkRequestLogFormat "%w %V %T"








DocumentRootセクションで、次の2行を追加します



JkMount /*.jsp loadbalancer

JkMount /servlet/* loadbalancer








両方のWebサーバーの/ etc / httpd / confフォルダーで、workers.propertiesファイルを作成します。



[root@web1 conf]$ touch workers.properties

[root@web2 conf]$ touch workers.properties








それらに次の行を追加します。



worker.list=tomcat1, tomcat2, loadbalancer



worker.tomcat1.port=10010

worker.tomcat1.host=192.168.1.1

worker.tomcat1.type=ajp13

worker.tomcat1.lbfactor=1



worker.tomcat2.port=10020

worker.tomcat2.host=192.168.1.2

worker.tomcat2.type=ajp13

worker.tomcat2.lbfactor=1



worker.loadbalancer.type=lb

worker.loadbalancer.balanced_workers=tomcat1, tomcat2








両方のTomcatの/opt/tomcat/conf/server.xmlでポートを構成します(すべてのポートが異なる必要があります)。



[root@tomcat1 conf]$ nano server.xml



<server port="8005" ...>



<! -- HTTP , .. AJP

<connector port="8080" protocol="HTTP/1.1" ... />

-->



<connector port="10010" protocol="AJP/1.3" ... />



[root@tomcat2 conf]$ nano server.xml



<server port="8006" ...>



<! -- HTTP , .. AJP

<connector port="8080" protocol="HTTP/1.1" ... />

-->



<connector port="10020" protocol="AJP/1.3" ... />










セッションレプリケーションの構成



Tomcatサーバーの1つがクラッシュしたときにユーザーセッションが破壊されるのを防ぐために、Tomcatサーバー間のセッションレプリケーションを構成することは理にかなっています。 これを行うには、すべてのTomcatの「<Engine name = "Catalina" defaultHost = "localhost">」セクションの/opt/tomcat/conf/server.xmlに次の行を追加します。



[root@tomcat1 conf]$ nano server.xml



<ngine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="tomcat1">



<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"

<membership

className="org.apache.catalina.cluster.mcast.McastService"

mcastAddr="228.0.0.4"

mcastBindAddress="127.0.0.1"

mcastPort="45564"

mcastFrequency="500"

mcastDropTime="3000"/>

<receiver

className="org.apache.catalina.cluster.tcp.ReplicationListener"

tcpListenAddress="auto"

tcpListenPort="4001"

tcpSelectorTimeout="100"

tcpThreadCount="6"/>

/>



[root@tomcat2 conf]$ nano server.xml



<ngine name="Catalina" defaultHost="localhost" debug="0" jvmRoute="tomcat2">



<Cluster className="org.apache.catalina.cluster.tcp.SimpleTcpCluster"

<membership

className="org.apache.catalina.cluster.mcast.McastService"

mcastAddr="228.0.0.4"

mcastBindAddress="127.0.0.1"

mcastPort="45564"

mcastFrequency="500"

mcastDropTime="3000"/>

<receiver

className="org.apache.catalina.cluster.tcp.ReplicationListener"

tcpListenAddress="auto"

tcpListenPort="4002"

tcpSelectorTimeout="100"

tcpThreadCount="6"/>

/>












これで、Javaサーブレットのフェイルオーバーおよびパフォーマンスクラスターの構成が完了しました。 耐障害性とスケーラブルなパフォーマンスを実現しました。これにより、パフォーマンスが不足した場合にクラスターに新しいノードを簡単に追加できます。



All Articles