一.实现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
3 TomcatA
4
5 TomcatA.magedu.com
6
7
8 Session ID
9 <% session.setAttribute("magedu.com","magedu.com"); %>
10 <%= session.getId() %>
11
12
13 Created on
14 <%= session.getCreationTime() %>
15
16
17
18
在另一主机上做相同操作,只需要将"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
TomcatA
TomcatA.magedu.com
TomcatA
TomcatA.magedu.com
TomcatA
TomcatA.magedu.com
TomcatA
TomcatA.magedu.com
TomcatA
TomcatA.magedu.com
TomcatA
TomcatA.magedu.com
TomcatA
TomcatA.magedu.com
TomcatA
TomcatA.magedu.com
TomcatA
TomcatA.magedu.com
TomcatA
TomcatA.magedu.com
显示结果为均衡调度
(5)使用httpd来实现调度
关掉nginx服务器,打开httpd
vim /etc/httpd/conf.d/host-tomcat.conf
BalancerMember http://172.18.254.242:8080
BalancerMember http://172.18.254.31:8080
ProxySet lbmethod=byrequests——相当于轮询调度算法,如果后端tomcat服务器有权重会按权重来进行调度
ServerName www.magedu.com
ProxyVia On
ProxyRequests Off——关闭正向代理
ProxyPreserveHost On
Require all granted——授权
ProxyPass / balancer://tcsrvs/——代理服务器地址
ProxyPassReverse / balancer://tcsrvs/
Require all granted ——授权
经过测试,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)启用内键管理器
SetHandler balancer-manager——启用内键的管理器
ProxyPass !——不会往后端调度而是自己进行管理
Require all granted——在实际应用中不可以这样授权,应该设置管理登录来实现
二.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——加入的请求的报文首部
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进行会话绑定
ServerName www.magedu.com
ProxyVia On
ProxyRequests Off
ProxyPreserveHost On
Require all granted
ProxyPass / balancer://tcsrvs/
ProxyPassReverse / balancer://tcsrvs/
Require all granted
在后端tomcat服务器上vim /etc/tomcat/server.xml
在此加入jvmRoute="tcA"
同理在另一个后端服务器上做相同操作
配置完成后在网页上进行测试查看效果
显示结果是只要第一次选中了一个后端tomcat服务器,那么只要是同一个客户端发来的相同的请求就会往同一地址调度
2实现session cluster服务
步骤:此时在调度服务器上只需要将header和 ProxySet stickysession=ROUTEID注释掉即可
在tomcat服务器上
vim /etc/tomcat/server.xml
133
134
137
138
139
144
150
151
152
153
154
155
156
157
158
160
167
168 ——注意在官方文档上没有后面的“/”符号,在设置时一定要加上,否则无法启动tomcat
169 ——同上
170
在另一个服务器上做相同操作,只需要将ip地址改为172.18.254.31即可
其次要设置 cp /etc/tomcat/web/xml /usr/share/tomcat/webapps/myapp/下
然后vim web.xml加入
另一个主机同上操作
最后在网页上进行测试
结果是,进行多次访问时,虽然调度到不同的主机上,但是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 :Use MB memory max to use for object storage; the default is 64 megabytes.
-c :Use max simultaneous connections; the default is 1024.
-u :以指定的用户身份来运行进程;
-l :监听的IP地址,默认为本机所有地址;
-p :监听的TCP端口, the default is port 11211.
-U :Listen on UDP port , the default is port 11211, 0 is off.
-M:内存耗尽时,不执行LRU清理缓存,而是拒绝存入新的缓存项,直到有多余的空间可用时为止;
-f :增长因子;默认是1.25;
-t :启动的用于响应用户请求的线程数;
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
复制该文件到172.18.254.31 另一个jvmRoute="tcB"
(3)mkdir kryo
下载相关文件
另一台主机也下载相同配置文件
重启服务后,在客户端测试查看结果