Redis
 sql >> Database >  >> NoSQL >> Redis

C'è un modo per fare in modo che una chiave specifica si trovi su un'istanza redis specifica in modalità cluster?

Puoi, ma non è banale. Prima di tutto, Redis usa le parentesi graffe nella chiave per determinare la parte di partizionamento orizzontale di essa, quindi puoi decidere di modificare una chiave e inviarla a uno shard arbitrario.

Ora, hai bisogno di due cose:

  1. Una mappa di quale shard o intervallo di slot risiede in quale istanza redis.

  2. Un modo per sapere quale stringa esegue il mapping a quale slot, in modo da poter forzare una "stringa di partizionamento orizzontale" sulla chiave per instradarla a uno shard specifico.

Il primo è facile:CLUSTER SLOTS ti darà quella mappa, basta analizzarla.

Il secondo è più complicato, ma fortunatamente ho già fatto questo lavoro. Ho creato una tabella della mappatura di stringhe alfanumeriche più breve possibile su ciascuno degli slot 16384 nel cluster Redis. È in C ma puoi convertirlo facilmente in qualsiasi cosa. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e

Quindi il tuo algoritmo sarebbe, data una chiave e un nodo desiderato:

  1. Guarda la mappa degli slot e prendi gli intervalli di slot che risiedono su quel nodo.

  2. Seleziona uno slot all'interno dell'intervallo di quel nodo.

  3. Cerca nella tabella di partizionamento orizzontale la voce di quello slot.

  4. Schiaffeggia quella corda con le parentesi graffe sulla chiave. per esempio. converti foo a foo{e4x} .

E questo è tutto! Qualsiasi comando che utilizza questa chiave verrà instradato a quello shard.

Versione pseudo-python di esso:

# 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)