Domanda

Predis pretesa di avere sharding lato client (il supporto per l'hashing coerente di chiavi). http://github.com/nrk/predis

posso fare sharding utilizzando la connessione a una serie di profili (nodi), ma non è hashing coerente. Quando aggiungo un altro nodo alla piscina, alcune delle chiavi non può essere trovato. Qualcuno ha qualche esperienza su questo?

utilizzando PHP 5.2 (e versione di PHP 5.2 di Redis).

È stato utile?

Soluzione

Il sito ufficiale Redis dice "Redis supporta sharding lato client tramite hashing coerente. Attualmente non v'è alcun supporto per riuscire tolleranza né di aggiungere o rimuovere i grappoli in fase di esecuzione."

Da quello che ho capito, al momento questo tipo di condivisione non è tollerante ai guasti, e tutte le chiavi memorizzate su un nodo fallito andranno perse. Allo stesso modo se si aggiunge un nuovo nodo, una parte dello spazio chiave sarà ora perduto (come i tasti saranno memorizzati sul nodo sbagliato). Normalmente in un sistema di hashing coerente, quando un nuovo nodo si unisce copia tutte le chiavi che ora mappano dai suoi vicini. Non v'è alcun supporto nel server Redis per fare questo.

Così l'hashing coerente funziona bene se si utilizza Redis come una cache, in cui la realtà i dati sono memorizzati dietro Redis, ma per il momento non ci si aspetta i dati per non vanno dispersi.

UPDATE: E 'possibile implementare reale sharding tramite una libreria di hashing coerente chiamato Ketama .

Altri suggerimenti

La soluzione è quella di utilizzare sharding virtuale. Non so funziona il quadro Predis, ma prevedo che usa un qualche tipo di array - probabilmente riempie con informazioni su ogni frammento allo start-up.

Si supponga che si avrà al massimo 10 cocci (questo numero dovrebbe essere difficilmente raggiungibile). Quindi, creare un array sharding che punta a solo 3 server reali. In futuro, quando si aggiungerà nuovi nodi, verrà eseguita la migrazione dei dati relativi ai nuovi shard e la mappatura cambiamento. Questo approccio preserva forma cambiando funzione di hash.

mappatura iniziale:

0 => 0 //node #0
1 => 0
2 => 0
3 => 1 //node #1
4 => 1
5 => 1
6 => 2 //node #2
7 => 2
8 => 2
9 => 2

Quando si aggiunge nuovo nodo si cambia solo la mappatura:

0 => 0
1 => 0
2 => 3 // new node #3
3 => 1
4 => 1
5 => 3 // new node #3
7 => 2
8 => 2
9 => 3 // new node #3

quindi bisogna spostare i dati con h (x) = 9 o 5 o 2 al nodo # 3.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top