1. 程式人生 > 其它 >基於tomcat的高可用性+nginx(haproxy)反向代理+session伺服器memcached(redis)

基於tomcat的高可用性+nginx(haproxy)反向代理+session伺服器memcached(redis)

前提:需要先安裝java,本質:執行在java虛擬機器上的一個程式

功能:tomcat是web應用伺服器,將java程式執行在tomcat內,將程式的結果以web的形式返還給使用者,使用者訪問是結果來自於java的執行結果;nginx和apche是靜態伺服器,java它們不支援;

注意:網頁升級後,需要清除快取在work較深的jsp資料夾裡儲存

tomcat的根目錄結構:

安裝路徑:/usr/local/tomcat/webapps/ROOT

tomcat會認為webapps下的每個目錄是一個單獨的java應用,所以網站的ROOT和

配置檔案:

修改子配置檔案需要注意檔案的屬性,需要修改所屬組和所有者

結合反向代理實現tomcat部署

nginx+tomcat

tomcat負載均衡

會話保持方式:

會話黏性:

基於session和cookie的來進行,相同的向統一提供服務的機器進行排程

session複製:Tomcat自己的提供的多播叢集,通過多播將任何一臺的session同步到其它節點。

缺點

Tomcat的同步節點不宜過多,互相即時通訊同步session需要太多頻寬;每一臺都擁有全部session,記憶體損耗太多

需要修改兩個地方的配置

session 共享伺服器:使用memcached、redis做共享的Session伺服器

memcached:小型快取伺服器

Session 問題方案總結

1. session繫結,基於IP或session cookie的。其部署簡單,尤其基於session黏性的方式,粒度小,對負載均衡影響小。但一旦後端伺服器有故障,其上的session丟失。

2. session複製叢集,基於tomcat實現多個伺服器內共享同步所有session。此方法可以保證任意一臺後端伺服器故障,其餘各伺服器上還都存有全部session,對業務無影響。但是它基於多播實現心跳,TCP單播實現複製,當裝置節點過多,這種複製機制不是很好的解決方案。且併發連線多的時候,單機上的所有session佔據的記憶體空間非常巨大,甚至耗盡記憶體。

3. session伺服器,將所有的session儲存到一個共享的記憶體空間中,使用多個冗餘節點儲存session,這樣做到session儲存伺服器的高可用,且佔據業務伺服器記憶體較小。是一種比較好的解決session持久的解決方案。

不過以上這些方法都是在記憶體中實現了session的保持,可以使用資料庫或者檔案系統,把session資料儲存起來,持久化。這樣伺服器重啟後,也可以重新恢復session資料。不過session資料是有時效性的,是否需要這樣做,視情況而定

實驗:基於tomcat的高可用性+nginx(haproxy)反向代理+session伺服器memcached(redis)

實驗規劃:

tomcat二進位制安裝tomcat1和tomcat2:

yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel

wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.50/bin/apache-tomcat-8.5.50.tar.gz

tar xvf apache-tomcat-8.5.64.tar.gz -C /usr/local/ 

cd /usr/local/

#指定PATH變數

ln -s apache-tomcat-8.5.64/ tomcat

echo 'PATH=/usr/local/tomcat/bin:$PATH' > /etc/profile.d/tomcat.sh

. /etc/profile.d/tomcat.sh

useradd -r -s /sbin/nologin tomcat

cat > /usr/local/tomcat/conf/tomcat.conf << EOF

#兩個變數至少設定一項才能啟動 tomcat,這行是至需要將java路徑指向出來,如是yum安裝通如下路徑:

JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.181-7.b13.el7.x86_64/

#JAVA_HOME=/usr/local/jdk

#JRE_HOME=/usr/local/jdk/jre

EOF

chown -R tomcat.tomcat /usr/local/tomcat/

#建立tomcat.service檔案

cat > /lib/systemd/system/tomcat.service << EOF

[Unit]

Description=Tomcat

After=syslog.target network.target 

[Service]

Type=forking

EnvironmentFile=/usr/local/tomcat/conf/tomcat.conf

ExecStart=/usr/local/tomcat/bin/startup.sh

ExecStop=/usr/local/tomcat/bin/shutdown.sh

