Sommario:
Video: Common design patterns with Azure Cosmos DB | Azure Friday 2024
La partizione parola viene utilizzata per due concetti diversi in NoSQL land. Una partizione di dati è un meccanismo per garantire che i dati siano equamente distribuiti su un cluster. D'altra parte, una partizione di rete si verifica quando due parti dello stesso cluster di database non possono comunicare.
Su sistemi cluster molto grandi, è sempre più probabile che si verifichi un guasto di un singolo componente. Se un cambio di rete tra server in un cluster fallisce, si verifica un fenomeno denominato (nel gergo del computer) cervello diviso . In questo caso, i singoli server continuano a ricevere richieste, ma non possono comunicare tra loro.
Questo scenario può portare a un'incoerenza dei dati o semplicemente a una ridotta capacità nell'archiviazione dei dati, poiché la partizione di rete con il minor numero di server viene rimossa dal cluster (o "votata" nella modalità Big Brother reale).).
Tolleranza delle partizioni
Sono disponibili due opzioni quando si verifica una partizione di rete:
-
Continuare, a un certo livello, per eseguire operazioni di lettura e scrittura.
-
"Vota fuori" una parte della partizione e decidi di correggere i dati più tardi quando entrambe le parti possono comunicare. Questo di solito implica che il cluster vota una replica di lettura come nuovo master per ciascun nodo partizione master mancante.
Riak consente di determinare quante volte i dati vengono replicati (tre copie, per impostazione predefinita, ovvero n = 3) e quanti server devono essere interrogati affinché una lettura abbia esito positivo. Ciò significa che, se il master principale di una chiave si trova sul lato sbagliato di una partizione di rete, le operazioni di lettura possono ancora riuscire se gli altri due server sono disponibili (ovvero, r = 2 disponibilità di lettura).
Riak gestisce le scritture quando il server della partizione primaria si interrompe utilizzando un sistema chiamato handoff . Quando i dati vengono inizialmente replicati, viene scritto il primo nodo per una particolare partizione chiave, insieme a (di default) due dei seguenti nodi vicini.
Se non è possibile scrivere sul primario, viene scritto il nodo successivo nell'anello. Queste scritture vengono effettivamente passate al nodo successivo. Quando il server primario viene ripristinato, le scritture vengono rieseguite su quel nodo prima che riprenda nuovamente le operazioni di scrittura primarie.
In entrambe queste operazioni, le incoerenze delle versioni possono verificarsi perché repliche diverse possono trovarsi in stati di versione diversi, anche se solo per pochi millisecondi.
Riak impiega ancora un altro sistema chiamato attivo anti - entropia per alleviare questo problema. Questo sistema naviga attraverso i valori aggiornati e assicura che le repliche vengano aggiornate ad un certo punto, preferibilmente il più presto possibile.Ciò aiuta a evitare conflitti sulla lettura mantenendo una velocità di importazione elevata, evitando così un commit a due fasi utilizzato da altri database NoSQL con supporto per il clustering slave master-shared-nothing.
Se si verifica un conflitto di lettura, Riak utilizza legge la riparazione per tentare di restituire solo i dati più recenti. Alla fine, tuttavia, e in base alle impostazioni di coerenza e disponibilità utilizzate, l'applicazione client può essere presentata con più versioni e viene chiesto di decidere autonomamente.
In alcune situazioni, questo compromesso è auspicabile e molte applicazioni possono intuitivamente sapere, in base ai dati presentati, quale versione utilizzare e quale versione scartare.
Indicizzazione secondaria
Gli indici secondari sono indici su dati specifici all'interno di un valore. La maggior parte dei negozi con valore chiave lascia questa indicizzazione all'applicazione. Tuttavia, Riak è diverso, utilizzando uno schema chiamato documento - basato sul partizionamento che consente l'indicizzazione secondaria.
Il partizionamento basato su documenti presuppone che si stiano scrivendo le strutture JSON nel database Riak. È quindi possibile impostare indici su particolari proprietà denominate all'interno di questa struttura JSON, come illustrato:
{"order-id": 5001, "id-cliente": 1429857, "order-date": "2014-09-24 "," Totale ": 134. 24}
Se si dispone di un'applicazione che mostra gli ordini di un cliente per il mese precedente, si desidera interrogare tutti i record, come mostrato, in cui l'ID cliente è un valore fisso (1429857) e la data dell'ordine è all'interno di un intervallo specifico (l'inizio e la fine del mese).
Nella maggior parte dei negozi a valore-chiave, si crea un altro bucket la cui chiave è il numero cliente e il mese combinati e il valore è un elenco di ID ordine. Tuttavia, in Riak, è sufficiente aggiungere un indice secondario sia su id cliente (intero) che su data ordine (data), che occupa spazio di archiviazione aggiuntivo ma presenta il vantaggio di essere trasparente per lo sviluppatore dell'applicazione.
Questi indici sono anche aggiornati dal vivo - il che significa che non vi è alcun ritardo tra l'aggiornamento di un valore del documento in Riak e gli indici aggiornati. Questo accesso dal vivo ai dati è più difficile da realizzare di quanto sembri. Dopo tutto, se gli indici sono incoerenti, non troverai mai i dati mantenuti in modo coerente!
Valutazione di Riak
Basho, l'entità commerciale dietro Riak, afferma che la sua prossima versione 2. 0 Il database NoSQL ha sempre una consistenza forte, un'affermazione che fanno altri venditori NoSQL. L'affermazione dei venditori NoSQL di avere sempre una consistenza forte è come pretendere di essere un vegetariano forte … tranne la domenica quando si mangia roast beef.
Riak non è un database compatibile con ACID. La sua configurazione non può essere modificata in modo che venga eseguita in modalità di conformità ACID. I client possono ottenere dati incoerenti durante le normali operazioni o durante le partizioni di rete. Riak scambia la coerenza assoluta per maggiore disponibilità e tolleranza delle partizioni.
L'esecuzione di Riak in modalità di consistenza forte significa che le sue repliche di lettura vengono aggiornate contemporaneamente al master principale. Ciò implica un commit a due fasi: in pratica, il nodo master scrive sugli altri nodi prima che confermi che la scrittura è completa.
Al momento della stesura di questo documento, la modalità di consistenza forte di Riak non supporta indici secondari o tipi di dati complessi (ad esempio, JSON). Spero che Basho risolverà questo problema nelle prossime versioni del database.
Riak Search (un motore di ricerca Apache Solr rimarchiato e integrato utilizza un modello di aggiornamento eventualmente coerente) può produrre falsi positivi quando si utilizza una consistenza forte. Questa situazione si verifica perché i dati possono essere scritti e quindi la transazione viene abbandonata, ma i dati vengono ancora utilizzati per l'indicizzazione, lasciando un risultato di ricerca "falso positivo": il risultato non è più valido per la query di ricerca.
Riak utilizza anche un processo sentinella separato per determinare quale nodo diventa un master in condizioni di failover. Questo processo, tuttavia, non è altamente disponibile, il che significa che per alcuni secondi è possibile che, mentre una nuova copia del processo sentinella sia portato online, non sia possibile aggiungere un nuovo nodo o un nuovo maestro eletto. È necessario essere consapevoli di questa possibilità in condizioni di failover ad alto stress.
Riak ha alcune caratteristiche interessanti per gli sviluppatori di applicazioni, come l'indicizzazione secondaria e il supporto del valore JSON integrato. La replica del database per il ripristino di emergenza verso altri data center è disponibile solo nella versione a pagamento, il cui prezzo può essere trovato sul loro sito Web (prezzi di noleggio mostrati, prezzi di licenza perpetui dati solo su richiesta).
Lo strumento di monitoraggio del cluster Riak Control non è molto apprezzato a causa del tempo di latenza durante il monitoraggio dei cluster. Riak ha molte promesse e se Basho aggiungerà più imprese - livello strutture di gestione dei cluster nelle versioni future, diventerà un prodotto best-in-class.