Kilka lat temu, programiści WWW zaczęli używać systemu memcached do tymczasowo przechowuj dane w pamięci RAM, więc często używane wartości mogą być pobierane bardzo szybko, zamiast polegać na wolniejszej ścieżce dostępu do pełnej bazy danych z dysku. Ten schemat kodowania wymagał, aby wszystkie dane były zapisywane przy użyciu tylko prymitywów klucz / wartość, początkowo oprócz tradycyjnych kwerend SQL w głównej bazie danych. Kiedy deweloperzy czuli się bardziej komfortowo z tym podejściem, zaczęli eksperymentować z bazami danych, które używały interfejsu klucz / wartość do przechowywania trwałego, a także pamięci podręcznej, ponieważ i tak musieli już wyrazić większość swoich zapytań w tej formie. Jest to rzadki przykład usunięcia warstwy abstrakcji, ponieważ interfejs klucz / wartość jest mniej ekspresyjny i niższy poziom niż język zapytań, taki jak SQL. Systemy te wymagają więcej pracy od twórców aplikacji, ale oferują także o wiele większą elastyczność i kontrolę nad pracą wykonywaną przez bazę danych. Ten uproszczony interfejs ułatwia również twórcom baz danych tworzenie nowych i eksperymentalnych systemów do testowania nowych rozwiązań spełniających surowe wymagania, takich jak bardzo duże, szeroko rozproszone zestawy danych lub aplikacje o dużej przepustowości. Powszechne zapotrzebowanie na rozwiązania i stosunkowo łatwość opracowywania nowych systemów doprowadziły do rozkwitu nowych baz danych. Ich wspólną cechą jest to, że żaden z nich nie obsługuje tradycyjnego interfejsu SQL, który doprowadził do tego, że ruch nosi nazwę NoSQL. Jest to trochę mylące, ponieważ prawie każde środowisko produkcyjne, w którym są używane, ma bazę danych opartą na języku SQL dla wszystkiego, co wymaga elastycznych zapytań i wiarygodnych transakcji, a gdy produkty dojrzewają, prawdopodobnie niektóre z nich zaczną wspierać język jako opcja. Jeśli “NoSQL” wydaje się zbyt agresywny, pomyśl o tym jako o “NotOnlySQL”. Są to wszystkie narzędzia zaprojektowane do wymiany niezawodności i łatwości użycia tradycyjnych baz danych w celu zapewnienia elastyczności i wydajności wymaganej przez nowe problemy napotykane przez programistów. Przy tak wielu różnych systemach, takich różnorodnych kompromisach w projektowaniu i tak krótkiej historii dla większości, lista ta jest nieuchronnie niekompletna i nieco subiektywna. Przekażę podsumowanie moich własnych doświadczeń i wyświetleń z każdej bazy danych, ale zachęcam do przejrzenia ich oficjalnych stron internetowych, aby uzyskać jak najbardziej aktualny i kompletny widok.
MongoDB
Mongo, którego nazwa pochodzi od “humongous”, to baza danych przeznaczona dla programistów z dość dużymi zbiorami danych, ale chcąca mieć coś łatwego w obsłudze i łatwa w obsłudze. Jest to system zorientowany na dokumenty, z rekordami, które wyglądają podobnie do obiektów JSON. z możliwością przechowywania i zapytania o zagnieżdżone atrybuty Z własnego doświadczenia dużą zaletą jest proaktywne wsparcie ze strony programistów zatrudnionych przez 10gen, firmę handlową, która powstała i wspiera projekt open source. Zawsze miałem szybkie i pomocne odpowiedzi zarówno na kanale IRC, jak i na liście mailingowej, co jest kluczowe, gdy mamy do czynienia z porównywalnie młodymi technologiami, takimi jak te. Obsługuje operacje automatycznego dzielenia i operacje MapReduce.Procesy są napisane w JavaScript, z dostępną interaktywną powłoką i powiązaniami dla wszystkich inne popularne języki.
CouchDB
CouchDB jest podobny pod wieloma względami do MongoDB, jako zorientowana na dokumenty baza danych z interfejsem JavaScript, ale różni się tym, w jaki sposób obsługuje kwerendy, skalowanie i wersjonowanie. Używa wielowariantowej metody kontroli współbieżności, która pomaga w rozwiązywaniu problemów wymagających dostępu do stanu danych w różnych momentach, ale wymaga więcej pracy po stronie klienta, aby obsłużyć kolizje podczas zapisywania, a okresowe cykle zbierania śmieci muszą być uruchamiane, aby usuń stare dane. Nie ma dobrej wbudowanej metody poziomej skalowalności, ale istnieją różne zewnętrzne rozwiązania, takie jak BigCouch, Lounge i Pillow, które obsługują dzielenie danych i przetwarzanie w klastrze maszyn. Przeszukujesz dane, pisząc funkcje JavaScript MapReduce nazywane widokami, które ułatwiają systemowi przetwarzanie w sposób rozproszony. Widoki oferują dużą moc i elastyczność, ale mogą być nieco przytłaczające dla prostych zapytań.
Cassandra
Pierwotnie był to wewnętrzny projekt na Facebooku, Cassandra była otwarta kilka lat temu i stała się standardową rozproszoną bazą danych dla sytuacji, w których warto poświęcić czas na naukę złożonego systemu w zamian za dużą moc i elastyczność. Tradycyjnie długa walka polegała właśnie na stworzeniu działającego klastra, ale wraz z dojrzewaniem projektu stało się to znacznie łatwiejsze. Jest to rozproszony system klucza / wartości o wysoce ustrukturyzowanych wartościach, które są utrzymywane w hierarchii podobnej do klasycznych poziomów baz danych / tabel, z odpowiednikami będącymi obszarami kluczowymi i rodzinami kolumn. Jest bardzo zbliżony do modelu danych używanego przez BigTable Google. Domyślnie dane są automatycznie redukowane i równoważone przy użyciu spójnego mieszania w zakresach kluczy, chociaż można skonfigurować inne schematy. Struktury danych są zoptymalizowane pod kątem stałej wydajności zapisu, kosztem sporadycznie powolnych operacji odczytu. Bardzo przydatną funkcją jest możliwość określenia, ile węzłów musi się zgodzić, zanim zakończy się operacja odczytu lub zapisu. Ustawienie poziomu spójności pozwala dopasować ograniczenia WPR dla konkretnej aplikacji, aby nadać priorytet prędkości nad konsekwencją lub odwrotnie. Interfejs najniższego poziomu dla Cassandry jest dostępny za pośrednictwem Thrift, ale dla większości głównych języków są dostępne bardziej przyjaźni klienci. Zalecaną opcją do uruchamiania zapytań jest Hadoop. Możesz zainstalować Hadoop bezpośrednio w tym samym klastrze, aby zapewnić lokalność dostępu, i istnieje również dystrybucja Hadoop zintegrowana z Cassandrą dostępna z DataStax. Istnieje interfejs wiersza polecenia, który pozwala wykonywać podstawowe zadania administracyjne, ale jest to zupełnie nieosłonięte kości. Zaleca się wybieranie początkowych tokenów przy pierwszym ustawianiu klastra, ale w przeciwnym razie zdecentralizowana architektura jest dość mało wymagająca w utrzymaniu, poza głównymi problemami.
Redis
Dwie cechy wyróżniają Redisa: zachowuje całą bazę danych w pamięci RAM, a jej wartości mogą być złożonymi strukturami danych. Chociaż cały zbiór danych jest przechowywany w pamięci, jest on również okresowo archiwizowany na dysku, więc można go używać jako trwałej bazy danych. Takie podejście zapewnia szybką i przewidywalną wydajność, ale prędkość spada z urwiska, jeśli rozmiar danych rozszerza się poza dostępną pamięć, a system operacyjny uruchamia pamięć stronicowania do obsługi dostępu. Nie będzie to problemem, jeśli masz małe lub przewidywalne wielkości potrzeb przechowywania, ale wymaga to trochę planowania na przyszłość podczas tworzenia aplikacji. Możesz zarządzać większymi zbiorami danych, grupując wiele maszyn razem, ale odłamanie jest obecnie obsługiwane na poziomie klienta. Istnieje eksperymentalna gałąź kodu pod aktywnym rozwojem, która obsługuje klastrowanie na poziomie serwera. Obsługa złożonych struktur danych jest imponująca, a duża liczba operacji list i zestawów jest obsługiwana szybko po stronie serwera. Ułatwia to np. dołączanie do końca wartości, która jest listą, a następnie przycięcie listy tak, aby zawierała tylko 100 ostatnich elementów. Dzięki tym funkcjom łatwiej jest ograniczyć wzrost danych niż w większości systemów, a także ułatwić życie twórcom aplikacji.
Big Table
BigTable jest dostępny tylko dla programistów spoza Google jako podstawa aplikacji dane magazynu silnika. Mimo to, jako jedna z pionierskich alternatywnych baz danych, warto się przyjrzeć. Ma bardziej złożoną strukturę i interfejs niż wiele datastore NoSQL, z hierarchią i wielowymiarowym dostępem. Pierwszym poziomem, podobnie jak tradycyjne relacyjne bazy danych, jest przechowywanie danych w tabeli. Każda tabela jest podzielona na wiele wierszy, a każdy wiersz jest adresowany za pomocą unikalnego ciągu kluczy. Wartości wewnątrz wiersza są rozmieszczone w komórkach, a każda komórka jest identyfikowana przez identyfikator rodziny kolumn, nazwę kolumny i znacznik czasu, z których każde wyjaśnię poniżej. Klucze wiersza są przechowywane w porządku rosnącym w częściach plików zwanych shards. To gwarantuje, że operacje uzyskujące dostęp do ciągłych zakresów kluczy są wydajne, ale oznacza to, że musisz zastanowić się nad prawdopodobną kolejnością odczytywania kluczy. W jednym z przykładów firma Google odwróciła nazwy domen adresów URL, z których korzystały jako klucze, że wszystkie linki z podobnych domen były w pobliżu; na przykład plik com.google.maps / index.html znajdował się w pobliżu com.google.www / index.html. Możesz myśleć o rodzinie kolumn jako o typie lub klasie w języku programowania. Każda reprezentuje zbiór wartości danych, które mają pewne wspólne właściwości; na przykład można przechowywać zawartość HTML stron internetowych, podczas gdy inne mogą być zaprojektowane tak, by zawierały ciąg znaków języka. Oczekuje się, że liczba pojedynczych rodzin na stół będzie niewielka i powinny one być rzadko zmieniane, więc w praktyce często są wybierane podczas tworzenia tabeli. Mogą mieć powiązane z nimi właściwości, ograniczenia i zachowania. Nazwy kolumn myląco nie przypominają nazw kolumn w relacyjnej bazie danych. Są definiowane dynamicznie, a nie określane z wyprzedzeniem i często przechowują same dane. Jeśli rodzina kolumn reprezentowała przychodzące linki do strony, nazwa kolumny może być adresem URL strony, z której pochodzi link, z zawartością komórki zawierającą tekst łącza. Znacznik czasu umożliwia danej komórce posiadanie wielu wersji w czasie, a także umożliwia wygaśnięcie lub usunięcie starych danych. Dana część danych może zostać unikalnie zaadresowana poprzez przejrzenie w tabeli pełnego identyfikatora, który koncepcyjnie wygląda jak klucz wiersza, następnie rodzina kolumn, a następnie nazwa kolumny i wreszcie znacznik czasu. Możesz łatwo odczytać wszystkie wartości dla danego klucza wiersza w konkretnej rodzinie kolumn, abyś mógł pomyśleć o rodzinie kolumn jako o najbliższym porównaniu do kolumny w relacyjnej bazie danych. Jak można się było spodziewać po Google, BigTable został zaprojektowany do obsługi bardzo dużych obciążeń danych przez uruchamianie na dużych klastrach sprzętu towarowego. Ma gwarancje transakcji dla pojedynczych wierszy, ale nie oferuje żadnej możliwości atomowej zmiany większej liczby wierszy. Wykorzystuje system plików Google jako pamięć bazową, która utrzymuje nadmiarowe kopie wszystkich trwałych plików, dzięki czemu można odzyskiwać po awarii.
HBase
HBase został zaprojektowany jako open-sourceowy klon BigTable Google, więc nie dziwi, że ma bardzo podobny interfejs i opiera się na klonie systemu plików Google o nazwie HDFS. Obsługuje tę samą strukturę danych tabel, kluczy wierszy, rodzin kolumn, nazw kolumn, znaczników czasu i wartości komórek, jednak zaleca się, aby dla każdej tabeli nie występowały więcej niż dwie lub trzy rodziny ze względu na wydajność. HBase jest dobrze zintegrowany z głównym projektem Hadoop, więc łatwo jest pisać i czytać w bazie danych z zadania MapReduce uruchomionego w systemie. Jedną z rzeczy, na które należy zwrócić uwagę, jest to, że opóźnienie poszczególnych odczytów i zapisów może być względnie powolne, ponieważ jest to system rozproszony, a operacje będą obejmować pewien ruch sieciowy. HBase jest w najlepszym wydaniu, gdy wielu klientów korzysta z niej w sposób rozproszony. Jeśli robisz serializowane odczyty i zapisy, być może będziesz musiał pomyśleć o strategii buforowania.
Hypertable
Hypertable jest kolejnym klonem OpenTable o otwartym kodzie źródłowym. Jest napisany w C ++, a nie jak Java, jak HBase, i skupił swoją energię na wysokiej wydajności. W przeciwnym razie jego interfejs następuje w śladach BigTable, z tą samą koncepcją rodziny kolumn i znaczników czasowych.
Voldemort
Klon open source z bazy danych Dynamo Amazon stworzony przez LinkedIn, Voldemort ma klasyczny trzy-operacyjny interfejs klucz / wartość, ale z wyrafinowaną architekturą zaplecza do obsługi uruchamiania w dużych klastrach rozproszonych. Korzysta ze spójnego hashu, aby umożliwić szybkie wyszukiwanie lokalizacji pamięci dla poszczególnych kluczy i ma kontrolę wersji w celu obsługi niespójnych wartości. Operacja odczytu może faktycznie zwrócić wiele wartości dla danego klucza, jeśli zostały napisane przez różnych klientów niemal w tym samym czasie. To następnie obciąża aplikację, aby podjęła sensowne działania naprawcze, gdy otrzyma wiele wartości, w oparciu o znajomość znaczenia zapisywanych danych. Przykładem, z którego korzysta Amazon, jest koszyk na zakupy, w którym zestaw przedmiotów może być połączony razem, tracąc wszelkie świadome skreślenia, ale zachowując wszelkie dodane elementy, co oczywiście ma sens – przynajmniej z perspektywy przychodów!
Riak
Podobnie jak Voldemort, Riak został zainspirowany bazą danych Dynamo firmy Amazon i oferuje interfejs klucz / wartość i jest przeznaczony do pracy w dużych klastrach rozproszonych. Korzysta również ze spójnego hashu i protokołu plotek, aby uniknąć potrzeby stosowania scentralizowanego serwera indeksowania, którego wymaga tabela BigTable, oraz obsługi wersji w celu obsługi konfliktów aktualizacji. Zapytanie jest obsługiwane za pomocą funkcji MapReduce zapisanych w języku Erlang lub JavaScript. Jest to open source na licencji Apache, ale istnieje również zamknięta wersja komercyjna z niektórymi specjalnymi funkcjami zaprojektowanymi dla klientów korporacyjnych.
ZooKeeper
Podczas korzystania z usługi rozproszonej na dużym klastrze maszyn, nawet zadania takie jak czytanie informacji konfiguracyjnych, które są proste w systemach z jednym urządzeniem, mogą być trudne do zrealizowania niezawodnie. Struktura ZooKeeper została pierwotnie zbudowana na Yahoo! aby ułatwić aplikacjom firmy dostęp do informacji konfiguracyjnych w solidny i łatwy do zrozumienia sposób, ale od tego czasu został rozwinięty, aby oferować wiele funkcji ułatwiających koordynację pracy w klastrach rozproszonych. Jednym ze sposobów myślenia o tym jest bardzo wyspecjalizowany magazyn klucz / wartość, z interfejsem, który wygląda bardzo podobnie do systemu plików i obsługuje takie operacje, jak oglądanie wywołań zwrotnych, konsensusy i identyfikatory transakcji, które często są potrzebne do koordynowania algorytmów rozproszonych. To pozwoliło jej działać jako warstwa podstawowa dla usług takich jak LinkedIn Norbert, elastyczna struktura do zarządzania klastrami maszyn. Sam ZooKeeper jest zbudowany tak, aby działał w sposób rozproszony na wielu maszynach i ma bardzo szybkie odczyty, a kosztem zapisów, które są wolniejsze, więcej serwerów jest używanych do hostowania usługi.