利用memcached实现CAS单点登录集群部署

前言:利用memcached实现CAS单点登录集群部署

  • 负载均衡
    将接口请求的有状态性变成无状态性。是我们在实现负载均衡时必要要解决的问题。以应用接口的session状态为例,一般解决方法都是将session数据和应用进行剥离,session数据统一保存到同一个数据源中,数据源就是保存数据的地方,我们常使用的MySQL数据库就是一个数据源。通常为了性能更高,数据源一般采用内存数据库(memcached、redis)。每当用户访问应用集群时,该请求被随机分配到任何一个节点,节点访问同一个数据源取session信息,保证了多个节点获取到的session状态是一致的。
  • 软件版本
应用名称端口版本主机IP
Nginx80881.0.1192.168.7.2
CAS-TomcatA80897.0.35192.168.7.3
n1:libevent2.1.8192.168.7.3
n1:memcached223221.5.12192.168.7.3
n1:magent120001.5.12192.168.7.3
CAS-TomcatB80897.0.35192.168.7.4
n2:libevent2.1.8192.168.7.4
n2:memcached223221.5.12192.168.7.4
n2:magent120001.5.12192.168.7.4
  • 应用架构图
    利用memcached实现CAS单点登录集群部署

    实现思路

    CAS(Central Authentication Service)单点登录的实现依赖了spring-webflow和TGT的ST校验,其中spring-webflow使用到了session数据,TGT对ST校验使用到了内存中的数据。将这两个功能的数据和应用剥离,便是我们实现CAS集群化的关键。TGT对ST校验使用了java类:TicketRegistry。

  • spring-webflow:是基于Spring MVC,实现应用程序的"流程化",用于指导业务逻辑按照固定的流程进行。对应的数据时保存到server的session中。
  • TicketRegistry:CAS票据,存储在TicketRegistry中,而TicketRegistry是存储在内存中的,CAS为了扩展,提供了支持TicketRegistry分布式的接口:org.jasig.cas.ticket.registry.AbstractDistributedTicketRegistry。通过实现这个接口,将TGT等数据放到内存数据库中。

步骤

    主要只有三个步骤:1.安装memcached并配置magent代理2.session共享的配置3.TicketRegistry内存数据剥离的配置

一:安装memcached并配置magent代理

    192.168.7.3和192.168.7.4两个节点下都要安装memcached和magent,安装步骤只用192.168.7.3举例。
  • 简介
    安装memcached时,需要先安装依赖库-libevent。libevent是一个强大的跨平台事件通知库,在 memcached 中 libevent 被用来处理网络事件(连接请求,读和写) 或者被用来实现定时器。 使用 libevent 需要包含头文件 event.h, 并且在 GCC 链接时需要使用选项 -levent。
  • 下载地址
    libevent:https://libevent.org/
    memcached:http://memcached.org/downloads
    本文末提供百度网盘的下载链接。
  • 安装libevent和memcached
    创建一个新的文件夹,将libevent和memcached放入其中,并解压,结果如下图。
    利用memcached实现CAS单点登录集群部署
    • libevent安装命令如下:
      #安装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

      执行结果截图:
      利用memcached实现CAS单点登录集群部署

    • memcached安装命令如下:
      #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。

      执行结果截图:
      利用memcached实现CAS单点登录集群部署

    • 启动命令,可使用非root用户启动:
      # /usr/local/memcached/bin/memcached -d -m 256 -p 22322 -c 1024 /tmp/memcached.pid
      无日志输出,且ps -ef | grep memcached 后出现进程,则为成功。
      启动参数说明:-d 选项是启动一个守护进程。-m 是分配给Memcache使用的内存数量,单位是MB,默认64MB。-p 是设置Memcache的TCP监听的端口,最好是1024以上的端口。-c 选项是最大运行的并发连接数,默认是1024。-P 是设置保存Memcache的pid文件。
      • 检查memcached的运行状态:
        首先用telnet 127.0.0.1 22322这样的命令连接上memcache,然后直接输入stats就可以得到当前memcache的状态。退出使用"ctrl+]",再输入quit,进行退出。参数解读参考:https://blog.csdn.net/andy_dou/article/details/84811715
      • 停止命令:
        # kill -9 pid
    • magent安装:
      1.执行以下命令修改文件
      # 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”命令,看结果是否一致。一致则为成功。
      如图:
      利用memcached实现CAS单点登录集群部署

