Recenzja CockroachDB: Rozproszony SQL wrzuca wyższy bieg

Kiedy przeglądałem CockroachDB na początku 2018 r., Odkryłem, że rozproszona baza danych SQL, zbudowana na bazie transakcyjnego i spójnego magazynu wartości kluczy, została zaprojektowana tak, aby przetrwać awarie dysku, maszyny, szafy, a nawet centrum danych z minimalnymi przerwami w opóźnieniu i bez interwencja ręczna. To wszystko nadal jest prawdą.

W tamtym czasie CockroachDB miał, moim zdaniem, trzy duże braki: ograniczona optymalizacja zapytań SQL JOIN, brak w pełni zarządzanej usługi i brak obsługi typów danych JSON lub Protobuf. Z przyjemnością informuję, że wszystkie te braki zostały już uzupełnione. JOINs używają teraz optymalizatora kosztów, CockroachCloud jest w wersji beta, a typ danych JSONB został zaimplementowany.

Czego wciąż brakuje w CockroachDB? Całkiem sporo, jeśli zależy Ci na kompatybilności z PostgreSQL:

  • Procedury i funkcje składowane
  • Wyzwalacze
  • Wydarzenia
  • Funkcje zdefiniowane przez użytkownika
  • Funkcje i indeksy pełnotekstowe
  • Funkcje i indeksy geoprzestrzenne
  • Upuść klucz podstawowy
  • Funkcje XML
  • Savepoints
  • Uprawnienia na poziomie kolumny
  • Składnia CREATE TEMPORARY TABLE
  • Składnia XA

Większość istniejących aplikacji OLTP PostgreSQL można przenieść do CockroachDB z pewnymi obejściami na poziomie aplikacji. Jeśli jednak korzystałeś z funkcji geoprzestrzennych (PostGIS) lub wyszukiwania pełnotekstowego, nie znam dobrego sposobu na ich implementację w obecnej wersji CockroachDB.

Istnieje problem ze śledzeniem indeksów i funkcji geoprzestrzennych, ale mimo że jest otwarty od kilku lat, status obiektów geoprzestrzennych jest tylko „potencjalny”. Przeprowadzono ankietę użytkowników na temat pożądanych przypadków użycia geoprzestrzennego, ale to nie to samo, co obiecanie funkcji.

Indeksowanie pełnotekstowe jest „planowane”, ale nie zostało jeszcze uwzględnione w harmonogramie. Kilka osób zasugerowało zintegrowanie CockroachDB z Bleve, aby to osiągnąć. Znowu żadnych obietnic.

W czerwcu 2019 r. Firma Cockroach zmieniła swoją licencję OSS z APL-2 na „niezwykle liberalną wersję licencji biznesowej (BSL)”. Było to w zasadzie odpowiedzią na Amazon Web Services oferujące rozwidloną wersję ElasticSearch jako usługę płatną i pozwalającą Cockroach oferować własną bazę danych jako usługę bez martwienia się, że AWS lub jakikolwiek inny dostawca chmury wykradnie jego grzmot.

CockroachCloud to w pełni hostowana iw pełni zarządzana usługa stworzona i będąca własnością Cockroach Labs, która twierdzi, że wdrażanie, skalowanie i zarządzanie CockroachDB jest łatwe. CockroachCloud działa obecnie w Amazon Web Services i Google Cloud Platform.

Instalacja CockroachDB i podstawowe testy 

Zainstalowałem CockroachDB 19.2.2 na moim MacBooku Pro przy użyciu Homebrew. Najpierw wyraźnie odinstalowałem starą wersję (1.1.3), którą zostawiłem po mojej pierwszej recenzji.

Homebrew jest specyficzny dla komputerów Mac. To tylko jeden z pięciu sposobów instalacji CockroachDB na komputerach Mac. Pozostałe to pobranie pliku binarnego; użyj Kubernetes; użyj Dockera; i buduj ze źródła. Linux i Windows mają mniej opcji instalacji.

martinheller @ Martins-Retina-MacBook ~% brew odinstaluj karalucha

Odinstalowywanie /usr/local/Cellar/cockroach/1.1.3 ... (5 plików, 72,9 MB)

martinheller @ Martins-Retina-MacBook ~% brew zainstaluj cockroachdb / tap / cockroach

==> Tapping cockroachdb / tap

zdalne: Wyliczanie obiektów: 6, gotowe.

zdalne: Liczenie obiektów: 100% (6/6), gotowe.

zdalne: Kompresja obiektów: 100% (5/5), gotowe.

zdalne: łącznie 6 (delta 0), ponownie użyte 3 (delta 0), ponownie wykorzystane w opakowaniu 0

