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

相关推荐
零千叶19 分钟前
Spring / Spring Boot 常用注解
java·spring boot·后端
用户61204149221324 分钟前
支持eclipse+idea+mysql5和8的javaweb学生信息管理系统
java·javascript·后端
我不是混子25 分钟前
说说建造者模式
java·后端
用户40993225021226 分钟前
PostgreSQL UPDATE语句怎么玩?从改邮箱到批量更新的避坑技巧你都会吗?
后端·ai编程·trae
我是谁的程序员28 分钟前
前端调试工具有哪些?常用前端调试工具推荐、前端调试工具对比
后端
一直_在路上28 分钟前
Go语言架构实践:构建临床ePRO高性能内存数据网格,应对海量并发挑战
后端
SimonKing1 小时前
🐔老乡鸡把菜谱在GitHub开源了,还说要给程序员发会员卡
java·后端·程序员
IT_陈寒2 小时前
⚡️Vite 5重磅升级:10个性能优化技巧让你的项目提速300%!🚀
前端·人工智能·后端
vivo互联网技术2 小时前
vivo 浏览器福利体系架构演进之路
后端·数据一致性·可扩展·大流量·可复制
aloha_2 小时前
mysqldump 操作手册
后端