StackExchange.Redis-向Redis集群写入时指向本地IP地址

3

我在向Redis集群写入数据时遇到了问题。

以下是我的配置信息:

static readonly IEnumerable<EndPoint> Endpoints = new[]
{
    EndPointCollection.TryParse("10.5.2.146:7000"),
    EndPointCollection.TryParse("10.5.2.146:7001"),
    EndPointCollection.TryParse("10.5.2.146:7002"),
};

public static ConnectionMultiplexer Build()
{
    var opt = new ConfigurationOptions { AllowAdmin = true };

    foreach (var endpoint in Endpoints)
        opt.EndPoints.Add(endpoint);

    Redis = ConnectionMultiplexer.Connect(opt);
    FlushAllDatabases();
    return Redis;
 }

并像这样使用它:

var redis = RedisConfig.Build();
redis.GetDatabase().StringSet("foo", "bar");
redis.GetDatabase().StringGet("foo");

返回此异常:
StackExchange.Redis.RedisServerException: 'Endpoint 127.0.0.1:7002 serving hashslot 12182 is not reachable at this point of time. Please check connectTimeout value. If it is low, try increasing it to give the ConnectionMultiplexer a chance to recover from the network disconnect.  IOCP: (Busy=1,Free=999,Min=4,Max=1000), WORKER: (Busy=0,Free=2047,Min=4,Max=2047), Local-CPU: n/a'

我认为问题在于:var endpoints = redis.GetEndPoints(); 返回了一个包含配置的、公网IP和基于集群发现的、本地IP的端点列表(请参见检查变量的图片),然后使用带有私有IP的节点来检索哈希插槽。

image

在配置中是否还有其他需要设置的内容或者客户端的使用有误?

当前使用的配置,每个节点都有它自己的文件夹.\700X,包括它自己的 conf 文件和 log:

redis.conf  (for first node)
    port 7000
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes
    logfile 7000.log
    protected-mode no
    bind 0.0.0.0

nodes.conf
    0c213c727e90710bbd94d5094da2c6749872f74f 127.0.0.1:7001 master - 0 1494253090995 2 connected 5461-10922
    2e6d24ccec03d1ca674b936eac0e48dc6a97c405 127.0.0.1:7000 myself,master - 0 0 1 connected 0-5460
    7467c908c390bb6db202836fdff2966e4f100858 127.0.0.1:7007 slave bdd5c046e2a05b289ef0aba47a9987988defc799 0 1494253090889 8 connected
    bbb2d02845e57622b5e95574ab843d9cefd0b28a 127.0.0.1:7006 slave 0c213c727e90710bbd94d5094da2c6749872f74f 0 1494253090890 7 connected
    bdd5c046e2a05b289ef0aba47a9987988defc799 127.0.0.1:7002 master - 0 1494253092195 3 connected 10923-16383
    c39aa6ff1e9823a169b758fc5aed2f5e811a971a 127.0.0.1:7008 slave bdd5c046e2a05b289ef0aba47a9987988defc799 0 1494253091700 9 connected
    673d0af38625ae962f6ed7f527cc5162a08d7f21 127.0.0.1:7003 slave 2e6d24ccec03d1ca674b936eac0e48dc6a97c405 0 1494253091191 4 connected
    ed1e5ba7a0a569e2d4b8542bf8a8353d33e81384 127.0.0.1:7004 slave 2e6d24ccec03d1ca674b936eac0e48dc6a97c405 0 1494253090889 5 connected
    a4d29951bcf70593d14fbee5438608c88c971922 127.0.0.1:7005 slave 0c213c727e90710bbd94d5094da2c6749872f74f 0 1494253091722 6 connected
    vars currentEpoch 9 lastVoteEpoch 0

请在群集中展示一个node.conf文件。 - Mobility
@MallowFox 添加了当前的 redis.conf 和 nodes.conf。 - Vlad Saftoiu
2个回答

2

我使用jedis测试了这种情况,并且发现存在一个问题:连接到redis集群时,公共IP和私有IP都可以存在。

为了解决这个问题,在设置集群时,请使用公共IP,并确保每个node.conf配置文件中都有公共IP。如果在node.conf中写入“127.0.0.1”,并连接到“10.5.2.146:7000”,那么这两个IP地址都将存在。

在这种情况下,快速解决的方法是:在redis-cli中使用cluster meet命令输入3个公共IP地址。

cluster meet 10.5.2.146 7000
cluster meet 10.5.2.146 7001
cluster meet 10.5.2.146 7002

cluster meet 解决了这个问题。阅读 CLUSTER MEET链接)的文档后,我发现:基本思想是节点默认不信任彼此,并被视为未知,因此由于系统管理错误或网络地址修改而导致不同的集群节点混合成一个单一节点的可能性很小。 - Vlad Saftoiu

1

我也遇到了同样的问题。还有另外一种确保IP地址以所需方式公布的方法,在配置文件中有一个NAT地址部分。但是,我的答案和之前的答案都存在一个问题,那就是您需要知道正确的IP地址,并且它应该是静态的...

cluster-announce-ip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接