PrivateTmp=true

User=tomcat

Group=tomcat

[Install]

WantedBy=multi-user.target

EOF

systemctl daemon-reload

systemctl enable --now tomcat.service
相同情況安裝tomcat2

nginx+tomcat實現動靜分離:

tomcat安裝完畢;

yum install nginx -y

#增加3個頁面

echo /usr/local/tomcat/webapps/ROOT/tomcat1_static.html >/usr/local/tomcat/webapps/ROOT/test.html

echo /usr/local/tomcat/webapps/ROOT/tomcat1_dynamic.jsp >/usr/local/tomcat/webapps/ROOT/test.jsp

echo nginx1 > /usr/share/nginx/html/test.html

vim /etc/nginx/nginx.conf

#下面位置增加這麼3行

location ~* \.jsp$ {

proxy_pass http://127.0.0.1:8080; 

}

curl 192.168.37.105/test.html

curl 192.168.37.105/test.jsp

nginx實現負載均衡:

vim /etc/nginx/nginx.conf

#新增如下語句塊:

upstream tomcat-server {

#ip_hash; 

server t1.lijian.com:8080;

server t2.lijian.com:8080;

}

location ~* \.(jsp|do)$ {

proxy_pass http://tomcat-server;

}

systemctl restart nginx

配置代理103上的hosts檔案

vim /etc/hosts

192.168.37.105 t1.lijian.com t1

192.168.37.106 t2.lijian.com t2

在tomcat1上安裝配置memcached:

yum install memcached -y

檢查配置檔案,無問題

cat /etc/sysconfig/memcached 

PORT="11211"     #監聽埠

USER="memcached" #啟動使用者

MAXCONN="1024"  #最大連線數

CACHESIZE="64"  #最大使用記憶體

OPTIONS="-l 127.0.0.1,::1" #其他選項

修改tomcat1配置檔案:

vim /usr/local/tomcat/conf/server.xml

#修改預設頁面

<Engine name="Catalina" defaultHost="www.lijian.com">

#配置虛擬機器

<Host name="www.lijian.com" appBase="/data/webapps"

unpackWARs="true" autoDeploy="true">

</Host>

#建立測試頁面:

vim /data/webapps/ROOT/index.jsp

<%@ page import="java.util.*" %> 

<!DOCTYPE html>

<html lang="en">

<head>

  <meta charset="UTF-8">

  <title>tomcat test</title>

</head>

<body>

<div>On <%=request.getServerName() %></div>

<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>

<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>

<%=new Date()%>

</body>

</html>

#修改許可權

chown -R tomcat.tomcat /data/webapps/
測試session在變化:

#sticky 模式配置msm

vim /usr/local/tomcat/conf/context.xml

###倒數第一行前,即</Context>行的前面,加下面內容

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:192.168.37.105:11211,n2:192.168.37.106:11211"                     

failoverNodes="n1"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

/>

#相關包放到/usr/local/tomcat/lib下

asm-5.2.jar

kryo-3.0.3.jar

kryo-serializers-0.45.jar

memcached-session-manager-2.3.2.jar

memcached-session-manager-tc8-2.3.2.jar

minlog-1.3.1.jar

msm-kryo-serializer-2.3.2.jar

objenesis-2.6.jar

reflectasm-1.11.9.jar

spymemcached-2.12.3.jar

tomcat2的配置:按照tomcat配置

#配置msm

vim /usr/local/tomcat/conf/context.xml

###倒數第一行前,即</Context>行的前面,加下面內容

<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"

memcachedNodes="n1:192.168.37.105:11211,n2:192.168.37.106:11211"                     

failoverNodes="n2"

requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"

/>

#non-sticky 模式配置msm

#在前面實驗基礎上修改,memcached配置不變,只需要修改tomcat配置

sticky="false"

sessionBackupAsync="false"

lockingMode="uriPattern:/path1|/path2"

測試:

redis快取

yum -y install redis

sed -i.bak 's/^bind.*/bind 0.0.0.0/' /etc/redis.conf

systemctl enable --now redis

#和non-sticky的memcached相比,只修改此行

vim /usr/local/tomcat/conf/context.xml 

memcachedNodes="redis://10.0.0.103:6379"