StackExchange.Redis - 写入 redis 集群指向本地 IP 地址
StackExchange.Redis - writing to a redis cluster points to local IP address
我在写入 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");
returns 这个异常:
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();
returns 都配置了具有 public IP 的端点和具有本地 IP 的集群发现的端点(参见检查变量的图像),然后具有私有 IP 的节点用于检索 hashslot。
我还应该在配置中设置什么或者使用客户端有什么问题吗?
当前使用的配置,每个节点都有自己的文件夹.0X
,里面有自己的配置文件和日志:
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
我用jedis测试了场景,也存在这个问题:public连接redis集群时,私网IP可以同时存在
要解决它,请在设置集群时使用 public ip,并确保 public ips 在每个 node.conf 配置中。如果node.conf写“127.0.0.1”,连接到“10.5.2.146:7000”,这两个ip都会存在
以及在这种情况下解决此问题的快速方法:集群在 redis-cli 中遇到 3 public ips,例如
cluster meet 10.5.2.146 7000
cluster meet 10.5.2.146 7001
cluster meet 10.5.2.146 7002
我也遇到了同样的问题。还有另一种方法可以确保 ip 以您需要的方式公布,在配置文件中有一部分用于 NAT 地址。我的回答以及之前的回答的唯一问题是您需要知道正确的 ip 地址,并且它应该是静态的 ...
cluster-announce-ip
我在写入 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");
returns 这个异常:
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();
returns 都配置了具有 public IP 的端点和具有本地 IP 的集群发现的端点(参见检查变量的图像),然后具有私有 IP 的节点用于检索 hashslot。
我还应该在配置中设置什么或者使用客户端有什么问题吗?
当前使用的配置,每个节点都有自己的文件夹.0X
,里面有自己的配置文件和日志:
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
我用jedis测试了场景,也存在这个问题:public连接redis集群时,私网IP可以同时存在
要解决它,请在设置集群时使用 public ip,并确保 public ips 在每个 node.conf 配置中。如果node.conf写“127.0.0.1”,连接到“10.5.2.146:7000”,这两个ip都会存在
以及在这种情况下解决此问题的快速方法:集群在 redis-cli 中遇到 3 public ips,例如
cluster meet 10.5.2.146 7000
cluster meet 10.5.2.146 7001
cluster meet 10.5.2.146 7002
我也遇到了同样的问题。还有另一种方法可以确保 ip 以您需要的方式公布,在配置文件中有一部分用于 NAT 地址。我的回答以及之前的回答的唯一问题是您需要知道正确的 ip 地址,并且它应该是静态的 ...
cluster-announce-ip