LVS+tomcat负载均衡部署

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介:
 
 
今天去公安部部署考试系统,一共有俩台机器,想跑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
MAILFROM=22@gongan.com
MAILTO=13525315648@139.com
##########################################################################
NULL=/dev/null
LOG=/var/log/monitor-tomcat.log
SLEEP="sleep 10"
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
>.T1
>.T2
>.T3
>.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 > .T1`
T1=`grep "$FILE" .T1 > $NULL ; echo $?`
T1STATUS=`nc -vv -z $SERVERA $TOMCAT1 > $NULL 2>&1 ; echo $?`
if [ $T1 -eq 0 ] ; then
echo $TIME  tomcat1 -------- is --------  alive >> $NULL
if [ $T1STATUS -eq 0 ]; then
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME  tomcat1 -------- is --------  alive >> $LOG
else
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME "tomcat1 -------- is -------- shutdown" >> $LOG
echo $TIME "tomcat1 ------------------->>> Restart" >> $LOG
PID=`ps aux |grep tomcat1 > $NULL ;echo $?`
if [ $PID -eq 0 ] ; then
$SVRA_TOMCAT_DIR/tomcat1/$SHUTDOWN 2 > $NULL
$SVRA_TOMCAT_DIR/tomcat1/$STARTUP 2 > $NULL
$SLEEP
else
$SVRA_TOMCAT_DIR/tomcat1/$STARTUP 2 > $NULL
$SLEEP
fi
fi
else
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME "tomcat1 -------- is -------- shutdown" >> $LOG
echo $TIME "tomcat1 ------------------->>> Restart" >> $LOG
PID=`ps aux |grep tomcat1 > $NULL ;echo $?`
if [ $PID -eq 0 ] ; then
$SVRA_TOMCAT_DIR/tomcat1/$SHUTDOWN 2 > $NULL
$SVRA_TOMCAT_DIR/tomcat1/$STARTUP 2 > $NULL
$SLEEP
else
$SVRA_TOMCAT_DIR/tomcat1/$STARTUP 2 > $NULL
$SLEEP
fi
fi
T2WEB_ST=`links  http://$SERVERA:$TOMCAT2/monitor.jsp > .T2`
T2=`grep "$FILE" .T2 > $NULL ; echo $?`
T2STATUS=`nc -vv -z $SERVERA $TOMCAT2 > $NULL 2>&1 ; echo $?`
if [ $T2 -eq 0 ] ; then
echo $TIME  tomcat2  is   alive >> $NULL
if [ $T2STATUS -eq 0 ]; then
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME  tomcat2 -------- is --------  alive >> $LOG
else
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME "tomcat2 -------- is -------- shutdown" >> $LOG
echo $TIME "tomcat2 ------------------->>> Restart" >> $LOG
PID=`ps aux |grep tomcat2 > $NULL ;echo $?`
if [ $PID -eq 0 ] ; then
$SVRA_TOMCAT_DIR/tomcat2/$SHUTDOWN 2 > $NULL
$SVRA_TOMCAT_DIR/tomcat2/$STARTUP 2 > $NULL
$SLEEP
else
$SVRA_TOMCAT_DIR/tomcat2/$STARTUP 2 > $NULL
$SLEEP
fi
fi
else
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME "tomcat2 -------- is -------- shutdown" >> $LOG
echo $TIME "tomcat2 ------------------->>> Restart" >> $LOG
PID=`ps aux |grep tomcat2 > $NULL ;echo $?`
if [ $PID -eq 0 ] ; then
$SVRA_TOMCAT_DIR/tomcat2/$SHUTDOWN 2 > $NULL
$SVRA_TOMCAT_DIR/tomcat2/$STARTUP 2 > $NULL
$SLEEP
else
$SVRA_TOMCAT_DIR/tomcat2/$STARTUP 2 > $NULL
$SLEEP
fi
fi

