天天看点

LVS+tomcat负载均衡部署

今天去公安部部署考试系统,一共有俩台机器,想跑8个tomcat出来,作负载。

原定于用tomcat自己实现负载,不过怕出万一就准备了lvs这种方式,不过没有用到,不过把准备的资料贴一下。

tomcat状态监控脚本

这个脚本实现的是tomcat端口状态的监控,web页面是否能访问的到,进程存活状态的监控,如果任何一个死掉,就重启tomcat并发送邮件报警。

在2太机器上都在后台执行

[root@bogon 22]# cat monitor.sh 

#!/bin/bash

while [ 1 ]

do

#set server ipadd

SERVERA=192.168.0.38

STATUS=SERVERA

#set tomcat path

SVRA_TOMCAT_DIR=/opt/service

SVRB_TOMCAT_DIR=/opt/service

#set server port

TOMCAT1=8081

TOMCAT2=8082

TOMCAT3=8083

TOMCAT4=8084

#set mail

[email protected]

<a href="mailto:[email protected]">[email protected]</a>

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

NULL=/dev/null

LOG=/var/log/monitor-tomcat.log

SLEEP="sleep 10"

TIME=`date +"%Y-%m-%d  %H:%M:%S"`

&gt;.T1

&gt;.T2

&gt;.T3

&gt;.T4

STARTUP=bin/startup.sh

SHUTDOWN=bin/shutdown.sh

AR1=`grep Restart $LOG |wc -l`

FILE="monitor tomcat status tomcat is alive"

if [ $STATUS = SERVERA ] ; then

T1WEB_ST=`links  http://$SERVERA:$TOMCAT1/monitor.jsp &gt; .T1`

T1=`grep "$FILE" .T1 &gt; $NULL ; echo $?`

T1STATUS=`nc -vv -z $SERVERA $TOMCAT1 &gt; $NULL 2&gt;&amp;1 ; echo $?`

if [ $T1 -eq 0 ] ; then

echo $TIME  tomcat1 -------- is --------  alive &gt;&gt; $NULL

if [ $T1STATUS -eq 0 ]; then

echo $TIME  tomcat1 -------- is --------  alive &gt;&gt; $LOG

else

echo $TIME "tomcat1 -------- is -------- shutdown" &gt;&gt; $LOG

echo $TIME "tomcat1 -------------------&gt;&gt;&gt; Restart" &gt;&gt; $LOG

PID=`ps aux |grep tomcat1 &gt; $NULL ;echo $?`

if [ $PID -eq 0 ] ; then

$SVRA_TOMCAT_DIR/tomcat1/$SHUTDOWN 2 &gt; $NULL

$SVRA_TOMCAT_DIR/tomcat1/$STARTUP 2 &gt; $NULL

$SLEEP

fi

T2WEB_ST=`links  http://$SERVERA:$TOMCAT2/monitor.jsp &gt; .T2`

T2=`grep "$FILE" .T2 &gt; $NULL ; echo $?`

T2STATUS=`nc -vv -z $SERVERA $TOMCAT2 &gt; $NULL 2&gt;&amp;1 ; echo $?`

if [ $T2 -eq 0 ] ; then

echo $TIME  tomcat2  is   alive &gt;&gt; $NULL

if [ $T2STATUS -eq 0 ]; then

echo $TIME  tomcat2 -------- is --------  alive &gt;&gt; $LOG

echo $TIME "tomcat2 -------- is -------- shutdown" &gt;&gt; $LOG

echo $TIME "tomcat2 -------------------&gt;&gt;&gt; Restart" &gt;&gt; $LOG

PID=`ps aux |grep tomcat2 &gt; $NULL ;echo $?`

$SVRA_TOMCAT_DIR/tomcat2/$SHUTDOWN 2 &gt; $NULL

$SVRA_TOMCAT_DIR/tomcat2/$STARTUP 2 &gt; $NULL

T3WEB_ST=`links  http://$SERVERA:$TOMCAT3/monitor.jsp &gt; .T3`

T3=`grep "$FILE" .T3 &gt; $NULL ; echo $?`

T3STATUS=`nc -vv -z $SERVERA $TOMCAT3 &gt; $NULL 2&gt;&amp;1 ; echo $?`

if [ $T3 -eq 0 ] ; then

echo $TIME  tomcat3  is   alive &gt;&gt; $NULL

if [ $T3STATUS -eq 0 ]; then

echo $TIME  tomcat3 -------- is --------  alive &gt;&gt; $LOG

echo $TIME "tomcat3 -------- is -------- shutdown" &gt;&gt; $LOG

echo $TIME "tomcat3 -------------------&gt;&gt;&gt; Restart" &gt;&gt; $LOG

PID=`ps aux |grep tomcat3 &gt; $NULL ;echo $?`

$SVRA_TOMCAT_DIR/tomcat3/$SHUTDOWN 2 &gt; $NULL

$SVRA_TOMCAT_DIR/tomcat3/$STARTUP 2 &gt; $NULL

T4WEB_ST=`links  http://$SERVERA:$TOMCAT1/monitor.jsp &gt; .T4`

T4=`grep "$FILE" .T4  &gt; $NULL ; echo $?`

T4STATUS=`nc -vv -z $SERVERA $TOMCAT4 &gt; $NULL 2&gt;&amp;1 ; echo $?`

if [ $T4 -eq 0 ] ; then

echo $TIME  tomcat4  is   alive &gt;&gt; $NULL

if [ $T4STATUS -eq 0 ]; then

echo $TIME  tomcat4 -------- is --------  alive &gt;&gt; $LOG

echo $TIME "tomcat4 -------- is -------- shutdown" &gt;&gt; $LOG

echo $TIME "tomcat4 -------------------&gt;&gt;&gt; Restart" &gt;&gt; $LOG

