sql >> Database >  >> NoSQL >> Redis

Is er een manier om een ​​specifieke sleutel te lokaliseren op een specifieke redis-instantie in clustermodus?

Dat kan, maar het is niet triviaal. Allereerst gebruikt Redis accolades in de sleutel om het sharding-gedeelte ervan te bepalen, zodat u kunt besluiten een sleutel aan te passen en naar een willekeurige scherf te sturen.

Nu heb je twee dingen nodig:

  1. Een kaart van welke shard of slot-range zich in welke redis-instantie bevindt.

  2. Een manier om te weten welke string naar welk slot is toegewezen, zodat je een "sharding string" op je sleutel kunt forceren om deze naar een specifieke shard te leiden.

De eerste is eenvoudig - CLUSTER SLOTS zal je die kaart geven, ontleden het maar.

De tweede is lastiger - maar gelukkig heb ik dit werk al gedaan. Ik heb een tabel gemaakt met de kortst mogelijke alfanumerieke tekenreekstoewijzing voor elk van de 16384-slots in het Redis-cluster. I't in C, maar je kunt het gemakkelijk naar wat dan ook converteren. https://gist.github.com/dvirsky/93f43277317f629bb06e858946416f7e

Dus uw algoritme zou zijn, gegeven een sleutel en een gewenst knooppunt:

  1. Kijk naar de slotkaart en neem de slotbereiken die zich op dat knooppunt bevinden.

  2. Selecteer een slot binnen het bereik van dat knooppunt.

  3. Kijk in de sharding-tabel voor de invoer van dat slot.

  4. Klap dat touwtje met accolades op de toets. bijv. converteer foo naar foo{e4x} .

En dat is het! Elke opdracht die deze sleutel gebruikt, wordt naar die shard gerouteerd.

Pseudo-python-versie ervan:

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



  1. Over MongoDB

  2. Clusterfailover

  3. Redis tcp-achterstand

  4. MongoDB werkt niet. FOUT:dbpath (/data/db) bestaat niet.