T3WEB_ST=`links  http://$SERVERA:$TOMCAT3/monitor.jsp > .T3`
T3=`grep "$FILE" .T3 > $NULL ; echo $?`
T3STATUS=`nc -vv -z $SERVERA $TOMCAT3 > $NULL 2>&1 ; echo $?`
if [ $T3 -eq 0 ] ; then
echo $TIME  tomcat3  is   alive >> $NULL
if [ $T3STATUS -eq 0 ]; then
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME  tomcat3 -------- is --------  alive >> $LOG
else
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME "tomcat3 -------- is -------- shutdown" >> $LOG
echo $TIME "tomcat3 ------------------->>> Restart" >> $LOG
PID=`ps aux |grep tomcat3 > $NULL ;echo $?`
if [ $PID -eq 0 ] ; then
$SVRA_TOMCAT_DIR/tomcat3/$SHUTDOWN 2 > $NULL
$SVRA_TOMCAT_DIR/tomcat3/$STARTUP 2 > $NULL
$SLEEP
else
$SVRA_TOMCAT_DIR/tomcat3/$STARTUP 2 > $NULL
$SLEEP
fi
fi
else
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME "tomcat3 -------- is -------- shutdown" >> $LOG
echo $TIME "tomcat3 ------------------->>> Restart" >> $LOG
PID=`ps aux |grep tomcat3 > $NULL ;echo $?`
if [ $PID -eq 0 ] ; then
$SVRA_TOMCAT_DIR/tomcat3/$SHUTDOWN 2 > $NULL
$SVRA_TOMCAT_DIR/tomcat3/$STARTUP 2 > $NULL
$SLEEP
else
$SVRA_TOMCAT_DIR/tomcat3/$STARTUP 2 > $NULL
$SLEEP
fi
fi

T4WEB_ST=`links  http://$SERVERA:$TOMCAT1/monitor.jsp > .T4`
T4=`grep "$FILE" .T4  > $NULL ; echo $?`
T4STATUS=`nc -vv -z $SERVERA $TOMCAT4 > $NULL 2>&1 ; echo $?`

