Recensione di CockroachDB: SQL distribuito passa alla marcia più alta

Quando ho esaminato CockroachDB all'inizio del 2018, ho scoperto che il database SQL distribuito, costruito su un archivio di valori-chiave transazionale e coerente, è stato progettato per sopravvivere a guasti di dischi, macchine, rack e persino data center con interruzioni di latenza minime e senza intervento manuale. È tutto ancora vero.

A mio parere, all'epoca, CockroachDB aveva tre grandi deficit: ottimizzazione limitata delle query SQL JOIN, nessun servizio completamente gestito e nessun supporto per i tipi di dati JSON o Protobuf. Sono felice di riferire che da allora tutte queste carenze sono state colmate. I JOIN ora utilizzano un ottimizzatore basato sui costi, CockroachCloud è in versione beta ed è stato implementato un tipo di dati JSONB.

Cosa manca ancora in CockroachDB? Un bel po ', se ti interessa la compatibilità con PostgreSQL:

  • Stored procedure e funzioni
  • Trigger
  • Eventi
  • Funzioni definite dall'utente
  • Funzioni e indici full-text
  • Funzioni e indici geospaziali
  • Rilascia la chiave primaria
  • Funzioni XML
  • Punti di salvataggio
  • Privilegi a livello di colonna
  • CREATE TEMPORARY TABLE sintassi
  • Sintassi XA

La maggior parte delle applicazioni OLTP PostgreSQL esistenti possono essere portate su CockroachDB con alcune soluzioni alternative a livello di applicazione. Se hai utilizzato le funzionalità geospaziali (PostGIS) o la ricerca full-text, tuttavia, non conosco un buon modo per implementarle nella versione corrente di CockroachDB.

Esiste un problema di monitoraggio per gli indici e le funzioni geospaziali, ma anche se è aperto da diversi anni, lo stato delle caratteristiche geospaziali è solo "potenziale". C'è stato un sondaggio tra gli utenti sui casi d'uso geospaziali desiderati, ma non è lo stesso che promettere la funzionalità.

L'indicizzazione di testo completo è "pianificata", ma non è ancora in programma. Diverse persone hanno suggerito di integrare CockroachDB con Bleve per ottenere questo risultato. Ancora una volta, niente promesse.

Nel giugno 2019, Cockroach ha cambiato la sua licenza OSS da APL-2 a una "versione estremamente permissiva della Business Source License (BSL)". Ciò era fondamentalmente in risposta a Amazon Web Services che offre una versione biforcuta di ElasticSearch come servizio a pagamento e consente a Cockroach di offrire il proprio database come servizio senza preoccuparsi di AWS o di qualsiasi altro fornitore di cloud che ruba il suo fulmine.

CockroachCloud è un servizio completamente ospitato e completamente gestito creato e di proprietà di Cockroach Labs che afferma di rendere la distribuzione, il ridimensionamento e la gestione di CockroachDB senza sforzo. CockroachCloud attualmente funziona su Amazon Web Services e Google Cloud Platform.

Installazione di CockroachDB e test di base 

Ho installato CockroachDB 19.2.2 sul mio MacBook Pro utilizzando Homebrew. Per prima cosa ho disinstallato esplicitamente la vecchia versione (1.1.3) che avevo lasciato dalla mia revisione iniziale.

Homebrew è specifico per i Mac. È solo uno dei cinque modi per installare CockroachDB su Mac, gli altri sono scaricare il binario; usa Kubernetes; usa Docker; e crea da sorgente. Linux e Windows hanno meno opzioni di installazione.

martinheller @ Martins-Retina-MacBook ~% brew disinstalla scarafaggio

Disinstallazione di /usr/local/Cellar/cockroach/1.1.3 ... (5 file, 72,9 MB)

martinheller @ Martins-Retina-MacBook ~% brew install cockroachdb / tap / blroach

==> Toccando scarafaggiodb / tap