Rozpakowywanie przedmiotów: 100% (6/6), gotowe.

Pobrano 1 formułę (32 pliki, 45,6 KB).

==> Instalowanie karalucha z cockroachdb / tap

==> Pobieranie //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 autouzupełnianie bash --out

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

==> Ostrzeżenia

uruchomić klaster z jednym węzłem, który przechowuje swoje dane w:

  / usr / local / var / karaluch /

Zamiast domyślnego portu 8080, węzeł obsługuje interfejs administratora pod adresem:

  // localhost: 26256

NIE używaj tego klastra do przechowywania danych, na których Ci zależy; działa w niepewnym stanie

tryb i może ujawniać dane publicznie np. w ataku rebinding DNS. Biegać

CockroachDB, zobacz:

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

Uzupełnianie Bash zostało zainstalowane w:

  /usr/local/etc/bash_completion.d

Uzupełnienia zsh zostały zainstalowane w:

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

Aby uruchomić uruchamianie, uruchom teraz cockroachdb / tap / cockroach i zrestartuj po zalogowaniu:

  usługi parzenia rozpocząć karaluch / kran / karaluch

Lub, jeśli nie chcesz / potrzebujesz usługi w tle, możesz po prostu uruchomić:

  start karalucha - niezabezpieczony

==> Podsumowanie

==> Funkcja `brew cleanup` nie była uruchamiana od 30 dni, działa teraz ...

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

Usunięto 18 dowiązań symbolicznych z / usr / local

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

*

* OSTRZEŻENIE: BIEGANIE W TRYBIE NIEBEZPIECZNYM!

*

* - Twój klaster jest otwarty dla każdego klienta, który ma dostęp.

* - Każdy użytkownik, nawet root, może zalogować się bez podawania hasła.

* - Każdy użytkownik, łączący się jako root, może odczytywać lub zapisywać dowolne dane w klastrze.

* - Nie ma szyfrowania sieciowego ani uwierzytelniania, a zatem nie ma poufności.

*

* Sprawdź, jak zabezpieczyć swój klaster: //www.cockroachlabs.com/docs/v19.2/secure-a-cluster.html

*

*

* OSTRZEŻENIE: nie podano ani --listen-addr, ani --advertise-addr.

* Serwer będzie rozgłaszał „Martins-Retina-MacBook.local” innym węzłom, czy jest to routowalne?

*

* Rozważ użycie:

* - dla serwerów tylko lokalnych: --listen-addr = localhost

* - dla klastrów wielowęzłowych: --advertise-addr =

*

*

*

* INFO: replikacja została wyłączona dla tego klastra.

* Kiedy / jeśli dodasz węzły w przyszłości, zaktualizuj konfiguracje stref, aby zwiększyć współczynnik replikacji.

*

