本帖最后由 小蜀哥哥 于 2017-9-5 12:51 编辑
简介:随着互联网的飞速发展,互联网的用户也飞速增加。随之而来就是如何解决大量用户访问导致高并发的问题,倘若用单机版的tomcat在理想状态下能够承受的并发访问量大概为150到200左右,为了解决高并发就需要引入负载均衡技术。负载均衡就是一个web服务器解决不了的问题可以通过多个web服务器来平均分担压力来解决,并将发过来的请求被平均分配到多个后台web服务器来处理,这样压力就被分解开来。如:将同一个系统部署到多台tomcat服务器,每个tomcat服务器都可以独立提供服务——tomcat集群,并且通过负载均衡技术反向代理tomcat集群,这样既可提供系统的访问压力。负载均衡技术有两种方式实现:(1) 硬件负载均衡——如F5 (2)软件负载均衡——如Nginx、Apache等,但是硬件负载均衡的成本比较大,所以一般都采用软件负载均衡。而很多大型网站如京东、淘宝都采用Nginx负载均衡解决高并发问题,所有我们这里也采用Nginx实现负载均衡,反向代理tomcat集群。
一.Nginx+tomcat广播机制实现session共享
1. 环境准备
2. Nginx安装与启动
(1) 解压Nginx压缩包
(2) 双击nginx.exe启动Nginx,在浏览器输入http://localhost展示如下页面即表示安装成功
3. Tomcat集群
(1) 解压apache-tomcat-7.0.69.zip成两个tomcat1、tomcat2
(2) 修改tomcat1的配置文件conf/server.xml
1). 修改server的port端口为18005
2). 修改Connector的port端口为18080
3). 修改<Connector port="18009"protocol="AJP/1.3" redirectPort="8443" />
4). 修改Engine添加jvmRoute="tomcat"
5). 在<Engine>下添加如下配置文件
[XML] 纯文本查看 复制代码
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">
<Manager className="org.apache.catalina.ha.session.DeltaManager" expireSessionsOnShutdown="false"
notifyListenersOnReplication="true"/>
<Channel className="org.apache.catalina.tribes.group.GroupChannel">
<Membership className="org.apache.catalina.tribes.membership.McastService"
address="228.0.0.4" port="45564" frequency="500" dropTime="3000"/>
<Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
address="localhost" port="14000" autoBind="100" selectorTimeout="5000" maxThreads="6"/>
<Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
<Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
</Sender>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
<Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
</Channel>
<Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>
<Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
(3) tomcat2操作同上,修改位置参照tomcat1,修改tomcat2的配置文件conf/server.xml
1). 修改server的port端口为28005
同tomcat1修改server的port端口
2). 修改Connector的port端口为28080
同tomcat1修改Connector的port
3). 修改<Connector port="28009"protocol="AJP/1.3" redirectPort="8443" />
同tomcat1修改操作
4). 修改Engine添加jvmRoute="tomcat"
同tomcat1该操作
5). 在<Engine>下添加如下配置文件
同tomcat1的该操作
(4) 修改Nginx安装目录下conf/nginx.conf文件
4. 创建Web项目并测试广播机制的session共享
(1) 创建一个Web项目,名称为TestJQ
(2) 编辑index.jsp的内容如下
(3) 在WEB-INF下的web.xml中加入<distributable/>
(4) 将该web项目分部复制到tomcat1和tomcat2的webapps目录下
(5) 分别修改tomcat1和tomcat2下web项目的index.jsp内容如下
(6) 启动tomcat1和tomcat2
(7) 在Nginx安装目录下,进入cmd命令模式执行如下命令
(8) 测试,在浏览器输入http://localhost/TestJQ。不断刷新该页面,session如果保持不变则完成广播机制的Nginx+tomcat集群下的session共享
注意:依靠广播方式来实现的session复制,会浪费很多带宽导致整个网络反映缓慢。官网也建议这种方式最好不要超过4台tomcat!推荐使用下面方式实现,当然如果是分布式架构。那么应该考虑sso单点登录系统来使用redis模拟session机制
二.Nginx+tomcat集群+redis实现session共享 1. 环境准备
2. Nignx的配置信息参照上面的,无序做任何修改
3. 修改tomcat如下内容
(1). 将tomcat1和tomcat2目录下conf/server.xml文件中的<Engine>节点中的jvmRoute属性去掉
(2). 删除tomcat1和tomcat2目录下conf/server.xml文件中的<Cluster> ... </Cluster>节点
(3). 删除tomcat1和tomcat2的webapps下TestJQ项目的web.xml,去掉<distributable/>节点
4. Redis的安装
(1) 解压redis压缩包
(2) 启动redis,在redis安装目录下,进入cmd命令窗口执行启动命令
----64位redis启动命令:redis-server.exe redis.windows.conf
----32位redis启动命令:redis-server.exe Redis.conf
5. tomcat使用redis实现session共享
(1) 解压如下压缩包,并将解压后的所有jar拷贝到tomcat1和tomcat2的lib目录下
(2) 修改tomcat1和tomcat2下conf/context.xml配置文件,加入以下内容
[XML] 纯文本查看 复制代码
<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
<Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
host="localhost"
port="6379"
database="0"
maxInactiveInterval="60" />
6. 重启redis和Nginx服务,启动tomcat1和tomcat2。在浏览器输入http://localhost/TestJQ。不断刷新该页面,session如果保持不变则实现Nginx+tomcat集群+redis实现session共享
三.总结
这里只是简单的整理Nginx反向代理实现tomcat集群中的session共享,对于集群、负载均衡做一个入门案例。让大家对如今互联网行业面临的问题有一个大概的了解,当然随着我们的学习,我们会更加深入集群、分布式架构、SOA、各种微服务等技术!
希望这篇文章对大家有所帮助,也希望我们共同进步,共同探讨新技术,不断提升!
不发展的技术只会淘汰,不学习的人才终会沉沦!Let's rock and control it , come on
|