remote: enumerazione di oggetti: 6, fatto.

remoto: Conteggio oggetti: 100% (6/6), fatto.

remoto: compressione di oggetti: 100% (5/5), fatto.

remoto: Totale 6 (delta 0), riutilizzato 3 (delta 0), pacchetto riutilizzato 0

Disimballaggio oggetti: 100% (6/6), fatto.

Toccato 1 formula (32 file, 45,6 KB).

==> Installazione scarafaggio da scarafaggiodb / rubinetto

==> Download di //binaries.cockroachdb.com/cockroach-v19.2.2.darwin-10.9-a

==> /usr/local/Cellar/cockroach/19.2.2/bin/cockroach gen man --path = / usr / local / C

==> /usr/local/Cellar/cockroach/19.2.2/bin/cockroach gen autocomplete bash --out

==> /usr/local/Cellar/cockroach/19.2.2/bin/cockroach gen autocomplete zsh --out =

==> Avvertenze

avviare un cluster a nodo singolo che memorizza i propri dati in:

  / usr / local / var / scarafaggio /

Invece della porta predefinita 8080, il nodo serve la sua interfaccia utente di amministrazione in:

  // localhost: 26256

NON utilizzare questo cluster per archiviare i dati che ti interessano; funziona in modo insicuro

modalità e può esporre i dati pubblicamente ad esempio in un attacco di rebinding DNS. Correre

CockroachDB in modo sicuro, vedere:

  //www.cockroachlabs.com/docs/secure-a-cluster.html

Il completamento di Bash è stato installato per:

  /usr/local/etc/bash_completion.d

I completamenti zsh sono stati installati in:

  / usr / local / share / zsh / site-functions

Per fare in modo che launchd avvii scarafaggiodb / tap / scarafaggio ora e riavvia all'accesso:

  i servizi di preparazione della birra iniziano scarafaggiodb / rubinetto / scarafaggio

Oppure, se non vuoi / hai bisogno di un servizio in background puoi semplicemente eseguire:

  inizio scarafaggio - insicuro

==> Riepilogo

==> `brew cleanup` non è stato eseguito in 30 giorni, in esecuzione ora ...

Rimozione: /Users/martinheller/Library/Caches/Homebrew/node--12.12.0.catalina.bottle.tar.gz ... (14,8 MB)

Eliminati 18 collegamenti simbolici da / usr / local

martinheller @ Martins-Retina-MacBook ~% scarafaggio start-single-node --insecure

*

* ATTENZIONE: FUNZIONAMENTO IN MODALITÀ NON SICURA!

*

* - Il tuo cluster è aperto per qualsiasi client che può accedere.

* - Qualsiasi utente, anche root, può accedere senza fornire una password.

* - Qualsiasi utente, connettendosi come root, può leggere o scrivere qualsiasi dato nel tuo cluster.

* - Non c'è crittografia di rete né autenticazione e quindi nessuna riservatezza.

*

* Scopri come proteggere il tuo cluster: //www.cockroachlabs.com/docs/v19.2/secure-a-cluster.html

*

*

* ATTENZIONE: non è stato specificato né --listen-addr né --advertise-addr.

* Il server pubblicizzerà "Martins-Retina-MacBook.local" ad altri nodi, è instradabile?

*

* Considera l'utilizzo di:

* - per server solo locali: --listen-addr = localhost

* - per cluster multi-nodo: --advertise-addr =

*

*

*

* INFO: la replica è stata disabilitata per questo cluster.

* Quando / se si aggiungono nodi in futuro, aggiornare le configurazioni delle zone per aumentare il fattore di replica.

*

Nodo CockroachDB a partire da 2019-12-30 16: 30: 35.369965 +0000 UTC (ha impiegato 0.6 secondi)

build: CCL v19.2.2 @ 2019/12/11 01:27:47 (go1.12.12)

webui: //Martins-Retina-MacBook.local:8080

