Redis(45)哨兵模式与集群模式有何区别?

Redis 提供了两种高可用性解决方案:哨兵模式和集群模式。它们各自有不同的特点和适用场景。以下是详细的对比和结合代码的示例:

哨兵模式(Sentinel)

特点

  1. 高可用性

    • Sentinel 通过监控、通知、故障转移等功能,保证 Redis 服务的高可用性。
  2. 主从复制

    • 使用主从复制实现数据冗余和读写分离。
  3. 自动故障转移

    • 当主节点发生故障时,Sentinel 会自动将一个从节点提升为新的主节点。
  4. 客户端连接

    • 客户端通过 Sentinel 获取当前主节点的信息以确保连接到正确的节点。

示例

配置主从架构和 Sentinel:

主节点配置(master.conf)

plaintext 复制代码
port 6379
bind 127.0.0.1
dir /var/lib/redis
appendonly yes

从节点配置(slave.conf)

plaintext 复制代码
port 6380
bind 127.0.0.1
dir /var/lib/redis
appendonly yes
slaveof 127.0.0.1 6379

Sentinel 配置(sentinel.conf)

plaintext 复制代码
port 26379
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 60000

启动 Sentinel:

sh 复制代码
redis-sentinel sentinel.conf

Java 代码示例

java 复制代码
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;

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

public class RedisSentinelExample {
    private static final String MASTER_NAME = "mymaster";

    public static void main(String[] args) {
        Set<String> sentinels = new HashSet<>();
        sentinels.add("127.0.0.1:26379");

        try (JedisSentinelPool sentinelPool = new JedisSentinelPool(MASTER_NAME, sentinels);
             Jedis jedis = sentinelPool.getResource()) {

            jedis.set("mykey", "myvalue");
            String value = jedis.get("mykey");
            System.out.println("mykey: " + value);

            System.out.println("Connected to master: " + jedis.getClient().getHost() + ":" + jedis.getClient().getPort());
        }
    }
}

集群模式(Cluster)

特点

  1. 数据分片

    • Redis 集群将数据分片存储在不同的节点上,每个节点存储整个数据集的一部分。
  2. 高可用性

    • Redis 集群通过复制和分区来实现高可用性和数据的高可靠性。
  3. 自动故障转移

    • 集群模式内建自动故障转移机制,发生故障时可以自动选择新的主节点。
  4. 水平扩展

    • 可以通过增加节点来扩展集群的存储容量和处理能力。

示例

配置 Redis 集群:

节点配置(node1.conf, node2.conf, ..., node6.conf)

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

启动每个节点:

sh 复制代码
redis-server node1.conf
redis-server node2.conf
redis-server node3.conf
redis-server node4.conf
redis-server node5.conf
redis-server node6.conf

创建集群:

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

Java 代码示例

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

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

public class RedisClusterExample {
    public static void main(String[] args) {
        Set<HostAndPort> clusterNodes = new HashSet<>();
        clusterNodes.add(new HostAndPort("127.0.0.1", 7000));
        clusterNodes.add(new HostAndPort("127.0.0.1", 7001));
        clusterNodes.add(new HostAndPort("127.0.0.1", 7002));
        clusterNodes.add(new HostAndPort("127.0.0.1", 7003));
        clusterNodes.add(new HostAndPort("127.0.0.1", 7004));
        clusterNodes.add(new HostAndPort("127.0.0.1", 7005));

        try (JedisCluster jedisCluster = new JedisCluster(clusterNodes)) {
            jedisCluster.set("mykey", "myvalue");
            String value = jedisCluster.get("mykey");
            System.out.println("mykey: " + value);
        }
    }
}

对比总结

  1. 高可用性

    • 哨兵模式:通过 Sentinel 实现高可用性,适用于小规模集群。
    • 集群模式:内建高可用性,通过节点间的复制和自动故障转移实现。
  2. 扩展性

    • 哨兵模式:扩展性有限,适用于少量节点的主从架构。
    • 集群模式:支持水平扩展,适用于大规模数据集和高并发场景。
  3. 数据分片

    • 哨兵模式:不支持数据分片,所有数据存储在主节点及其复制的从节点上。
    • 集群模式:支持数据分片,每个节点存储部分数据,通过哈希槽分配数据。
  4. 客户端连接

    • 哨兵模式:客户端通过 Sentinel 获取主节点信息,连接到正确的主节点。
    • 集群模式:客户端直接连接到集群节点,自动处理数据分片和故障转移。

根据具体需求选择合适的模式。如果需要高可用性和简单的主从复制,可以选择哨兵模式;如果需要更高的扩展性和数据分片,则选择集群模式。

相关推荐
星辰徐哥6 小时前
Spring Boot 微服务架构设计与实现
spring boot·后端·微服务
星辰徐哥6 小时前
Spring Boot 数据导入导出与报表生成
spring boot·后端·ui
明夜之约6 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee6 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Micro麦可乐6 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
Jinkxs6 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
毕设源码_郑学姐6 小时前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计
辣机小司6 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录
码农阿豪6 小时前
从零到一:Spring Boot快速接入金仓数据库实战
数据库·spring boot·后端
追逐时光者6 小时前
一个基于 .NET 与 Avalonia 构建、面向 TrinityCore 的开源 WoW 数据库编辑器
后端·.net