# BigTable

BigTable è un sistema proprietario di base di dati compresso ad alte prestazioni, sviluppato da Google a partire dal 2004 e costruito su Google File System (GFS), su Chubby Lock Service, su SSTable e su alcune altre tecnologie di Google. Sebbene cominci dalla tipica convenzione di un numero fisso di colonne, condivide le caratteristiche sia di database orientati alla riga che di quelli orientati alla colonna.
Le ragioni che hanno spinto Google a sviluppare il proprio database sono la scalabilità e un miglior controllo sulle caratteristiche prestazionali: è progettato per poter supportare carichi a livello del petabyte attraverso centinaia o migliaia di macchine e di rendere facile l'aggiunta di nuove macchine al sistema, utilizzando le nuove risorse senza che sia necessaria alcuna riconfigurazione.
Il prodotto viene utilizzato internamente da diverse applicazioni di Google come: MapReduce, Google Reader, Google Maps, Google Libri, Google Earth, Blogger.com, Google Code hosting, Orkut, YouTube, Gmail e ne viene offerto l'accesso come parte del Google App Engine.
Dal 6 maggio 2015, Google ha lanciato una versione pubblica di BigTable col nome di Google Cloud Bigtable.

## Descrizione
### BigTable Data Model

Bigtable è una mappa ordinata multi-dimensionale sparsa, distribuita e persistente.
Il modello dei dati utilizza tre diversi tipi di indicizzazione:

#### Chiavi di riga

    Le chiavi di riga sono stringhe arbitrarie ed ogni lettura/scrittura di dati su una riga è un'operazione atomica. Non viene quindi permesso l'accesso contemporaneo alla stessa chiave di riga. Ogni riga può essere partizionata dinamicamente in tablet in modo da poter distribuire il carico e bilanciarlo.

#### Chiavi di colonna

    Le chiavi di colonna sono raggruppate in set detti famiglie di colonne dove ogni famiglia contiene lo stesso tipo di dato.
    I dati nelle chiavi di colonna di una famiglia sono salvati all'interno di una famiglia di colonne e identificati tramite chiavi di colonna chiamate Family Qualifier.

#### TimeRest (cit.)

    Ogni cella di una tabella in BigTable può contenere più versioni dello stesso dato, e per indicizzare queste versioni utilizzo il Time Stamp che identifica univocamente la versione del dato. Generalmente la versione più recente è quella che viene letta per prima e l'applicativo decide quante versioni mantenere per ogni cella.

### BigTable Partition Model

Il sistema BigTable è composto da tre componenti.

#### Tablet

    Ogni Tablet è identificato da un Tablet Identifier e dal range di chiavi di riga di cui è responsabile. Le dimensioni di un Tablet variano dai 100MB ai 200MB.
    A sua volta ogni Tablet è costituito da più SSTable (BigTable File Format) che sono utilizzate per salvare e recuperare le coppie chiave-dato.
    Una funzione fondamentale è che le SSTable possono essere condivise su più Tablet.

#### Tablet Server

    Ogni Tablet è assegnato a un solo Tablet Server che può contenerne da 10 a 1000.
    I Tablet Server possono splittare i Tablet che diventano troppo grandi. Ogni Tablet Server è responsabile delle proprie Tablet locali.

#### Master Server

    Il master server ha tre compiti fondamentali:
   * assegnare i vari tablet ai Tablet Server
   * gestire l'aggiunta o l'eliminazione dei Tablet Server
   * bilanciare il carico tra i vari server
    Il Master Server tiene in memoria un elenco di Tablet attualmente attive e anche una lista degli assegnamenti di tutti i tablets ai rispettivi Tablets Servers.

### Operazioni di lettura e scrittura

La replicazione dei dati è gestita dal Google File System. Ogni Tablet ha una propria Memtable e la comunicazione dei client con i singoli Tablet Server per operazioni di lettura/scrittura avviene in maniera diretta.

#### Operazioni di scrittura

La richiesta di scrittura arriva direttamente al tablet server che:
* segna sul LOG la richiesta
* dopo il commit successivo ad un'operazione di scrittura, il contenuto viene inserito nella Memtable che si trova in memoria RAM
* ogni volta che viene effettuata una scrittura, la Memtable aumenta di misura fino a quando non raggiunge il limite massimo; raggiunto il limite la Memtable viene "congelata" e diventa una SSTable.
Successivamente viene generata una nuova Memtable.

#### Operazioni di lettura

La richiesta di lettura viene inviata al Tablet Server, e questa avviene tramite una consultazione contemporanea della SSTable che appartiene al tablet e l'attuale Memtable.