两台服务器实现会话共享
2019獨角獸企業重金招聘Python工程師標準>>>
? ???? ?前言: 公司的產品上線了, 對于大并發量的客戶訪問和對手的攻擊,真是苦不堪言,所以集群的部署重要,現在集群的部署一般有兩種方式,第一種,看到大部分人的做法一般是Nginx+Memcached+Tomcat進行一系列的轉發部署,但是說實話,我們自己去搞這個Nginx,轉發的效果并不是那么的完美,如果Nginx的服務器down掉的話,那么我們的整個站點,基本上就廢除了,所以我這邊用的的買了阿里云的ecs,買了一個負載均衡,進行的站點轉發功能,其中阿里云的安全騎士也挺好,可以幫我們檢測到攻擊,那兩臺不同ip的服務器,由一個主ip去進行了映射,比如192.168.1.101和192.168.1.102兩臺centos上部署了兩個tomcat,由我們的主ip192.168.1.100去訪問,轉發到兩者上,那么問題來了,如果其中的一臺down掉后,用戶就必須重新登陸了,更為嚴重的是,如果在支付環節出現了這樣的問題,那么后果不堪設想,我們今天使用Memcached +Tomcat7的環境,做一個會話共享轉移。
?
Memcached 環境安裝
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*如果執行完畢出現了一行綠色的信息,說明安裝成功
4. 啟動memcached服務
/usr/local/bin/memcached -d -m 10 -u root -l 192.168.141.64 -p 12000 -c 256 -P /tmp/memcached.pid-d選項是啟動一個守護進程,
 -m是分配給Memcache使用的內存數量,單位是MB,我這里是10MB,
 -u是運行Memcache的用戶,我這里是root,
 -l是監聽的服務器IP地址,如果有多個地址的話,我這里指定了服務器的IP地址192.168.0.200,
 -p是設置Memcache監聽的端口,我這里設置了12000,最好是1024以上的端口,
 -c選項是最大運行的并發連接數,默認是1024,我這里設置了256,按照你服務器的負載量來設定,
 -P是設置保存Memcache的pid文件,我這里是保存在 /tmp/memcached.pid
