2009-11-06 22 views
39

Potrzebuję szybkiej, niezawodnej i wydajnej pamięci bazy danych kluczy dla systemu Linux. Moje klucze mają około 128 bajtów, a maksymalny rozmiar może wynosić 128K lub 256K. Podsystem bazy danych nie powinien wykorzystywać więcej niż 1 MB pamięci RAM. Całkowita wielkość bazy danych to 20G (!), Ale tylko niewielka część danych jest dostępna jednocześnie. Jeśli to konieczne, mogę przenieść niektóre dane bloki z bazy danych (do zwykłych plików), więc rozmiar spada do maksymalnie 2 GB. Baza danych musi przetrwać awarię systemu bez utraty ostatnio niezmodyfikowanych danych. Będę miał około 100 razy więcej odczytów niż pisze. To jest plus, jeśli może używać urządzenia blokowego (bez systemu plików) jako pamięci masowej. Nie potrzebuję funkcji klient-serwer, tylko biblioteki. Potrzebuję powiązań Python (ale mogę je zaimplementować, jeśli nie są dostępne).Niezawodna i wydajna baza danych wartości klucza dla systemu Linux?

Jakie rozwiązania należy wziąć pod uwagę i które polecasz?

Kandydaci znam, które mogłyby działać:

  • (Wiązania Pythona są pytc patrz również pytc example code wspiera mieszań i B + drzew, pliki dziennika transakcji i więcej, wielkość tablicy wiadro jest stała w czasie tworzenia bazy danych, autor musi zamknąć plik, aby dać innym szansę, wiele małych zapisów z ponownym otwarciem pliku dla każdego z nich jest bardzo powolna, serwer Tyrana może pomóc z wieloma małymi zapisami: speed comparison between Tokyo Cabinet, Tokyo Tyrant and Berkeley DB)
  • VSDB (bezpieczny nawet na NFS, bez blokowania, a co z barierami?; aktualizacje są bardzo powolne, ale nie tak wolne, jak w cdb; Ostatnia wersja z 2003 roku)
  • BerkeleyDB (zapewnia odtwarzanie po awarii; zapewnia transakcji; moduł bsddb Python zapewnia powiązania)
  • Samba's TDB (z transakcji i powiązań Python, niektórych użytkowników experienced corruption, czasami mmap() s całego pliku, operacja repack czasami podwaja rozmiar pliku, powoduje tajemnicze niepowodzenia, jeśli baza danych jest większa niż 2G (nawet w systemach 64-bitowych), dostępna jest także implementacja klastra (CTDB), plik jest zbyt duży po wielu modyfikacjach, plik staje się zbyt wolny po wielu hashach , brak wbudowanego sposobu na odbudowanie pliku, bardzo szybkie aktualizacje równoległe przez blokowanie poszczególnych haków mieszających)
  • aodbm (append-only tak przetrwa zawieszenie się systemu, z powiązaniami Pythona)
  • hamsterdb (z powiązaniami Pythona)
  • C-tree (dojrzałego, wszechstronnego rozwiązania komercyjnego z wysoką wydajnością, ma darmową wersję o ograniczonej funkcjonalności)
  • stary TDB (od 2001)
  • bitcask (log-zorganizowany, napisany w Erlang)
  • różne inne implementacje DBM (takich jak gdbm, NDBM, QDBM ,, SDBM Perl czy Ruby; Prawdopodobnie nie mają właściwego odzysku awarii)

nie będę z nich korzystać:

  • MemcacheDB (klient-serwer, wykorzystuje BereleleyDB jako backend)
  • cdb (potrzebuje do regeneracji cała baza danych przy każdym zapisie)
  • http://www.wildsparx.com/apbcdb/ (jw)
  • Redis (utrzymuje całą bazę danych w pamięci)
  • SQLite (staje się bardzo wolny bez okresowego odkurzania, zobacz autouzupełnianie w pasku adresu w Firefoksie 3.0, mimo że wersje 3.1 i późniejsze sqlite zezwalają na auto_vacuum; uwaga: małe transakcje pisania mogą być bardzo powolne; uwaga: jeśli zajęty procesem robi wiele transakcji, inne procesy głodu, a oni nigdy nie można uzyskać blokady)
  • MongoDB (zbyt dużej gramaturze, traktuje wartości jako obiektów o strukturze wewnętrznej)
  • Firebird (RDBMS SQL oparte zbyt duża waga)

