问题:
1.tomcat集群能带来什么?
1).提高服务的性能(一般采用一台机器部署一个tomcat,如果一台机器部署多个tomcat,它们有共享瓶颈,它们要共享网卡、内存、I/O等),并发能力(一台tomcat的http线程池是有限的,根据机器的性能,如果是两台,则能承载的http线程就是两倍),以及高可用性(nginx下面如果有多台tomcat,当其中一台tomcat出故障了,可以把这个结点从nginx负载均衡tomcat集群的配置中去掉,nginx还可以达到tomcat其他可用的服务器上)
2).提供项目架构的横向扩展能力(如果我有一台服务器,通过不断升级内存、CPU,这是纵向提高性能。比如在双11时,只需根据历史评估添加tomcat横向结点即可)
2.tomcat集群实现原理
通过nginx负载均衡进行请求转发。
3.tomcat集群新旧架构对比解析
一期架构:
“想当然”二期架构:
例如:user1登录信息存在第一台tomcat的session中,user1要生成订单,通过Nginx可能请求到了第二台tomcat,这时发现没有登录信息,会请求用户再次登录。也就是出现了session无法共享的问题。
4.tomcat集群带来了什么新问题?
1).session登录信息存储及读取的问题
解决办法:采用nginx ip hash policy(即,根据请求的ip,对ip进行hash取模后分配到指定的服务器,那么这个ip发过来的请求都会发送到这台服务器上。优点:可以不改变现有技术架构,直接实现横向扩展。缺点:1.导致服务器请求(负载)不平均(完全依赖ip hash的结果)。例如,有两个用户,ip hash后都请求到第一台tomcat上,如果只有两个用户,两个tomcat,这样第二台tomcat就处于空闲状态。2.在IP变化的环境下无法服务。如果ip变化,有可能hash到不同的tomcat上,影响正常服务。)(这种办法在实操中基本不使用)
2).服务器定时任务并发的问题(比如定时关单)
二期架构:
所有服务器的session登录信息,都缓存在分布式的redis中。进而可以做单点登录,利用分布式redis,来做一个分布式锁,解决tomcat A,B,C在同一时间点启动定时任务的问题。如果不做分布式锁,会造成CPU、内存的资源浪费,因为在同一时间点只需要一台机器启动定时任务即可,其他机器不需要启动,并且随便一台都行。
5.单机部署多应用(一台服务器开启多个tomcat实例)/多机部署多应用(假设有A,B,C三台服务器,在这三台服务器上分别装有tomcat,然后把这三个做成一个集群)
6.nginx负载均衡配置、策略、场景及特点
1)轮询(默认)
优点:实现简单。
缺点:不考虑每台服务器处理能力。
upstream www.mall.com { server www.mall.com:8080; server www.mall.com:9080; }
2)权重(实际最常使用,默认是1)
优点:考虑了每台服务器处理能力的不同。
upstream www.mall.com { server www.mall.com:8080 weight = 15; server www.mall.com:9080 weight = 10; }
3)ip hash
优点:能实现同一个用户访问同一个服务器,就不会出现单点登录问题。
缺点:根据ip hash不一定平均。
upstream www.mall.com { ip_hash; server www.mall.com:8080; server www.mall.com:9080; }
4)url hash(第三方)
优点:能实现同一个服务访问同一个服务器。
缺点:根据url hash分配请求会不平均,请求频繁的url会请求到同一个服务器上。
upstream www.mall.com { server www.mall.com:8080; server www.mall.com:9080; hash $request_uri; }
5)fair(第三方)
优点:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream www.mall.com { server www.mall.com:8080; server www.mall.com:9080; fair; }
7.nginx+tomcat搭建集群
8.tomcat集群验证