Redis集群+tomcat7集群实现session共享

就在昨天,一个线上的产品突然不能访问了,经过一系列的排查问题,最终发现原来是redis死掉了,因为做的用redis管理session,redis又是单台服务器,当redis宕机后,网站就访问不上了。为了避免以后redis宕机导致网站上不去,同时也为了网站的稳健性,我决定把redis做成集群的方式,其中一个redis宕机,也不影响网站的正常使用。

本文软件架构:redis3.2.10,tomcat7,jdk7,centos7.2,一般集群都是采用奇数群,so redis3个 tomcat3个,

目录

 

准备工作

安装redis

搭建sentinel

tomcat配置

redis-sentinel总结:

redis主从复制总结:


准备工作

  1. 下载redis:wget http://download.redis.io/releases/redis-3.2.10.tar.gz

  2. 下载tomcat7:wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-7/v7.0.91/bin/apache-tomcat-7.0.91.tar.gz

安装redis

在编译之前,请检查有没有安装gcc,g++,

yum -y install gcc  yum -y install gcc-c++

编译:进入redis目录,执行make (这一步时间可能有点长)

copy redis.conf 和src下的 redis-server redis-cli 到 /usr/local/server/redis1下,copy三次,注意文件夹名字不要重复

修改redis1中的redis.conf

把当前的redis选中为master节点,要修改的配置文件如下:

注释掉bind 127.0.0.1,允许外部连接

protected-mode yes 改为 protected-mode no 禁用保护模式

(上面这两部重要,为了后面连接 这个坑我又踩了一遍,)

修改端口号:port 6301

修改为后台运行:daemonize yes

修改日志文件位置:logfile "/tmp/logs/redis1.log"

修改 pidfile /var/run/redis_6301.pid

最后根据实际情况修改:maxclients  maxmemory

(主节点修改完毕)

修改redis2(从节点) 的redis.conf

注释掉bind 127.0.0.1,允许外部连接

protected-mode yes 改为 protected-mode no 禁用保护模式

修改端口号:port 6302

修改为后台运行:daemonize yes

修改日志文件位置:logfile "/tmp/logs/redis2.log"

修改pidfile /var/run/redis_6302.pid

做主从复制:找到 slaveof <masterip> <masterport>:slave 主节点ip 端口

注释掉save 900 1 save 300 10  save 60 10000,从节点只做读取的操作,so把它注释掉

最后根据实际情况修改:maxclients  maxmemory

修改redis3(从节点)的redis.conf

这个根据reids2的conf配置文件修改 端口为6303 日志文件 和pid 剩下的基本一样

三个redis配置完了,这只是做了redis的主从复制,但是需要一个监控redis的状态信息,redis提供了一个sentinel哨兵机制

搭建sentinel

sentinel也需奇数群 本文设置3个

copy redis安装目录中的 sentinel.conf 和 src下的 redis-sentinel 到/usr/local/server/redis/sentinel1中(其余的如此复制)

修改sentinel.conf配置文件:

port 26380   sentinel端口号

daemonize yes    在后台运行

protected-mode no    允许远程连接(这个巨坑)

dir /tmp

sentinel monitor mymaster 主节点ip 6301 2        监控主节点,后面2表示 如果2个sentinel认为主节点宕机 就是真的宕机

sentinel down-after-milliseconds mymaster 1000    

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

剩下的两个根据上面配置 只需要修改端口号就可以、

下面依次启动三个redis 和三个sentinel

tomcat配置

向tomcat的lib下添加三个jar包:https://download.csdn.net/download/qq_33273303/10715767 commons-pool2-2.2.jar jedis-2.5.2.jar

在tomcat的conf下context.xml中添加:

<Valve className="com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve" />
    <Manager className="com.orangefunction.tomcat.redissessions.RedisSessionManager"
        sentinelMaster="mymaster"  主节点的名称
        sentinels="主机ip:26379,主机ip:26380,主机ip:26381" 三个sentinel几点的ip和端口
        database="0"  连接的redis数据库
        maxInactiveInterval="60" />   session失效时间 单位为分钟

修改webapp下ROOT中index.jsp

删掉<%@ page session="false" %>

在body下添加<div>当前sessionId是<%= session.getId()%></div>

最后启动三个redis和三个sentinel 浏览器访问三个tomcat 就能看见sessionId是一样。

redis-sentinel总结:

  1. sentinel的作用,他用来监控reids主节点的状态,每次做心跳检测会向redis主节点发送一次info如果没有得到信息,就有一个故障信息,剩下的sentinel会再一次发送一次info 如果配置的是两个sentinel发现reids主节点死掉, 就会做一个主从切换(slave of主节点),会从剩下的reids中重新选举一个从节点作为主节点。(sentinel仲裁会
  2. 上面说到reids主节点宕机,如果sentinel也发生宕机,这就是sentinel也需要集群化的原因。如果sentinel的“老大”也老生宕机这个时候sentinel集群会重新选举一个“老大”(sentinel选举

redis主从复制总结:

  1. 一主两从 两个从节点只能读不能写;当从节点和主机点断开连接后需要重新slave of主节点,才能建立连接;master挂掉后,master关系依然存在,master重启即可恢复。

  2.  上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了 链条中下一个slave的Master,如此可以有效减轻Master的写压力。如果slave中途变更转向,会清除之前的数据,重新建立最新的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值