Nginx+tomcat+memcached實現session共享


nginx裝載skity模塊

出現緣由


1.要想作Nginx+tomcat+memcached實現session共享,首先在nginx裝載skity模塊css

保證同一個用戶的訪問由同一個tomcat處理.

2.ip hash 算法存在弊端由於經過cdn訪問的網頁,
html

在服務器看來都是同一個ip訪問的,結果都是同一個服務器響應,不能很好的負載均衡.
java


nginx 添加skity模塊


靜態編譯從新編譯nginx

tar zxf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz

cd nginx-1.10.3

make clean

./configure --prefix=/usr/local/nginx/ --with-http_ssl_module --with-http_stub_status_module 
make && make install


cd /usr/local/nginx/conf/
web

vim nginx.conf算法

 22         upstream westos{
 23         sticky;
 24         server 172.25.88.12:8080;
 25         server 172.25.88.13:8080;
 26         }

nginx -s reload數據庫


檢驗


在瀏覽器訪問    http://172.25.88.11/test.jspvim

不清空cookie訪問的一直都同樣刪了cookie就不同拉
或者開兩個瀏覽器,由於cookiecookie不同,因此訪問的不同
不斷刷新,也不會便變!!跨域

wKioL1jZ1UzCP-bUAACMlNtmGEA120.png




wKiom1jZ1UzAz9DZAACVAVFcb60247.png




tomcat+memcached實現session共享


什麼是session?瀏覽器

在網頁上註冊上填的一些信息還沒來的及存入數據庫這個時候是存在session的。

   

在生產環境中,爲了負載均衡,一般不一樣的服務器,可能會存儲不一樣的session,但這樣就會有一些問題,同一個用戶的session有可能不全在一個服務器上,因此實現session共享就顯得格外重要了


Tips:

1.session和memcache都在內存中

2.cookie不能跨域名。

3.雲平臺彈性計算在線擴容


架構設計(交叉存儲)

t12在正常工做的時候,把session存儲m12:planA
當m13壞了,才存儲在m12(planB:副本) m12是t12的failoverNode(故障切換點) 

這樣配置的好處是,當t12,m12同時壞了,t12的數據在m13上,m13能夠直接讀取t12的數據 
這樣一來就能夠防止單點故障啦~

wKioL1jZ2zTzyNl4AAArnd1d7CY078.png



server12,server3

yum install -y memcached
/etc/init.d/memcached start


真機


scp jar/ root@172.25.88.13:/usr/local/tomcat/lib
scp jar/
 root@172.25.88.12:/usr/local/tomcat/lib

cd /usr/local/tomcat/lib/
rm -rf memcached-session-manager-tc6-1.6.3.jar


wKiom1jZ1U2w3KLzAAD8bb5lsVc493.png


cd /usr/local/tomcat/conf/
vim context.xm

l

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.4.12:11211,n2:172.25.4.13:11211"
      #server13爲n2
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"
/>
</Context>



測試頁面

cd /usr/local/tomcat/webapps/ROOT

vim 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>

bin/startup.sh

tail -f logs/catalina.out


當出現finished Initialzation 才說明,tomcat啓動成功!!!


wKioL1jZ1U2BkrkYAADX__omP8c419.png


wKiom1jZ1VKwD0Z9AADo9AgYCXk595.png




server13:

Server Info: 172.25.88.13 : 8080           

ID 0412CF61D0CD936D00445533643F8B79-n1
Session listuser2 = 22222
user1 = 111111


 訪問的是13,能夠從日誌中看出來,可是存儲在server12


wKiom1jZ1U6wtgdaAAE_K2lSrvI029.png

server12:


telnet localhost 11211

[root@server12 bin]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
get 0412CF61D0CD936D00445533643F8B79-n1
VALUE 0412CF61D0CD936D00445533643F8B79-n1 2048 118
W[<[<01[<[<#0412CF61D0CD936D00445533643F8B79-n1user222222user1111111
END


wKioL1jZ1U7h8ZjCAABjlB3R9Cw953.png


servr13中就沒有~


[root@server13 bin]# telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
get 0412CF61D0CD936D00445533643F8B79-n1
END


wKiom1jZ1U6AUJaRAAA12Qt_yWA601.png


模擬t13故障了,t12就接管業務了,仍是存儲在12上!


[root@server13 tomcat]# bin/shutdown.sh

Server Info: 172.25.88.12 : 8080

ID 0412CF61D0CD936D00445533643F8B79-n1
Session listuser2 = 22222
user1 = 111111
user3 = 333333


wKiom1jZ1U-D3m1gAAD6nTYzm6I956.png



仍是存儲在server12的m12上



wKiom1jZ1VDQoJWnAAD2zeSOprk114.png



這個時候,若是server12的m12壞了,就存入存儲在server13拉

[root@server12 bin]# /etc/init.d/memcached stop

Server Info: 172.25.88.12 : 8080

ID 0412CF61D0CD936D00445533643F8B79-n2
Session listuser4-2mdown = 44444
user2 = 22222
user1 = 111111
user3 = 333333



wKioL1jZ1VHB67gnAAE3Mo5ro60032.png






總結



訪問 http://172.25.88.11/test.jsp,不一樣的主機訪問時會調度到不一樣的 tomcat 實例上處理.


來自同一主機的請求會交給同一個 tomcat 實例處理,此時你 down 掉當前正在響應的 tomcat 實例,nginx 會自動把用戶的請求調度到另外一個 tomcat 實例上,同時 session 也沒有丟掉,由於另外一個tomcat上的memcached上存儲了down機的session.


這個時候接下來的數據就存在另外一個tomcat上了,直到down機修復,在此期間,用戶的訪問請求不受任何影響

相關文章
相關標籤/搜索