Redis集群
Redis的三种集群模式
- 主从模式
- 哨兵模式
- Cluster模式
主从模式
Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制根据是否全量复制,分为全量复制和增量复制。
全量复制:
在slave启动的初始化阶段,slave需要将master的全量数据都复制一份,全量复制步骤:
- slave连接master,发送SYNC命令
- master接收到SYNC命令后,开始执行bgsave生成rdb文件,并使用缓冲区接受所有写命令
- master执行完bgsave之后,向slave发送快照,并继续将写命令记录在缓冲区
- slave接收到快照之后,载入收到的数据
- master发送完快照之后,向slave发送缓冲区的写命令
- slave载入快照之后,重放写命令
增量复制:
在slave初始化之后,将master上的写命令同步到slave,保证slave和master数据一致
采用主从复制架构时,必须在master开启持久化,否则可能在master当机重启时,因为master的数据为空导致复制之后slave的数据也丢失
主从复制的特点:
- 采用异步复制
- 一主可以多从
- 从服务器可以接受其他从服务器的连接
- 主从复制对于master、slave都是非阻塞的
主从复制的优点:
实现了读写分离,提高了可用性,解决了单点故障
缺点是当master节点宕机时,需要手动进行切换主机,进行故障转移,不容易扩容
哨兵模式
哨兵(Sentinel)是Redis中的一个组件,主要有以下功能:
- 集群监听:监听master、slave是否正常工作
- 消息通知:如果某个slave发生了故障,哨兵负责通知给管理员
- 故障转移:一个master挂掉了,会自动转移到slave上
- 配置中心:当故障发生了之后,通知client新的master地址
哨兵用于实现redis的高可用,本身也是分布式的,作为一个哨兵集群与运行
哨兵的核心知识:
- 至少需要3个哨兵,来保证哨兵集群的健壮性
- 哨兵+主从的架构,主要用于保证redis集群的高可用,不保证不会丢失数据
哨兵主要用来监控Redis集群,来保证Redis的高可用,但是还有一个缺点,就是不易扩容
Cluster模式
Redis Cluster是一种服务端芬片技术,采用了槽(slot)的概念,实现了分布式存储
分片原理:
redis将集群划分为16384个槽,存取数据的时候,对key进行hash来决定放在那个槽上,而redis集群的每一个槽都存放了所有槽的路由信息,当定位到槽后,可以直接从配置中获取到所处的节点,再去对应节点获取数据,扩容时只要将槽迁移到新的节点上,再更新槽的路由信息即可
Cluster模式下,每个节点需要开放两个端口,一个用于客户端请求命令,一个用于进行节点之间的通信,用于故障检测、配置更新、故障转移
优点是:
- 分布式架构便于动态扩容
- 节点不需要存放所有数据,节省资源
- 具备哨兵模式的故障监控和转移能力
- 无proxy,客户端直接访问redis服务
但缺点是运维更复杂,迁移数据需要人工操作,只能使用0号库,不能使用SELECT