一.實現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
搜狗截圖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