實驗:基於tomcat的高可用性+nginx(haproxy)反向代理+session伺服器memcached(redis)
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:
安裝jdk 和tomcat
yum -y install java-1.8.0-openjdk.x86_64 java-1.8.0-openjdk-devel wget相同情況安裝tomcat2http://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 tomcatcat > /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
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"