sql: postgresql: //[email protected]: 26257sslmode = disabilita

Flag client RPC: blatta --host = Martins-Retina-MacBook.local: 26257 --insicuro

log: / Users / martinheller / cockroach-data / logs

temp dir: / Users / martinheller / cockroach-data / cockroach-temp884406444

percorso I / O esterno: / Users / martinheller / cockroach-data / extern

store [0]: path = / Users / martinheller / cockroach-data

stato: nuovo cluster inizializzato

clusterID: 9f7141f8-d53d-49e3-9a5a-264de8cfa626

nodeID: 1

A questo punto sono stato in grado di aprire il collegamento dell'interfaccia utente web mostrato sopra e vedere l'interfaccia di gestione basata sul web mostrata nello screenshot qui sotto.

Per testare il fumo dell'installazione ho seguito il primo esercizio alla Cockroach University in un'altra scheda Terminale, come mostrato di seguito. Ho trovato il tutorial buono, anche se presentato in brevi video piuttosto che in testo e rivolto ai principianti piuttosto che agli amministratori di database o sviluppatori esperti. La parte pratica inizia utilizzando lo workloadstrumento per creare un piccolo database, movr, quindi continua nella shell SQL di CockroachDB.

martinheller @ Martins-Retina-MacBook ~% carico di lavoro scarafaggio init movr

I191230 16: 55: 34.351650 1 workload / workloadsql / dataload.go: 135 utenti importati (0s, 50 righe)

I191230 16: 55: 34.356751 1 workload / workloadsql / dataload.go: 135 veicoli importati (0s, 15 righe)

I191230 16: 55: 34.382023 1 workload / workloadsql / dataload.go: 135 corse importate (0s, 500 righe)

I191230 16: 55: 34.404733 1 workload / workloadsql / dataload.go: 135 veicolo_location_histories importato (0s, 1000 righe)

I191230 16: 55: 34.429203 1 workload / workloadsql / dataload.go: 135 promo_codes importati (0s, 1000 righe)

martinheller @ Martins-Retina-MacBook ~% cockroach sql --insecure

#

# Benvenuti nella shell SQL di CockroachDB.

# Tutte le istruzioni devono essere terminate da un punto e virgola.

# Per uscire, digita: \ q.

#

# Versione server: CockroachDB CCL v19.2.2 (x86_64-apple-darwin14, costruito 2019/12/11 01:27:47, go1.12.12) (stessa versione del client)

# ID cluster: 9f7141f8-d53d-49e3-9a5a-264de8cfa626

#

# Accedere \? per una breve introduzione.

#

root @: 26257 / defaultdb> MOSTRA database;

  nome del database 

+ --------------- +

  defaultdb     

  movr          

  postgres      

  sistema        

(4 righe)

Tempo: 2.028 ms

root @: 26257 / defaultdb> MOSTRA TABELLE DA movr;

          nome_tabella          

+ ---------------------------- +

  promo_codes                

  cavalcate                      

  user_promo_codes           

  utenti                      

  vehicle_location_histories 

  veicoli                   

(6 righe)

Tempo: 2.863 ms

root @: 26257 / defaultdb> SELEZIONA * DA movr.users LIMIT 10;

                   id | città | nome | indirizzo | carta di credito 

