【问题标题】:What is the difference between ShardedJedis and JedisClusterShardedJedis 和 JedisCluster 有什么区别
【发布时间】:2019-07-04 22:04:54
【问题描述】:

所以我有两种不同的方法可以在 Jedis 中使用 Redis 集群:

方法一 链接here

    List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();

    JedisShardInfo si = null;

    si = new JedisShardInfo("10.7.2.242", 7003);
    shards.add(si);
    si = new JedisShardInfo("10.7.2.242", 7004);
    shards.add(si);
    si = new JedisShardInfo("10.7.2.242", 7005);
    shards.add(si);

    ShardedJedis jedis = new ShardedJedis(shards);

    jedis.set("foo_first", "foo");

方法二 链接here

    Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
        jedisClusterNodes.add(new HostAndPort("10.7.2.242", 7003));
        jedisClusterNodes.add(new HostAndPort("10.7.2.242", 7004));
        jedisClusterNodes.add(new HostAndPort("10.7.2.242", 7005));
    System.out.println("cluster node set initialised");
    JedisCluster jc = new JedisCluster(jedisClusterNodes);
        jc.set("foo_first", "bar");
    String value = jc.get("foo_first");
    System.out.println(value);

现在我怀疑为什么会有这两种不同的方法,它们之间的基本区别是什么?

【问题讨论】:

  • @xetorthio 请解释一下

标签: java redis jedis


【解决方案1】:

ShardedJedis 逻辑创建分片,因此它不支持 H/A(故障转移)和重新分配密钥(因为密钥分配是基于算法的,我们无法动态更改)。

它是在 Redis 不关心集群功能时引入的,目前您可以使用 ShardedJedis 完成的大部分工作都是使用 RedisCluster (JedisCluster) 完成的。

一个很大的区别是节点故障。 ShardedJedis 不关心 H/A,因此一个节点的故障不会导致整个集群的故障。 (但你无法访问崩溃节点内的密钥)但是 Redis Cluster 将情况视为 CLUSTERDOWN,所以你应该准备从节点,以便 Redis Cluster 可以触发故障转移。

【讨论】:

    【解决方案2】:

    分片允许您将数据分布在不同的节点(没有 Redis 实例)中,现在您可以使用集群来透明地访问和分布您的数据。

    【讨论】:

    • 如何在 Sharding 中分发数据。如果您看到 ShardedJedis 的调用,我们永远不会告诉您将数据放入哪个分片。所以事实并非如此
    • 分配(数据)的机制是通过一种称为“一致散列”的技术实现的,它告诉您一个键 X 将被插入到节点 2 中。要强制键转到某个节点,您可以看到github.com/xetorthio/jedis/wiki/AdvancedUsage“强制某些键转到同一分片”部分。
    • 我告诉你的机制对于共享和集群模式都是透明的。
    猜你喜欢
    • 2010-10-02
    • 2011-12-12
    • 2010-09-16
    • 2012-03-14
    • 2012-02-06
    • 2011-02-25
    • 2011-11-22
    • 2015-03-26
    • 2013-08-19
    相关资源
    最近更新 更多