tomcat
cos17和cos27主机当tomcat服务器,且同时在对应的cos17和cos27安装ningx做代理,这样tomcat就可以隐藏起来了
[root@cos17 ~ ]#yum install java-1.8.0-openjdk-devel tomcat tomcat-admin-webapps tomcat-webapps nginx -y
[root@cos17 ~ ]#mkdir myapp/{classes,lib,WEB-INF,META-INF} -p
[root@cos17 ~ ]#vim myapp/index.jsp
<%@ page language="java" %>
<html>
<head><title>TomcatA</title></head>
<body>
<h1><font color="red">TomcatA.dhy.com</font></h1>
<table align="centre" border="1">
<tr>
<td>Session ID</td>
<% session.setAttribute("dhy.com","dhy.com"); %>
<td><%= session.getId() %></td>
</tr>
<tr>
<td>Created on</td>
<td><%= session.getCreationTime() %></td>
</tr>
</table>
</body>
</html>
[root@cos17 ~ ]#cp -r myapp /usr/share/tomcat/webapps/
[root@cos17 ~ ]#systemctl start tomcat
[root@cos27 ~ ]#
同cos17
浏览器输入http://192.168.31.27:8080/myapp/ 可以访问tomcat
[root@cos17 ~ ]#vim /etc/nginx/nginx.conf
server {
index index.jsp index.html
location / {
proxy_pass http://127.0.0.1:8080/;
[root@cos17 ~ ]#scp /etc/nginx/nginx.conf 192.168.31.27:/etc/nginx/
[root@cos17 ~ ]#tail -f /var/log/nginx/error.log
2018/09/09 10:03:57 [crit] 6766#0: *1 connect() to 127.0.0.1:8080 failed (13: Permission denied) while connecting to upstream, client: 192.168.31.1, server: _, request: "GET /poweredby.png HTTP/1.1", upstream: "http://127.0.0.1:8080/myapppoweredby.png", host: "192.168.31.17", referrer: "http://192.168.31.17/"
当启用nginx做代理时,若遇到502 bad gateway报错,请关闭selinux
如图1,图2
====================================
[root@cos7 ~ ]#yum install nginx -y
[root@cos7 ~ ]#vim /etc/nginx/nginx.conf
# for more information.
include /etc/nginx/conf.d/*.conf;
upstream tcsrvs {
server 192.168.31.17:80 weight=1;
server 192.168.31.27:80 weight=2;
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://tcsrvs;
}
[root@cos7 ~ ]#systemctl startnginx
浏览器做代理,实现负载均衡http://192.168.31.7/myapp/
session cookie
或者用http做代理,实现负载均衡及session cookie
[root@cos7 ~ ]#systemctl stop nginx
[root@cos7 ~ ]#yum install httpd
[root@cos7 ~ ]#httpd -M | grep lb
lbmethod_bybusyness_module (shared) #lc
lbmethod_byrequests_module (shared) #roundrobin
lbmethod_bytraffic_module (shared) #基于链路流量控制
[root@cos7 ~ ]#vim /etc/httpd/conf.d/nginx.conf
Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED #会话绑定
<proxy balancer://tcsrvs>
BalancerMember http://192.168.31.17:8080 route=TomcatA loadfactor=1
BalancerMember http://192.168.31.27:8080 route=TomcatB loadfactor=2
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID #会话绑定
</Proxy>
<VirtualHost *:80>
ServerName lb.dhy.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
<Proxy *>
Require all granted
</Proxy>
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
<Location />
Require all granted
</Location>
<Location /dhy-manager> #负载均衡器管理界面,如图4
SetHandler balancer-manager
ProxyPass !
Require all granted
</Location>
</VirtualHost>
[root@cos7 ~ ]#httpd -t
Syntax OK
[root@cos7 ~ ]#systemctl start httpd
[root@cos27 ~ ]#vim /etc/tomcat/server.xml
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcatB-engince">
图3
后端cos17和cos27用nignx作本地代理,如果卸载nginx,用httpd负载均衡的cos7和后端tomcat直接通信,可以把负载均衡的cos7主机上http协议改为ajp协议,而tomcat支持ajp协议
cookie是根据主机标识找到上次访问的的一个主机,以便用户访问的服务器信息后不会丢失,但当这个主机宕机,则又引起单点失败,可以用tomcat集群
==============================================
session replication
session replication cluster
tomcat集群
删除cos7上的session cookie配置
[root@cos17 ~ ]#yum install tomcat-docs-webapp.noarch -y
浏览器输入:http://192.168.31.17:8080/docs/
http://192.168.31.17:8080/docs/cluster-howto.html
[root@cos17 ~ ]#vim /etc/tomcat/server.xml
[root@cos27 ~ ]#vim /etc/tomcat/server.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="auto"
port="4000"
autoBind="100"
selectorTimeout="5000"
maxThreads="6"/>
#maxThreads集群个数减1
<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"/>
<Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
tempDir="/tmp/war-temp/"
deployDir="/tmp/war-deploy/"
watchDir="/tmp/war-listen/"
watchEnabled="false"/>
#文档没有闭合标签
<ClusterListener className="org.apache.catalina.ha.session.JvmRouteSessionIDBinderListener"/>
<ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>
[root@cos17 ~ ]#cp -r /etc/tomcat/web.xml /usr/share/tomcat/webapps/myapp/WEB-INF/
[root@cos17 ~ ]#vim /usr/share/tomcat/webapps/myapp/WEB-INF/web.xml
<!-- listings is enabled? [true] -->
<distributable/>
#添加distributable,作为会话集权到myapp一个实例中
[root@cos17 ~ ]#tail -100 /var/log/tomcat/catalina.
catalina.2018-09-09.log catalina.out
[root@cos27 ~ ]#systemctl restart tomcat
[root@cos17 ~ ]#systemctl restart tomcat
#可以看到日志中,会话已经加入
浏览器刷新,不回再改变
此session replication中tomcat的数量不宜过多,太多,组播发送的数据占用太多局域网带宽
可以用session server中的memcached
============================
session server之memcached
memcached 保存在内存,断电即丢失
redis #持久化保存,内存中运行,定期同步到磁盘
MSM:memcached session manager
把会话从tomcat剥离出来到memcached,memcached当tomcat的客户端,memchaced用java编写,java是面向对象的,数据是有结构的,放到磁盘,则数据要0,1存储,被流式化,从磁盘取出来到内存,要流式化,再把数据还原为有结构的数据到内存,要借助工具;数据从memcached内存取出来经过网络到达tomcat,需要工具转换数据格式,工具一般都是采用加标签,如xml,json,JSON格式的YAML文件(YAML Ain’t Markup Language),3者一个一个轻量
memcached作为session server使用配置
分布式算法:一致性hash算法
memcached的特征
memcached作为高速运行的分布式缓存服务器,具有以下的特点。
• 协议简单
• 基于libevent的事件处理
• 内置内存存储方式
• memcached不互相通信的分布式
旁路式缓存系统
请参见memcahced.pfd文档
[root@cos17 ~ ]#yum info memcached
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
Available Packages
Name : memcached
Arch : x86_64
Version : 1.4.15
Release : 10.el7_3.1
Size : 85 k
Repo : base
Summary : High Performance, Distributed Memory Object Cache
URL : http://www.memcached.org/
License : BSD
Description : memcached is a high-performance, distributed memory object caching
: system, generic in nature, but intended for use in speeding up dynamic
: web applications by alleviating database load.
[root@cos17 ~ ]#yum install memcached -y
[root@cos17 ~ ]#yum info libmemcached
#工具,c++库
[root@cos17 ~ ]#yum install libmemcached -y
如果安装了libmemcached这个面向C/C++语言的客户端库,就会安装memstat这个命令
[root@cos17 ~ ]#yum list all |grep memcached
memcached.x86_64 1.4.15-10.el7_3.1 @base
libmemcached.i686 1.0.16-5.el7 base
libmemcached.x86_64 1.0.16-5.el7 base
libmemcached-devel.i686 1.0.16-5.el7 base
libmemcached-devel.x86_64 1.0.16-5.el7 base
memcached-devel.i686 1.4.15-10.el7_3.1 base
memcached-devel.x86_64 1.4.15-10.el7_3.1 base
opensips-memcached.x86_64 1.10.5-3.el7 epel1
php-ZendFramework-Cache-Backend-Libmemcached.noarch
php-pecl-memcached.x86_64 2.2.0-1.el7 epel
python-memcached.noarch 1.48-4.el7 base
uwsgi-router-memcached.x86_64 2.0.16-1.el7 epel1
[root@cos17 ~ ]#memcached -h
memcached 1.4.15
-p <num> TCP port number to listen on (default: 11211)
-U <num> UDP port number to listen on (default: 11211, 0 is off)
-m <num> max memory to use for items in megabytes (default: 64 MB)
-f <factor> chunk size growth factor (default: 1.25)
-S Turn on Sasl authentication
simple authentication secure layer,框架,为不支持认证框架的程序提供简单的认证,如smtp协议
[root@cos17 ~ ]#cat /usr/lib/systemd/system/memcached.service
[Unit]
Description=Memcached
Before=httpd.service
After=network.target
[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/memcached
ExecStart=/usr/bin/memcached -u $USER -p $PORT -m $CACHESIZE -c $MAXCONN $OPTIONS
[Install]
WantedBy=multi-user.target
[root@cos17 ~ ]#vim /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="10240"
CACHESIZE="256"
OPTIONS="-f 1.5"
[root@cos17 ~ ]#systemctl start memcached
[root@cos17 ~ ]#ps aux
memcach+ 2639 0.0 0.1 344080 1688 ? Ssl 15:03 0:00 /usr/bin/memcached -u memcached -p 11211 -
[root@cos17 ~ ]#cat /proc/2639/cmdline
/usr/bin/memcached-umemcached-p11211-m256-c10240-f1.5
[root@cos17 ~ ]#rpm -ql libmemcached
[root@cos17 ~ ]#memping -h
[root@cos17 ~ ]#memping --servers='127.0.0.1:11211'
[root@cos17 ~ ]#less /usr/share/doc/memcached-1.4.15/protocol.txt
$ telnet localhost 11211
Trying 127.0.0.1…
Connected to localhost.localdomain (127.0.0.1).
Escape character is ‘^]’.
set foo 0 0 3 (保存命令)
bar (数据)
STORED (结果)
get foo (取得命令)
VALUE foo 0 3 (数据)
bar (数据)
[root@cos17 ~ ]#telnet 192.168.31.17 11211
Trying 192.168.31.17...
Connected to 192.168.31.17.
Escape character is '^]'.
stats
add mykey 0 600 9 #关键字key,600秒过期,字节大小
dhy.com
STORED
incr mykey 10
delete mykey
flush #清空