redis常见的使用方式
Redis的几种常见使用方式包括:
- Redis单副本;
- Redis多副本(主从) ;
- Redis Sentinel (哨兵) ;
- Redis Cluster;
- Redis自研。
使用场景:
如果数据量很少,主要是承载高并发高性能的场景,比如缓存一般就几个G的话, 单机足够了。
主从模式: master节点挂掉后,需要手动指定新的master,可用性不高,基本不用。
哨兵模式: master 节点挂掉后,哨兵进程会主动选举新的master,可用性高,但是每个节点存储的数据是一样的,浪费内存空间。数据量不是很多,集群规模不是很大,需要自动容错容灾的时候使用。
Redis cluster主要是针对海量数据+高并发+高可用的场景,如果是海量数据,如果你的数据量很大,那么建议就用Redis cluster,所有master的容量总和就是Redis cluster可缓存的数据容量。
redis单副本
Redis单副本,采用单个Redis节点部署架构,没有备用节点实时同步数据,不提供数据持久化和备份策略,适用于数据可靠性要求不高的纯缓存业务场景。
多副本(主从)
Redis多副本,采用主从(replication) 部署结构,相较于单副本而言最大的特点就是主从实例间数据实时同步,并且提供数据持久化和备份策略。主从实例部署在不同的物理服务器上,根据公司的基础环境配置,可以实现同时对外提供服务和读写分离策略。
优点:
- 高可靠性: 一方面,采用双机主备架构,能够在主库出现故障时自动进行主备切换,从库提升为主库提供服务,保证服务平稳运行; 另一方面,开启数据持久化功能和配置合理的备份策略,能有效的解决数据误操作和数据异常丢失的问题;
- 读写分离策略:从节点可以扩展主库节点的读能力,有效应对大并发量的读操作。
缺点:
- 故障恢复复杂,如果没有RedisHA系统(需要开发),当主库节点出现故障时,需要手动将一个从
节点晋升为主节点,同时需要通知业务方变更配置,并且需要让其它从库节点去复制新主库节点,整个过程需要人为干预,比较繁琐; - 主库的写能力受到单机的限制,可以考虑分片;
- 主库的存储能力受到单机的限制,可以考虑Pika;
- 原生复制的弊端在早期的版本中也会比较突出,如: Redis 复制中断后,Slave 会发起psync,此时如果同步不成功,则会进行全量同步,主库执行全量备份的同时可能会造成毫秒或秒级的卡顿;又由于COW机制,导致极端情况下的主库内存溢出,程序异常退出或宕机;主库节点生成备份文件导致服务器磁盘IO和CPU (压缩)资源消耗;发送数GB大小的备份文件导致服务器出口带宽暴增,阻塞请求,建议升级到最新版本。
哨兵(sentinel)
主从模式下,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工千预,费事费力,还会造成一段时间内服务不可用。这种方式并不推荐,实际生产中,我们优先考虑哨兵模式。这种模式下,master
宕机,哨兵会自动选举master并将其他的slave指向新的master。
Redis Sentinel是社区版本推出的原生高可用解决方案,其部署架构主要包括两部分: Redis Sentinel集群和Redis数据集群。
其中Redis Sentinel集群是由若干Sentinel节点组成的分布式集群,可以实现故障发现、故障自动转移、配置中心和客户端通知。Redis Sentinel的节点数量要满足2n+1 (n>=1) 的奇数个。
优点:
- Redis Sentinel集群部署简单;
- 能够解决Redis主从模式下的高可用切换问题:
- 很方便实现Redis数据节点的线形扩展,轻松突破Redis自身单线程瓶颈,可极大满足Redis大容量或高性能的业务需求:
- 可以实现一套Sentinel监控一 组Redis数据节点或多组数据节点。
缺点:
- 部署相对Redis主从模式要复杂一些,原理理解更繁琐;
- 资源浪费,Redis数据节点中slave节点作为备份节点不提供服务;
- Redis Sentinel主要是针对Redis数据节点中的主节点的高可用切换,对Redis的数据节点做失败判
定分为主观下线和客观下线两种,对于Redis的从节点有对节点做主观下线操作,并不执行故障转
移。 - 不能解决读写分离问题,实现起来相对复杂。
Redis哨 兵是怎么工作的?
1.每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及 其他Sentinel实例发送一个
PING命令。
2.如果一个实例(instance) 距离最后一次有效回复PING命令的时间超过down-after-milliseconds
选项所指定的值,则这个实例会被当前Sentinel标记为主观下线。
3.如果一个Master被标记为主观下线,则正在监视这个Master的所有Sentinel要以每秒一次的频率
确认Master的确进入了主观下线状态。
4.当有足够数量的Sentinel (大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入
了主观下线状态,则Master 会被标记为客观下线。
5.当Master被Sentinel标记为客观下线时,Sentinel 向下线的Master的所有Slave发送INFO命令的频率会从10秒一次改为每秒一次(在一般情况下,每个Sentinel会以每10秒一次的频率向它已知的所有Master,Slave发送INFO命令)。
6.若没有足够数量的Sentinel同意Master已经下线,Master 的客观下线状态就会变成主观下线。若Master重新向Sentinel的PING命令返回有效回复,Master 的主观下线状态就会被移除。
7.sentinel节点会与其他sentinel节点进行“沟通”,投票选举- - 个sentine|节点进行故障处理,在从节
点中选取一个主节点,其他从节点挂载到新的主节点上自动复制新主节点的数据。
集群(cluster)
Redis的哨兵模式基本已经可以实现高可用,读写分离,但是在这种模式下每台Redis服务器都存储相同的数据,很浪费内存,所以在Redis3.0.上加入了Cluster集群模式,实现了Redis的分布式存储,对数据进行分片,也就是说每台Redis节点上存储不同的内容。
Redis Cluster是社区版推出的Redis分布式集群解决方案,主要解决Redis分布式方面的需求,比如,当
遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster能起到很好的负载均衡的目的。
Redis Cluster集群节点最小配置6个节点以上(3主3从),其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。
Redis Cluster采用虚拟槽分区,所有的键根据哈希函数映射到0~ 16383个整数槽内,每个节点负责维护
一部分槽以及槽所印映射的键值数据。