Węzeł CockroachDB od 2019-12-30 16: 30: 35.369965 +0000 UTC (zajęło 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 = disable

Flagi klienta RPC: karaluch --host = Martins-Retina-MacBook.local: 26257 --insecure

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

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

zewnętrzna ścieżka we / wy: / Users / martinheller / cockroach-data / extern

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

status: zainicjowano nowy klaster

ID klastra: 9f7141f8-d53d-49e3-9a5a-264de8cfa626

nodeID: 1

W tym momencie udało mi się otworzyć łącze interfejsu użytkownika sieci Web pokazane powyżej i zobaczyć interfejs zarządzania oparty na sieci Web pokazany na zrzucie ekranu poniżej.

Aby przetestować instalację, wykonałem pierwsze ćwiczenie w Cockroach University w innej zakładce Terminal, jak pokazano poniżej. Uważam, że samouczek jest dobry, choć przedstawiony w krótkich filmach, a nie w tekście, i jest przeznaczony dla początkujących, a nie dla doświadczonych administratorów baz danych lub programistów. Część praktyczna rozpoczyna się od użycia workloadnarzędzia do utworzenia małej bazy danych, movr, a następnie jest kontynuowana w powłoce CockroachDB SQL.

martinheller @ Martins-Retina-MacBook ~% obciążenia karalucha init movr

I191230 16:55: 34.351650 1 obciążenie / workloadsql / dataload.go: 135 zaimportowanych użytkowników (0s, 50 wierszy)

I191230 16: 55: 34.356751 1 obciążenie / workloadsql / dataload.go: 135 importowanych pojazdów (0s, 15 rzędów)

I191230 16:55: 34.382023 1 obciążenie / workloadsql / dataload.go: 135 zaimportowanych przejazdów (0s, 500 wierszy)

I191230 16: 55: 34.404733 1 obciążenie / workloadsql / dataload.go: 135 importowane historie_lokalizacji_ pojazdu (0s, 1000 wierszy)

I191230 16:55: 34.429203 1 obciążenie / workloadsql / dataload.go: 135 zaimportowane kody_promo (0s, 1000 wierszy)

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

#

# Witamy w powłoce CockroachDB SQL.

# Wszystkie instrukcje muszą być zakończone średnikiem.

# Aby wyjść, wpisz: \ q.

#

Wersja serwera: CockroachDB CCL v19.2.2 (x86_64-apple-darwin14, zbudowany 2019/12/11 01:27:47, go1.12.12) (ta sama wersja co klient)

# Identyfikator klastra: 9f7141f8-d53d-49e3-9a5a-264de8cfa626

#

# Wchodzić \? na krótkie wprowadzenie.

#

root @: 26257 / defaultdb> POKAŻ bazy danych;

  nazwa_bazy_danych 

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

  defaultdb     

  movr          

  postgres      

  system        

(4 rzędy)

Czas: 2,028 ms

root @: 26257 / defaultdb> POKAŻ TABELE Z movr;

          Nazwa tabeli          

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

  kody promocyjne                

  przejażdżki                      

  user_promo_codes           

  użytkowników                      

  Vehicle_location_histories 

  pojazdy                   

(6 rzędów)

Czas: 2,863 ms

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

                   id | miasto | nazwa | adres | karta kredytowa 

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

  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 Doliny Janet | 0904722368  

(10 rzędów)

Czas: 2,977 ms

Stamtąd samouczek zawiera więcej informacji na temat CockroachDB, w tym podstaw działania klastrów CockroachDB i podstaw wykonywania kodu SQL na dużą skalę.

CockroachCloud

Uruchomienie jednego węzła CockroachDB jest dość proste, jak właśnie widzieliśmy. Rozkręcenie klastra trzech lub więcej węzłów wymaga trochę więcej wysiłku i planowania, zwłaszcza jeśli tworzysz klastry wieloregionowe i musisz dostroić topologię tabeli. Jeśli potrzebujesz pomocy, inżynierowie sprzedaży karaluchów z przyjemnością się do tego przyślą.

Z drugiej strony, utworzenie klastra w CockroachCloud jest kwestią wypełnienia formularza internetowego, jak pokazano na zrzucie ekranu poniżej. Obecnie można utworzyć klaster obejmujący jeden region, korzystając z tego interfejsu samoobsługowego; jeśli potrzebujesz klastrów obejmujących wiele regionów, większych węzłów lub więcej niż 24 węzłów na klaster, musisz skontaktować się z pomocą techniczną Cockroach Labs, aby udostępnić je za Ciebie w CockroachCloud.

Klastry CockroachCloud są tak odizolowane i bezpieczne, jak to tylko możliwe. Są to pojedynczy dzierżawcy, każdy na swoim własnym subkoncie i VPC, a VPC są zaporą ogniową od siebie nawzajem i od dowolnego innego połączenia zewnętrznego, chyba że znajdują się na białej liście portów SQL i interfejsu internetowego. Wszystkie połączenia z klastrem przez Internet korzystają z protokołu TLS 1.2.

Pamiętaj, że Cockroach Labs nie obsługuje obecnie chmur prywatnych. Mają jednak plany, aby to zrobić w przyszłości.

Z reguły firma Cockroach Labs szacuje, że każdy procesor wirtualny może obsłużyć około 1000 TPS. Szacunki podane na stronie tworzenia klastra podczas obsługi administracyjnej są prawdopodobnie dokładniejsze, ale są podawane w różnych jednostkach (IOPS zamiast TPS). Obecnie szacuje się, że węzeł 2-vCPU w GCP wynosi 1800 IOPS, a węzeł 2-vCPU w AWS szacuje się na 600 IOPS.

Ulepszenia wydajności CockroachDB

Kiedy spojrzałem na CockroachDB 1.1.3 na początku 2018 r., Jego implementacja SQL JOIN była ograniczona do łączeń mieszających i planowania heurystycznego; jego wydajność zapytań często skalowała się liniowo, ale w niczym nie przypominała najnowocześniejszych rozwiązań - była bliższa wydajności SQLite. Do listopada 2018 r. CockroachDB 2.1 miał oparty na kosztach optymalizator zapytań, który był konkurencyjny w stosunku do PostgreSQL pod względem wydajności JOIN. Począwszy od wersji 19.2, po kolejnym roku rozwoju (i przejściu na wersjonowanie kalendarza), wszystkie zapytania SQL używają optymalizatora kosztów, nawet instrukcje DDL i funkcje okna. Wspierając optymalizator kosztów, CockroachDB automatycznie generuje statystyki tabeli.