5. 測試是否啟動成功
[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. 配置啟動項
我們將memcached配置成為開機啟動項,省心又省力
假如啟動Memcache的服務器端的命令為:
 # /usr/local/bin/memcached -d -m 10 -u root -l 192.168.141.64 -p 12000 -c 256 -P /tmp/memcached.pid
 想開機自動啟動的話,只需在/etc/rc.d/rc.local中加入一行,下面命令
 /usr/local/memcached/bin/memcached -d -m 10 -p 12000 -u apache -c 256?
 上面有些東西可以參考一下:即,ip不指定時,默認是本機,用戶:最好選擇是:apache 或 deamon
 這樣,也就是屬于哪個用戶的服務,由哪個用戶啟動。
?
Tomcat7 環境安裝
tomcat和jdk的安裝環境,在此就不多說了,將java環境裝好,tomcat下載一個解壓版的就可以了,我這邊用的是7.063版本的。下載tomcat
配置會話共享
1.添加tomcat環境jar
這是我所用到的jar全部的包,再次我提供一個下載鏈接,請嚴格安裝下載包中的說明進行部署?下載jar包
上面紅色的兩個,tc7指的是使用了tomcat7版本,如果是6版本的話請更新為tc6的jar,將現在所有的jar放入tomcat/lib目錄下。
注意點:?
 -msm1.6.5依賴了Couchbase,需要添加couchbase-client的jar包,否則啟動會報: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,只可選一,否則啟動報錯。
 -msm源碼中的lib包版本太低:spymemcached-2.7.jar需要使用2.10.2,否則啟動tomcat報錯:
 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版本,否則報錯:?
 Caused by: java.lang.ClassNotFoundException: de.javakaffee.kryoserializers.DateSerializer
2.修改context.xml
在tomcat目錄下conf中找到context.xml文件,并添加為一下內容
<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" />到此為止呢,負載均衡的會話共享已經完成了,當使用100去訪問,如果其中down掉了一臺服務器的話,會話也不會丟失,一下午的辛酸啊 。。。。
?
Nginx方式
很多人還是中意于不花錢的Nginx的方式去實現負載均衡,那么上述的共享session的方式不變,我們只需要搭建一個Nginx的轉發http服務即可
1. 安裝Nginx
yum install pcre* ## nginx 依賴pcre類庫 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. 配置轉發服務
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標簽屬性說明
 1.className 必須
 類名:de.javakaffee.web.msm.MemcachedBackupSessionManager
 2.memcachedNodes 必須
 memcached節點:此屬性應該包含所有運行的 memcached節點或者membase bucket的uri地址,每一個memcached節點的屬性定義格式為<id>:<host>:<port>, 多個節點定義直接使用空格或者逗號分隔,形如:memcachedNodes="n1:app01:11211,n2:app02:11211",如果只 有單個的memcached節點,則<id>是可選項,只需配置<host>:<port>即可,形 如:memcachedNodes="localhost:11211"。
 如果我們配置的是membase,那么從1.6.0版本開始,我們可以配置指定一個或者多個membase bucket uris,形如:http://host1:8091/pools,http://host2:8091/pools。Bucket 名稱和密碼通過屬性username,password來定義。membase buckets連接需要遵循memcached協議,傳輸數據通過二進制流方式。
 3.failoverNodes 可選項
 故障轉移節點:可選項,對非黏性session不可用,屬性必須包含memcached節點集群的所有ids。節點id之間用空格或者逗號分隔。
 4.username 可選項
 從1.6.0版開始使用,并且是可選的。用來進行membase bucket或者SASL驗證,密碼可以為空。
 5.password 可選項
 從1.6.0版開始使用,并且是可選的。用來進行membase bucket或者SASL驗證,密碼可以為空。
 6.memcachedProtocol 可選項
 定義memcached協議,默認使用text文本,出屬性指明memcached使用的存儲協議。只支持text或者binary。
 7.sticky 可選項
 定義session方式為黏性或非黏性,默認為true,多個tomcat時需使用非黏性
 8.lockingMode 可選項
 只有非黏性session才使用,默認值為none
 none: 從不對session進行鎖定
 all: session將一直被鎖定,知道請求結束
 auto: 對于只讀請求,session將不會被鎖定,如果是非只讀請求,則session會被鎖定
 uriPattern:<regexp>: 通過正則表達式的方式來對請求uri以及查詢字符串進行匹配,只有匹配上的才會被鎖定。
 9.requestUriIgnorePattern 可選項
 此屬性是那些不能改備份Session的請求的正則表達式。如果像css,javascript,圖片等靜態文件被同一個Tomcat和同一個應用 上下文來提供,這些請求也會通過memcached-session-manager。但是這些請求在一個http會話中幾乎沒什么改變,所以他們沒必要 觸發Session備份。所以那些靜態文件沒必要觸發Session備份,你就可以使用此屬性定義。此屬性必須符合java regex正則規范。
 如:".*\.(png|gif|jpg|css|js)$"
 10.sessionBackupAsync 可選項
 指定Session是否應該被異步保存到Memcached中。 如果被設置為true,backupThreadCount設置起作用,如果設置false,通過sessionBackupTimeout設置的過期時間起作用。
 11.backupThreadCount 可選項
 用來異步保存Session的線程數,(如果sessionBackupAsync="true")。默認值為cup的內核數。
 12.sessionBackupTimeout 可選項
 設置備份一個Session所用的時間,如果操作超過時間那么保存失敗。此屬性只在sessionBackupAsync="false"是起作用。默認100毫秒
 13.operationTimeout 可選項
 從1.6.0版開始使用, 默認值為1000
 14.sessionAttributeFilter 可選項
 此屬性是用來控制Session 中的那個屬性值保存到Memcached中的正則表達式。鄭則表達式被用來匹配Session中屬性名稱。如 sessionAttributeFilter="^(userName|sessionHistory)$" 指定了只有"userName"和"sessionHistory"屬性保存到Memcached中。依賴于選擇的序列化策略。
 15.transcoderFactoryClass 可選項
 此屬性值是創建序列化和反序列化 保存到Memcached中的Session的編碼轉換器的工廠類名。這個指定的類必須實現了 de.javakaffee.web.msm.TranscoderFactory和提供一個無參的構造方法。例如其他的有效的實現在其他 packages/jars中提供如:msm-kryo-serializer,msm-xstrea-serializer和msm- javolution-serializer.
 默認為 de.javakaffee.web.msm.JavaSerializationTranscoderFactory
 16.copyCollectionsForSerialization 可選項
 默認值為false。
 17.customConverter 可選項
 自己定義特殊的類注冊到kryo自定義轉換器中,實現序列化
 18.enableStatistics 可選項
 用來指定是否進行統計。 默認值為true。
 19.enabled 可選項
 指定Session保存到Memcached中是否可用和是否可以通過JMX進行改變。只用于粘性Session。 默認值為true。
轉載于:https://my.oschina.net/gaoguofan/blog/757029
總結
以上是生活随笔為你收集整理的两台服务器实现会话共享的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 打不死的redis集群
 - 下一篇: Eclipse中javascript文件