二:session共享的配置

    session共享完全由tomcat来实现,不必修改web应用。本文忽略Nginx实现负载的相关配置。
  • 上传session共享所需的jar包
    将以下jar包放到tomcatlib下。本文是采用kryo序列化来实现session的序列化,不同的序列化实现方式,只是引用的jar包不同,方法一致。据说kryo效率比较高。
    相关jar包如下文:
        asm-5.0.3.jarkryo-3.0.3.jarkryo-serializers-0.37.jarmemcached-session-manager-1.9.5.jarmemcached-session-manager-tc7-1.9.5.jarminlog-1.3.0.jarmsm-kryo-serializer-1.9.5.jarobjenesis-2.1.jarreflectasm-1.10.1.jarspymemcached-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 morecontributor license agreements.  See the NOTICE file distributed withthis 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 withthe License.  You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed 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 andlimitations 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 eventson 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>
  • 修改tomcat的conf/server.xml文件
    修改server.xml中Engine标签,在其标签中添加jvmRoute="tomcat1"属性,用于区分多个tomcat应用
  • 检验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是不一致的也是正确的。如下图

利用memcached实现CAS单点登录集群部署
利用memcached实现CAS单点登录集群部署

三:将TicketRegistry内存数据写入memcached

1.在cas的tomcat容器中添加一下jar包tomcat的路径:/webapps/cas_sso/WEB-INF/lib/
        asm-5.0.3.jarcas-server-integration-memcached-3.5.1.jarkryo-3.0.3.jarminlog-1.3.0.jarreflectasm-1.10.1.jarspymemcached-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 licenseagreements. See the NOTICE file distributed with this workfor 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 fileexcept in compliance with the License.  You may obtain acopy of the License at the following location:http://www.apache.org/licenses/LICENSE-2.0Unless 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 ANYKIND, either express or implied.  See the License for thespecific language governing permissions and limitationsunder 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.xsdhttp://www.springframework.org/schema/utilhttp://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

转载于:https://blog.51cto.com/8595476/2387647

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/448897.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式开放消息系统 ( RocketMQ ) 的原理与实践

分布式消息系统作为实现分布式系统可扩展、可伸缩性的关键组件&#xff0c;需要具有高吞吐量、高可用等特点。而谈到消息系统的设计&#xff0c;就回避不了两个问题&#xff1a; 消息的顺序问题消息的重复问题RocketMQ作为阿里开源的一款高性能、高吞吐量的消息中间件&#xff…

数据结构02-链表

说明&#xff1a;由于该数据结构是由java并且是原生实现&#xff0c;所以与C有一些出入&#xff0c;不过原理是相同的 1.链表的定义 为了表示线性表元素a与a1的逻辑关系&#xff0c;存储数据时&#xff0c;除了存储元素本身的信息之外&#xff0c;还存储了直接后继元素的位置信…

洛谷P2347 砝码称重 某一年noip提高组原题

可以转化为01背包求方案数的问题&#xff0c;dp数组f[][]表示第几个砝码能称出的重量,可压缩至一维 转移方程为f(i,j)f(i-1,j-w[i]) 当前我们可以称出的重量必定是由之前的砝码重量转移过来的 #include<bits/stdc.h> using namespace std; const int N550; const int max…

linux 下载、安装 maven

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 创建maven的文件夹并下载maven的tar包到此文件夹中 //进入一个目录 cd /usr/local//创建一个文件夹 mkdir maven//下载maven的tar包…

c# 编程学习(二)

2019独角兽企业重金招聘Python工程师标准>>> 标识符是对程序中的各个元素进行标识的名称。  只能使用字母(大写和小写)、数字和下划线  标识符必须以字母或下划线开头 变量是容纳值的存储位置。可将变量想象成容纳临时信息的容器 命名变量的建议&#xff1a; …

深入理解C++ 虚函数表

目录 深入理解C 虚函数表虚函数表概述单继承下的虚函数表派生类未覆盖基类虚函数派生类覆盖基类虚函数多继承下的虚函数表无虚函数覆盖派生类覆盖基类虚函数钻石型虚继承总结几个原则安全性问题深入理解C 虚函数表 ​ C中的虚函数的作用主要是实现了多态的机制。关于多态&#…

Bootstrap简介

1.使用准备 1.1 Bootstrap的下载 http://www.bootcss.com&#xff0c;下载用于生产环境的Bootstrap即可。 1.2 Bootstrap包含的内容 ● 全局CSS&#xff1a;基本的 HTML 元素均可以通过 class 设置样式并得到增强效果&#xff1b;还有先进的栅格系统。 ● 组件&#xff1a;无数…

tomcat需要设置环境变量吗

tomcat是一款轻量级web应用服务器&#xff0c;安装的时候我们都是直接解压zip包&#xff0c;然后在bin目录下双击startup.bat就可以启动了&#xff08;当然&#xff0c;前提是本地要安装jdk并配置JAVA_HOME环境变量&#xff09; 所以我一直认为tomcat是不用配置环境变量的 但是…

钱荒下银行理财收益率角逐:邮储银行垫底

