Redis(37)Redis集群中的主节点和从节点是如何协作的?

Redis 集群中的主节点和从节点通过一种主从复制机制协作,以确保数据的高可用性和容错性。主节点负责处理读写请求,而从节点则从主节点复制数据,并在主节点发生故障时接替主节点的角色。

主从复制机制

在 Redis 集群中,每个主节点都可以有一个或多个从节点。从节点会异步地从主节点复制数据,以保证数据的一致性。当主节点发生故障时,从节点会自动提升为新的主节点,以保证集群的可用性。

主要机制

  1. 数据复制 :从节点会周期性地向主节点发送 PSYNC 命令,同步主节点的最新数据。
  2. 故障检测:集群中的每个节点都会定期发送 PING 消息给其他节点,以检测节点的健康状态。当某个节点被多数节点标记为不可用时,集群会启动故障转移机制。
  3. 故障转移:当主节点发生故障时,集群会选择一个从节点提升为新的主节点,并将槽重新分配给新的主节点。

配置主从节点

在配置文件中,通过设置 replicaof 选项可以指定某个节点为另一个节点的从节点。例如,在 redis-node-2.conf 中指定其为 redis-node-1 的从节点:

plaintext 复制代码
port 7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
replicaof 127.0.0.1 7000

创建和管理集群

假设我们已经有 3 个主节点和 3 个从节点,下面的示例展示了如何创建一个 Redis 集群,并分配主从关系。

使用 redis-cli 创建集群

sh 复制代码
# 创建集群并分配角色
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

上述命令会自动将 3 个节点作为主节点,另外 3 个节点作为从节点。输出类似如下信息:

plaintext 复制代码
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
>>> Performing Cluster Check (using node 127.0.0.1:7000)

故障转移

当 Redis 集群中的主节点发生故障时,集群会自动执行故障转移。以下是模拟主节点故障转移的步骤和代码示例:

1. 模拟主节点故障

可以通过停止某个 Redis 实例来模拟主节点故障:

sh 复制代码
redis-cli -p 7000 shutdown

2. 检查故障转移情况

在某个时间段内,集群会检测主节点的故障并进行故障转移。可以通过以下命令检查集群状态:

sh 复制代码
redis-cli -p 7001 cluster nodes

3. Java 代码示例:检测故障转移

以下 Java 代码示例展示如何使用 Jedis 库检测 Redis 集群中的节点状态:

java 复制代码
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

import java.util.HashSet;
import java.util.Set;

public class RedisClusterFailoverExample {
    public static void main(String[] args) {
        // 定义 Redis 集群节点
        Set<HostAndPort> jedisClusterNodes = new HashSet<>();
        jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7001));
        jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7002));
        jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7003));
        jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7004));
        jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7005));

        // 创建 JedisCluster 对象
        try (JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes)) {
            // 获取集群节点信息
            String clusterNodes = jedisCluster.clusterNodes();
            System.out.println("Cluster nodes:\n" + clusterNodes);

            // 检查某个键是否可用
            String key = "testKey";
            jedisCluster.set(key, "value");
            String value = jedisCluster.get(key);
            System.out.println("Key: " + key + " Value: " + value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

总结

Redis 集群中的主节点和从节点通过主从复制机制协作,以确保数据的高可用性和容错性。主节点处理读写请求,从节点复制主节点的数据,并在主节点故障时接替主节点的角色。通过 Redis 的配置文件和 redis-cli 工具,可以轻松创建和管理集群中的主从关系。使用 Jedis 库,可以在 Java 应用中检测和管理集群状态。上述示例代码展示了如何配置主从节点、创建集群、检测故障转移以及使用 Jedis 库与 Redis 集群进行交互。

相关推荐
aramae30 分钟前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
徐小夕1 小时前
存量.doc 文档怎么办?JitWord 开源转换库打通旧文档到在线协同全链路
后端·架构·github
ee又momo1 小时前
一次 JWT Token 过期续期的踩坑记录
后端
二月龙1 小时前
App 瘦身实战:图片、so 库、资源压缩,安装包体积减小 40%
后端
大勇前进2 小时前
Kotlin 协程实战避坑:90% 的人都会踩的生命周期泄漏问题
后端
苏三说技术2 小时前
Spring AI、LangChain4j、AgentScope、Embabel,哪个AI框架更好?
后端
烽学长2 小时前
(附源码)基于Springboot+vue的图书阅读分享系统的设计与实现
java·spring boot·后端
isfox2 小时前
Python 单例模式:一个类只能有一个实例,到底怎么实现?
后端
青山木3 小时前
RocketMQ 入门到原理(三):消息存储原理
java·后端·中间件·架构·rocketmq