Recenzja Amazon Neptune: skalowalna baza danych wykresów dla OLTP

Grafowe bazy danych, takie jak Neo4j, Apache Spark GraphX, DataStax Enterprise Graph, IBM Graph, JanusGraph, TigerGraph, AnzoGraph, część graficzna Azure Cosmos DB oraz temat tego przeglądu, Amazon Neptune, nadają się do kilku rodzajów aplikacji obejmujących wysoce powiązane zestawy danych, takie jak dostarczanie rekomendacji opartych na grafach społecznościowych, wykrywanie oszustw, dostarczanie rekomendacji produktów w czasie rzeczywistym oraz wykrywanie wtargnięć w operacje sieciowe i informatyczne. Są to obszary, w których tradycyjne, relacyjne bazy danych stają się nieefektywne i powolne ze względu na konieczność stosowania złożonych sprzężeń SQL działających na dużych zbiorach danych.

Neptune to w pełni zarządzana usługa graficznej bazy danych z właściwościami ACID i natychmiastową spójnością, której podstawą jest specjalnie zbudowany, wysokowydajny silnik bazy danych wykresów, zoptymalizowany pod kątem przechowywania miliardów relacji i odpytywania wykresu z milisekundowym opóźnieniem. Neptune obsługuje dwa najpopularniejsze języki zapytań grafowych typu open source, Apache TinkerPop Gremlin i W3C SPARQL. Popularny język Cypher Query Language (CQL) używany w Neo4j na początku był zastrzeżony, ale później stał się open source.

Gremlin i SPARQL obsługują różne rodzaje baz danych grafów. Gremlin, podobnie jak CQL, służy do baz danych grafów właściwości; SPARQL jest przeznaczony dla trójek Resource Description Framework (RDF), zaprojektowanych dla sieci. Gremlin jest językiem przechodzenia wykresów; SPARQL to język zapytań z klauzulami SELECT i WHERE.

Implementacja Amazon Neptune pozwala na używanie języków Gremlin i SPARQL w jednej instancji bazy danych, ale nie widzą one swoich danych. Powodem dopuszczenia obu jest umożliwienie nowym użytkownikom ustalenia, która działa lepiej dla ich potrzeb.

Dokumentacja Neptuna zawiera przykłady wykorzystujące warianty Gremlin-Groovy, Gremlin-Java i Gremlin-Python. Neptune zezwala na Gremlin w konsoli, wywołania HTTP REST, programy Java, Python, .Net i Node.js. Po stronie SPARQL Neptune obsługuje konsolę i środowisko robocze Eclipse RDF4J, wywołania HTTP REST i programy w języku Java.

Funkcje i zalety Amazon Neptune

Jako w pełni zarządzana baza danych wykresów transakcyjnych jako usługa, Amazon Neptune nie tylko zapewnia wolność od konieczności utrzymywania sprzętu i oprogramowania bazy danych, ale także oferuje łatwe skalowanie, dostępność powyżej 99,99% i wiele poziomów bezpieczeństwa. Klastry bazy danych Neptune mogą mieć do 64 TB magazynu z automatycznym skalowaniem w sześciu replikach danych w trzech strefach dostępności, a nawet więcej, jeśli włączysz wysoką dostępność za pomocą replik do odczytu w dodatkowych strefach.

Warstwa przechowywania danych Neptune jest wspierana przez dyski SSD, odporna na błędy i samonaprawiająca się. Awarie dysków są naprawiane w tle bez utraty dostępności bazy danych. Neptune automatycznie wykrywa awarie bazy danych i uruchamia się ponownie - zazwyczaj w ciągu 30 sekund lub krócej - bez konieczności wykonywania odzyskiwania po awarii lub odbudowywania pamięci podręcznej bazy danych, ponieważ pamięć podręczna jest odizolowana od procesów bazy danych i może przetrwać ponowne uruchomienie. Jeśli cała instancja główna ulegnie awarii, Neptune automatycznie przełączy się na jedną z maksymalnie 15 replik do odczytu. Kopie zapasowe są stale przesyłane strumieniowo do S3.

Możesz skalować klastry Amazon Neptune w górę lub w dół, modyfikując instancje lub (aby uniknąć przestojów), dodając instancję o żądanym rozmiarze i zamykając starą instancję po migracji danych i promowaniu nowej instancji do podstawowa. Rozmiary instancji maszyn wirtualnych Neptune wahają się od db.r4.large (dwa procesory wirtualne i 16 GiB pamięci RAM) do db.r4.16xlarge (64 procesory wirtualne i 488 GiB pamięci RAM).