21世纪资管研究员松壑 由于银行理财的收益定价机制为设定预期收益率的“先行定价”&#xff0c;而银行对产品本金收益又保有或明或暗的兑付要求&#xff0c;其业绩往往在理财产品发行前就已决定。 因此&#xff0c;本次榜单根据已披露最高预期收益率&#xff08;下称收益率&a…

数据结构7.3_图的遍历

我们希望从图中某一顶点出发访遍图中其余顶点&#xff0c;且使每一个顶点仅被访问一次。 这一过程就叫做图的遍历。 图的遍历算法是求解图的连通性问题、拓扑排序和求关键路径等算法的基础。 然而&#xff0c;图的遍历要比树的遍历复杂得多。 因为图的任一顶点都可能和其余的顶…

HCL实验四

PC端配置&#xff1a;配置ip地址 配置网关 交换机配置&#xff1a;①创建VLAN system-view vlan 10 vlan 20 ②配置PC端接口 interface vlan-interface 10 ip add 192.168.10.254 24 interface vlan-interface 20 ip add 192.168.20.254 24 转载于:https://www.cnblogs.com/zy5…

程序员/设计师能用上的 75 份速查表

本文由 伯乐在线 - 黄利民 翻译自 designzum。欢迎加入 技术翻译小组。转载请参见文章末尾处的要求。75 份速查表&#xff0c;由 vikas 收集整理&#xff0c;包括&#xff1a;jQuery、HTML、HTML5、CSS、CSS3、JavaScript、Photoshop 、git、Linux、Java、Perl、PHP、Python、…

GWAS: 网页版的基因型填充(genotype imputation)

在全基因组关联分析中&#xff0c;处理芯片数据时&#xff0c;必须走的一个流程就是基因型数据填充&#xff08;imputation&#xff09;。 当然&#xff0c;如果你拿到的是全测序的数据&#xff0c;请忽略这一步。 下面直奔主题&#xff0c;怎么在网页版进行基因型填充。 1 进入…

腾讯CKV海量分布式存储系统

摘要&#xff1a;腾讯CKV&#xff0c;是腾讯自主研发的高性能、低延时、持久化、分布式KV存储服务。在腾讯的微信平台、开放平台、腾讯云、腾讯游戏和电商平台广泛使用&#xff0c;日访问量超过万亿次。本文将全面剖析CKV的实现原理和技术挑战。 与Memcached和Redis等开源NoSQ…

编程之法:面试和算法心得

《编程之法&#xff1a;面试和算法心得》高清中文版PDF 含书目录 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1Kcd2bRsIfhagKZR6NaOgXg 提取码&#xff1a;054s 《编程之法&#xff1a;面试和算法心得》高清中文版PDF高清中文版PDF 含书目录&#xff0c;36…

localStorage存、取数组

localStorage存储数组时需要先使用JSON.stringify()转成字符串&#xff0c;取的时候再字符串转数组JSON.parse()。 var arr[1,2,3,4];localStorage.setItem(key,arr);console.log(localStorage(key); //打印出字符串&#xff1a;1,2,3,4 正常存储&#xff1a;localStorage.setI…

Redis原理及拓展

Redis是单线程程序。单线程的Redis为何还能这么快&#xff1f; 1、所有的数据都在内存中&#xff0c;所有的运算都是内存级别的运算&#xff08;因此时间复杂度为O(n)的指令要谨慎使用&#xff09; 2、单线程操作&#xff0c;避免了频繁的上下文切换 3、多路复用&#xff08;非…

日常问题 - 远程服务器运行Tomcat出现卡顿阻塞

问题描述&#xff1a; 远程服务器Tomcat容器运行一个WEB项目&#xff0c;浏览器访问时&#xff0c;请求一直得不到响应&#xff0c;并且除此之外没有出现任何异常&#xff0c;像是被阻塞了。查看远程Tomcat窗口&#xff0c;也没有任何报错。鼠标在Tomcat窗口右键点击后&#xf…

给技术人上的管理课:平衡和集中

摘要&#xff1a;大中型团队管理是技术人转型的巨大挑战&#xff0c;这个阶段的管理工作&#xff0c;仍然可以归为技术范畴&#xff0c;依靠的大抵是管理人的筋肉力量。是否会管理&#xff0c;要看能否管好超出自己筋肉力量规模的团队。此中的关键&#xff0c;在于把握平衡和集…

理解分布式id生成算法--雪花算法(SnowFlake)

分布式ID生成算法的有很多种&#xff0c;Twitter的SnowFlake就是其中经典的一种。 注&#xff1a; 1B就是1个字节。Byte、KB、B、MB、GB之间的关系是&#xff1a;Bit——比特 &#xff1b; B ——字节&#xff1b;KB——千字节&#xff1b;MB——兆字节&#xff1b;GB——吉字节…