2017 11-02 tomcat 应用

一.实现nginx与tomcat的反向代理负载均衡的应用

实验原理图:
搜狗截图20171106231142.png

实验环境准备:一个客户端主机,一个调度器(反向代理服务器),两个tomcat后端服务器
实验步骤:
1.两个后端服务器Yum安装 tomcat tomcat-admin-webapps tomcat-webapps tomcat-docs-webapp
并yum install java-1.8.0-openjdk-devel.x86_64
在代理服务器上安装httpd和nginx
2.在后端服务器上创建目录
mkdir -pv /usr/share/tomcat/webapps/myapp/WEB-INF
编辑 index.jsp vim -pv /usr/share/tomcat/webapps/myapp/index.jsp

      <%@ page language="java" %>
  2  <html>
  3   <head><title>TomcatA</title></head>
  4   <body>
  5     <h1><font color="red">TomcatA.magedu.com</font></h1>
  6     <table align="centre" border="1">
  7          <tr>
  8                 <td>Session ID</td>
  9                 <% session.setAttribute("magedu.com","magedu.com"); %>
 10                 <td><%= session.getId() %></td>
 11                 </tr>
 12                 <tr>
 13                          <td>Created on</td>
 14                         <td><%= session.getCreationTime() %></td>
 15                  </tr>
 16                  </table>
 17                </body>
 18         </html>

在另一主机上做相同操作,只需要将"red"改为blue做区分即可
在网页上测试: 172.18.254.242/myapp和172.18.254.31/myapp


搜狗截图20171106220419.png

搜狗截图20171107143334.png

可以看出不同的效果,证明编辑成功
3.设置nginx服务器
vim /etc/nginx/nginx.conf

upstream tcsrvs {
     server 192.168.136.134:8080;
     server 192.168.136.170:8080;
}
        location / {
         proxy_pass http://tcsrvs;
}

配置好后重启nginx服务
在网页客户端进行测试 172.18.25.62/myapp
通过结果显示代理成功


搜狗截图20171106221356.png

(4)在虚拟机客户端使用curl命令来显示是否均衡调度

for i in {1..10};do curl -s 172.18.25.62/myapp/index.jsp |grep -i tomcat ;done
  <head><title>TomcatA</title></head>
    <h1><font color="blue">TomcatA.magedu.com</font></h1>
  <head><title>TomcatA</title></head>
    <h1><font color="red">TomcatA.magedu.com</font></h1>
  <head><title>TomcatA</title></head>
    <h1><font color="blue">TomcatA.magedu.com</font></h1>
  <head><title>TomcatA</title></head>
    <h1><font color="red">TomcatA.magedu.com</font></h1>
  <head><title>TomcatA</title></head>
    <h1><font color="blue">TomcatA.magedu.com</font></h1>
  <head><title>TomcatA</title></head>
    <h1><font color="blue">TomcatA.magedu.com</font></h1>
  <head><title>TomcatA</title></head>
    <h1><font color="red">TomcatA.magedu.com</font></h1>
  <head><title>TomcatA</title></head>
    <h1><font color="blue">TomcatA.magedu.com</font></h1>
  <head><title>TomcatA</title></head>
    <h1><font color="red">TomcatA.magedu.com</font></h1>
  <head><title>TomcatA</title></head>
    <h1><font color="blue">TomcatA.magedu.com</font></h1>

显示结果为均衡调度
(5)使用httpd来实现调度
关掉nginx服务器,打开httpd
vim /etc/httpd/conf.d/host-tomcat.conf

<proxy balancer://tcsvrs>
    BalancerMember http://172.18.254.242:8080
    BalancerMember http://172.18.254.31:8080
    ProxySet lbmethod=byrequests——相当于轮询调度算法,如果后端tomcat服务器有权重会按权重来进行调度
 </Proxy>

                                <VirtualHost *:80>
                                        ServerName www.magedu.com
                                        ProxyVia On
                                        ProxyRequests Off——关闭正向代理
                                        ProxyPreserveHost On
                                        <Proxy *>
                                                Require all granted——授权
                                        </Proxy>
                                        ProxyPass / balancer://tcsrvs/——代理服务器地址
                                        ProxyPassReverse / balancer://tcsrvs/
                                        <Location />
                                                Require all granted ——授权
                                        </Location>
                                </VirtualHost>