if [ $T4 -eq 0 ] ; then
echo $TIME  tomcat4  is   alive >> $NULL
if [ $T4STATUS -eq 0 ]; then
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME  tomcat4 -------- is --------  alive >> $LOG
else
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME "tomcat4 -------- is -------- shutdown" >> $LOG
echo $TIME "tomcat4 ------------------->>> Restart" >> $LOG
PID=`ps aux |grep tomcat4 > $NULL ;echo $?`
if [ $PID -eq 0 ] ; then
$SVRA_TOMCAT_DIR/tomcat4/$SHUTDOWN 2 > $NULL
$SVRA_TOMCAT_DIR/tomcat4/$STARTUP 2 > $NULL
$SLEEP
else
$SVRA_TOMCAT_DIR/tomcat4/$STARTUP 2 > $NULL
$SLEEP
fi
fi
else
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME "tomcat4 -------- is -------- shutdown" >> $LOG
echo $TIME "tomcat4 ------------------->>> Restart" >> $LOG
PID=`ps aux |grep tomcat4 > $NULL ;echo $?`
if [ $PID -eq 0 ] ; then
$SVRA_TOMCAT_DIR/tomcat4/$SHUTDOWN 2 > $NULL
$SVRA_TOMCAT_DIR/tomcat4/$STARTUP 2 > $NULL
$SLEEP
else
$SVRA_TOMCAT_DIR/tomcat4/$STARTUP 2 > $NULL
$SLEEP
fi
fi
fi
sleep 20 
TOMCAT='(tomcat1|tomcat2|tomcat3|tomcat4)'
PIDSTATE=` ps aux |grep -v grep | egrep $TOMCAT  > /dev/null ;echo $?`
PORTSTATE1=`nc -vv -z $SERVERA $TOMCAT1 > $NULL 2>&1 ; echo $?`
PORTSTATE2=`nc -vv -z $SERVERA $TOMCAT2 > $NULL 2>&1 ; echo $?`
PORTSTATE3=`nc -vv -z $SERVERA $TOMCAT3 > $NULL 2>&1 ; echo $?`
PORTSTATE4=`nc -vv -z $SERVERA $TOMCAT4 > $NULL 2>&1 ; echo $?`
if [ $PIDSTATE -eq 0 ] && [ $PORTSTATE1 -eq 0 ] && [ $PORTSTATE2 -eq 0 ] &&  [ $PORTSTATE3 -eq 0 ] &&  [ $PORTSTATE4 -eq 0 ]  ; then
$SLEEP
else
$SLEEPMIN
fi
PIDSTATE=` ps aux |grep -v grep | egrep $TOMCAT  > /dev/null ;echo $?`
PORTSTATE1=`nc -vv -z $SERVERA $TOMCAT1 > $NULL 2>&1 ; echo $?`
PORTSTATE2=`nc -vv -z $SERVERA $TOMCAT2 > $NULL 2>&1 ; echo $?`
PORTSTATE3=`nc -vv -z $SERVERA $TOMCAT3 > $NULL 2>&1 ; echo $?`
PORTSTATE4=`nc -vv -z $SERVERA $TOMCAT4 > $NULL 2>&1 ; echo $?`
if [ $PIDSTATE -eq 0 ] && [ $PORTSTATE1 -eq 0 ] && [ $PORTSTATE2 -eq 0 ] &&  [ $PORTSTATE3 -eq 0 ] &&  [ $PORTSTATE4 -eq 0 ]  ; then
$SLEEP
else
$SLEEPMIN
fi
PIDSTATE=` ps aux |grep -v grep | egrep $TOMCAT  > /dev/null ;echo $?`
PORTSTATE1=`nc -vv -z $SERVERA $TOMCAT1 > $NULL 2>&1 ; echo $?`
PORTSTATE2=`nc -vv -z $SERVERA $TOMCAT2 > $NULL 2>&1 ; echo $?`
PORTSTATE3=`nc -vv -z $SERVERA $TOMCAT3 > $NULL 2>&1 ; echo $?`
PORTSTATE4=`nc -vv -z $SERVERA $TOMCAT4 > $NULL 2>&1 ; echo $?`
if [ $PIDSTATE -eq 0 ] && [ $PORTSTATE1 -eq 0 ] && [ $PORTSTATE2 -eq 0 ] &&  [ $PORTSTATE3 -eq 0 ] &&  [ $PORTSTATE4 -eq 0 ]  ; then
$SLEEP
else
$SLEEPMIN
fi
PIDSTATE=` ps aux |grep -v grep | egrep $TOMCAT > /dev/null ;echo $?`
PORTSTATE1=`nc -vv -z $SERVERA $TOMCAT1 > $NULL 2>&1 ; echo $?`
PORTSTATE2=`nc -vv -z $SERVERA $TOMCAT2 > $NULL 2>&1 ; echo $?`
PORTSTATE3=`nc -vv -z $SERVERA $TOMCAT3 > $NULL 2>&1 ; echo $?`
PORTSTATE4=`nc -vv -z $SERVERA $TOMCAT4 > $NULL 2>&1 ; echo $?`
if [ $PIDSTATE -eq 0 ] && [ $PORTSTATE1 -eq 0 ] && [ $PORTSTATE2 -eq 0 ] &&  [ $PORTSTATE3 -eq 0 ] &&  [ $PORTSTATE4 -eq 0 ]  ; then
$SLEEP
else
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME "tomcat  -------- is -------- shutdown" >> $LOG
$SLEEPMIN
fi

AR2=`grep Restart $LOG  |wc -l`
LINEB=`echo "$AR2-$AR1"|bc `
MAILSUBJECT=` grep Restart $LOG | tail -n $LINEB `

if [ $LINEB -gt 0 ] ; then
TIME=`date +"%Y-%m-%d  %H:%M:%S"`
echo $TIME send mail  to $MAILTO >> $LOG
sendmail -t <<EOF
from: $MAILFROM
to: $MAILTO
subject: warning
$MAILSUBJECT
EOF
fi
done

