Examen de CockroachDB: SQL distribué passe à la vitesse supérieure

Lorsque j'ai examiné CockroachDB au début de 2018, j'ai constaté que la base de données SQL distribuée, construite au-dessus d'un magasin de valeurs-clés transactionnel et cohérent, était conçue pour survivre aux pannes de disque, de machine, de rack et même de centre de données avec une interruption de latence minimale et aucune intervention manuelle. Tout cela est encore vrai.

À l'époque, CockroachDB avait trois grands déficits, à mon avis: optimisation limitée des requêtes SQL JOIN, pas de service entièrement géré et pas de prise en charge des types de données JSON ou Protobuf. Je suis heureux d'annoncer que toutes ces lacunes ont depuis été corrigées. Les JOIN utilisent désormais un optimiseur basé sur les coûts, le CockroachCloud est en version bêta et un type de données JSONB a été implémenté.

Que manque-t-il encore dans CockroachDB? Un peu, si vous vous souciez de la compatibilité PostgreSQL:

  • Procédures et fonctions stockées
  • Déclencheurs
  • Événements
  • Fonctions définies par l'utilisateur
  • Fonctions de texte intégral et index
  • Fonctions et index géospatiaux
  • Supprimer la clé primaire
  • Fonctions XML
  • Points de sauvegarde
  • Privilèges au niveau de la colonne
  • Syntaxe de CREATE TEMPORARY TABLE
  • Syntaxe XA

La plupart des applications OLTP PostgreSQL existantes peuvent être portées sur CockroachDB avec quelques solutions de contournement au niveau de l'application. Cependant, si vous avez utilisé des fonctionnalités géospatiales (PostGIS) ou une recherche en texte intégral, je ne connais pas de bon moyen de les implémenter dans la version actuelle de CockroachDB.

Il existe un problème de suivi pour les index et les fonctions géospatiales, mais même s'il est ouvert depuis plusieurs années, le statut des entités géospatiales n'est que «potentiel». Il y a eu un sondage d'utilisateurs sur les cas d'utilisation géospatiaux souhaités, mais ce n'est pas la même chose que de promettre la fonctionnalité.

L'indexation en texte intégral est «prévue», mais pas encore sur la feuille de route. Plusieurs personnes ont suggéré d'intégrer CockroachDB à Bleve pour y parvenir. Encore une fois, pas de promesses.

En juin 2019, Cockroach a changé sa licence OSS d'APL-2 en une «version extrêmement permissive de la licence Business Source (BSL)». C'était essentiellement en réponse à Amazon Web Services offrant une version fourchue d'ElasticSearch en tant que service payant et permettant à Cockroach d'offrir sa propre base de données en tant que service sans se soucier d'AWS ou de tout autre fournisseur de cloud qui vole son tonnerre.

CockroachCloud est un service entièrement hébergé et entièrement géré créé et détenu par Cockroach Labs qui prétend faciliter le déploiement, la mise à l'échelle et la gestion de CockroachDB. CockroachCloud fonctionne actuellement sur Amazon Web Services et la plate-forme Google Cloud.

Installation de CockroachDB et tests de base 

J'ai installé CockroachDB 19.2.2 sur mon MacBook Pro en utilisant Homebrew. J'ai d'abord désinstallé explicitement l'ancienne version (1.1.3) que j'avais laissée de mon examen initial.

Homebrew est spécifique aux Mac. Ce n'est que l'une des cinq façons d'installer CockroachDB sur Mac, les autres étant de télécharger le binaire; utilisez Kubernetes; utilisez Docker; et construire à partir de la source. Linux et Windows ont moins d'options d'installation.

martinheller @ Martins-Retina-MacBook ~% brew désinstalle cafard

Désinstallation de /usr/local/Cellar/cockroach/1.1.3 ... (5 fichiers, 72,9 Mo)

martinheller @ Martins-Retina-MacBook ~% brew installer cafarddb / tap / cafard

==> Taper cafarddb / robinet

remote: énumération des objets: 6, terminé.

remote: comptage d'objets: 100% (6/6), terminé.

remote: Compression d'objets: 100% (5/5), terminé.

remote: Total 6 (delta 0), réutilisé 3 (delta 0), pack-reused 0

Déballage des objets: 100% (6/6), terminé.

Tapé 1 formule (32 fichiers, 45,6 Ko).

==> Installation de cafard de cafarddb / robinet