Amazon Neptune wdraża zabezpieczenia, uruchamiając silnik w sieci VPC (wirtualna chmura prywatna) i opcjonalnie szyfrując dane w spoczynku za pomocą usługi AWS Key Management Service. Oprócz szyfrowania podstawowej pamięci masowej Neptune szyfruje również kopie zapasowe, migawki i repliki. Neptune może być używany w aplikacjach HIPAA. Neptune nie wymaga tworzenia określonych indeksów w celu uzyskania dobrej wydajności zapytań, co jest mile widzianą zmianą w stosunku do równoważenia wydajności zapytań i zapisu poprzez dokładne dostrojenie indeksów.

Amazon Neptune nie obsługuje analitycznych algorytmów zapytań, takich jak PageRank, które są dostępne w niektórych innych graficznych bazach danych, takich jak Neo4j, TigerGraph i AnzoGraph. Neptune ma być transakcyjną bazą danych o małych opóźnieniach (OLTP) dla ogromnych zbiorów danych, a nie bazą danych analitycznych (OLAP) i po prostu nie jest zoptymalizowana pod kątem przypadków użycia analitycznego lub zapytań obejmujących więcej niż trzy przeskoki - a PageRank dotyka każdego elementu w bazie danych.

Amazon Neptune obsługuje agregaty, więc może przeprowadzić małą analizę, ale niewiele. Podobnie jak Neptune, Neo4j był również pierwotnie przeznaczony do użycia w OLTP, ale dodał bibliotekę zapytań analitycznych w 2017 roku. Fakt, że możliwości analizy są ograniczone w Neptunie, niekoniecznie jest powodem do wykluczenia tego, ponieważ baza danych z wykresami OLTP o małych opóźnieniach z globalnie rozproszonymi replikami do odczytu i możliwością obsługi 64 TB danych nie ma się czego kichać.

Zacznij korzystać z Amazon Neptune

Możesz uruchomić klaster Amazon Neptune na dwa sposoby: bezpośrednio z konsoli Amazon Neptune lub używając szablonu AWS CloudFormation do utworzenia stosu Neptune. Zauważ, że dostarczony szablon CloudFormation nie nadaje się do produkcji, ponieważ nie jest zbyt bezpieczny - ma służyć jako podstawa samouczka.

Możesz rozpocząć od małej i zwiększyć pojemność - większe maszyny wirtualne lub więcej replik do odczytu - kiedy tylko aplikacja tego potrzebuje. Magazyn rośnie automatycznie, a płacisz tylko za używane miejsce.

Na poniższych zrzutach ekranu pokazuję część cyklu życia obrazu Neptuna utworzonego z konsoli Neptuna. Rozpoczynam od stworzenia klastra.

Czy chcesz mieć wysoką dostępność dla swojego klastra? To wcale nie jest trudne.

W ustawieniach zaawansowanych jest wiele paneli. Na szczęście większość ustawień domyślnych powinna służyć Twoim potrzebom.

Na koniec zobaczysz ostrzeżenie przed naciśnięciem przycisku, aby uruchomić bazę danych. Jeśli naprawdę chcesz zobaczyć wyjaśnienie, kliknij łącze prawym przyciskiem myszy i wyświetl je w innej karcie. (Mam nadzieję, że ten błąd zostanie naprawiony).

Gdy masz działający klaster, możesz wykonać kilka czynności na instancjach.

Na poziomie klastra możesz wyświetlić podsumowanie.

Na poziomie instancji możesz zobaczyć wykresy wydajności.

Ładowanie danych do Amazon Neptune

Aby załadować dane do Amazon Neptune, najpierw załaduj pliki do Amazon S3 w jednym z poprawnych formatów: CSV dla Gremlin i triples, quady, RDF / XML lub Turtle dla RDF. Moduł ładujący obsługuje kompresję gzip pojedynczych plików.

Musisz utworzyć rolę IAM i punkt końcowy S3 VPC, aby nadać Neptunowi uprawnienia dostępu do Twojego zasobnika S3, chyba że zostały one już utworzone, na przykład przez szablon CloudFormation. Istnieje interfejs API modułu ładującego Neptune, który można wywołać za pośrednictwem punktu końcowego REST (np. Z polecenia curl), który może przejąć rolę IAM i zbiorczo ładować dane do klastra. Dostępny jest również konwerter GraphML na CSV na GitHub. Procedura ładowania danych dotyczy dowolnego obsługiwanego formatu danych.

Zapytaj Amazon Neptune za pomocą Gremlin

Możesz użyć konsoli Gremlin i punktu końcowego REST, aby połączyć się z instancjami Amazon Neptune w Gremlin i wysyłać do nich zapytania z maszyny wirtualnej EC2 w tym samym VPC co baza danych. Bardziej użyteczne w przypadku aplikacji jest możliwość wysyłania zapytań do Neptuna za pomocą Gremlin w językach Java, Python, .Net i Node.js.

Jest cała książka o Gremlinie, Practical Gremlin: An Apache TinkerPop Tutorial , autorstwa Kelvina Lawrence'a. Książka używa TinkerGraph do swojej bazy danych, ale ta sama składnia Gremlin działa dla Neptuna z małymi wyjątkami, które są udokumentowane przez Amazon.

