2017-05-25 2 views
3

J'ai un problème d'écriture dans un cluster redis.StackExchange.Redis - l'écriture dans une grappe redis pointe vers l'adresse IP locale

Ayant cela comme configuration:

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; 
} 

et l'utiliser comme ceci:

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

renvoie cette exception:

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' 

Je pense que le problème est que: var endpoints = redis.GetEndPoints(); retourne à la fois points de terminaison configurés avec une adresse IP publique et des points de terminaison détectés par un cluster (voir l'image de variable inspectée) avec IP locale, puis le nœud avec IP privée est utilisé pour récupérer le hashslot.

image

Y at-il autre chose que je dois mettre en place dans la configuration ou quelque chose de mal en utilisant le client?

configuration utilisée Actuellement, chaque nœud a son dossier .\700X avec son propre fichier de configuration et connectez-vous:

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 
+0

s'il vous plaît montrer un fichier node.conf dans le cluster – Solo

+0

@MallowFox ajouté actuellement redis.conf et nodes.conf –

Répondre

2

J'ai testé le scénario avec Jedis, et ce problème existe aussi: IP publique et privée peut à la fois exister lorsque se connecter au cluster redis. Pour résoudre ce problème, utilisez ip publique lors de la configuration du cluster, et assurez-vous que les ips publiques sont dans chaque config node.conf. Si "127.0.0.1" est écrit dans node.conf et se connecte à "10.5.2.146:7000", ces deux ips existeront tous les deux.

Et un moyen rapide de résoudre ce problème à la situation: rencontre de groupe 3 ips publics Redis-cli, comme

cluster meet 10.5.2.146 7000 
cluster meet 10.5.2.146 7001 
cluster meet 10.5.2.146 7002 
+0

'cluster meet' a résolu le problème. En lisant les documents pour 'CLUSTER MEET' ([link] (https://redis.io/commands/cluster-meet)), je suis tombé sur ceci: _L'idée de base est que les nœuds par défaut ne font pas confiance à chacun autres, et sont considérés comme inconnus, de sorte qu'il est peu probable que différents nœuds de cluster se mélangent en un seul en raison d'erreurs d'administration système ou de modifications d'adresses réseau_ –

1

J'ai eu le même problème aussi. Il y a aussi une autre façon de s'assurer que l'ip est annoncée comme vous le souhaitez, dans le fichier de configuration il y a une partie pour les additions NAT. Le seul problème avec ma réponse, ainsi que la réponse précédente est que vous devez connaître l'adresse IP correcte, et il devrait être statique ...

cluster-announce-ip