基于Redis的Session共享示例
在单机情况下,Session可由部署在服务器上的Web容器来管理 (如Tomcat、JBoss)。 在负载均衡的集群环境下,负载均衡可能将请求分发到不同的服务器上去,在这种情况,需要将有状态的session统一管理起来。 本文将给出一个简单的示例,将session存放到Redis统一管理。因为只是一个示例,所以Nginx只用1台,Tomcat使用2台,Redis一个或者简单的主从。 环境准备 准备Redis 下载redis-3.2.3.tar.gz (Redis.io下载) 解压缩redis tar-zvxfredis-3.2.3.tar.gz 将解压缩后的redis文件名改成好记点的6379(可以不重命名)。 然后使用make && make install完成安装。 [root@dev18redis]#mvredis-3.2.36379 [root@dev18redis]#cd6379 [root@dev186379]#make&&makeinstall 安装成功之后,出现如下显示: 因为本版本使用的Redis版本是3.2.3, 在这个版本中,有protected mode的属性(默认是yes),进入6379目录,修改redis.conf配置文件。从而,其它网段的程序可以去访问,否则可能会出现如下的错误。 Exceptioninthread"main"redis.clients.jedis.exceptions.JedisDataException:DENIEDRedisisrunninginprotectedmodebecauseprotectedmodeisenabled,nobindaddresswasspecified,noauthenticationpasswordisrequestedtoclients.Inthismodeconnectionsareonlyacceptedfromtheloopbackinterface.IfyouwanttoconnectfromexternalcomputerstoRedisyoumayadoptoneofthefollowingsolutions:1)Justdisableprotectedmodesendingthecommand'CONFIGSETprotected-modeno'fromtheloopbackinterfacebyconnectingtoRedisfromthesamehosttheserverisrunning,howeverMAKESURERedisisnotpubliclyaccessiblefrominternetifyoudoso.UseCONFIGREWRITEtomakethischangepermanent.2)AlternativelyyoucanjustdisabletheprotectedmodebyeditingtheRedisconfigurationfile,andsettingtheprotectedmodeoptionto'no',andthenrestartingtheserver.3)Ifyoustartedtheservermanuallyjustfortesting,restartitwiththe'--protected-modeno'option.4)Setupabindaddressoranauthenticationpassword.NOTE:Youonlyneedtodooneoftheabovethingsinorderfortheservertostartacceptingconnectionsfromtheoutside. atredis.clients.jedis.Protocol.processError(Protocol.java:117) atredis.clients.jedis.Protocol.process(Protocol.java:151) atredis.clients.jedis.Protocol.read(Protocol.java:205) atredis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:297) atredis.clients.jedis.Connection.getIntegerReply(Connection.java:222) atredis.clients.jedis.Jedis.sadd(Jedis.java:1057) atjedis.example.Main.main(Main.java:36) 修改后保存。 进入src目录,启动Redis服务 [root@dev186379]#cdsrc [root@dev18src]#./redis-server 成功启动显示如下: [root@dev18src]#./redis-server 10051:C22Dec09:50:59.653#Warning:noconfigfilespecified,usingthedefaultconfig.Inordertospecifyaconfigfileuse./redis-server/path/to/redis.conf _._ _.-``__''-._ _.-```.`_.''-._Redis3.2.3(00000000/0)64bit .-``.-```.```\/_.,_''-._ (',.-`|`,)Runninginstandalonemode |`-._`-...-`__...-.``-._|'`_.-'|Port:6379 |`-._`._/_.-'|PID:10051 `-._`-._`-./_.-'_.-' |`-._`-._`-.__.-'_.-'_.-'| |`-._`-.__.-'_.-'|http://redis.io `-._`-._`-.__.-'_.-'_.-' |`-._`-._`-.__.-'_.-'_.-'| |`-._`-.__.-'_.-'| `-._`-._`-.__.-'_.-'_.-' `-._`-.__.-'_.-' `-.__.-' `-.__.-' 10051:M22Dec09:50:59.656#Serverstarted,Redisversion3.2.3 10051:M22Dec09:50:59.656#WARNINGovercommit_memoryissetto0!Backgroundsavemayfailunderlowmemorycondition.Tofixthisissueadd'vm.overcommit_memory=1'to/etc/sysctl.confandthenrebootorrunthecommand'sysctlvm.overcommit_memory=1'forthistotakeeffect. 10051:M22Dec09:50:59.656#WARNINGyouhaveTransparentHugePages(THP)supportenabledinyourkernel.ThiswillcreatelatencyandmemoryusageissueswithRedis.Tofixthisissuerunthecommand'echonever>/sys/kernel/mm/transparent_hugepage/enabled'asroot,andaddittoyour/etc/rc.localinordertoretainthesettingafterareboot.RedismustberestartedafterTHPisdisabled. 10051:M22Dec09:50:59.656*Theserverisnowreadytoacceptconnectionsonport6379 准备Tomcat 下载tomcat,并解压缩为两个tomcat,并修改各自server.xml中的端口,保证两者不冲突。 本示例中,tomcat_1的端口为8082 <Connectorport="8082"protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> tomcat_2的端口为8083 <Connectorport="8083"protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> 准备Session-Manager 大家可以通过如下路径获取Session-Manager的jar包和相关的依赖包,包括common-pool2和Jedis。 https://pan.baidu.com/s/1geZVozx 下载好之后,我们首先将这三个jar包,放到Tomcat目录下的lib文件夹中。 配置Context.xml,添加如下内容,具体的host和port由自己的环境决定。 <ValveclassName="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"/> <ManagerclassName="com.orangefunction.tomcat.redissessions.RedisSessionManager" host="xxx.xx.xx.xxx" port="6379" database="0" maxInactiveInterval="60"/> 然后准备一个项目,为了方便,我直接将测试的war中的文件替换了 Tomcat_Home/webapps中的ROOT的内容。也可以通过tomcat自带的examples示例来测试session。 如:http://localhost:8082/examples/servlets/servlet/SessionExample 至此,两个测试的tomat就准备好了,并且已经配置了session管理,由redis来存储。接下来,我们就需要一个Nginx用于负载,配置两个tomcat的信息即可。 准备Nginx 下载Nginx,解压,然后进入Nginx的conf目录,修改nginx.conf文件内容,找到http的部分,添加upstream,就是我们上述提到的两个tomcat。 http{ upstreamtomcat{ serverlocalhost:8082; serverlocalhost:8083; } 本文Nginx的端口为8899, 自己设定了一个。 server{ listen8899; 至此Nginx, Tomcat, Session-Manager, Redis相关的环境就全部准备好了。 接下来,要做的就是启动Nginx, Tomcat, Redis,来看看 session是否存入到Redis中,自己的Web工程能不能正常运行等。 启动Nginx和Tomcat 进入NGINX_HOME/使用nginx命令启动Nginx服务器。 进入两个tomcat_1和tomcat_2,分别启动tomcat。登录自己在ROOT中放置的WEB工程,可以看到session在Redis中存储下来了。 通过Redis-Desktop Manager查看Redis中session的信息。 配置一个Redis从服务器 通过Redis-Desktop Manager查看Redis中session的信息。 为上面的6379主服务器配置一个从服务器6380。 在6380的redis.conf中指定 是6379的slave,如: slaveof127.0.0.16379 启动从服务器: [root@dev18src]#./redis-server../redis.conf _._ _.-``__''-._ _.-```.`_.''-._Redis3.2.3(00000000/0)64bit .-``.-```.```\/_.,_''-._ (',.-`|`,)Runninginstandalonemode |`-._`-...-`__...-.``-._|'`_.-'|Port:6380 |`-._`._/_.-'|PID:14302 `-._`-._`-./_.-'_.-' |`-._`-._`-.__.-'_.-'_.-'| |`-._`-.__.-'_.-'|http://redis.io `-._`-._`-.__.-'_.-'_.-' |`-._`-._`-.__.-'_.-'_.-'| |`-._`-.__.-'_.-'| `-._`-._`-.__.-'_.-'_.-' `-._`-.__.-'_.-' `-.__.-' `-.__.-' 14302:S22Dec12:02:55.810#Serverstarted,Redisversion3.2.3 14302:S22Dec12:02:55.810#WARNINGovercommit_memoryissetto0!Backgroundsavemayfailunderlowmemorycondition.Tofixthisissueadd'vm.overcommit_memory=1'to/etc/sysctl.confandthenrebootorrunthecommand'sysctlvm.overcommit_memory=1'forthistotakeeffect. 14302:S22Dec12:02:55.810#WARNINGyouhaveTransparentHugePages(THP)supportenabledinyourkernel.ThiswillcreatelatencyandmemoryusageissueswithRedis.Tofixthisissuerunthecommand'echonever>/sys/kernel/mm/transparent_hugepage/enabled'asroot,andaddittoyour/etc/rc.localinordertoretainthesettingafterareboot.RedismustberestartedafterTHPisdisabled. 14302:S22Dec12:02:55.810*Theserverisnowreadytoacceptconnectionsonport6380 14302:S22Dec12:02:55.810*ConnectingtoMASTER127.0.0.1:6379 14302:S22Dec12:02:55.810*MASTER<->SLAVEsyncstarted 14302:S22Dec12:02:55.810*NonblockingconnectforSYNCfiredtheevent. 14302:S22Dec12:02:55.811*MasterrepliedtoPING,replicationcancontinue... 14302:S22Dec12:02:55.811*Partialresynchronizationnotpossible(nocachedmaster) 14302:S22Dec12:02:55.815*Fullresyncfrommaster:c5038d1cbe197bbd8c8fee0e719370eac42bd6bc:1 14302:S22Dec12:02:55.865*MASTER<->SLAVEsync:receiving2741bytesfrommaster 14302:S22Dec12:02:55.865*MASTER<->SLAVEsync:Flushingolddata 14302:S22Dec12:02:55.865*MASTER<->SLAVEsync:LoadingDBinmemory 14302:S22Dec12:02:55.866*MASTER<->SLAVEsync:Finishedwithsuccess 使用Redis-Desktop Manager 可以看到,主服务6379和从服务6380都包含session的相关信息。 文章转自:https://my.oschina.net/wangmengjun/blog/810179