2016-05-24 1 views
0

Je teste donc le cluster redis. J'ai une configuration avec 3 maîtres et 3 esclaves. Maintenant, dans le cas où un nœud est confronté à un hard-failure (le maître et l'esclave tombent en panne), le cluster est toujours fonctionnel, à l'exception des emplacements de hachage servis par le nœud défaillant. Maintenant, tout en testant un tel scénario, je vois que les lectures/écritures qui opèrent sur les clés servies par ces emplacements de hachage échouent avec des exceptions, ce qui est bien (j'utilise jedis btw). Cependant, si j'utilise redis cluster comme un cache, je voudrais que ces emplacements de hachage soient servis par un autre nœud. Cette fonctionnalité ne semble pas être présente dans l'utilitaire redis-trib.Comment faire pour reprendre les emplacements de hachage d'un nœud particulier dans le cluster redis en cas de panne?

Je ne peux pas reshard le cluster pour déplacer ces emplacements de hachage comme ./redis-trib.rb reshard échoue avec [ERR] Not all #{ClusterHashSlots} slots are covered by nodes.. Je ne peux également pas supprimer le nœud du cluster en tant que ./redis-trib.rb del-node échoue avec [ERR] Node #{node} is not empty! Reshard data away and try again.. Quelle est alors la meilleure façon de gérer un scénario dans lequel je ne peux pas mettre en place mon noeud d'origine mais que ces emplacements soient servis par un autre noeud (en supposant que je perds même des données sur l'ancien noeud)? Idéalement, quelque chose comme être capable de supprimer ce nœud (maître et esclave du cluster et affecter ces emplacements de hachage à un autre nœud).

+0

Le cluster sera réparé après le redémarrage de Redis en échec. Y a-t-il un problème à le faire? – neuront

+0

@neuront je parle de cas où l'hôte devient inaccessible pendant un certain temps. – gravetii

+0

Est-ce que 'redis-trib.rb fix HOST: PORT' fonctionnerait? (où 'HOST: PORT' pourrait être l'adresse de n'importe quel noeud accessible dans le cluster) – neuront

Répondre

0

Il corrige le cluster en ajoutant tous les emplacements servis par le noeud défaillant à certains noeuds pouvant être connectés. L'approche consiste à utiliser la commande cluster addslots, mais bien sûr, il est difficile de le faire manuellement, donc je suggère ce tool développé par notre équipe.

Utilisation (en coquille):

# it requires Python2.7; install it via pip 
pip install redis-trib 

# suppose one of the accessible nodes is serving at 172.0.0.1:7000 
# start a cluster-mode Redis that is not involved in any cluster 
# suppose its address is 172.0.0.5:8000 
redis-trib.py rescue --existing-addr 172.0.0.1:7000 --new-addr 172.0.0.5:8000 

Après que le nouveau nœud servirait tous les emplacements ont échoué de sorte que l'état du cluster deviendra ok.