问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Redis机制详解:主从模式、哨兵模式与分片集群

创作时间:
作者:
@小白创作中心

Redis机制详解:主从模式、哨兵模式与分片集群

引用
CSDN
1.
https://blog.csdn.net/hangegedecs/article/details/139100777

Redis作为一款高性能的键值存储系统,其集群架构的设计对于提升系统的可用性和扩展性至关重要。本文将详细介绍Redis的三种集群模式:主从模式、哨兵模式和分片集群,帮助读者全面理解它们的工作原理和应用场景。

一、主从复制

想要提升Redis的并发能力,就要搭建主从集群,实现读写分离,毕竟单节点的Redis的并发能力是有上限的。如图,主节点可以进行写操作,从节点只能进行读操作。

但是这又引出了另外一个问题,那就是如何保证主节点和从节点之间的数据一致呢?主从数据是如何进行同步的呢?

主从同步

  1. 全量同步

  2. 从节点第一次请求主节点进行数据同步时,会执行replicaof命令。

  3. 发送自己的id和偏移量给主节点。

  4. 主机此时会判断是否是第一次进行同步。

  5. 如果是第一次,那么就会返回主节点之中的版本数据。

  6. 从节点则会保存版本信息。

  7. 主节点会执行bgsave命令,然后生成一个RDB文件,RDB(Redis Database Backup file)数据备份文件,也是Redis数据快照。简单来说就是把内存中所有数据记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照,恢复数据。

  8. 然后会将这个RDB文件发送给从节点。

  9. 从节点则会清空本地数据,执行该RDB文件。

  10. 在生成RDB文件的同时,主节点还会记录RDB期间所有发送过来的命令,保存到一个repl_baklog文件当中。然后发送给从节点。

  11. 从节点执行log文件,此时就达到了真正的主从数据同步。

  12. 增量同步

假如从节点重启以后恢复,此时主节点和从节点之间数据已经有了差异,从节点会发送同步请求,那么此时,主节点还是会判断是否是第一次连接,如果不是,那么就发送log文件,此时从节点就可以进行增量同步。

值得注意的是,主节点的数据是存储在一个环形数组中的,如果这个数据的偏移量已经超过了数组的长度,那么增量同步也是会丢失数据的,此时就只能再进行全量同步了。

二、哨兵机制

Redis提供了哨兵机制来实现主从集群的自动故障恢复。哨兵提供了三个功能:

  • 监控:哨兵会不断地检查主节点和从节点是否按照预期工作
  • 自动故障恢复:如果主节点故障,那么哨兵会选择一个从节点来担当主节点
  • 通知:哨兵充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新的信息推送给Redis的客户端。

服务状态检测

  • 主观下线:当某哨兵节点发现某个redis实例未在规定时间内响应的话,则认为该节点下线。
  • 客观下线:当哨兵群有一半以上认为某个redis实例主观下线,则其也会客观下线,因此哨兵数量一般都为奇数。

哨兵选主规则

  1. 首先判断主从节点断开时间长短,如超过指定值就排除该从节点。
  2. 然后判断从节点的slave-priority值,越小优先级越高。
  3. 如果优先级一样,那么判断offset值,越大优先级越高。
  4. 最后判断slave节点的运行id大小,越小优先级越高。

脑裂(不同的网络分区)

如果当前主节点突然出现暂时性 “失联”,而并不是真的发生了故障,此时监听的哨兵会自动启动主从切换机制。当这个原始的主库从假故障中恢复后,又开始处理请求,但是哨兵已经选出了新的主库,这样一来,旧的主库和新主库就会同时存在,这就是脑裂现象

脑裂最严重的问题就是客户端不知道往哪个节点写数据了。结果就是不同的客户端会给不同的服务器写数据,从而造成数据丢失的现象。

简单来说就是,主节点让从节点执行它的RDB文件,此时从节点会删除自己的数据,从而噪声数据丢失。

redis中存在两个配置参数

  • min_replicas_to_write N
  • min_replicas_max_lag 10

第一个参数标识,一个节点最少要有N个从节点,才可以进行写操作。

第二个参数标识,用于配置 master 多长时间(秒)无法得到从节点的响应,就认为这个节点失联。我们这里配置的是 10 秒,也就是说 master 10 秒都得不到一个从节点的响应,就会认为这个从节点失联,停止接受新的写入命令请求。

三、分片集群

当有海量数据和高并发问题时,就应该采用分片集群的结构。

集群中有多个主节点,且每个主节点保存不同数据

每个主节点有多个从节点

主节点之间通过心跳进行检测,充当哨兵

客户端可以访问任意节点,最终都会被转发到正确的节点

数据读写

分片集群中引入了哈希槽的概念,比如说Redis有16384个哈希槽,每个key通过CRC16检验之后会算出一个值模16384,得到的值就在16383之间,然后根据最后的结果快速得到数据在哪一个主节点之上。同一类数据还可以用{ }扩起来计算其有效果值,可以使得查找更为方便。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号