就在昨天,一个线上的产品突然不能访问了,经过一系列的排查问题,最终发现原来是redis死掉了,因为做的用redis管理session,redis又是单台服务器,当redis宕机后,网站就访问不上了。为了避免以后redis宕机导致网站上不去,同时也为了网站的稳健性,我决定把redis做成集群的方式,其中一个redis宕机,也不影响网站的正常使用。
本文软件架构:redis3.2.10,tomcat7,jdk7,centos7.2,一般集群都是采用奇数群,so redis3个 tomcat3个,
目录
准备工作
安装redis
搭建sentinel
tomcat配置
redis-sentinel总结:
redis主从复制总结:
下载redis:wget http://download.redis.io/releases/redis-3.2.10.tar.gz
下载tomcat7:wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-7/v7.0.91/bin/apache-tomcat-7.0.91.tar.gz
在编译之前,请检查有没有安装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
注释掉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也需奇数群 本文设置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的lib下添加三个jar包:https://download.csdn.net/download/qq_33273303/10715767 commons-pool2-2.2.jar jedis-2.5.2.jar
在tomcat的conf下context.xml中添加:
sentinels="主机ip:26379,主机ip:26380,主机ip:26381" 三个sentinel几点的ip和端口
database="0" 连接的redis数据库
maxInactiveInterval="60" /> session失效时间 单位为分钟
修改webapp下ROOT中index.jsp
删掉<%@ page session="false" %>
在body下添加
最后启动三个redis和三个sentinel 浏览器访问三个tomcat 就能看见sessionId是一样。
一主两从 两个从节点只能读不能写;当从节点和主机点断开连接后需要重新slave of主节点,才能建立连接;master挂掉后,master关系依然存在,master重启即可恢复。
上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了 链条中下一个slave的Master,如此可以有效减轻Master的写压力。如果slave中途变更转向,会清除之前的数据,重新建立最新的。