==> Téléchargement //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 =

==> Mises en garde

démarrer un cluster à nœud unique qui stocke ses données sous:

  / usr / local / var / cafard /

Au lieu du port par défaut 8080, le nœud sert son interface utilisateur d'administration à:

  // localhost: 26256

N'utilisez PAS ce cluster pour stocker les données qui vous intéressent; il fonctionne de manière non sécurisée

mode et peut exposer des données publiquement dans, par exemple, une attaque de rebinding DNS. Courir

CockroachDB en toute sécurité, veuillez consulter:

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

La complétion de Bash a été installée sur:

  /usr/local/etc/bash_completion.d

Les complétions zsh ont été installées sur:

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

Pour que launchd démarre cafarddb / tap / cafard maintenant et redémarre à la connexion:

  les services de brassage commencent cafarddb / tap / cafard

Ou, si vous ne voulez / n'avez pas besoin d'un service d'arrière-plan, vous pouvez simplement exécuter:

  début de cafard - non sécurisé

==> Résumé

==> `brew cleanup` n'a pas été exécuté depuis 30 jours, en cours d'exécution maintenant ...

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

Élagage de 18 liens symboliques de / usr / local

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

*

* AVERTISSEMENT: FONCTIONNEMENT EN MODE INSÉCURISÉ!

*

* - Votre cluster est ouvert à tous les clients qui peuvent y accéder.

* - Tout utilisateur, même root, peut se connecter sans fournir de mot de passe.

* - Tout utilisateur, se connectant en tant que root, peut lire ou écrire toutes les données de votre cluster.

* - Il n'y a ni cryptage ni authentification du réseau, donc pas de confidentialité.

*

* Découvrez comment sécuriser votre cluster: //www.cockroachlabs.com/docs/v19.2/secure-a-cluster.html

*

*

* ATTENTION: ni --listen-addr ni --advertise-addr n'ont été spécifiés.

* Le serveur annoncera "Martins-Retina-MacBook.local" sur d'autres nœuds, est-ce routable?

*

* Pensez à utiliser:

* - pour les serveurs uniquement locaux: --listen-addr = localhost

* - pour les clusters multi-nœuds: --advertise-addr =

*

*

*

* INFO: la réplication a été désactivée pour ce cluster.

* Lorsque / si vous ajoutez des nœuds à l'avenir, mettez à jour les configurations de zone pour augmenter le facteur de réplication.

*

Nœud CockroachDB à partir de 2019-12-30 16: 30: 35.369965 +0000 UTC (a pris 0,6 s)

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 = désactiver

Drapeaux du client RPC: cafard --host = Martins-Retina-MacBook.local: 26257 --insecure

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

répertoire temporaire: / Users / martinheller / cafard-data / cafard-temp884406444

chemin d'E / S externe: / Users / martinheller / cockroach-data / extern

store [0]: chemin = / Utilisateurs / martinheller / cafard-data

état: nouveau cluster initialisé

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

nodeID: 1

À ce stade, j'ai pu ouvrir le lien de l'interface utilisateur Web indiqué ci-dessus et voir l'interface de gestion Web illustrée dans la capture d'écran ci-dessous.

Pour tester la fumée de l'installation, j'ai suivi le premier exercice de Cockroach University dans un autre onglet Terminal, comme indiqué ci-dessous. J'ai trouvé le tutoriel bon, bien que présenté dans de courtes vidéos plutôt que du texte, et destiné aux débutants plutôt qu'aux DBA ou développeurs expérimentés. La partie pratique commence par l'utilisation de l' workloadoutil pour créer une petite base de données, movr, puis se poursuit dans le shell SQL CockroachDB.

martinheller @ Martins-Retina-MacBook ~% charge de travail cafard init movr

I191230 16: 55: 34.351650 1 workload / workloadsql / dataload.go: 135 utilisateurs importés (0s, 50 lignes)

I191230 16: 55: 34.356751 1 workload / workloadsql / dataload.go: 135 véhicules importés (0s, 15 lignes)

I191230 16: 55: 34.382023 1 workload / workloadsql / dataload.go: 135 courses importées (0s, 500 lignes)

I191230 16: 55: 34.404733 1 workload / workloadsql / dataload.go: 135 importés Vehicle_location_histories (0s, 1000 lignes)

I191230 16: 55: 34.429203 1 workload / workloadsql / dataload.go: 135 codes promo_codes importés (0s, 1000 lignes)

