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 集群进行交互。

相关推荐
驰羽10 小时前
[GO]什么是热重载,如何使用Air工具
开发语言·后端·golang
SirLancelot110 小时前
MongoDB-基本介绍(一)基本概念、特点、适用场景、技术选型
java·数据库·分布式·后端·mongodb·软件工程·软件构建
程序员小凯11 小时前
Spring Boot消息队列与事件驱动详解
java·spring boot·后端
BUG弄潮儿11 小时前
go-swagger标准接口暴露
开发语言·后端·golang
阑梦清川11 小时前
linux系统jdk&&mysql配置
后端
i学长的猫12 小时前
Spring Boot 布隆过滤器最佳实践指南
spring boot·后端·哈希算法
Mr_hwt_12312 小时前
spring boot框架中本地缓存@Cacheable原理与踩坑点详细解析
java·spring boot·后端·缓存
qq_3391911412 小时前
go win安装grpc-gen-go插件
开发语言·后端·golang
iCoding9113 小时前
前端分页 vs 后端分页:技术选型
前端·后端·系统架构
王中阳Go背后的男人13 小时前
我发现不管是Java还是Golang,懂AI之后,是真吃香!
后端