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:
-
Una mappa di quale shard o intervallo di slot risiede in quale istanza redis.
-
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:
-
Guarda la mappa degli slot e prendi gli intervalli di slot che risiedono su quel nodo.
-
Seleziona uno slot all'interno dell'intervallo di quel nodo.
-
Cerca nella tabella di partizionamento orizzontale la voce di quello slot.
-
Schiaffeggia quella corda con le parentesi graffe sulla chiave. per esempio. converti
foo
afoo{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)