1. redis的使用场景
==热点数据的缓存。==
==限时任务的操作。比如短信验证码==
==完成session共享的问题。==
==完成分布式锁。==
商品的销售量。
2. redis的持久化方式
2.1 什么是持久化
把内存中的数据存储到磁盘的过程。同时也可以把磁盘中的数据加载到内存中。
2.2 redis实现持久化的方式
redis实现持久化的方式提供了两种:
第一种:RDB
第二种:AOF
2.2.1 什么是RDB
RDB[redis database]: 快照模式。每隔一段时间对内存中的数据进行快照存储。 默认启用该模式
2.2.2 什么时候会触发RDB模式
1.手动触发:save和bgsave手动触发rdb。 保存的名称dump.rdb
save该命令会阻塞当前Redis服务器,执行save命令期间,Redis不能处理其他命令,直到RDB过程完成为止。具体流程如下:
执行完成时候如果存在老的RDB文件,就把新的替代掉旧的。我们的客户端可能都是几万或者是几十万,这种方式显然不可取。
bgsave:
执行该命令时,Redis会在后台异步进行快照操作,快照同时还可以响应客户端请求。具体流程如下:
bgsave在执行该命令时会fork出一个新的线程,单独执行rdb持久化操作,而不影响其他客户对redis服务的操作。---唯一的多线程。
2.自动触发: 通过配置文件搞定。
需要修改配置文件
2.2.3 什么是Aof
AOF[append only file]: 日志[每执行一个写操作]追加模式,默认redis没有开启该模式。需要手动开启。默认的文件名appendonly.aof
2.2.4 开启aof
把配置文件中的appendonly yes即可
当启动redis服务器,会把日志文件中的命令从上到下执行一下。
2.2.5 RBD和AOF的区别
RDB快照模式,数据备份和恢复速度快。缺点: 数据完整性差。数据可能丢失多。
AOF日志追加: 数据完整性高。 缺点: 数据备份呵呵恢复速度慢。
3. redis的集群模式
redis提供了三种集群模式.
第一种: 主从模式。3一下
第二种: 哨兵模式 5以下
第三种: 去中心化模式
3.1 为什么使用redis集群
提高并发量,提高了可用性。
3.2 主从模式
redis主从模式表示一个主节点跟若干个从节点。 主节点可以负责写操作和读操作。而从节点只负责读操作。主节点的数据会自动同步到所有的从节点上。
如何搭建redis主从模式
我们为了操作方便: 我在一台linux上跑三个redis服务器。 只要端口号不同即可。
修改配置文件
1.端口号 2.dump文件的名称 3.aof的名称
开启三台redis服务
redis-server redisXXX.conf
配置主从关系
配从不配主 slaveof 主节点IP 主节点port
info replication 查看主从的状态
Redis主从优点
防止数据丢失,数据在从节点都有备份
读写分离,分担读压力
Redis主从的缺点
不能分担写压力
主节点挂了整个集群不可用
数据存储上限为主节点的上限,未得到扩容
3.3 哨兵模式
1.什么是哨兵
当主服务器中断服务后,可以将一个从服务器升级为主服务器 ,以便继续提供服务,但是这个过程需要人工手动来操作。 为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。Redis-Sentinel是用于管理Redis集群,该系统执行以下三个任务
1.监控(Monitoring) Sentinel会不断地检查你的主服务器和从服务器是否运作正常;
2.提醒(Notification) 当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知;
3.自动故障迁移(Automatic failover):当主服务器不可用,Sentinel会自动选举一个从服务器作为新主服务器,并让其它的从服务器从新的主服务器复制数据,用户的请求会被变更为新的主服务器
2.哨兵是如何运作的(1)主观下线
每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主服务器,Slave从服务器以及 其他Sentinel(哨兵)进程发送一个 PING 命令。
如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项 所指定的值, 则这个实例会被 Sentinel(哨兵)进程标记为主观下线(SDOWN)
如果一个Master主服务器被标记为主观下线(SDOWN),则正在监视这个Master主服务器的所有 Sentinel(哨兵)进程要以每秒一次的频率确认Master主服务器的确进入了主观下线状态
(2)客观下线
当有足够数量(半数以上)的 Sentinel(哨兵)进程(大于等于配置文件指定的值)在指定的时间范围 内确认Master主服务器进入了主观下线状态(SDOWN), 则Master主服务器会被标记为客观下线 (ODOWN)
若没有足够数量的 Sentinel(哨兵)进程同意 Master主服务器下线, Master主服务器的客观下线状 态就会被移除。若 Master主服务器重新向 Sentinel(哨兵)进程发送 PING 命令返回有效回复,Master 主服务器的主观下线状态就会被移除。
(3)故障转移
当前哨兵虽然发现了主数据客观下线,需要故障恢复,但故障恢复需要由领头哨兵来完成。这样来保 证同一时间只有一个哨兵来执行故障恢复,选出领头哨兵后,领头哨兵将会开始对主数据库进行故障 恢复。
首先是从主服务器的从服务器中选出一个从服务器作为新的主服务器。选出之后通过slaveif no ont将 该从服务器升为新主服务器。
所有在线的从数据库中,选择优先级最高的从数据库。优先级通过replica-priority参数设置,优先级相 同,则复制的命令偏移量越大(复制越完整)越优先 , 如果以上都一样,则选择运行ID较小的从数据库选出一个从数据库后,领头哨兵将向从数据库发送SLAVEOF NO ONE命令使其升格为主数据库,而后领 头哨兵向其他从数据库发送 SLAVEOF命令来使其成为新主数据库的从数据库,最后一步则是更新内部 的记录,将已经停止服务的旧的主数据库更新为新的主数据库的从数据库,使得当其恢复服务时自动 以从数据库的身份继续服务。
准备条件
- 修改sentinel.conf
启动哨兵服务
redis-sentinel sentinel.conf
当6380端口下线之后会在6381和6382之间选出一个主节点
哨兵的优点
哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。
主从可以自动切换,系统更健壮,可用性更高。
哨兵的缺点
哨兵依然是主从模式,没法解决写的压力,只能减轻读的压力
存储得不到扩容,存储数据总量是主的数据总量
当主服务器宕机后,从服务器切换成主服务器的这段时间,服务不可用。
3.4 去中心化模式(Cluster )
1.什么是Cluster
redis的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台redis服务器都存储相同的数据,很浪费内存,所以在redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说每台redis节点上都可以存储不同的内容。
Redis-Cluster采用无中心结构,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。
但是如果每台Redis都存储不同数据的话,我们应该到哪台Redis中去寻找我们所需要的数据呢。
redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个整数结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
当你往Redis Cluster中加入一个Key时,会根据crc16(key) mod 16384计算这个key应该分布到哪个hash slot中,一个hash slot中会有很多key和value。你可以理解成表的分区,使用单节点时的redis时只有一个表,所有的key都放在这个表里;改用Redis Cluster以后会自动为你生成16384个分区表,你insert数据时会根据上面的简单算法来决定你的key应该存在哪个分区,每个分区里有很多key。
准备三主三从
1. 修改端口
2. dump文件名
3. aof文件名
4. aof目录名
5. 开启集群模式cluster-enabled yes
6. cluster-config-file nodes-7001.conf
启动redis
分配槽以及主从关系
redis-cli --cluster create --cluster-replicas 1 192.168.100.104:7001 192.168.100.104:7002 192.168.100.104:7003 192.168.100.104:7004 192.168.100.104:7005 192.168.100.104:7006