PID=`ps aux |grep tomcat4 &gt; $NULL ;echo $?`

$SVRA_TOMCAT_DIR/tomcat4/$SHUTDOWN 2 &gt; $NULL

$SVRA_TOMCAT_DIR/tomcat4/$STARTUP 2 &gt; $NULL

sleep 20 

TOMCAT='(tomcat1|tomcat2|tomcat3|tomcat4)'

PIDSTATE=` ps aux |grep -v grep | egrep $TOMCAT  &gt; /dev/null ;echo $?`

PORTSTATE1=`nc -vv -z $SERVERA $TOMCAT1 &gt; $NULL 2&gt;&amp;1 ; echo $?`

PORTSTATE2=`nc -vv -z $SERVERA $TOMCAT2 &gt; $NULL 2&gt;&amp;1 ; echo $?`

PORTSTATE3=`nc -vv -z $SERVERA $TOMCAT3 &gt; $NULL 2&gt;&amp;1 ; echo $?`

PORTSTATE4=`nc -vv -z $SERVERA $TOMCAT4 &gt; $NULL 2&gt;&amp;1 ; echo $?`

if [ $PIDSTATE -eq 0 ] &amp;&amp; [ $PORTSTATE1 -eq 0 ] &amp;&amp; [ $PORTSTATE2 -eq 0 ] &amp;&amp;  [ $PORTSTATE3 -eq 0 ] &amp;&amp;  [ $PORTSTATE4 -eq 0 ]  ; then

$SLEEPMIN

PIDSTATE=` ps aux |grep -v grep | egrep $TOMCAT &gt; /dev/null ;echo $?`

echo $TIME "tomcat  -------- is -------- shutdown" &gt;&gt; $LOG

AR2=`grep Restart $LOG  |wc -l`

LINEB=`echo "$AR2-$AR1"|bc `

MAILSUBJECT=` grep Restart $LOG | tail -n $LINEB `

if [ $LINEB -gt 0 ] ; then

echo $TIME send mail  to $MAILTO &gt;&gt; $LOG

sendmail -t &lt;&lt;EOF

from: $MAILFROM

to: $MAILTO

subject: warning

$MAILSUBJECT

EOF

done

监控脚本就是这样的,需要将monitor.jsp文件放在应用目录中,确保可以访问的到

monitor.jsp文件内容

[root@bogon 22]# cat monitor.jsp 

&lt;html&gt;

&lt;head&gt;

&lt;tatle&gt;monitor tomcat status&lt;/tatle&gt;

&lt;body&gt;

&lt;%out.println("tomcat is alive");%&gt;

&lt;/body&gt;

&lt;/head&gt;

&lt;/html&gt;

本来想用ipvsadm这个软件做的,把ipvsadm的命令也贴下。

[root@bogon 22]# cat ipvsadm_manager.sh 

ACCPORT=80

ACCIP=192.168.1.2

SVRAIP=192.168.0.38

SVRBIP=192.168.0.39

SVRA1PORT=8081

SVRA2PORT=8082

SVRA3PORT=8083

SVRA4PORT=8084

SVRB1PORT=8081

SVRB2PORT=8082

SVRB3PORT=8083

SVRB4PORT=8084

/sbin/ipvsadm -C

/sbin/ipvsadm -A -t $ACCIP:$ACCPORT -s rr 

/sbin/ipvsadm -a -t $ACCIP:$ACCPORT -r $SVRAIP:$SVRA1PORT -m

/sbin/ipvsadm -a -t $ACCIP:$ACCPORT -r $SVRAIP:$SVRA2PORT -m 

/sbin/ipvsadm -a -t $ACCIP:$ACCPORT -r $SVRAIP:$SVRA3PORT -m 

/sbin/ipvsadm -a -t $ACCIP:$ACCPORT -r $SVRAIP:$SVRA4PORT -m 

/sbin/ipvsadm -a -t $ACCIP:$ACCPORT -r $SVRBIP:$SVRB1PORT -m

/sbin/ipvsadm -a -t $ACCIP:$ACCPORT -r $SVRBIP:$SVRB2PORT -m

/sbin/ipvsadm -a -t $ACCIP:$ACCPORT -r $SVRBIP:$SVRB3PORT -m

/sbin/ipvsadm -a -t $ACCIP:$ACCPORT -r $SVRBIP:$SVRB4PORT -m

需要iptables的支持

iptables脚本的内容,为了方便管理,将2台真实的机器22端口映射出来。

[root@bogon 22]# cat iptables_manager.sh 

NETWORK=192.168.0.0

LOCALHOST=192.168.1.2

NATPORTA=2222

NATPORTB=3333

SERVERB=192.168.0.39

iptables -F  

iptables -X

iptables -F -t nat

iptables -X -t nat

iptables -t nat -A POSTROUTING -s $NETWORK -j MASQUERADE

iptables -t nat -A PREROUTING -d $LOCALHOST -p tcp --dport $NATPORTA -j DNAT --to $SERVERA:22

iptables -t nat -A PREROUTING -d $LOCALHOST -p tcp --dport $NATPORTB -j DNAT --to $SERVERB:22

service iptables save

service iptables restart

[root@bogon 22]# 

lvs使用nat方式

思路是,因为有俩台设备,做nat三台设备正好,所以再一台配置好的机器上装个虚拟己,呵呵,这也是虚拟化了。

在虚拟机搭建负载服务,安装ipvsadm软件,客户端访问的时候,访问的IP地址实际就是虚拟机的IP地址,而没有访问真实的服务器,而真实的页面是由2台真实的服务器提供的。

这样用ipvsadm对俩太机器的8个tomcat实现负载。

本文转自zhaoyun00 51CTO博客,原文链接:http://blog.51cto.com/zhaoyun/639821