一、redis 优化

1.开启 AOF 持久化

2.设置 config set activedefrag yes 开启内存碎片自动清理,或者 定时执行 memory purge 清理内存碎片。

3.缓存雪崩

缓存同一时间大面积的过期失效,所以,后面的请求都会落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决方案:
缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。

4、缓存击穿
缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。
和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案
设置热点数据永远不过期。
加互斥锁,互斥锁

5、缓存穿透
缓存和数据库中都没有的数据,导致所有的请求都落到数据库上,造成数据库短时间内承受大量请求而崩掉。

解决方案:
接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;
从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击
采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。

二.Redis哨兵模式

1.核心功能

在主从复制的基础上,哨兵引入了主节点的自动故障转移
哨兵模式原理
哨兵(sentinel)∶是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的Master并将所有 Slave 连接到新的Master。所以整个运行哨兵的集群的数量不得少于3个节点。

gateway 整合 redis 哨兵 限流 redis哨兵策略_java

2. 哨兵模式的作用

监控∶哨兵会不断地检查主节点和从节点是否运作正常。
自动故障转移∶当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
**通知(提醒)**∶哨兵可以将故障转移的结果发送给客户端。

3.哨兵模式的组成 哨兵节点∶哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据,端口是26379 数据节点∶主节点和从节点都是数据节点

4.哨兵的工作模式

所有哨兵都会监控节点,哨兵之间会共享服务器的状态数据,对整个集群实现监控

哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式,所有节点上都需要部署哨兵模式,哨兵模式会监控所有的 Redis 工作节点是否正常,当Master出现问题的时候,因为其他节点与主节点失去联系,因此会投票,投票过半就认为这个Master的确出现问题,然后会通知哨兵间,然后从Slaves中选取一个作为新的Master

需要特别注意的是,客观下线是主节点才有的概念,如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操作

1)主观下线:当某个哨兵认为节点宕机,是主观下线

2)客观下线:当所有哨兵投票后票数过半后确认宕机为客观下线,然后就会执行故障的切换等过程;

5.哨兵模式的搭建

主机

操作系统

ip

所需软件

master服务器

centos7

192.168.6.170

redis-5.0.7

slave服务器

centos7

192.168.6.188

redis-5.0.7

slave2服务器

centos7

192.168.6.169

redis-5.0.7

5.1 修改 Redis 配置文件(所有节点操作)
Master:192.168.6.170
Slave1:192.168.6.188
Slave2:192.168.6.169

vim /opt/redis-5.0.7/sentinel.conf
#17行,关闭保护模式
protected-mode no
#21行,Redis哨兵默认的监听端口
port 26379
#26行,指定sentinel为后台启动
daemonize yes
#36行,指定日志存放路径
logfile "/var/log/sentinel.log"
#65行,指定数据库存放路径
dir "/var/lib/redis/6379"
#84行,修改 指定该哨兵节点监控192.168.6.170:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel monitor mymaster 192.168.6.170 6379 2
#113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel down-after-milliseconds mymaster 30000
#146行,故障节点的最大超时时间为180000(180秒)
sentinel failover-timeout mymaster 180000

6.先启master,再启slave

cd /opt/redis-5.0.7/
 redis-sentinel sentinel.conf &

7. 验证结果

Master:192.168.6.170
redis-cli -p 26379 info sentinel

gateway 整合 redis 哨兵 限流 redis哨兵策略_数据库_02

                                redis群集模式

1.集群模式的Redis由多组(>=3组)〉节点组成,每组都有一个主节点和一个或者多个从节点组成。只有主节点负责数据的读写,从节点只负责数据的复制。

2.高可用:集群支持主从复制和主节点的自动故障转移(与哨垂类似)﹔当任一节点发生故障时,集群仍然可以对外提供服务。

3.集群的作用:两点:

(1)数据分区:

集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增如,另一方面每个主节点都可以对外提供读眼务和写眼务,大大提高了集群的响应能力。
Redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及,例如,如果单机内存太大,,bgpare bgreriteofifore操侯作可能导致主选理阻寨,主从环境下主机动换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。
(2)高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似)﹔当任一节点发生故障时,集群仍然可以对外提供服务。

(2) 高可用:

集群支持主从复制和主节点的自动故障转移(与哨兵类似)﹔当任一节点发生故障时,集群仍然可以对外提供服务。
Redis a集群引入了哈希槽的概念Redi a集群;

