Redis集群方案
Posted sysu_lluozh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis集群方案相关的知识,希望对你有一定的参考价值。
一、主从复制模式
1.1 主从复制的概念
主从复制(又名读写分离):是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点
默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点
1.2 redis replication 的核心机制
redis replication -> 主从架构 -> 读写分离 -> 水平扩容支撑读高并发
- redis采用异步方式复制数据到slave节点,不过redis2.8开始,slave node会周期性地确认自己每次复制的数据量
- 一个master node是可以配置多个slave node的
- slave node可以连接其他的slave node
- slave node做复制的时候,不会block master node的正常工作
- slave node做复制的时候,不会block对自己的查询操作,会用旧的数据集来提供服务,但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了
- slave node主要用来进行横向扩容,做读写分离,扩容的slave node可以提高读的吞吐量
注意:
如果采用了主从架构,那么建议必须开启master node的持久化,不建议用slave node作为 master node 的数据热备,因为那样的话,如果关掉master的持久化,可能在master宕机重启的时候数据是空的,然后可能一经过复制slave node的数据也丢了
另外,master的各种备份方案也需要做。万一本地的所有文件丢失,从备份中挑选一份rdb去恢复 master,这样才能确保启动的时候是有数据的
1.3 主从复制的核心原理
当启动一个 slave node 的时候,它会发送一个 PSYNC 命令给master node
- slave node初次连接到master node
触发一次full resynchronization全量复制:
- master启动一个后台线程,开始生成一份RDB快照文件,同时还会将从客户端client新收到的所有写命令缓存在内存中
- RDB 文件生成完毕后, master将这个RDB发送给slave
- slave先写入本地磁盘,然后再从本地磁盘加载到内存中
- master 会将内存中缓存的写命令发送到slave
- slave同步这些数据
- slave node断开重连
slave node如果跟master node有网络故障断开了连接,会自动重连,连接之后master node仅会复制给slave部分缺少的数据
1.4 主从复制的作用
-
数据冗余
主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
-
故障恢复
当主节点出现问题时可以由从节点提供服务实现快速的故障恢复;实际上是一种服务的冗余
-
负载均衡
在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量
-
读写分离
可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量
-
高可用基石
除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础
1.5 主从复制的缺点
-
不具备自动容错和恢复功能
主从宕机会影响前端的部分请求失败,需要重启机器或者手动切换前端IP才能恢复
-
主机宕机数据丢失
宕机前部分有部分数据未同步到从机,切换IP后会引入数据不一致降低系统可用性
-
数据大的问题
数据量特别大一个主是存储不了
-
主机压力大
所有的slave节点数据的复制和同步都由master节点来处理,会照成master节点压力太大,使用主从从结构来解决
二、Sentinel(哨兵)模式
2.1 哨兵模式概念
主从复制模式中,主服务中断后需要人工手动将从服务切换为主服务,以便继续提供服务
Redis2.8中,哨兵模式解决了这一问题,哨兵模式可以实现自动化的系统监控和故障恢复(主从切换)功能
哨兵会持续去ping Redis的服务器,若多数哨兵ping不通服务器,表示这个服务器下线
- 主观下线:一个哨兵觉得服务器下线
- 客观下线:多数哨兵认为服务器下线
- 故障转移:主从切换
2.2 主要功能
哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能:
- 集群监控:负责监控redis master和slave进程是否正常工作
- 消息通知:如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员
- 故障转移:如果master node挂掉,会自动转移到slave node上
- 配置中心:如果故障转移发生,通知client客户端新的master地址
2.3 核心知识
- 哨兵至少需要3个实例,来保证健壮性
- 哨兵+redis主从的部署架构,是不保证数据零丢失的,只能保证redis集群的高可用性
- 对于哨兵+redis主从这种复杂的部署架构,尽量在测试环境和生产环境都进行充足的测试和演练
三、Cluster(服务端路由查询)模式
3.1 为什么需要Redis-Cluster
哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台redis服务器都存储相同的数据,很浪费内存
在redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说每台redis节点上存储不同的内容
3.2 Redis-Cluster的概念
Redis-Cluster采用无中心结构,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态
每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了只需要连接集群中的任意一个节点,就可以获取到其他节点的数据
3.3 Redis-Cluster方案说明
Redis Cluster并没有使用一致性hash,而是采用slot(槽)的概念,一共分成16384个槽。将请求发送到任意节点,接收到请求的节点会将查询请求发送到正确的节点上执行
- 通过哈希的方式,将数据分片,每个节点均分存储一定哈希槽(哈希值)区间的数据,默认分配了16384个槽位
- 每份数据分片会存储在多个互为主从的多节点上
- 数据写入先写主节点,再同步到从节点(支持配置为阻塞同步)
- 同一分片多个节点间的数据不保持一致性
- 读取数据时,当客户端操作的key没有分配在该节点上时,redis会返回转向指令,指向正确的节点
- 扩容时需要需要把旧节点的数据迁移一部分到新节点
在redis cluster架构下,每个redis要放开两个端口号,比如一个是6379,另外一个就是加1w的端口号,比如16379
16379端口号是用来进行节点间通信的,也就是cluster bus的东西,cluster bus的通信,用来进行故障检测、配置更新、故障转移授权。cluster bus用了另外一种二进制的协议,gossip协议,用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间
3.4 节点间的内部通信机制
基本通信原理
集群元数据的维护有两种方式:集中式、Gossip 协议。redis cluster节点间采用gossip协议进行通信
3.5 分布式寻址算法
- hash 算法(大量缓存重建)
- 一致性 hash 算法(自动缓存迁移)+ 虚拟节点(自动负载均衡)
- redis cluster的hash slot算法
3.6 容错机制
为了防止主节点数据丢失,可以为每个主节点准备特点数目的从节点,主节点挂掉从节点可以升级为主节点(哨兵模式)
容错机制指的是,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作
故障节点对应的从节点自动升级为主节点,如果某个主挂掉而没有从节点可以使用,那么整个Redis集群进入宕机状态
3.7 优点
- 多主多从,分摊写的压力
- 无中心架构,支持动态扩容,对业务透明
- 分布式数据存储,解决存储大量数据问题
- 具备Sentinel的监控和自动Failover(故障转移)能力
- 客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
- 高性能,客户端直连redis服务,免去了proxy代理的损耗
3.8 缺点
- 运维也很复杂,数据迁移需要人工干预
- 只能使用0号数据库
- 不支持批量操作(pipeline管道操作)
- 分布式逻辑和存储模块耦合
以上是关于Redis集群方案的主要内容,如果未能解决你的问题,请参考以下文章
#yyds干货盘点#Redis集群原理专题介绍一下常用的Redis集群机制方案的介绍和分析
Day761.Redis集群方案:Codis -Redis 核心技术与实战