经过测试,httpd代理也成功
(6)扩展,实现权重的调度
BalancerMember http://172.18.254.242:8080 loadfactor=1
BalancerMember http://172.18.254.31:8080 loadfactor=3
在客户端测试,实现3:1的调度
(7)健康性检查
将tomcat后端服务器关闭一个,再到客户端进行测试结果不会再往故障的tomcat服务器上进行调度
或者在host-tomcat.conf上
BalancerMember http://172.18.254.242:8080 status=D
BalancerMember http://172.18.254.31:8080
这样就将242主机关闭,此时只会往31的服务器上进行调度
也可以设置为
BalancerMember http://172.18.254.242:8080 status=H 设置为备用,只有当31主机不可用时,该主机才会上线进行工作
BalancerMember http://172.18.254.31:8080
(7)使用ajp协议来调度
BalancerMember ajp://172.18.254.242:8009
BalancerMember ajp://172.18.254.31:8009
实现相同的调度,只需要将端口和协议名称改变即可
(8)启用内键管理器
<Location /balancer-manager>
SetHandler balancer-manager——启用内键的管理器
ProxyPass !——不会往后端调度而是自己进行管理
Require all granted——在实际应用中不可以这样授权,应该设置管理登录来实现
</Location>
</VirtualHost>

二.session回话保持的实现

三种保持方法:
(1)session sticky
source_ip
nginx: ip_hash
haproxy: source
lvs: sh
cookie:
nginx:hash
haproxy: cookie
(2) session cluster:delta session manager
(3) session server:redis(store), memcached(cache)

1.首先实现session sticky绑定的实现

在nginx或是apache服务器上进行设置
vim /etc/httpd/conf.d/http.tomcat.conf

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED——加入的请求的报文首部
                                   <proxy balancer://tcsrvs>
                                        BalancerMember http://172.18.254.242:8080  loadfactor=1 route=tcA——一定要加这个标识符,否则无法实现绑定的目的
                                        BalancerMember http://172.18.254.31:8080   loadfactor=1 route=tcB——同上
                                        ProxySet lbmethod=byrequests
                                        ProxySet stickysession=ROUTEID——新加入的内容,routeid进行会话绑定
                                      </Proxy>

                                <VirtualHost *:80>
                                        ServerName www.magedu.com
                                        ProxyVia On
                                        ProxyRequests Off
                                        ProxyPreserveHost On

                                       <Proxy *>
                                                Require all granted
                                        </Proxy>
                                        ProxyPass / balancer://tcsrvs/
                                        ProxyPassReverse / balancer://tcsrvs/
                                        <Location />
                                                Require all granted
                                        </Location>
                                </VirtualHost>

在后端tomcat服务器上vim /etc/tomcat/server.xml
在此加入jvmRoute="tcA" <Engine name="Catalina" defaultHost="localhost" jvmRoute="tcA">
同理在另一个后端服务器上做相同操作
配置完成后在网页上进行测试查看效果
显示结果是只要第一次选中了一个后端tomcat服务器,那么只要是同一个客户端发来的相同的请求就会往同一地址调度

2实现session cluster服务

步骤:此时在调度服务器上只需要将header和 ProxySet stickysession=ROUTEID注释掉即可
在tomcat服务器上
vim /etc/tomcat/server.xml

 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
132                  channelSendOptions="8">
133 
134           <Manager className="org.apache.catalina.ha.session.DeltaManager"
135                    expireSessionsOnShutdown="false"
136                    notifyListenersOnReplication="true"/>
137 
138           <Channel className="org.apache.catalina.tribes.group.GroupChannel">
139             <Membership className="org.apache.catalina.tribes.membership.McastService"
140                         address="228.0.25.62"——手动设置一个新的多播地址
141                         port="45564"
142                         frequency="500"
143                         dropTime="3000"/>
144             <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
145                       address="172.18.254.242"——设置为tomcat的服务器的ip地址
146                       port="4000"
147                       autoBind="100"
148                       selectorTimeout="5000"
149                       maxThreads="6"/>
150 
151             <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
152               <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
153             </Sender>
154             <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
155          <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>
156           </Channel>
157 
158           <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
159                  filter=""/>
160           <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>
                 <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
163                     tempDir="/tmp/war-temp/"
164                     deployDir="/tmp/war-deploy/"
165                     watchDir="/tmp/war-listen/"
166                     watchEnabled="false"/>
167 
168           <ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>——注意在官方文档上没有后面的“/”符号,在设置时一定要加上,否则无法启动tomcat
169           <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>——同上
170         </Cluster>