有16384个哈希槽(象编+号L-1后.3H3 >集群的博个节点到责一部分哈希档;对key值进行算法定位

每个Key通过CRc16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插柚所对应的节点,然后直接白动跳转到这个对应的节点上进行读取;

gateway 整合 redis 哨兵 限流 redis哨兵策略_java_03

4.redis集群的主从复制模型

集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范E的梏而不可以用。为每个节点添加一个从节点A1、B1、ci整个集群便有三个Naster节点和三个alave节点组成,在节点⑶a失败后,集群迷举s.位为的主节点继续服务。当s和时都失攻后,集群将不可用。

 --------------------- 搭建Redis群集模式-----------------------------

以端口号进行区分:3个主节点端口号; 6001/6002/6003,对应的从节点端口号: 6004/6005/6006。

集群总线端口是16379:用于内部节点的通信

6379用于客户端与服务端之间的通信。

26379端口用于哨兵模式的通信。

环境配置/安装包

安装包:redis-5.0.7.tar.gz

主机

操作系统

IP地址

软件 / 安装包 / 工具

软件 / 安装包 / 工具

192.168.6.156

redis-5.0.7.tar.gz

第一步:安装redis服务(跳过)

gateway 整合 redis 哨兵 限流 redis哨兵策略_java_04

第二步:创建每个节点的工作目录

cd /etc/redis/
mkdir -p redis-cluster/redis600{1..6}   #创建redis集群的工作目录、和每个节点的工作目录
ls -R redis-cluster/

gateway 整合 redis 哨兵 限流 redis哨兵策略_缓存_05

 

第三步:到软件包目录,把redis配置文件分别复制到我们第二步所创建的每个节点目录中。也要把/opt/redis-5.0.7/src下的客户端工具redis-cli和服务端命令redis-server复制到每个节点的目录中

cd /opt/redis-5.0.7/src/
ls
cd /opt/redis-5.0.7/
for i in {1..6}; do cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i; cp /opt/redis-5.0.7/src/redis-server /opt/redis-5.0.7/src/redis-cli /etc/redis/redis-cluster/redis600$i; done      
#使用for循环复制可以节省很多时间
cd /etc/redis/redis-cluster/
ls -R

 

gateway 整合 redis 哨兵 限流 redis哨兵策略_缓存_06

 

gateway 整合 redis 哨兵 限流 redis哨兵策略_数据_07

 

 第四步:

 修改每个节点目录中的redis配置文件

cd redis6001
vim redis.conf
 
#bind 127.0.0.1     ##第69行;注释掉监听地址,表示监听任意地址(也可设置为0.0.0.0)
protected-mode no    #修改第88行,关闭保护模式,设置为no
port 6001           #修改第92行,修改监听端口为6001
daemonize yes       #修改第136行,开启后台运行
appendonly yes      #修改第699行,开启AOF持久化
 
 
#集群模式配置
cluster-enabled yes    #第832行取消注释,开启集群模式
cluster-config-file nodes-6001.conf   #第840行,每个集群配置文件,取消注释、修改对应的端口(每个节点都要设置对应的)
cluster-node-timeout 15000   #第846行,集群节点之间通信的超时时间;取消注释

gateway 整合 redis 哨兵 限流 redis哨兵策略_redis_08

 

gateway 整合 redis 哨兵 限流 redis哨兵策略_java_09

gateway 整合 redis 哨兵 限流 redis哨兵策略_java_10

gateway 整合 redis 哨兵 限流 redis哨兵策略_java_11

  其他五个节点的配置文件修改

#先使用for循环把刚才我们设置的6001端口节点的配置文件覆盖到其他节点的配置文件
for i in {2..6}; do \cp -f redis.conf /etc/redis/redis-cluster/redis600$i; done
 
cd /etc/redis/redis-cluster/redis6002
vim redis.conf
port 6002          #修改第92行,修改监听端口为6002
cluster-config-file nodes-6002.conf   #第840行,每个集群配置文件,取消注释、修改对应的端口(每个节点都要设置对应的)

gateway 整合 redis 哨兵 限流 redis哨兵策略_java_12

 操作一样:

第五步:启动redis服务,一定要先进入每个节点目录中去使用redis-server命令启动

cd ../redis6001
ls
for i in {1..6}; do cd /etc/redis/redis-cluster/redis600$i; ./redis-server redis.conf; done
ps -elf |grep redis
redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1                                 #把节点加入到集群当中
--cluster-replicas    指定每个主节点有多少个从节点做主从复制
 
 
redis-cli -p 6001    #登录redis数据库
cluster slots        #查看主从对应关系

gateway 整合 redis 哨兵 限流 redis哨兵策略_缓存_13

 

gateway 整合 redis 哨兵 限流 redis哨兵策略_缓存_14

 

gateway 整合 redis 哨兵 限流 redis哨兵策略_缓存_15

gateway 整合 redis 哨兵 限流 redis哨兵策略_缓存_16

  第六步:验证,键的插入

redis-cli -p 6001 -c    
-c  实现节点间的跳转,如果不加会报错
set name hj

gateway 整合 redis 哨兵 限流 redis哨兵策略_数据库_17

 登录到6004节点

redis-cli -p 6004 -c
 keys *
 get name

gateway 整合 redis 哨兵 限流 redis哨兵策略_java_18

 登录到6006节点上

gateway 整合 redis 哨兵 限流 redis哨兵策略_java_19

  查看集群模式节点状态

cluster nodes

 集群总线

每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比6379,还有一个额外的端口(通过在这个端口号上加100Q0)作为数据端口,例如: redis的端口为6379,那么另外一个需要开通的端口是:6379 + 10000,即需要开启16379。16379端口用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权。等等。

总结:

6379端口:主要用于客户端和服务端之间的通信以及主从复制之间相互通信

26379端口:哨兵模式之间相互通信

16379端口:集群之间的节点进行通信