Zapytania Gremlin opisują, jak poruszać się po wierzchołkach i krawędziach wykresu. Przykładowa baza danych tras lotniczych omówiona w książce zawiera wszystkie sposoby przelotu z Austin w Teksasie (kod lotniska AUS) do Agry w Indiach (kod lotniska AGR) z dwoma przystankami:

gV (). has ('kod', 'AUS'). powtarzanie (out ()). razy (3) .has ('kod', 'AGR'). ścieżka (). by ('kod')

Jeśli chcesz wypróbować przykłady z książki o Amazon Neptune, musisz najpierw skopiować krawędzie i pliki CSV węzłów do wiadra S3 za pomocą polecenia AWS CLI cp i załadować stamtąd dane do Neptuna.

Zapytaj Amazon Neptune za pomocą SPARQL

Możesz użyć konsoli RDF4J, środowiska roboczego RDF4J i punktu końcowego REST do łączenia się z instancjami Amazon Neptune w SPARQL z maszyny wirtualnej EC2 w tym samym VPC co baza danych i wysyłania zapytań do nich. Bardziej użyteczne w przypadku aplikacji jest możliwość wysyłania zapytań do Neptuna za pomocą SPARQL w Javie. Specyfikacja języka zapytań SPARQL 1.1 definiuje sposób konstruowania zapytań. Jeśli przeszukasz internet pod kątem „samouczka sparql”, znajdziesz wiele bezpłatnych samouczków pisemnych i wideo na ten temat. Po załadowaniu danych powinny one działać z Neptunem.

SPARQL wygląda mniej jak kod funkcjonalny niż Gremlin, a bardziej jak SQL. Na przykład:

SELECT? Book? Who

GDZIE {? Book dc: creator? Who}

Wydajność i skalowanie Amazon Neptune

Amazon Neptune został zaprojektowany z myślą o zapytaniach graficznych o małych opóźnieniach do trzech przeskoków w ogromnych (do 64 TB) bazach danych. Obsługuje do 15 replik odczytu o małych opóźnieniach w trzech strefach dostępności w celu skalowania pojemności odczytu i, według Amazon, może wykonać ponad 100 000 zapytań grafowych na sekundę.

Rozmiary instancji wahają się od dwóch do 64 procesorów wirtualnych z 15 GiB do 488 GiB pamięci RAM, z grubsza podwajając oba na każdym kroku. Co najwyżej Neptune może używać 64 procesorów wirtualnych razy 16 wystąpień, co daje łącznie 1024 procesory wirtualne, oraz 488 GiB pamięci RAM razy 16 wystąpień, co daje łącznie 7808 GiB pamięci RAM. To ogólny możliwy wzrost skalowania 512x, biorąc pod uwagę zarówno rozmiar instancji, jak i liczbę replik do odczytu. Koszty dość dokładnie śledzą skalowanie zasobów.

Jeśli szukasz transakcyjnej bazy danych wykresów jako usługi, Amazon Neptune jest dobrym wyborem. Biorąc pod uwagę, że Neptune obsługuje zarówno język zapytań Gremlin, jak i SPARQL, powinieneś być w stanie znaleźć programistów, którzy zbudują dla niego aplikacje. Z drugiej strony brak obsługi Cypher przez Neptuna może zniechęcać obecnych użytkowników Neo4j, a brak obsługi OLAP i algorytmu grafowego zniechęci ludzi, którzy chcą mieć jedną bazę danych grafów do transakcji i analizy.

Szeroki zakres pojemności Amazon Neptune (do 16x rozmiar i 16 wystąpień), wysoki maksymalny współczynnik transakcji (100 000 zapytań na sekundę) i ceny zgodnie z rzeczywistym użyciem powinny odpowiadać większości wymagań biznesowych. Jednak brak opcji lokalnych może uniemożliwiać jego stosowanie w firmach, które stosują zasady zakazujące umieszczania swoich wrażliwych danych w chmurze i firmach, które wolą ponosić i zapisywać wydatki kapitałowe w stosunku do bieżących kosztów operacyjnych.

-

Koszt: od 0,348 USD do 5,568 USD za godzinę wystąpienia instancji w zależności od rozmiaru instancji, 0,10 USD za GB miesięcznie na przechowywanie, 0,20 USD za milion żądań we / wy, 0,023 USD za GB miesięcznie za przechowywanie kopii zapasowych, 0,12 USD za GB za wychodzący transfer danych; obowiązują różne obniżki cen. 

Platforma: Amazon Web Services; obsługuje zapytania Apache TinkerPop Gremlin lub SPARQL; dostęp przez konsolę AWS, HTTP REST i Java, a także RDF4J Workbench (SPARQL) i Python, .Net i Node.js (Gremlin).