2017-09-19 5 views

Répondre

0

Vous pouvez, mais ce n'est pas trivial. Tout d'abord, Redis utilise des accolades dans la clé pour déterminer la partie de partition, de sorte que vous pouvez décider de modifier une clé et de l'envoyer à une partition arbitraire.

Maintenant, vous avez besoin de deux choses:

  1. Une carte de ce tesson ou sous-gamme dans laquelle réside Redis par exemple.

  2. Une façon de savoir quelle chaîne correspond à quel emplacement, de sorte que vous pouvez forcer une "chaîne d'ombrage" sur votre clé pour l'acheminer vers un fragment spécifique.

Le premier est facile - CLUSTER SLOTS vous donnera cette carte, tout analyser.

Le second est plus compliqué - mais heureusement j'ai déjà fait ce travail. J'ai créé une table du mappage de chaînes alphanumériques le plus court possible pour chacun des 16384 emplacements du cluster Redis. C'est en C mais vous pouvez facilement le convertir en n'importe quoi. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e

donc votre algorithme serait, étant donné une clé et un noeud souhaité:

  1. Regardez la carte de l'emplacement et de prendre les plages de fente qui résident sur ce nœud.

  2. Sélectionnez un emplacement dans la plage de ce noeud.

  3. Regardez dans la table de partition pour l'entrée de ce logement. Enfoncez cette chaîne avec des accolades sur la clé. par exemple. convertir foo en foo{e4x}.

Et c'est tout! Toute commande utilisant cette clé sera routée vers cette partition.

Version Pseudo-python de celui-ci:

# Build this table from CLUSTER SLOTS or CLUSTER NODES 
slots = { 
    '127.0.0.1:7000': [(0, 1045),(2000,2100)] 
    ... 
} 

# Build this table from the C example: 
sharding_table = ["06S", "Qi", "5L5", "4Iu", "4gY", ....] 

def retarget_key(key, node): 
    ranges = slots[node] 

    sharding_key = shading_table[ranges[0][0]] 
    return '%s{%s}' % (key, sharding_key) 
+0

Merci beaucoup. Votre mappage de chaîne à 16384 slots est ce que je veux. – Jack

+0

@Jack cool. Juste curieux - qu'est-ce que vous essayez de faire avec ça? –

+0

Mon verrou distribué est basé sur redis multi lock (en fait le verrou rouge), donc je dois faire mes verrous localiser sur différentes instances redis au lieu de slots aléatoires. Cela peut faire fonctionner mon verrou distribué sur un petit cluster. – Jack