Redis哨兵集群

一、Redis安装

1.1 安装依赖
yum -y install gcc gcc-c++ make
1.2 编译安装
# http://download.redis.io/releases/
tar xf redis-5.0.7.tar.gz
cd redis-5.0.7/
make
#make MALLOC=libc
make install PREFIX=/usr/local/redis
1.3 创建目录
mkdir /usr/local/redis/{etc,data,logs}
cp ./redis.conf /usr/local/redis/etc/
1.4 配置参数
vim /usr/local/redis/etc/redis.conf
#----------------------------------
bind 127.0.0.1 10.0.0.10
port 6379
daemonize yes
requirepass password
timeout 300
tcp-keepalive 300
loglevel notice
pidfile "/usr/local/redis/logs/redis.pid"
logfile "/usr/local/redis/logs/redis.log"
dbfilename dump.rdb
dir /usr/local/redis/data/
#----------------------------------
1.5 启动服务
echo "export PATH=/usr/local/redis/bin:\$PATH" >> /etc/profile
source /etc/profile
redis-server /usr/local/redis/etc/redis.conf
redis-cli -h 127.0.0.1 -p 6379 -a "password"
redis-cli -h 127.0.0.1 -p 6379 -a "password" shutdown

二、Redis主从

2.1 单节点问题
  • 从架构上看,单节点容器发生单点故障,并且需要处理请求负载大;
  • 从容量上看,单个redis内存容量有限,一般最大不应该超过20G;
2.2 主从的概念

主从复制是将一台redis数据复制到其他redis1服务器,且数据是单向复制的,只能由主到从节点,通常master以写为主,slave以读为主;

2.3 主从的用途
  • 数据冗余: 主从复制实现数据备份;
  • 故障恢复:当主出现故障,可以由从提供服务,快速故障恢复;
  • 负载均衡:配合应用实现读写分离,减轻节点负载;
  • 高可用基础:作为哨兵集群基础;
2.4 主从配置

默认情况下,每台redis服务器都是主节点,实现主从需要对作为从的节点配置;

vim /usr/local/redis/etc/redis.conf
#----------------------------------
bind 127.0.0.1 10.0.0.10
port 6379
daemonize yes
requirepass password
timeout 300
tcp-keepalive 300
loglevel notice
# 添加如下参数
slaveof 10.0.0.10 6379
masterauth password
pidfile "/usr/local/redis/logs/redis.pid"
logfile "/usr/local/redis/logs/redis.log"
dbfilename dump.rdb
dir /usr/local/redis/data/
#----------------------------------
2.5 主从验证



三、redis哨兵

3.1 主从问题

主从复制中,当主节点宕机,需要人为的把一台从切换为主,会导致一段时间内服务不可用;

3.2 哨兵模式
  • 哨兵机制能够监控主机是否故障,实现主从自动切换,当主节点故障了,哨兵会根据投票数自动将从转换为主提供服务;
  • 哨兵是一个独立的进程,其运行原理就是通过发生命令对redis实例进行心跳从而实现redis实例的监控;
  • 因为哨兵是独立进程,一般情况下会部署到多个节点实现高可用;
3.3 哨兵原理
  • 哨兵进程会发生命令,让redis实例响应获取运行状态,包括主和从节点;
  • 当哨兵检测主宕机,会自动将salve切换成master,然后通过发布订阅模式通知其他slave修改配置,连接到新的master上;
3.4 哨兵配置

考虑到哨兵是独立进程运行,为了避免单独故障,建议在每个节点上都部署一个;

mkdir /usr/local/redis/sentinel #创建工作目录
vim /usr/local/redis/etc/sentinel.conf
#-------------------------------------
port 16379  #哨兵端口
dir "/usr/local/redis/sentinel" #工作目录
logfile "/usr/local/redis/sentinel/sentinel.log" #日志
daemonize yes #后台运行
sentinel monitor master 10.0.0.10 6379 2 #监控的主节点,2表示有几个哨兵认为主down了才进行切换
sentinel auth-pass master password #与主节点连接密码
sentinel down-after-milliseconds master 15000 #心跳时间,默认30s
sentinel failover-timeout master 120000 #故障转移超时时间
sentinel parallel-syncs master 1 #主从切换时可以有几个slave同时对新master进行同步,值越小时间越长
#protected-mode no #关闭防护模式,无密码认证时候使用
#sentinel notification-script master01 /data/sh/notice.sh #通知脚本(自行编写)
#-------------------------------------
redis-sentinel /usr/local/redis/etc/sentinel.conf  #启动哨兵
3.5 验证集群

停止master节点,查看哨兵主从切换的日志;

四、redis问题

4.1 缓存穿透
当用户需要查询一个数据,发现redis内存数据中没有,即没有命中缓存,于是向持久层数据库查询,发生也没有,那边本次查询失败;
当大量用户缓存都没有命中,都去请求后端数据库时会给数据库造成很大压力,这就相当于出现了缓存穿透了;

解决方案:
1、应用层使用布隆过滤器
2、缓存空对象匹配
4.2 缓存击穿
一个高频key不停的扛着大并发,当这个key在过期的瞬间,有大量的并发请求,会直接请求到数据库,类似从redis上突破一个口子到数据库;

解决方案:    
1、设置高频key永不过期
2、加互斥锁(分布式锁)
4.3 缓存雪崩
雪崩是指在某个时间段内所有的缓存key全部过期或者redis崩了,所有的请求全部落到数据库,从而产生周期性的压力波峰;

解决方案:
1redis高可用
2、限流将级(枷锁控制线程)
3、数据预热(访问一遍服务)