+ -------------------------------------- + ---------- - + --------------------- + -------------------------- ----- + ------------- +

  ae147ae1-47ae-4800-8000-000000000022 | amsterdam | Tyler Dalton | 88194 Angela Gardens Suite 94 | 4443538758  

  b3333333-3333-4000-8000-000000000023 | amsterdam | Dillon Martin | 29590 Butler Plain Apt. 25 | 3750897994  

  b851eb85-1eb8-4000-8000-000000000024 | amsterdam | Deborah Carson | 32768 Eric Divide Suite 88 | 8107478823  

  bd70a3d7-0a3d-4000-8000-000000000025 | amsterdam | David Stanton | 80015 Mark Views Suite 96 | 3471210499  

  c28f5c28-f5c2-4000-8000-000000000026 | amsterdam | Maria Weber | 14729 Karen Radial | 5844236997  

  1eb851eb-851e-4800-8000-000000000006 | boston | Brian Campbell | 92025 Yang Village | 9016427332  

  23d70a3d-70a3-4800-8000-000000000007 | boston | Carl Mcguire | 60124 Palmer Mews Apt. 49 | 4566257702  

  28f5c28f-5c28-4600-8000-000000000008 | boston | Jennifer Sanders | 19121 Padilla Brooks Apt. 12 | 1350968125  

  2e147ae1-47ae-4400-8000-000000000009 | boston | Cindy Medina | 31118 Allen Gateway Apt. 60 | 6464362441  

  33333333-3333-4400-8000-00000000000a | boston | Daniel Hernandez MD | 51438 Valli Janet | 0904722368  

(10 righe)

Tempo: 2.977 ms

Il tutorial prosegue da lì per insegnare di più su CockroachDB, inclusi i fondamenti dei cluster CockroachDB e le basi per l'esecuzione di SQL su larga scala.

CockroachCloud

Avviare un nodo CockroachDB è abbastanza semplice, come abbiamo appena visto. La rotazione di un cluster di tre o più nodi richiede un po 'più di impegno e pianificazione, soprattutto se crei cluster multi-regione e devi ottimizzare la topologia della tabella. Se hai bisogno di aiuto, gli ingegneri di vendita di Cockroach sono felici di partecipare.

D'altra parte, creare un cluster in CockroachCloud è questione di compilare un modulo web, come mostrato nello screenshot qui sotto. Attualmente è possibile creare solo un cluster a regione singola da questa interfaccia self-service; se hai bisogno di cluster multi-regione, nodi più grandi o più di 24 nodi per cluster, devi contattare il supporto di Cockroach Labs per fornirli per te in CockroachCloud.

I cluster di CockroachCloud sono il più isolati e sicuri possibile. Sono tenant singoli, ciascuno nel proprio account secondario e VPC, e i VPC sono protetti da firewall l'uno dall'altro e da qualsiasi altra connessione esterna, a meno che non siano autorizzati per le porte SQL e dell'interfaccia utente Web. Tutte le connessioni al cluster su Internet utilizzano TLS 1.2.

Tieni presente che Cockroach Labs attualmente non supporta i cloud privati. Tuttavia, hanno in programma di farlo in futuro.

Come regola generale, Cockroach Labs stima che ogni vCPU possa gestire circa 1000 TPS. Le stime fornite nella pagina di creazione del cluster durante il provisioning sono probabilmente più accurate, ma vengono fornite in unità diverse (IOPS anziché TPS). Attualmente un nodo a 2 vCPU su GCP è stimato a 1800 IOPS e un nodo a 2 vCPU su AWS è stimato a 600 IOPS.

Miglioramenti delle prestazioni di CockroachDB

Quando ho esaminato CockroachDB 1.1.3 all'inizio del 2018, la sua implementazione SQL JOIN era limitata agli hash join e a un pianificatore euristico; le sue prestazioni di query spesso venivano ridimensionate in modo lineare, ma non assomigliavano allo stato dell'arte: erano più vicine alle prestazioni di SQLite. A novembre 2018, CockroachDB 2.1 aveva un ottimizzatore di query basato sui costi che era competitivo con PostgreSQL per le prestazioni JOIN. A partire dalla versione 19.2, dopo un altro anno di sviluppo (e il passaggio al controllo delle versioni del calendario), tutte le query SQL utilizzano l'ottimizzatore basato sui costi, anche le istruzioni DDL e le funzioni finestra. A supporto dell'ottimizzatore basato sui costi, CockroachDB genera automaticamente le statistiche della tabella.