一、redis节点的复制

复制的数据流是单向的,只能由主节点复制到从节点。配置复制的方式 有以下三种:
1)在配置文件中加入 slaveof {masterHost } {masterPort}随 Redis 启动生效。
2)在 redis-server 启动命令后加入–slaveof {masterHost} {masterPort }生效。
3)直接使用命令:slaveof {masterHost} { masterPort}生效。 综上所述,slaveof 命令在使用时,可以运行期动态配置,也可以提前写到配 置文件中。

默认情况下,从节点使用 slave-read-only=yes 配置为只读模式。由于复制只 能从主节点到从节点,对于从节点的任何修改主节点都无法感知,修改从节点会 造成主从数据不一致。因此建议线上不要修改从节点的只读模式。

传输延迟:
主从节点一般部署在不同机器上,复制时的网络延迟就成为需要考虑的问 题,Redis 为我们提供了 repl-disable-tcp-nodelay 参数用于控制是否关闭 TCP_NODELAY,默认关闭,说明如下: 当关闭时,主节点产生的命令数据无论大小都会及时地发送给从节点,这样 主从之间延迟会变小,但增加了网络带宽的消耗。适用于主从之间的网络环境良 好的场景,如同机架或同机房部署。 当开启时,主节点会合并较小的 TCP 数据包从而节省带宽。默认发送时间间 隔取决于 Linux 的内核,一般默认为 40 毫秒。这种配置节省了带宽但增大主从 之间的延迟。适用于主从网络环境复杂或带宽紧张的场景,如跨机房部署。

二、redis主从架构

redis只读模式 redis 只读_java


一个redis主节点,配多个redis从节点。主节点用于写入数据。并通过复制,传入从节点。至于读数据,可以从主节点读取,也可以从从节点读取。但是需要客户端手动配置从节点的连接信息,手动切换,不支持自动切换主从节点。而且读取从节点,还需考虑数据延迟的问题。

主从架构中,主节点挂了,从节点无法自动转成主节点。redis的写入操作就此中断。
由上述可知,redis的主从模式很鸡肋。针对上述问题,提出了哨兵模式。

三、哨兵模式 Redis Sentinel

当主节点出现故障时,Redis Sentinel 能自动完成故障发现和故障转移,并 通知应用方,从而实现真正的高可用。

工作机制:
Redis Sentinel 是一个分布式架构,其中包含若干个 Sentinel 节点和 Redis 数 据节点,每个 Sentinel 节点会对数据节点和其余 Sentinel 节点进行监控,当它发 现节点不可达时,会对节点做下线标识。如果被标识的是主节点,它还会和其他 Sentinel 节点进行“协商”,当大多数 Sentinel 节点都认为主节点不可达时,它 们会选举出一个 Sentinel 节点来完成自动故障转移的工作,同时会将这个变化实 时通知给 Redis 应用方。整个过程完全是自动的,不需要人工来介入,所以这套 方案很有效地解决了 Redis 的高可用问题。

Redis Sentinel 与 Redis 主从复制模式只是多了若干 Sentinel 节点,所以 Redis Sentinel 并没有针对 Redis 节点做了特殊处理。

下面以 1 个主节点、2 个从节点、3 个 Sentinel 节点组成的 Redis Sentinel 为 例子进行说明。
整个故障转移的处理逻辑有下面 4 个步骤:
1)主节点出现故障,此时两个从节点与主节点失去连接,主从复制失败。 2)每个 Sentinel 节点通过定期监控发现主节点出现了故障。
3)多个 Sentinel 节点对主节点的故障达成一致,选举出 sentinel-3 节点作为领 导者负责故障转移。
4)Sentinel 领导者节点执行了自动化故障转移,包括通知客户端,重新选择 主节点,建立新的复制关系等等。

通过上面介绍的Redis Sentinel逻辑架构以及故障转移的处理,可以看出Redis Sentinel 具有以下几个功能:
监控:Sentinel 节点会定期检测 Redis 数据节点、其余 Sentinel 节点是否可 达。
通知:Sentinel 节点会将故障转移的结果通知给应用方。
主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系。
配置提供者:在 Redis Sentinel 结构中,客户端在初始化的时候连接的是 Sentinel 节点集合,从中获取主节点信息。

同时看到,Redis Sentinel 包含了若个 Sentinel 节点,这样做也带来了两个好 处:对于节点的故障判断是由多个 Sentinel 节点共同完成,这样可以有效地防止误 判。Sentinel 节点集合是由若干个 Sentinel 节点组成的,这样即使个别 Sentinel 节 点不可用,整个 Sentinel 节点集合依然是健壮的。 但是 Sentinel 节点本身就是独立的 Redis 节点,只不过它们有一些特殊,它 们不存储数据,只支持部分命令。

部署拓扑结构如下:

redis只读模式 redis 只读_缓存_02


sentinel节点也是redis服务。可见,哨兵模式需要的redis节点有很多。

四、Redis Cluster集群模式

redis只读模式 redis 只读_redis只读模式_03


cluster模式下,数据根据key计算出槽位,插入到不同的节点上,如下图:

redis只读模式 redis 只读_Redis_04


所以,不同的key,分布到不同的主节点上。

在cluster模式下,主节点也可以配置从节点,且主节点挂掉之后,从节点会自动顶上来当主节点。无需引入哨兵模式。

细节很多,没在实践中用过,先简单研究一下吧,以后有需要再深入研究。