FYI, recent article about key--value databases w magazynie Linux.

FYI, older software list

FYI, a speed comparison of MemcacheDB, Redis and Tokyo Cabinet Tyrant

Podobne pytania na StackOverflow:

+1

Wiem, że to pytanie jest dość stare, ale czy spojrzałeś na aodbm (https://sourceforge.net/projects/aodbm/)? Spełnia Twoje wymagania, a użycie pliku z załącznikami oznacza, że ​​przetrwa awarię systemu. –

+0

@dan_waterworh: aodbm to ciekawy projekt, dzięki za wzmiankę o nim. Dodaj dokumentację dla wszystkich publicznych funkcji. Czy aodbm obsługuje szybkie dołączanie kilku bajtów do istniejącej wartości? Jeśli dodaję 1 bajt 1000 razy, czy wolałbym odzyskać wartość, niż gdybym raz po raz dodała 1000 bajtów? – pts

+0

@pts, przepraszam, przegapiłem twoją wiadomość, kiedy ją po raz pierwszy opublikowałeś. aodbm nie obsługuje szybkiego dodawania wartości, ponieważ nie ma przewagi w prędkości w przypadku formatów tylko do dodania. Pracuję nad dokumentacją. –

Odpowiedz

2

Miałem szczęście z rozwiązaniem Tokyo Cabinet/pytc. Jest bardzo szybki (nieco szybszy niż użycie modułu półki przy użyciu anydbm w mojej implementacji), zarówno do czytania, jak i pisania (choć ja też dużo więcej czytam). Problemem dla mnie była spartańska dokumentacja na temat powiązań Pythona, ale jest wystarczająco dużo przykładów kodu, aby dowiedzieć się, jak zrobić to, co trzeba zrobić. Dodatkowo, szafka tokyo jest dość łatwa do zainstalowania (podobnie jak połączenia Pythona), nie wymaga serwera (jak wspominasz) i wydaje się być aktywnie wspieranym (stabilny, ale nie jest już pod aktywnym rozwojem). Można otwierać pliki w trybie tylko do odczytu, umożliwiając równoczesny dostęp lub tryb odczytu/zapisu, uniemożliwiając innym procesom dostęp do bazy danych.

W lecie szukałem różnych opcji, a moja rada była następująca: wypróbuj różne opcje i zobacz, co najlepiej dla ciebie działa. Byłoby miło, gdyby była po prostu "najlepsza" opcja, ale wszyscy szukają nieco innych funkcji i są skłonni do różnych kompromisów. Ty wiesz najlepiej.

(Powiedział, że to będzie przydatne dla innych, jeśli wspólne, co skończyło się pracy dla Ciebie najlepszy i dlaczego wybrał takie rozwiązanie nad innymi!)

+1

Gabinet w Tokio jest nieobsługiwany i niewiarygodny. Ludzie CfEngine używali go, ale mieli z nim stałe, nierozwiązywalne problemy związane z korupcją. – hyc

+0

Używam tego od kilku lat i nigdy nie miałem problemów z korupcją. Masz jednak rację, że nie jest już obsługiwany. – Noah

+0

https://www.google.com/search?q=cfengine+tokyo+cabinet+corruption Wydaje się, że był to dość uporczywy problem w niektórych społecznościach oprogramowania. – hyc

0

jak o SQLite?

+1

Obawiam się, że SQLite będzie zbyt wolny po wielu zapisach (bez odkurzania). – pts

+0

Co byś pomyślał o ustawieniu pracy crona na odkurzanie w regularnych odstępach czasu? Dodatkowo, co się stanie, jeśli baza danych o kluczach i wartościach zostanie uaktualniona do korzystania z bardziej znanej relacyjnej bazy danych, w skrócie, pita musi migrować. Korzystając z SQLite, jesteś właściwie bezpieczny na przyszłość? – t0mm13b

+0

Widzę, że wyjaśniłeś swoje pytanie - w tym przypadku tak sqlite nie będzie najlepszym rozwiązaniem. Tylko zalecenie - pamiętaj, że jeśli aplikacja jest na platformie - system Windows ma twardy limit 2 GB na rozmiar pliku. Powodem, dla którego o tym wspominam, jest to, że pojawił się w innym pytaniu. Jeśli wybrana przez ciebie baza danych przechowuje wszystko w jednym pliku, to staje się zbyt duże - ulegnie awarii w oknach. Podobnie jak w przypadku awarii Thunderbirda lub Outlook'a, gdy ich pamięć jest zbyt duża. – konung

0

Użyłem bsddb.hashlib() z Pythonem, działało całkiem nieźle.

+0

Dziękujemy za wzmiankę o module Python bsddb. Korzysta z BerkeleyDB. – pts

0

Być może spodoba Ci się djbcdb, który ma właściwości, o których wspomniałeś.

+0

O ile rozumiem, muszę przebudować cdb dla każdego zapisu. To byłoby zbyt wolne. – pts

+0

Czytanie nie jest przerywane podczas zapisu, co sprawia, że ​​nie jest to problem w prawdziwym świecie; zobacz http://cr.yp.to/cdb/cdbmake.html. Czy możesz wyjaśnić, dlaczego uważasz, że wydajność byłaby nie do przyjęcia? – esm

+1

esm: czy przeczytałeś pytanie? Rozmiar bazy danych wynosi 20 GiB i jest 100 odczytów na zapis, więc są zapisy. Czy uważasz, że można przesuwać 20 GiB w obie strony za jednym razem? – tzot

1

Co powiecie na dbm.ndbm w Pythonie 3.0?

+0

dbm.ndbm używa NDBM, o którym już wspomniałem w pytaniu. Czy możesz podać powody, dla których powinienem używać NDBM? – pts

1

Kolejna propozycja jest TDB (część Projekt Samba). Używałem go przez moduł tdb, jednak nie mogę powiedzieć, że testowałem jego niezawodność podczas awarii; projekty, z których korzystałem, nie miały takich wymagań i nie mogę znaleźć odpowiedniej dokumentacji.

2

cdb może obsłużyć dowolną bazę danych do 4 GB, co czyni ją zbyt małą dla 20 GB dostępnej pod ręką.

2

Riak działa na Linuksie i pozwala dynamicznie dodawać węzły

6

LMDB jest najbardziej efektywny w bazie pamięci wokół http://symas.com/mdb/inmem/

i również okazały się być najbardziej niezawodne - całkowicie odporny na zderzenia. http://wisdom.cs.wisc.edu/workshops/spring-14/talks/Thanu.pdf

z tych Wspominałeś, Tokyo Cabinet udokumentował kwestii korupcji https://www.google.com/search?q=cfengine+tokyo+cabinet+corruption

BerkeleyDB wydaje również została dobrze udokumentowana korupcja, podobnie jak Bitcask. (I bitcask jest tak czy inaczej DB tylko w pamięci, więc bezużyteczny dla twojego 1MB pamięci RAM).

LMDB jest również dobrze obsługiwany w Pythonie, z kilkoma różnymi powiązaniami dostępnymi. https://github.com/dw/py-lmdb/ https://github.com/tspurway/pymdb-lightning

Zastrzeżone - Jestem autorem LMDB. Ale są to udokumentowane fakty: LMDB to najmniejszy, najbardziej wydajny i najbardziej niezawodny sklep z kluczem/wartością na świecie i nic innego nie jest blisko.