两台服务器实现会话共享
2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
? ???? ?前言: 公司的產(chǎn)品上線了, 對(duì)于大并發(fā)量的客戶訪問(wèn)和對(duì)手的攻擊,真是苦不堪言,所以集群的部署重要,現(xiàn)在集群的部署一般有兩種方式,第一種,看到大部分人的做法一般是Nginx+Memcached+Tomcat進(jìn)行一系列的轉(zhuǎn)發(fā)部署,但是說(shuō)實(shí)話,我們自己去搞這個(gè)Nginx,轉(zhuǎn)發(fā)的效果并不是那么的完美,如果Nginx的服務(wù)器down掉的話,那么我們的整個(gè)站點(diǎn),基本上就廢除了,所以我這邊用的的買了阿里云的ecs,買了一個(gè)負(fù)載均衡,進(jìn)行的站點(diǎn)轉(zhuǎn)發(fā)功能,其中阿里云的安全騎士也挺好,可以幫我們檢測(cè)到攻擊,那兩臺(tái)不同ip的服務(wù)器,由一個(gè)主ip去進(jìn)行了映射,比如192.168.1.101和192.168.1.102兩臺(tái)centos上部署了兩個(gè)tomcat,由我們的主ip192.168.1.100去訪問(wèn),轉(zhuǎn)發(fā)到兩者上,那么問(wèn)題來(lái)了,如果其中的一臺(tái)down掉后,用戶就必須重新登陸了,更為嚴(yán)重的是,如果在支付環(huán)節(jié)出現(xiàn)了這樣的問(wèn)題,那么后果不堪設(shè)想,我們今天使用Memcached +Tomcat7的環(huán)境,做一個(gè)會(huì)話共享轉(zhuǎn)移。
?
Memcached 環(huán)境安裝
1. 下載編譯文件
wget http://www.memcached.org/files/memcached-1.4.29.tar.gz ----下載memcached源文件wget https://cloud.github.com/downloads/libevent/libevent/libevent-2.0.15-stable.tar.gz -----下載libevent源文件2.?安裝編譯:
## lt編譯安裝 tar zxvf libevent-2.0.5-beta.tar.gz cd libevent-2.0.5 ./configure –prefix=/usr make make install## memcached編譯安裝 tar zxvf memcached-1.4.2.tar.gz cd memcached-1.4.2 ./configure --with-libevent=/usr make make install3. 檢查是否安裝成功?
ls -al /usr/local/bin/mem*如果執(zhí)行完畢出現(xiàn)了一行綠色的信息,說(shuō)明安裝成功
4. 啟動(dòng)memcached服務(wù)
/usr/local/bin/memcached -d -m 10 -u root -l 192.168.141.64 -p 12000 -c 256 -P /tmp/memcached.pid-d選項(xiàng)是啟動(dòng)一個(gè)守護(hù)進(jìn)程,
-m是分配給Memcache使用的內(nèi)存數(shù)量,單位是MB,我這里是10MB,
-u是運(yùn)行Memcache的用戶,我這里是root,
-l是監(jiān)聽(tīng)的服務(wù)器IP地址,如果有多個(gè)地址的話,我這里指定了服務(wù)器的IP地址192.168.0.200,
-p是設(shè)置Memcache監(jiān)聽(tīng)的端口,我這里設(shè)置了12000,最好是1024以上的端口,
-c選項(xiàng)是最大運(yùn)行的并發(fā)連接數(shù),默認(rèn)是1024,我這里設(shè)置了256,按照你服務(wù)器的負(fù)載量來(lái)設(shè)定,
-P是設(shè)置保存Memcache的pid文件,我這里是保存在 /tmp/memcached.pid
5. 測(cè)試是否啟動(dòng)成功
[root@localhost /]# telnet 192.168.141.64 12000 Trying 192.168.141.64... Connected to 192.168.141.64 (192.168.141.64). Escape character is '^]'. set key1 0 60 4 zhou STORED get key1 VALUE key1 0 4 zhou END6. 配置啟動(dòng)項(xiàng)
我們將memcached配置成為開(kāi)機(jī)啟動(dòng)項(xiàng),省心又省力
假如啟動(dòng)Memcache的服務(wù)器端的命令為:
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.141.64 -p 12000 -c 256 -P /tmp/memcached.pid
想開(kāi)機(jī)自動(dòng)啟動(dòng)的話,只需在/etc/rc.d/rc.local中加入一行,下面命令
/usr/local/memcached/bin/memcached -d -m 10 -p 12000 -u apache -c 256?
上面有些東西可以參考一下:即,ip不指定時(shí),默認(rèn)是本機(jī),用戶:最好選擇是:apache 或 deamon
這樣,也就是屬于哪個(gè)用戶的服務(wù),由哪個(gè)用戶啟動(dòng)。
?
Tomcat7 環(huán)境安裝
tomcat和jdk的安裝環(huán)境,在此就不多說(shuō)了,將java環(huán)境裝好,tomcat下載一個(gè)解壓版的就可以了,我這邊用的是7.063版本的。下載tomcat
配置會(huì)話共享
1.添加tomcat環(huán)境jar
這是我所用到的jar全部的包,再次我提供一個(gè)下載鏈接,請(qǐng)嚴(yán)格安裝下載包中的說(shuō)明進(jìn)行部署?下載jar包
上面紅色的兩個(gè),tc7指的是使用了tomcat7版本,如果是6版本的話請(qǐng)更新為tc6的jar,將現(xiàn)在所有的jar放入tomcat/lib目錄下。
注意點(diǎn):?
-msm1.6.5依賴了Couchbase,需要添加couchbase-client的jar包,否則啟動(dòng)會(huì)報(bào):java.lang.NoClassDefFoundError: com/couchbase/client/CouchbaseClient。
-tomcat6和7使用不同msm支持包:memcached-session-manager-tc6-1.6.5.jar和memcached-session-manager-tc7-1.6.5.jar,只可選一,否則啟動(dòng)報(bào)錯(cuò)。
-msm源碼中的lib包版本太低:spymemcached-2.7.jar需要使用2.10.2,否則啟動(dòng)tomcat報(bào)錯(cuò):
java.lang.NoSuchMethodError: net.spy.memcached.MemcachedClient.set(Ljava/lang/String;ILjava/lang/Object;)Lnet/spy/memcached/internal/OperationFuture;
at de.javakaffee.web.msm.BackupSessionTask.storeSessionInMemcached(BackupSessionTask.java:227)?
kryo-serializers-0.8.jar需要使用0.10版本,否則報(bào)錯(cuò):?
Caused by: java.lang.ClassNotFoundException: de.javakaffee.kryoserializers.DateSerializer
2.修改context.xml
在tomcat目錄下conf中找到context.xml文件,并添加為一下內(nèi)容
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"memcachedNodes="n1:112.74.210.155:12000"requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" sessionBackupAsync="false" sessionBackupTimeout="1800000"transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" />到此為止呢,負(fù)載均衡的會(huì)話共享已經(jīng)完成了,當(dāng)使用100去訪問(wèn),如果其中down掉了一臺(tái)服務(wù)器的話,會(huì)話也不會(huì)丟失,一下午的辛酸啊 。。。。
?
Nginx方式
很多人還是中意于不花錢的Nginx的方式去實(shí)現(xiàn)負(fù)載均衡,那么上述的共享session的方式不變,我們只需要搭建一個(gè)Nginx的轉(zhuǎn)發(fā)http服務(wù)即可
1. 安裝Nginx
yum install pcre* ## nginx 依賴pcre類庫(kù) useradd nginx tar xf /share/soft/lamp/nginx/nginx-1.4.7.tar.gz -C /usr/src/ cd /usr/src/nginx-1.4.7 ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module --with-http_stub_status_module make && make install2. 配置轉(zhuǎn)發(fā)服務(wù)
user nginx nginx;worker_processes 5;error_log logs/error.log;#error_log logs/error.log notice;#error_log logs/error.log info;pid logs/nginx.pid;events {worker_connections 1024;use epoll;}http {upstream session {server 10.1.1.217:8080 weight=1 max_fails=2 fail_timeout=30s;server 10.1.1.218:8080 weight=1 max_fails=2 fail_timeout=30s;}server {listen 80;server_name 10.1.1.217;root /nginxroot/;location ~ \.(txt|jsp)$ {proxy_pass http://session;}proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $http_host; } } mkdir /nginxroot/?
Manager標(biāo)簽屬性說(shuō)明
1.className 必須
類名:de.javakaffee.web.msm.MemcachedBackupSessionManager
2.memcachedNodes 必須
memcached節(jié)點(diǎn):此屬性應(yīng)該包含所有運(yùn)行的 memcached節(jié)點(diǎn)或者membase bucket的uri地址,每一個(gè)memcached節(jié)點(diǎn)的屬性定義格式為<id>:<host>:<port>, 多個(gè)節(jié)點(diǎn)定義直接使用空格或者逗號(hào)分隔,形如:memcachedNodes="n1:app01:11211,n2:app02:11211",如果只 有單個(gè)的memcached節(jié)點(diǎn),則<id>是可選項(xiàng),只需配置<host>:<port>即可,形 如:memcachedNodes="localhost:11211"。
如果我們配置的是membase,那么從1.6.0版本開(kāi)始,我們可以配置指定一個(gè)或者多個(gè)membase bucket uris,形如:http://host1:8091/pools,http://host2:8091/pools。Bucket 名稱和密碼通過(guò)屬性u(píng)sername,password來(lái)定義。membase buckets連接需要遵循memcached協(xié)議,傳輸數(shù)據(jù)通過(guò)二進(jìn)制流方式。
3.failoverNodes 可選項(xiàng)
故障轉(zhuǎn)移節(jié)點(diǎn):可選項(xiàng),對(duì)非黏性session不可用,屬性必須包含memcached節(jié)點(diǎn)集群的所有ids。節(jié)點(diǎn)id之間用空格或者逗號(hào)分隔。
4.username 可選項(xiàng)
從1.6.0版開(kāi)始使用,并且是可選的。用來(lái)進(jìn)行membase bucket或者SASL驗(yàn)證,密碼可以為空。
5.password 可選項(xiàng)
從1.6.0版開(kāi)始使用,并且是可選的。用來(lái)進(jìn)行membase bucket或者SASL驗(yàn)證,密碼可以為空。
6.memcachedProtocol 可選項(xiàng)
定義memcached協(xié)議,默認(rèn)使用text文本,出屬性指明memcached使用的存儲(chǔ)協(xié)議。只支持text或者binary。
7.sticky 可選項(xiàng)
定義session方式為黏性或非黏性,默認(rèn)為true,多個(gè)tomcat時(shí)需使用非黏性
8.lockingMode 可選項(xiàng)
只有非黏性session才使用,默認(rèn)值為none
none: 從不對(duì)session進(jìn)行鎖定
all: session將一直被鎖定,知道請(qǐng)求結(jié)束
auto: 對(duì)于只讀請(qǐng)求,session將不會(huì)被鎖定,如果是非只讀請(qǐng)求,則session會(huì)被鎖定
uriPattern:<regexp>: 通過(guò)正則表達(dá)式的方式來(lái)對(duì)請(qǐng)求uri以及查詢字符串進(jìn)行匹配,只有匹配上的才會(huì)被鎖定。
9.requestUriIgnorePattern 可選項(xiàng)
此屬性是那些不能改備份Session的請(qǐng)求的正則表達(dá)式。如果像css,javascript,圖片等靜態(tài)文件被同一個(gè)Tomcat和同一個(gè)應(yīng)用 上下文來(lái)提供,這些請(qǐng)求也會(huì)通過(guò)memcached-session-manager。但是這些請(qǐng)求在一個(gè)http會(huì)話中幾乎沒(méi)什么改變,所以他們沒(méi)必要 觸發(fā)Session備份。所以那些靜態(tài)文件沒(méi)必要觸發(fā)Session備份,你就可以使用此屬性定義。此屬性必須符合java regex正則規(guī)范。
如:".*\.(png|gif|jpg|css|js)$"
10.sessionBackupAsync 可選項(xiàng)
指定Session是否應(yīng)該被異步保存到Memcached中。 如果被設(shè)置為true,backupThreadCount設(shè)置起作用,如果設(shè)置false,通過(guò)sessionBackupTimeout設(shè)置的過(guò)期時(shí)間起作用。
11.backupThreadCount 可選項(xiàng)
用來(lái)異步保存Session的線程數(shù),(如果sessionBackupAsync="true")。默認(rèn)值為cup的內(nèi)核數(shù)。
12.sessionBackupTimeout 可選項(xiàng)
設(shè)置備份一個(gè)Session所用的時(shí)間,如果操作超過(guò)時(shí)間那么保存失敗。此屬性只在sessionBackupAsync="false"是起作用。默認(rèn)100毫秒
13.operationTimeout 可選項(xiàng)
從1.6.0版開(kāi)始使用, 默認(rèn)值為1000
14.sessionAttributeFilter 可選項(xiàng)
此屬性是用來(lái)控制Session 中的那個(gè)屬性值保存到Memcached中的正則表達(dá)式。鄭則表達(dá)式被用來(lái)匹配Session中屬性名稱。如 sessionAttributeFilter="^(userName|sessionHistory)$" 指定了只有"userName"和"sessionHistory"屬性保存到Memcached中。依賴于選擇的序列化策略。
15.transcoderFactoryClass 可選項(xiàng)
此屬性值是創(chuàng)建序列化和反序列化 保存到Memcached中的Session的編碼轉(zhuǎn)換器的工廠類名。這個(gè)指定的類必須實(shí)現(xiàn)了 de.javakaffee.web.msm.TranscoderFactory和提供一個(gè)無(wú)參的構(gòu)造方法。例如其他的有效的實(shí)現(xiàn)在其他 packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm- javolution-serializer.
默認(rèn)為 de.javakaffee.web.msm.JavaSerializationTranscoderFactory
16.copyCollectionsForSerialization 可選項(xiàng)
默認(rèn)值為false。
17.customConverter 可選項(xiàng)
自己定義特殊的類注冊(cè)到kryo自定義轉(zhuǎn)換器中,實(shí)現(xiàn)序列化
18.enableStatistics 可選項(xiàng)
用來(lái)指定是否進(jìn)行統(tǒng)計(jì)。 默認(rèn)值為true。
19.enabled 可選項(xiàng)
指定Session保存到Memcached中是否可用和是否可以通過(guò)JMX進(jìn)行改變。只用于粘性Session。 默認(rèn)值為true。
轉(zhuǎn)載于:https://my.oschina.net/gaoguofan/blog/757029
總結(jié)
以上是生活随笔為你收集整理的两台服务器实现会话共享的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 打不死的redis集群
- 下一篇: Eclipse中javascript文件