1. 程式人生 > >nginx+tomcat+memcached搭建負載均衡叢集實現交叉快取

nginx+tomcat+memcached搭建負載均衡叢集實現交叉快取

tomcat

tomcat簡介

Tomcat 伺服器是一個免費的開放原始碼的Web 應用伺服器,屬於輕量級應用伺服器,在中小型系統和併發訪問使用者不是很多的場合下被普遍使用,是開發和除錯JSP 程式的首選。對於一個初學者來說,可以這樣認為,當在一臺機器上配置好Apache 伺服器,可利用它響應HTML(標準通用標記語言下的一個應用)頁面的訪問請求。實際上Tomcat是Apache 伺服器的擴充套件,但執行時它是獨立執行的,所以當你執行tomcat 時,它實際上作為一個與Apache 獨立的程序單獨執行的。

tomcat的作用

通俗點說他是jsp網站的伺服器之一,就像asp網站要用到微軟的IIS伺服器,php網站用apache伺服器一樣,因為你的jsp動態網站使用指令碼語言等寫的,需要有伺服器來解釋你的語言吧,伺服器就是這個功能。如果你的網頁是純html的,瀏覽器就可以直接解釋檢視效果,但是你的網頁一但是.jsp .asp .php 等的動態網頁時瀏覽器自己就無法解釋了,需要上面說到的伺服器。tomcat便可以解釋jsp等java編寫的網站。

交叉快取

舉個例子向大家解釋一下:
兩個結點代表兩個memcache服務:
n1(server1):172.25.66.1:11211
n2(server2):172.25.66.2:11211
在這裡插入圖片描述
T1代表 n1 上的tomcat
T2代表 n2 上的tomcat
M1代表 n1 上的 memcache
M2代表 n2 上的 memcache
T1的session存到M2上
T2的session存到M1上 #session代表客戶端與伺服器之間的會話
當T1出問題後,T2接管T1的工作,從M2裡讀取T1的工作資料
當M2出問題,T1就把快取存到M1上
這就是交叉快取的含義,可以有效避免單節點出現故障

session

session:在計算機中,尤其是在網路應用中,稱為“會話控制”。Session物件儲存特定使用者會話所需的屬性及配置資訊。這樣,當用戶在應用程式的 Web 頁之間跳轉時,儲存在 Session物件中的變數將不會丟失,而是在整個使用者會話中一直存在下去。當用戶請求來自應用程式的 Web 頁時,如果該使用者還沒有會話,則 Web伺服器將自動建立一個 Session 物件。當會話過期或被放棄後,伺服器將終止該會話。Session物件最常見的一個用法就是儲存使用者的首選項。例如,如果使用者指明不喜歡檢視圖形,就可以將該資訊儲存在 Session 物件中。

實現交叉快取

實驗環境

作業系統:Rhel6.5
節點:
server1:172.25.66.1
server2:172.25.66.2

tomcat安裝與配置

在server1與server2中都要配置
一、在server1中:
1:tomcat的安裝需要java環境,所以先配置java環境
下載並解壓jdk-7u79-linux-x64.tar.gz
tar zxf jdk-7u79-linux-x64.tar.gz
mv jdk1.7.0_79/ /usr/local/
cd /usr/local/
ln -s jdk1.7.0_79/ java #生成連結以便版本升級,這一步可做可不做
在這裡插入圖片描述
2:配置java環境變數
vim /etc/profile
在裡面新增下面幾行

      export JAVA_HOME=/usr/local/java
      export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
      export PATH=$PATH:$JAVA_HOME/bin