在另一个服务器上做相同操作,只需要将ip地址改为172.18.254.31即可
其次要设置 cp /etc/tomcat/web/xml /usr/share/tomcat/webapps/myapp/下
然后vim web.xml加入 <distributable/>实现集群会话
另一个主机同上操作
最后在网页上进行测试
结果是,进行多次访问时,虽然调度到不同的主机上,但是sessionID不发生变化


搜狗截图20171107122743.png

搜狗截图20171107122916.png

如图所示,sessionID未发生改变
注意细节:要同步各主机的时间,否则会影响实验结果
用nginx 和ajp协议访问结果相同

三.session server的实现
session server得实现方法:
(1)memcached
(2)redis
(3)couchbase
首先实现基于memcached的方法来实现
1.memcached的介绍
memcached是高性能、分布式的内存对象缓存系统
缓存服务器特点:
缓存:cache,无持久存储功能;
bypass缓存,依赖于客户端的智能;
k/v cache,仅支持存储可流式化数据;
k/v cache:仅可存储可序列化数据;存储项:k/v;
智能性一半依赖于客户端(调用memcached的API开发程序),一半依赖于服务端;
分布式缓存:互不通信的分布式集群;
分布式系统请求路由方法:取模法,一致性哈希算法;
算法复杂度:O(1)
清理过期缓存项:
缓存耗尽:LRU
缓存项过期:惰性清理机制
2.memcached的下载安装
yum install memcache


搜狗截图20171107171412.png

下载成功后直接开启服务systemctl start memcached
ss -ntlu 监听端口为11211
3.协议格式:memcached协议
支持 文本格式和二进制格式,如果没有文本格式就yum install libmemcached来支持二进制的格式
vim /usr/share/doc/memcached-1.4.15/protocol.txt来查看memcached使用的文档协议


搜狗截图20171107172113.png

使用telnet命令来演示
搜狗截图20171107173250.png

搜狗截图20171107173747.png

4.memcached程序的常用选项:
        -m <num>:Use <num> MB memory max to use for object storage; the default is 64 megabytes.
            -c <num>:Use <num> max simultaneous connections; the default is 1024.
            -u <username>:以指定的用户身份来运行进程;
            -l <ip_addr>:监听的IP地址,默认为本机所有地址;
            -p <num>:监听的TCP端口, the default is port 11211.
            -U <num>:Listen on UDP port <num>, the default is port 11211, 0 is off.
            -M:内存耗尽时,不执行LRU清理缓存,而是拒绝存入新的缓存项,直到有多余的空间可用时为止;
            -f <factor>:增长因子;默认是1.25;
            -t <threads>:启动的用于响应用户请求的线程数;
            
        memcached默认没有认证机制,可借用于SASL进行认证;
            SASL:Simple Authentication Secure Layer
            
        API:
            php-pecl-memcache
            php-pecl-memcached
            python-memcached
            libmemcached
            libmemcached-devel

5.启动memcached后,实现session server的配置
(1)在实际应用中,tomcat无法直接将缓存存放到memcached中,需要借助第三方的工具来实现,因此我们需要进入www.github.com

搜狗截图20171107174901.png

搜狗截图20171107175051.png

搜狗截图20171107175132.png

搜狗截图20171107175726.png

搜狗截图20171107175827.png

(2)了解过后开始进行配置
在虚拟机上vim /etc/tomcat/server.xml

<Engine name="Catalina" defaultHost="localhost" jvmRoute="tcA">
<Context  path="/myapp"  docBase="/usr/share/tomcat/webapps/myapp" reloadable="true"  >
  
  <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
    memcachedNodes="172.18.2544.242:11211,n2:172.18.254.31:11211"
    failoverNodes="n1"
    requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
    transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
    />
</Context>

复制该文件到172.18.254.31 另一个jvmRoute="tcB"
(3)mkdir kryo
下载相关文件


搜狗截图20171107210707.png

另一台主机也下载相同配置文件
重启服务后,在客户端测试查看结果


搜狗截图20171107213022.png
搜狗截图20171107213044.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,646评论 4 366
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,979评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,391评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,356评论 0 215
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,740评论 3 293
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,836评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,022评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,764评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,487评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,728评论 2 252
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,200评论 1 263
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,548评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,217评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,134评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,921评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,919评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,766评论 2 274

推荐阅读更多精彩内容