Dlaczego NSA zbudowała własnego HBase i jak działa Apache Accumulo

Gdy potrzebujesz przechowywać terabajty danych w sposób rozproszony, programiści Java zazwyczaj myślą o Cassandrze lub Apache HBase. Niewielu wie, że HBase ma starszego krewnego z rzadką funkcją, która sprawia, że jest uwielbiany w określonych projektach.
W 2008 roku amerykańska Agencja Bezpieczeństwa Narodowego stanęła przed wyzwaniem: musiała przechowywać ogromne ilości informacji, ale udzielać dostępu do różnych komórek tej samej tabeli ściśle na podstawie poziomu uprawnień pracowników. Istniejące rozwiązania NoSQL nie były w stanie tego zrobić. W rezultacie agencja wywiadowcza napisała własny system magazynowania, a w 2011 roku przekazała go Fundacji Apache Software. Projekt nosił nazwę Apache Accumulo.
Pod maską
U podstaw Accumulo leży posortowana rozproszona baza danych klucz-wartość. Została zainspirowana tą samą dobrze znaną pracą Google o BigTable.
Dane nie są przechowywane na jednym dysku. Accumulo wykorzystuje Apache Hadoop HDFS do fizycznego przechowywania plików oraz Apache ZooKeeper do zarządzania stanem klastra i koordynacji.
Jeśli spojrzysz na strukturę klucza w Accumulo, zrozumiesz, czym różni się ono od prostych magazynów:
- Row ID (identyfikator wiersza)
- Column Family (rodzina kolumn)
- Column Qualifier (kwalifikator kolumny)
- Column Visibility (etykieta bezpieczeństwa)
- Timestamp (znacznik czasu)
To właśnie czwarty komponent, Column Visibility, rozwiązuje problem, dla którego projekt został stworzony.
Kontrola dostępu na poziomie komórki
W większości baz danych uprawnienia są przyznawane na poziomie tabeli lub kolumny. W skrajnych przypadkach — poszczególnych wierszy. W Accumulo kontekst bezpieczeństwa jest osadzony bezpośrednio w każdej komórce.
Każdy rekord zawiera etykietę, taką jak (ADMIN&SECRET)|TOP_SECRET. Gdy klient wysyła żądanie odczytu, przekazuje swoje tokeny autoryzacji. Serwer Accumulo filtruje strumień danych samodzielnie przed wysłaniem go przez sieć. Jeśli użytkownik nie ma wymaganego poziomu uprawnień, nawet nie dowie się o istnieniu określonych komórek w wierszu.
Takie podejście eliminuje potrzebę pisania złożonej logiki filtrowania w kodzie aplikacji lub wdrażania dziesiątek oddzielnych tabel dla każdego poziomu dostępu.
Iteratory: obliczenia po stronie serwera
Drugą mocną stroną Accumulo są iteratory. To wtyczki Java działające po stronie serwera, osadzone w łańcuchu skanowania danych i kompaktacji.
Iteratory działają bezpośrednio na węzłach magazynowania (Tablet Servers). Wykonują jednocześnie kilka zadań:
- Filtrowanie danych według złożonych warunków przed wysłaniem ich do klienta.
- Agregacja i transformacja wartości w locie.
- Usuwanie przestarzałych wersji lub usuniętych rekordów podczas kompaktacji plików w tle.
Korzystając z iteratorów, możesz sprawić, że intensywne filtrowanie analityczne nastąpi tuż w warstwie magazynowania. W ten sposób sieć nie zostanie zapchana surowymi gigabajtami.
Jak zbudować i uruchomić
Projekt jest w całości napisany w Javie. Jest budowany za pomocą standardowego Mavena. Polecenie budowania archiwum tarball wygląda następująco:
mvn package -DskipTests
Gotowe archiwum pojawi się w assemble/target/accumulo-<version>-bin.tar.gz.
Do lokalnego programowania możesz uruchomić instancję testową, ale do pełnoprawnej pracy będziesz musiał skonfigurować działający klaster HDFS i ZooKeeper. Będziesz musiał przydzielić zasoby i odpowiednio skonfigurować ustawienia, ponieważ system jest zaprojektowany dla środowiska rozproszonego.
Gdzie się to przyda
Nie ma sensu wdrażać Accumulo dla prostego projektu hobbystycznego. Ale system pokazuje swoje najlepsze oblicze w następujących scenariuszach:
- Usługi wielodostępne. Gdy jedna baza danych przechowuje dane z różnych działów lub klientów z nakładającymi się uprawnieniami.
- Przetwarzanie grafów i budowanie indeksów wyszukiwania. Iteratory pomagają szybko przecinać zbiory po stronie serwera.
- Przechowywanie logów i zdarzeń telemetrii. Gdy zapisy przychodzą jako ciągły strumień, ale odczyty muszą być ściśle ograniczone przez role użytkowników.
Czy warto się z tym męczyć
Projekt ma około 11 000 gwiazdek na GitHubie, ale za skromną popularnością kryje się dojrzałe narzędzie z częstymi wydaniami i wsparciem Fundacji Apache.
Jeśli Twój system nie potrzebuje etykiet bezpieczeństwa na poziomie poszczególnych komórek ani określonego przetwarzania po stronie serwera za pomocą iteratorów, łatwiej wybrać HBase lub Cassandrę. Mają większe społeczności i prostszą integrację z popularnymi frameworkami. Jednak jeśli bezpieczeństwo danych na poziomie komórki jest najwyższym priorytetem, praktycznie nie ma alternatyw dla Accumulo.
Powiązane projekty