在這裡插入圖片描述
執行source /etc/profile #載入環境變數
3:檢視路徑
echo $JAVA_HOME
echo $CLASSPATH
echo $PATH
which java
which javac
在這裡插入圖片描述
4:環境配好之後就開始安裝tomcat
下載apache-tomcat-7.0.90.tar.gz並解壓
tar zxf apache-tomcat-7.0.90.tar.gz
mv apache-tomcat-7.0.90 /usr/local/
cd /usr/local/
ln -s apache-tomcat-7.0.90/ tomcat
在這裡插入圖片描述
cd tomcat/
在這裡插入圖片描述
6:在網上下載下面幾個包,放到lib下(不用解壓)
這些都是tomcat常用的第三方jar包
在這裡插入圖片描述
7:啟動tomcat
cd /usr/local/tomcat
bin/startup.sh
在這裡插入圖片描述
8:檢視8080埠,tomcat預設佔用8080埠:
netstat -anplt | grep :8080
tomcat預設釋出目錄:
在這裡插入圖片描述
9:在瀏覽器訪問 172.25.66.1:8080 測試tomcat
出現以下介面就說明安裝成功:
在這裡插入圖片描述
10:生成jsp檔案,在tomcat預設釋出目錄中
vim test.jsp
寫入:
server1 time is: <%=new java.util.Date() %>
在這裡插入圖片描述
11:瀏覽器中訪問172.25.66.1:8080/test.jsp
在這裡插入圖片描述
12:配置tomcat
vim /usr/local/tomcat/conf/context.xml

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.66.1:11211,n2:172.25.66.2:11211"
failoverNodes="n1"  ##在server2 上設定為n2,意為當儲存的節點memcached宕掉,將session存放到本機
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>

在這裡插入圖片描述
二、在server2中:
1:先做上面和server1中同樣的操作,記得在上面第12步的時候將節點改為n2
2:下載memcached
yum install memcached -y
/etc/init.d/memcached start
3:檢視tomcat日誌,當server1和server6兩邊同時出現次資訊,表示共享成功
server1日誌的內容:cat /usr/local/tomcat/logs/catalina.2018-12-01.log
在這裡插入圖片描述
server2日誌的內容:
在這裡插入圖片描述

配置nginx

編輯配置檔案:
vim /usr/local/nginx/conf/nginx.conf

    18 http {
##在Http下新增策略 test 這個策略是呼叫tomcat(tomcat預設埠為8080)
    19         upstream test{
    20             sticky;
    21             server 172.25.66.2:8080;
    22             server 172.25.66.1:8080;
    23         }
 
##在server下新增 jsp 頁面處理策略 只要是jsp頁面,就跳到 test策略
##tomcat善於處理動態頁面,將所有jsp頁面全部交給tomcat去處理,實現動靜分離
    70         location ~ \.jsp$ {
    71                 proxy_pass http://test; 
    72         }
 
    ##新增server策略 當訪問 www.test.org 時跳到test策略
   126 server {
127         listen 80;
128         server_name www.test.org;
129 
130         location / {
131                 proxy_pass http://test;
132         }
133         }

檢測nginx配置檔案有沒有差錯
nginx -t
重啟nginx
nginx -s reload
在這裡插入圖片描述

測試

1:測試介面
寫到tomcat釋出目錄下,每個節點都要寫
vim /usr/local/tomcat/webapps/ROOT/test.jsp

<%@ page contentType="text/html; charset=GBK" %>                     
<%@ page import="java.util.*" %>
<html><head><title>Cluster App Test</title></head>
<body>
Server Info:
<%
out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%>
<%
out.println("<br> ID " + session.getId()+"<br>");
String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) {
String dataValue = request.getParameter("dataValue");
session.setAttribute(dataName, dataValue);
}
out.print("<b>Session list</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
String value = session.getAttribute(name).toString();
out.println( name + " = " + value+"<br>");
System.out.println( name + " = " + value);
}
%>
<form action="test.jsp" method="POST">
name:<input type=text size=20 name="dataName">
<br>
key:<input type=text size=20 name="dataValue">
<br>
<input type=submit>
</form>
</body>
</html> 

2:開啟瀏覽器訪問 http://www.test.org/test.jsp
在這裡插入圖片描述
現在session共享在server1(n1)上,tomcat服務啟用在serevr2上,當server1的memcache關掉之後,客戶端依舊可以輸入name還有key,但是session共享卻在server2(n2)上,保證了客戶端可以不間斷的輸入name還有key。
3:關掉server1的memcached
在這裡插入圖片描述
網頁中重新整理後:
在這裡插入圖片描述
可以看到,tomcat服務依然啟用在server2上,但是session已經轉移到了n2節點,實現了交叉快取