监控脚本就是这样的,需要将monitor.jsp文件放在应用目录中,确保可以访问的到
monitor.jsp文件内容
[root@bogon 22]# cat monitor.jsp 
<html>
<head>
<tatle>monitor tomcat status</tatle>
<body>
<%out.println("tomcat is alive");%>
</body>
</head>
</html>

本来想用ipvsadm这个软件做的,把ipvsadm的命令也贴下。
[root@bogon 22]# cat ipvsadm_manager.sh 
#!/bin/bash
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 
#!/bin/bash
NETWORK=192.168.0.0
LOCALHOST=192.168.1.2
NATPORTA=2222
NATPORTB=3333
SERVERA=192.168.0.38
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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
相关文章
|
1月前
|
Java jenkins 应用服务中间件
结合Jenkins与Tomcat,实施Maven项目的自动构建和部署流程。
任何项目构建和部署的自动化流程,总离不开对各个环节精细把控与密切配合。涉及到源代码管理、构建工具、持续集成服务器以及最终的运行时环境的协调。通过上述简洁实用的步骤,可以实现Maven项目从源代码到运行状态的无缝过渡,进而提升软件开发的效率与质量。
176 0
|
4月前
|
Java 关系型数据库 MySQL
在Linux平台上进行JDK、Tomcat、MySQL的安装并部署后端项目
现在,你可以通过访问http://Your_IP:Tomcat_Port/Your_Project访问你的项目了。如果一切顺利,你将看到那绚烂的胜利之光照耀在你的项目之上!
292 41
|
4月前
|
开发框架 Java 关系型数据库
在Linux系统中安装JDK、Tomcat、MySQL以及部署J2EE后端接口
校验时,浏览器输入:http://[your_server_IP]:8080/myapp。如果你看到你的应用的欢迎页面,恭喜你,一切都已就绪。
387 17
|
4月前
|
Java 关系型数据库 MySQL
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
114 18
|
4月前
|
负载均衡 前端开发 应用服务中间件
Tomcat的负载均衡和动静分离(与nginx联动)
总的来说,负载均衡和动静分离是提高Web应用性能的两个重要手段。通过合理的配置和使用,我们可以让Web应用更好地服务于用户。
147 21
|
4月前
|
开发框架 关系型数据库 Java
Linux操作系统中JDK、Tomcat、MySQL的完整安装流程以及J2EE后端接口的部署
然后Tomcat会自动将其解压成一个名为ROOT的文件夹。重启Tomcat,让新“植物”适应新环境。访问http://localhost:8080/yourproject看到你的项目页面,说明“植物”种植成功。
128 10
|
4月前
|
负载均衡 Java 应用服务中间件
Tomcat与Nginx的负载均衡与动静分离技巧
总的来说,Tomcat和Nginx各有各的优点,在负载均衡和动静分离这两方面它们都有很好的应用。灵活使用这两个工具能够让Web应用具有更好的扩展性和用户体验。
124 14
|
4月前
|
负载均衡 前端开发 JavaScript
LVS-DR模式、keepalived、Nginx与Tomcat合作,打造动静分离,高效负载均衡与高可用性
为了采用这样的架构,你需要对LVS-DR、Keepalived、Nginx与Tomcat有一定的理解和掌握,同时也需要投入一些时间去研究和配置,但是一旦你把它运行起来,你将会发现,这一切都是值得的。
168 11
|
7月前
|
负载均衡 网络协议 Linux
LVS,软负载均衡
LVS(Linux Virtual Server)是一项广泛应用的负载均衡技术,由章文嵩博士于1998年发起,自Linux 2.4.24版本起成为官方内核的一部分。LVS通过四层负载均衡技术实现高性能、高可用的服务器集群,支持多种调度算法和工作模式(如D-NAT、full-NAT、IP隧道、DR),适用于HTTP、数据库等应用。相比7层负载均衡器(如Nginx、HAProxy),LVS具有更高的并发处理能力和更低的资源消耗,适合大规模流量分发。本期文章详细介绍了LVS的工作原理、优势与不足,并对比了常见的负载均衡产品,帮助读者根据具体需求选择合适的解决方案。
885 5
LVS,软负载均衡
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
236 2