martinheller @ Martins-Retina-MacBook ~% cafard sql --insécurité

#

# Bienvenue dans le shell SQL CockroachDB.

# Toutes les instructions doivent être terminées par un point-virgule.

# Pour quitter, tapez: \ q.

#

# Version du serveur: CockroachDB CCL v19.2.2 (x86_64-apple-darwin14, build 2019/12/11 01:27:47, go1.12.12) (même version que le client)

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

#

# Entrer \? pour une brève introduction.

#

root @: 26257 / defaultdb> SHOW bases de données;

  nom de la base de données 

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

  defaultdb     

  movr          

  postgres      

  système        

(4 rangées)

Temps: 2.028ms

root @: 26257 / defaultdb> AFFICHER LES TABLES DE movr;

          nom de la table          

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

  code de promo                

  monte                      

  user_promo_codes           

  utilisateurs                      

  Vehicle_location_histories 

  Véhicules                   

(6 rangées)

Temps: 2,863 ms

root @: 26257 / defaultdb> SELECT * FROM movr.users LIMIT 10;

                   id | ville | nom | adresse | carte de crédit 

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

  ae147ae1-47ae-4800-8000-000000000022 | amsterdam | Tyler Dalton | 88194 Angela Gardens, bureau 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 Vallées Janet | 0904722368  

(10 rangées)

Temps: 2.977ms

Le tutoriel se poursuit à partir de là pour en apprendre davantage sur CockroachDB, y compris les principes de base des clusters CockroachDB et les bases de l'exécution de SQL à grande échelle.

CafardNuage

Faire tourner un nœud CockroachDB est assez simple, comme nous venons de le voir. Faire tourner un cluster de trois nœuds ou plus nécessite un peu plus d'efforts et de planification, en particulier si vous créez des clusters multirégionaux et que vous devez régler la topologie de la table. Si vous avez besoin d'aide, les ingénieurs commerciaux de Cockroach se feront un plaisir de vous aider.

D'autre part, la création d'un cluster dans le CockroachCloud consiste à remplir un formulaire Web, comme indiqué dans la capture d'écran ci-dessous. Actuellement, vous ne pouvez créer un cluster à région unique qu'à partir de cette interface en libre-service; si vous avez besoin de clusters multirégionaux, de nœuds plus grands ou de plus de 24 nœuds par cluster, vous devez contacter le support Cockroach Labs pour les provisionner pour vous dans CockroachCloud.

Les clusters CockroachCloud sont aussi isolés et sécurisés que possible. Ce sont des locataires uniques, chacun dans son propre sous-compte et VPC, et les VPC sont protégés par un pare-feu les uns des autres et de toute autre connexion extérieure, à moins qu'ils ne figurent sur la liste blanche pour les ports SQL et d'interface utilisateur Web. Toutes les connexions au cluster via Internet utilisent TLS 1.2.

Notez que Cockroach Labs ne prend actuellement pas en charge les clouds privés. Cependant, ils prévoient de le faire à l'avenir.

En règle générale, Cockroach Labs estime que chaque processeur virtuel peut gérer environ 1000 TPS. Les estimations données sur la page de création de cluster lors de la mise en service sont probablement plus précises, mais sont données dans des unités différentes (IOPS plutôt que TPS). Actuellement, un nœud à 2 vCPU sur GCP est estimé à 1 800 IOPS, et un nœud à 2 vCPU sur AWS est estimé à 600 IOPS.

Améliorations des performances de CockroachDB

Quand j'ai regardé CockroachDB 1.1.3 au début de 2018, son implémentation SQL JOIN était limitée aux jointures de hachage et à un planificateur heuristique; ses performances de requête étaient souvent mises à l'échelle de manière linéaire, mais ne ressemblaient en rien à l'état de l'art - elles étaient plus proches des performances de SQLite. En novembre 2018, CockroachDB 2.1 disposait d'un optimiseur de requêtes basé sur les coûts qui était compétitif avec PostgreSQL pour les performances de JOIN. À partir de la version 19.2, après une autre année de développement (et un passage à la gestion des versions de calendrier), toutes les requêtes SQL utilisent l'optimiseur basé sur les coûts, même les instructions DDL et les fonctions de fenêtre. À l'appui de l'optimiseur basé sur les coûts, CockroachDB génère automatiquement des statistiques de table.