Semplice spiegazione di base di un Distributed Hash Table (DHT)


178

Qualcuno potrebbe dare una spiegazione su come funziona un DHT?

Niente di troppo pesante, solo le basi.

Risposte:


238

Ok, sono fondamentalmente un'idea piuttosto semplice. Un DHT offre un'interfaccia simile a un dizionario, ma i nodi sono distribuiti attraverso la rete. Il trucco con i DHT è che il nodo che arriva a memorizzare una particolare chiave si trova eseguendo l'hashing di quella chiave, quindi in effetti i bucket della tabella hash sono ora nodi indipendenti in una rete.

Ciò offre molta tolleranza agli errori e affidabilità, e forse alcuni vantaggi in termini di prestazioni, ma genera anche molti mal di testa. Ad esempio, cosa succede quando un nodo lascia la rete, in caso di errore o in altro modo? E come ridistribuire le chiavi quando un nodo si unisce in modo che il carico sia approssimativamente bilanciato. Vieni a pensarci bene, come puoi distribuire uniformemente le chiavi comunque? E quando un nodo si unisce, come si evita di rimettere in ordine tutto? (Ricorda che dovresti farlo in una normale tabella di hash se aumenti il ​​numero di bucket).

Un esempio di DHT che affronta alcuni di questi problemi è un anello logico di n nodi, ognuno dei quali si assume la responsabilità di 1 / n dello spazio delle chiavi. Una volta aggiunto un nodo alla rete, trova un posto nell'anello per sedersi tra altri due nodi e si assume la responsabilità di alcune delle chiavi nei suoi nodi fratelli. La bellezza di questo approccio è che nessuno degli altri nodi nell'anello è interessato; solo i due nodi fratelli devono ridistribuire le chiavi.

Ad esempio, supponiamo che in un anello a tre nodi il primo nodo abbia le chiavi 0-10, il secondo 11-20 e il terzo 21-30. Se arriva un quarto nodo e si inserisce tra i nodi 3 e 0 (ricorda, sono in un anello), può prendersi la responsabilità di dire metà dello spazio delle chiavi di 3, quindi ora si occupa di 26-30 e il nodo 3 si occupa di 21 -25.

Esistono molte altre strutture di sovrapposizione come questa che utilizzano il routing basato sul contenuto per trovare il nodo giusto su cui archiviare una chiave. La localizzazione di una chiave in un anello richiede la ricerca intorno all'anello un nodo alla volta (a meno che non si mantenga una tabella di ricerca locale, problematica in un DHT di migliaia di nodi), che è il routing O (n) -hop. Altre strutture - compresi gli anelli aumentati - garantiscono il routing del negozio O (log n) e alcuni sostengono il routing del negozio O (1) a scapito di una maggiore manutenzione.

Leggi la pagina di Wikipedia e se vuoi davvero approfondire un po ', dai un'occhiata a questo corso ad Harvard che ha un elenco di letture piuttosto completo.


23
+1 buona risposta. Ciò che intendi nel terzo paragrafo ("Un esempio di DHT che affronta alcuni di questi problemi è un anello logico di n nodi") è Coerent Hashing. È un argomento davvero interessante, utilizzato in Apache Cassandra, un database distribuito creato da Facebook. Link al documento (vale la pena leggerlo): cs.cornell.edu/projects/ladis2009/papers/lakshman-ladis2009.pdf
santiagobasulto

5
Un protocollo di ricerca basato sull'anello che è abbastanza facile da capire è Chord: pdos.csail.mit.edu/papers/chord:sigcomm01
ThomasWeiss

Potete per favore approfondire come vengono archiviati i valori-chiave su un nodo? Sarà una qualche forma di tabella hash o di un DB ?.
Wand Maker,

@HenryR, "nodo anello" non è semplicemente una struttura ad albero?
Pacerier,

La Uni of Illinois insegna il protocollo degli accordi ogni semestre come parte della loro classe di sistemi distribuiti se qualcuno vuole più materiale di lettura - corsi.engr.illinois.edu/ece428/sp2018/lectures.html
Siddhartha

11

I DHT forniscono all'utente lo stesso tipo di interfaccia di una normale tabella hash (cerca un valore per chiave), ma i dati vengono distribuiti su un numero arbitrario di nodi connessi. Wikipedia ha una buona introduzione di base che essenzialmente rigurgiterei se scrivo di più -

http://en.wikipedia.org/wiki/Distributed_hash_table


7

Vorrei aggiungere la risposta utile di HenryR dato che ho appena avuto un'idea di hashing coerente. Una ricerca hash normale / ingenua è una funzione di due variabili, una delle quali è il numero di bucket. La bellezza di un hash coerente è che eliminiamo il numero di bucket "n", dall'equazione.

Nell'hashing ingenuo, la prima variabile è la chiave dell'oggetto da archiviare nella tabella. Chiameremo il tasto "x". La seconda variabile è il numero di bucket, "n". Quindi, per determinare in quale bucket / macchina è archiviato l'oggetto, devi calcolare: hash (x) mod (n). Pertanto, quando si modifica il numero di bucket, si modifica anche l'indirizzo in cui è archiviato quasi ogni oggetto.

Confronta questo con hashing coerente. Definiamo "R" come intervallo di una funzione hash. R è solo una costante. In hashing coerente, l'indirizzo di un oggetto si trova in hash (x) / R. Poiché la nostra ricerca non è più una funzione del numero di bucket, finiamo per ridisegnare meno quando cambiamo il numero di bucket.

http://michaelnielsen.org/blog/consistent-hashing/


1
Avresti comunque bisogno di mod comunque? Supponiamo che tu abbia 3 server. hash(x)/Rti dà 34500. Devi ancora fare il 34500% 3 .
Pacerier,

Il tuo post sul blog non è chiaro tra l'altro, dovresti elencare l'istantanea passo per passo di un esempio funzionante in cui i nodi vengono aggiunti e rimossi insieme alle righe che vengono aggiunte e rimosse.
Pacerier,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.