您好,登錄后才能下訂單哦!
前言:利用memcached實現CAS單點登錄集群部署
參考信息:https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration https://code.google.com/archive/p/memcached-session-manager/wikis/SetupAndConfiguration.wiki
應用名稱 | 端口 | 版本 | 主機IP |
---|---|---|---|
Nginx | 8088 | 1.0.1 | 192.168.7.2 |
CAS-TomcatA | 8089 | 7.0.35 | 192.168.7.3 |
n1:libevent | 2.1.8 | 192.168.7.3 | |
n1:memcached | 22322 | 1.5.12 | 192.168.7.3 |
n1:magent | 12000 | 1.5.12 | 192.168.7.3 |
CAS-TomcatB | 8089 | 7.0.35 | 192.168.7.4 |
n2:libevent | 2.1.8 | 192.168.7.4 | |
n2:memcached | 22322 | 1.5.12 | 192.168.7.4 |
n2:magent | 12000 | 1.5.12 | 192.168.7.4 |
應用架構圖:
實現思路
CAS(Central Authentication Service)單點登錄的實現依賴了spring-webflow和TGT的ST校驗,其中spring-webflow使用到了session數據,TGT對ST校驗使用到了內存中的數據。將這兩個功能的數據和應用剝離,便是我們實現CAS集群化的關鍵。TGT對ST校驗使用了java類:TicketRegistry。
主要只有三個步驟:
1.安裝memcached并配置magent代理
2.session共享的配置
3.TicketRegistry內存數據剝離的配置
192.168.7.3和192.168.7.4兩個節點下都要安裝memcached和magent,安裝步驟只用192.168.7.3舉例。
#安裝libevent-使用root賬號。
# tar -zxvf libevent-2.1.8-stable.tar.gz
# cd libevent-2.1.8-stable
#./configure -prefix=/usr && make && make install
#chmod -R 755 /usr/include
#chmod命令對其他用戶授權了libevent的使用權限,非root用戶也可以使用libevent。libevent的github地址:https://github.com/libevent/libevent
執行結果截圖:
#root用戶安裝memcached
# tar -zxvf memcached-1.5.12.tar.gz
# cd memcached-1.5.12
# ./configure -with-libevent=/usr --prefix=/usr/local/memcached && make && make install
#chmod -R 755 /usr/local/memcached/
#chmod命令對其他用戶授權了memcached的使用權限,非root用戶也可以使用memcached。
執行結果截圖:
# /usr/local/memcached/bin/memcached -d -m 256 -p 22322 -c 1024 /tmp/memcached.pid
無日志輸出,且ps -ef | grep memcached 后出現進程,則為成功。
如果想查看memcached的日志詳情,可以追加上-vv >> /tmp/memcached.log 2>&1參數。日志級別有三個,v最低,vv中等,vvv最詳細。
啟動參數說明:
-d 選項是啟動一個守護進程。
-m 是分配給Memcache使用的內存數量,單位是MB,默認64MB。
-p 是設置Memcache的TCP監聽的端口,最好是1024以上的端口。
-c 選項是最大運行的并發連接數,默認是1024。
-P 是設置保存Memcache的pid文件。
# kill -9 pid
# mkdir magent
#mv magent-0.5.tar.gz magent/
#cd magent/
# tar -zxvf magent-0.5.tar.gz
# /sbin/ldconfig
# sed -i "s#CFLAGS = -Wall -O2 -g#CFLAGS =-lrt -Wall -O2 -g#g" Makefile
# sed -i "s#LIBS = -levent#LIBS = -levent -lm#g" Makefile
2.修改ketama.h文件:在第一行加入以下三行代碼
#ifndef SSIZE_MAX
#define SSIZE_MAX 32767
#endif
3.執行編譯命令
#make
編譯成功后會在該目錄下生成magent啟動腳本。
4.執行啟動命令
#./magent -n 51200 -l 192.168.7.3 -p 12000 -s 192.168.7.3:22322 -b 192.168.7.4:22322
192.168.7.4主機上為:./magent -n 51200 -l 192.168.7.4 -p 12000 -s 192.168.7.4:22322 -b 192.168.7.3:22322。讓兩個memcached互為主備。
啟動參數說明:
-n 最大連接數。
-l 代理的IP地址,即magent的訪問IP。
-p 代理的端口地址,即magent的訪問端口。
-s 代理的主節點,可以使用多個-s參數,代理多個主節點。
-b 代理的備份節點,可以使用多個-b參數,代理多個備份節點。
具體參數介紹可以使用./magent -help命令查詢。
5.測試magent代理
使用“telnet 192.168.7.3 12000”連接到magent代理上,執行“set test 0 0 2”的插入數據操作,退出12000連接。再次連接“telnet 192.168.7.3 22322”,執行“get test”命令,看是否可以輸出數據;連接“telnet 192.168.7.4 22322”,執行“get test”命令,看結果是否一致。一致則為成功。
如圖:
session共享完全由tomcat來實現,不必修改web應用。本文忽略Nginx實現負載的相關配置。
asm-5.0.3.jar
kryo-3.0.3.jar
kryo-serializers-0.37.jar
memcached-session-manager-1.9.5.jar
memcached-session-manager-tc7-1.9.5.jar
minlog-1.3.0.jar
msm-kryo-serializer-1.9.5.jar
objenesis-2.1.jar
reflectasm-1.10.1.jar
spymemcached-2.12.0.jar
修改tomcat的配置文件
tomcat的conf目錄下的context.xml文件,先把默認的context.xml文件內容清空,再將以下代碼復制到context.xml中。其中memcachedNodes是memcached地址,多個memcached使用需","隔開。
<?xml version='1.0' encoding='utf-8'?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- The contents of this file will be loaded for each web application -->
<Context>
<!-- Default set of monitored resources -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
<!-- Uncomment this to enable Comet connection tacking (provides events
on session expiration as well as webapp lifecycle) -->
<!--
<Valve className="org.apache.catalina.valves.CometConnectionManagerValve" />
-->
<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:192.168.7.3:12000,n2:192.168.7.4:12000"
sticky="false"
sessionBackupAsync="false"
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|jpeg|bmp|css|js|html|htm)$"
transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"/>
</Context>
檢驗Session共享
利用如下代碼生成test.jsp,并將jsp放入tomcat的webapps中的工程里,可以訪問到的地方。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<BR>
SessionID:<%=session.getId()%>
<BR>
SessionIP:<%=request.getServerName()%>
<BR>
SessionPort:<%=request.getServerPort()%>
<BR>
**分別**訪問兩個tomcat,只要session的后綴結尾類似于"-n1.tomcat1 "即為成功,sessionid是不一致的也是正確的。如下圖
1.在cas的tomcat容器中添加一下jar包
tomcat的路徑:/webapps/cas_sso/WEB-INF/lib/
asm-5.0.3.jar
cas-server-integration-memcached-3.5.1.jar
kryo-3.0.3.jar
minlog-1.3.0.jar
reflectasm-1.10.1.jar
spymemcached-2.12.0.jar
2.修改ticketRegistry.xml文件
文件在Tomact中的路徑:/webapps/cas_sso/WEB-INF/spring-configuration/ticketRegistry.xml
備份ticketRegistry.xml,并創建新的ticketRegistry.xml文件,內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to Jasig under one or more contributor license
agreements. See the NOTICE file distributed with this work
for additional information regarding copyright ownership.
Jasig licenses this file to you under the Apache License,
Version 2.0 (the "License"); you may not use this file
except in compliance with the License. You may obtain a
copy of the License at the following location:
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.1.xsd">
<bean id="ticketRegistry" class="org.jasig.cas.ticket.registry.MemCacheTicketRegistry">
<constructor-arg index="0">
<bean class="net.spy.memcached.spring.MemcachedClientFactoryBean"
p:servers="192.168.7.3:12000,192.168.7.4:12000"
p:protocol="BINARY"
p:locatorType="ARRAY_MOD"
p:failureMode="Redistribute"
p:transcoder-ref="serialTranscoder">
<property name="hashAlg">
<util:constant static-field="net.spy.memcached.DefaultHashAlgorithm.FNV1A_64_HASH" />
</property>
</bean>
</constructor-arg>
<constructor-arg index="1" value="36000" />
<constructor-arg index="2" value="2" />
</bean>
<bean id="serialTranscoder" class="net.spy.memcached.transcoders.SerializingTranscoder"
p:compressionThreshold="2048" />
</beans>
參數說明:
<constructor-arg index="0">:memcached的地址,多個用逗號隔開。
<constructor-arg index="1">:TGT超時時間(秒)
<constructor-arg index="1">:ST超時時間(秒)
3.重啟應用測試
使用Nginx做負載,代理兩個CAS服務端。
1.通過瀏覽器訪問Nginx單點登錄登陸后,通過日志查看訪問到哪個CAS節點,將該節點stop。
2.再次通過瀏覽器訪問Nginx,查看是否需要登錄,正常情況是不需要登錄的。成功后標識session共享成功。
3.通過瀏覽器進行cas客戶端訪問,如果沒有跳轉單點,則TGT數據保存到memcached共享成功。
后續:memcached的安全
使用memcached應用時,只需要能連接上主機端口就能用,如果放到互聯網上,這是很不安全的操作。使用memcached時,不要使用默認端口,換個1024以上的端口。針對于這個安全一般有三個解決方案,但每一種都有各自的局限性,可以根據自己的業務來做選擇。
1.雙網卡:應用服務選擇外網的網卡,memcached使用內網的網卡。
2.設置防火墻:使用主機的iptables進行白名單放行,阻止非信任的訪問請求。
3.memcached開啟SASL認證。1.4.3版本后支持此功能。
附件信息
鏈接: https://pan.baidu.com/s/1aihl_abcNguh9QVNSAWwNA 提取碼: 7r1r
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。