一.實現(xiàn)nginx與tomcat的反向代理負載均衡的應用
實驗原理圖:實驗環(huán)境準備:一個客戶端主機,一個調(diào)度器(反向代理服務器)刮便,兩個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.在后端服務器上創(chuàng)建目錄
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做區(qū)分即可
在網(wǎng)頁上測試: 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服務
在網(wǎng)頁客戶端進行測試 172.18.25.62/myapp
通過結(jié)果顯示代理成功
(4)在虛擬機客戶端使用curl命令來顯示是否均衡調(diào)度
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>
顯示結(jié)果為均衡調(diào)度
(5)使用httpd來實現(xiàn)調(diào)度
關掉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——相當于輪詢調(diào)度算法氢架,如果后端tomcat服務器有權(quán)重會按權(quán)重來進行調(diào)度
</Proxy>
<VirtualHost *:80>
ServerName www.magedu.com
ProxyVia On
ProxyRequests Off——關閉正向代理
ProxyPreserveHost On
<Proxy *>
Require all granted——授權(quán)
</Proxy>
ProxyPass / balancer://tcsrvs/——代理服務器地址
ProxyPassReverse / balancer://tcsrvs/
<Location />
Require all granted ——授權(quán)
</Location>
</VirtualHost>
經(jīng)過測試碌尔,httpd代理也成功
(6)擴展浇辜,實現(xiàn)權(quán)重的調(diào)度
BalancerMember http://172.18.254.242:8080 loadfactor=1
BalancerMember http://172.18.254.31:8080 loadfactor=3
在客戶端測試,實現(xiàn)3:1的調(diào)度
(7)健康性檢查
將tomcat后端服務器關閉一個唾戚,再到客戶端進行測試結(jié)果不會再往故障的tomcat服務器上進行調(diào)度
或者在host-tomcat.conf上
BalancerMember http://172.18.254.242:8080 status=D
BalancerMember http://172.18.254.31:8080
這樣就將242主機關閉柳洋,此時只會往31的服務器上進行調(diào)度
也可以設置為
BalancerMember http://172.18.254.242:8080 status=H 設置為備用,只有當31主機不可用時叹坦,該主機才會上線進行工作
BalancerMember http://172.18.254.31:8080
(7)使用ajp協(xié)議來調(diào)度
BalancerMember ajp://172.18.254.242:8009
BalancerMember ajp://172.18.254.31:8009
實現(xiàn)相同的調(diào)度熊镣,只需要將端口和協(xié)議名稱改變即可
(8)啟用內(nèi)鍵管理器
<Location /balancer-manager>
SetHandler balancer-manager——啟用內(nèi)鍵的管理器
ProxyPass !——不會往后端調(diào)度而是自己進行管理
Require all granted——在實際應用中不可以這樣授權(quán),應該設置管理登錄來實現(xiàn)
</Location>
</VirtualHost>
二.session回話保持的實現(xiàn)
三種保持方法:
(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.首先實現(xiàn)session sticky綁定的實現(xiàn)
在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——一定要加這個標識符募书,否則無法實現(xiàn)綁定的目的
BalancerMember http://172.18.254.31:8080 loadfactor=1 route=tcB——同上
ProxySet lbmethod=byrequests
ProxySet stickysession=ROUTEID——新加入的內(nèi)容绪囱,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">
同理在另一個后端服務器上做相同操作
配置完成后在網(wǎng)頁上進行測試查看效果
顯示結(jié)果是只要第一次選中了一個后端tomcat服務器,那么只要是同一個客戶端發(fā)來的相同的請求就會往同一地址調(diào)度
2實現(xiàn)session cluster服務
步驟:此時在調(diào)度服務器上只需要將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/>實現(xiàn)集群會話
另一個主機同上操作
最后在網(wǎng)頁上進行測試
結(jié)果是道盏,進行多次訪問時而柑,雖然調(diào)度到不同的主機上,但是sessionID不發(fā)生變化
如圖所示荷逞,sessionID未發(fā)生改變
注意細節(jié):要同步各主機的時間媒咳,否則會影響實驗結(jié)果
用nginx 和ajp協(xié)議訪問結(jié)果相同
三.session server的實現(xiàn)
session server得實現(xiàn)方法:
(1)memcached
(2)redis
(3)couchbase
首先實現(xiàn)基于memcached的方法來實現(xiàn)
1.memcached的介紹
memcached是高性能、分布式的內(nèi)存對象緩存系統(tǒng)
緩存服務器特點:
緩存:cache种远,無持久存儲功能涩澡;
bypass緩存,依賴于客戶端的智能坠敷;
k/v cache妙同,僅支持存儲可流式化數(shù)據(jù)射富;
k/v cache:僅可存儲可序列化數(shù)據(jù);存儲項:k/v粥帚;
智能性一半依賴于客戶端(調(diào)用memcached的API開發(fā)程序)胰耗,一半依賴于服務端;
分布式緩存:互不通信的分布式集群芒涡;
分布式系統(tǒng)請求路由方法:取模法柴灯,一致性哈希算法;
算法復雜度:O(1)
清理過期緩存項:
緩存耗盡:LRU
緩存項過期:惰性清理機制
2.memcached的下載安裝
yum install memcache
下載成功后直接開啟服務systemctl start memcached
ss -ntlu 監(jiān)聽端口為11211
3.協(xié)議格式:memcached協(xié)議
支持 文本格式和二進制格式费尽,如果沒有文本格式就yum install libmemcached來支持二進制的格式
vim /usr/share/doc/memcached-1.4.15/protocol.txt來查看memcached使用的文檔協(xié)議
使用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>:監(jiān)聽的IP地址,默認為本機所有地址旱幼;
-p <num>:監(jiān)聽的TCP端口查描, the default is port 11211.
-U <num>:Listen on UDP port <num>, the default is port 11211, 0 is off.
-M:內(nèi)存耗盡時,不執(zhí)行LRU清理緩存柏卤,而是拒絕存入新的緩存項冬三,直到有多余的空間可用時為止;
-f <factor>:增長因子闷旧;默認是1.25长豁;
-t <threads>:啟動的用于響應用戶請求的線程數(shù);
memcached默認沒有認證機制忙灼,可借用于SASL進行認證;
SASL:Simple Authentication Secure Layer
API:
php-pecl-memcache
php-pecl-memcached
python-memcached
libmemcached
libmemcached-devel
5.啟動memcached后钝侠,實現(xiàn)session server的配置
(1)在實際應用中该园,tomcat無法直接將緩存存放到memcached中泽艘,需要借助第三方的工具來實現(xiàn)澎迎,因此我們需要進入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
下載相關文件
另一臺主機也下載相同配置文件
重啟服務后直撤,在客戶端測試查看結(jié)果