Spanner: TrueTime e coerenza esterna

TrueTime è un orologio distribuito ad alta disponibilità che viene fornito su tutti i server Google1. TrueTime abilita per generare timestamp con aumento monotonico: un'applicazione può calcolano un timestamp T garantito maggiore di qualsiasi timestamp T" if "T" è stata completata prima della generazione di T. Questa garanzia per tutti i server e per tutti i timestamp.

Questa funzionalità di TrueTime viene utilizzata da Spanner per assegnare timestamp a transazioni. Nello specifico, a ogni transazione viene assegnato un timestamp riflette l'istante in cui Spanner ritiene che abbia si è verificato un errore. Poiché Spanner utilizza il controllo della contemporaneità multiversione, la garanzia dell'ordinamento sui timestamp consente ai client di Spanner di eseguire letture coerenti in un intero database (anche su più regioni cloud) senza bloccare le scritture.

Coerenza esterna

Spanner offre ai client il controllo della contemporaneità più severo le garanzie per le transazioni, che sono chiamate esterne coerenza2. Con coerenza esterna, il sistema si comporta come se tutte le transazioni sono state eseguite in sequenza, anche se Spanner le esegue su più server (e possibilmente su server data center specifici) per offrire prestazioni e disponibilità maggiori. Inoltre, se uno viene completata prima che venga avviata un'altra transazione, il sistema garantisce che i clienti non vedano mai uno stato che include l'effetto del la seconda transazione, ma non la prima. Intuitivamente, Spanner è semanticamente indistinguibile da un database a macchina singola. Anche se offre garanzie così solide che Spanner consente alle applicazioni di ottenere paragonabili ai database che forniscono garanzie più deboli (in cambio per prestazioni più elevate). Ad esempio, come i database che supportano snapshot di isolamento, Spanner consente alle scritture di procedere senza essere bloccate transazioni di sola lettura, ma senza presentare le anomalie rilevate l'isolamento lo consente.

La coerenza esterna semplifica notevolmente lo sviluppo delle applicazioni. Ad esempio: supponiamo che tu abbia creato un'applicazione di banking su Spanner e una dei tuoi clienti parte da € 50 sul conto corrente e € 50 sul conto conto di risparmio. L'applicazione avvia quindi un flusso di lavoro in cui impegna una transazione T1 a depositare 200 $sul conto di risparmio, ed emette una seconda transazione T2 per addebitare 150 $sulla conto corrente. Inoltre, supponiamo che, alla fine della giornata, i saldi negativi in un account sono coperte automaticamente da altri account e un cliente comporta una sanzione se il saldo totale di tutti i loro account è negativo in qualsiasi momento durante la giornata. La coerenza esterna garantisce che, Il Livello 2 inizia a impegnarsi al termine del T1, dopodiché tutti i lettori di il database osserverà che il deposito T1 si è verificato prima debito T2. In altre parole, la coerenza esterna garantisce che nessuna si vedrà uno stato in cui T2 si verifica prima di T1; nel In altre parole, al debito non verrà mai applicata una penale per insufficienza di fondi.

Un database tradizionale che utilizza uno spazio di archiviazione a versione singola e un sistema di archiviazione a due fasi rigoroso il blocco fornisce coerenza esterna. Purtroppo, in un sistema di questo tipo, ogni volta che l'applicazione desidera leggere i dati più aggiornati (ovvero "lettura elevata"), il sistema acquisisce un blocco di lettura sui dati, che blocca le scritture ai dati che vengono letti.

Timestamp e controllo della contemporaneità multiversione (MVCC)

