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, operacjarepack
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:
- Key Value Database For Windows?
- Is there a business proven cloud store/Key=>Value Database? (Open Source)
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. –
@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
@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ą. –