一.实现nginx与tomcat的反向代理负载均衡的应用
实验原理图:实验环境准备:一个客户端主机,一个调度器(反向代理服务器),两个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
可以看出不同的效果,证明编辑成功
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
通过结果显示代理成功
(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不发生变化
如图所示,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
下载成功后直接开启服务systemctl start memcached
ss -ntlu 监听端口为11211
3.协议格式:memcached协议
支持 文本格式和二进制格式,如果没有文本格式就yum install libmemcached来支持二进制的格式
vim /usr/share/doc/memcached-1.4.15/protocol.txt来查看memcached使用的文档协议
使用telnet命令来演示
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
(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
下载相关文件
另一台主机也下载相同配置文件
重启服务后,在客户端测试查看结果