Per leggere senza bloccare le scritture, Spanner e molti altri sistemi di database mantenere più versioni immutabili dei dati (spesso chiamata contemporaneità multiversione . Una scrittura crea una nuova versione immutabile il cui timestamp è scrivere la transazione. Una "lettura istantanea" a un timestamp restituisce il valore alla versione più recente precedente a quel timestamp e non deve bloccare scrive. Per questo è importante che i timestamp assegnati alle versioni coerente con l'ordine in cui è possibile osservare il commit delle transazioni. Me chiama questa proprietà "timestamping corretto"; da notare che l'esistenza di un il timestamp è equivalente alla coerenza esterna.

Per capire perché è importante avere una corretta timestamp, considera l'esempio della banca nella sezione precedente. Senza un timestamp corretto, il T2 potrebbe essere ha assegnato un timestamp precedente a quello assegnato a T1 (ad esempio, se un sistema ipotetico ha usato invece orologi locali di TrueTime e il tempo del server che elabora il T2 è ritardato leggermente). Un'istantanea letta potrebbe quindi riflettere l'addebito del T2, ma non il bonifico T1, anche se il cliente ha visto la sua fine prima di iniziare l'addebito.

Ottenere un timestamp corretto è semplice per un database di una singola macchina (ad Ad esempio, puoi semplicemente assegnare timestamp da un modello ). Come raggiungerlo in un sistema ampiamente distribuito come Spanner, di quali server in tutto il mondo devono assegnare timestamp, è molto più difficile da fare in modo efficiente.

Spanner si basa su TrueTime per generare incrementi monotonici i timestamp. Spanner utilizza questi timestamp in due modi. Innanzitutto, utilizza come timestamp appropriati per le transazioni di scrittura senza la necessità di un comunicazione. In secondo luogo, li usa come timestamp per le letture efficaci, consente l'esecuzione di letture efficaci in un unico ciclo di comunicazione, anche di letture complesse su più server.

Domande frequenti

Quali garanzie di coerenza offre Spanner?

Spanner fornisce coerenza esterna, ovvero la coerenza più rigorosa per i sistemi di elaborazione delle transazioni. Tutte le transazioni in Spanner soddisfano questa proprietà di coerenza, non solo quelle all'interno di una partizione. Esterni con coerenza dichiara che Spanner esegue le transazioni in un modo indistinguibili da un sistema in cui le transazioni vengono eseguite in modo seriale, e inoltre, che l'ordine di serie sia coerente con l'ordine in cui che ogni transazione possa impegnarsi. Poiché i timestamp generati per corrispondono all'ordine seriale, se un cliente vede una transazione Il T2 inizia a impegnarsi al termine di un'altra transazione T1, il sistema assegnerà al T2 un timestamp maggiore di Timestamp di T1.

Spanner offre la linearizzabilità?

Sì. Infatti, Spanner fornisce coerenza esterna, che è una maggiore rispetto alla linearità, perché la linearizzabilità non dice nulla sul comportamento delle transazioni. La linearità è una proprietà della simultanea che supportano operazioni atomiche di lettura e scrittura. In un database, "object" formato da una singola riga o anche da una singola cella. Esterni la coerenza è una proprietà dei sistemi di elaborazione delle transazioni, sintetizzare dinamicamente le transazioni che contengono più su oggetti arbitrari. La linearizzabilità può essere vista come un caso speciale di coerenza esterna, dove una transazione può contenere solo una singola lettura di scrittura su un singolo oggetto.

Spanner offre la serializzabilità?

Sì. Infatti, Spanner fornisce coerenza esterna, che è una procedura più restrittiva che la serializzabilità. Un sistema di elaborazione delle transazioni è serializzabile se esegue le transazioni in un modo indistinguibile da un sistema in cui le transazioni vengono eseguite in modo seriale. Spanner garantisce inoltre che l'ordine seriale sia coerente con l'ordine in cui le transazioni possono da osservare per impegnarsi.

Consideriamo ancora l'esempio del settore bancario usato in precedenza. In un sistema che fornisce serializzabilità ma non coerenza esterna, anche se il cliente ha eseguito da T1 a T2 in sequenza, il sistema sarebbe consentito di riordinarli, causando una sanzione all'addebito dovuto a fondi insufficienti.

Spanner offre elevata coerenza?

Sì. Infatti, Spanner fornisce coerenza esterna, che è una maggiore piuttosto che all'elevata coerenza. La modalità predefinita per le letture in Spanner è "strong", che garantisce il rispetto degli effetti di tutte le transazioni di cui è stato eseguito il commit prima dell'inizio dell'operazione, indipendentemente dalla replica riceve la lettura.

Qual è la differenza tra elevata coerenza e coerenza esterna?

Un protocollo di replica mostra "elevata coerenza" se gli oggetti replicati sono linearizzabili. Come la linearizzabilità, "elevata coerenza" è più debole di "coerenza esterna", perché non dice nulla sul comportamento dei transazioni.

Spanner fornisce coerenza finale (o lazy)?

Spanner fornisce coerenza esterna, che è una proprietà molto più efficace rispetto alla coerenza finale. La coerenza finale negozia garanzie più deboli per con prestazioni più elevate. La coerenza finale è problematica perché significa che lettori possono osservare il database in uno stato in cui non è mai stato veramente (ad es. di lettura potrebbe osservare uno stato in cui viene impegnata la Transazione B, mentre la Transazione A è no, anche se A è avvenuto prima della B). Spanner fornisce letture obsolete, che offrono contenuti simili vantaggi in termini di rendimento come coerenza finale, ma con una coerenza garantiti. Una lettura inattiva restituisce i dati di una timestamp, che non può le scritture di blocco poiché le versioni precedenti dei dati sono immutabili.

Per approfondire

Note

  • 1J. C. Corbett, J. Dean, M. Epstein, A. Fikes C. Gelo, J. Furman, S. Ghemawat, A. Gubarev, C. Heiser, P. Hochschild V. Hsieh, S. Kanthak, E. Kogan, H. Li, A. Lloyd, S. Melnik, D. Mwaura, D. Nagle Numero Quinlan, R. Rao, L. Rolig, Y. Saito, M. Szymaniak, C. Teresa, R. Wang e D. Woodford, Spanner: Database di Google distribuito a livello globale. Nel decimo simposio di USENIX sul Operating Systems Design and Implementation (OSDI 12), pp. 261–264, Hollywood, CA, ottobre 2012.
  • 2Gifford, D. K. Archiviazione delle informazioni in un computer decentralizzato Sistema. Tesi di dottorato di ricerca, Stanford University, 1981.