Подтвердить что ты не робот

Надежная и эффективная база данных с ключом для Linux?

Мне нужна быстрая, надежная и эффективная для памяти база данных ключевых значений для Linux. Мои ключи составляют около 128 байт, а максимальный размер может быть 128 КБ или 256 КБ. Подсистема базы данных не должна использовать более 1 МБ ОЗУ. Общий размер базы данных составляет 20 Гб (!), Но одновременно осуществляется доступ к небольшой случайной доле данных. При необходимости я могу перенести некоторые данные из базы данных (в обычные файлы), поэтому размер уменьшается до 2 ГБ. База данных должна выдерживать системный сбой без каких-либо потерь в недавно измененных данных. У меня будет примерно в 100 раз больше чтений, чем пишет. Это плюс, если он может использовать блок-устройство (без файловой системы) в качестве хранилища. Мне не нужны функции клиент-сервер, просто библиотека. Мне нужны привязки Python (но я могу реализовать их, если они недоступны).

Какие решения следует учитывать, и какой из них вы рекомендуете?

Кандидаты, о которых я знаю, могут работать:

  • Токийский кабинет (привязки Python pytc, см. также код примера pytc, поддерживает хэши и деревья B +, файлы журнала транзакций и т.д., размер массива ведра фиксирован во время создания базы данных, автор должен закрыть файл, чтобы дать другим шанс, много мелких записей с повторным открытием файла для каждого из них очень медленное, сервер Tyrant может помочь с множеством небольших записей: сравнение скорости между Tokyo Cabinet, Tokyo Tyrant и Berkeley DB)
  • VSDB (безопасно даже на NFS, без блокировки, а что касается барьеров?), обновления происходят очень медленно, но не так медленно, как в cdb, последняя версия в 2003 году)
  • BerkeleyDB (обеспечивает восстановление при сбоях, предоставляет транзакции, модуль bsddb Python предоставляет привязки)
  • Samba TDB (с транзакциями и привязками Python, некоторые пользователи опытная коррупция, иногда mmap() весь файл, операция repack иногда удваивает размер файла, создает таинственные сбои, если база данных больше 2G (даже в 64-битных системах), реализация кластера (CTDB), файл становится слишком большим после многих модификаций, после слишком много хеш-хартов, файл становится слишком медленным, нет встроенного способа перестроить файл, очень быстрые параллельные обновления путем блокировки отдельных хэш-кодов)
  • aodbm (append-only так выживает сбой системы, с привязками Python)
  • hamsterdb (с привязками Python)
  • C-tree (зрелое, универсальное коммерческое решение с высокой производительностью имеет бесплатную версию с ограниченной функциональностью).
  • старый TDB (с 2001 года)
  • bitcask (построена в журнале, написана в Erlang)
  • различные другие реализации DBM (такие как GDBM, NDBM, QDBM, Perl SDBM или Ruby, возможно, они не имеют надлежащего восстановления после сбоя).

Я не буду использовать их:

  • MemcacheDB (клиент-сервер использует BereleleyDB как бэкэнд)
  • cdb (необходимо восстановить всю базу данных при каждой записи)
  • http://www.wildsparx.com/apbcdb/ (ditto)
  • Redis (хранит всю базу данных в памяти)
  • SQLite (он становится очень медленным без периодического вакуумирования, см. автозаполнение в строке местоположения в Firefox 3.0, хотя версии 3.1 и более поздние из sqlite позволяют auto_vacuum ing: будьте осторожны: небольшие транзакции записи могут быть очень медленными, будьте осторожны: если занятый процесс выполняет много транзакций, другие процессы голодают, и они никогда не смогут получить блокировку)
  • MongoDB (слишком тяжелый, обрабатывает значения как объекты с внутренней структурой)
  • Firebird (SQL-based RDBMS, слишком тяжелый)

FYI, недавняя статья о базах данных с ключом в журнале Linux.

FYI, более старый список программ

FYI, сравнение скорости MemcacheDB, Redis и Tokyo Cabinet Tyrant

Связанные вопросы по StackOverflow:

4b9b3361

Ответ 1

Мне повезло с решением Tokyo Cabinet/pytc. Это очень быстро (немного быстрее, чем использование модуля shelve с использованием anydbm в моей реализации), как для чтения, так и для записи (хотя я тоже делаю гораздо больше чтения). Проблема для меня была спартанская документация по связям с python, но достаточно кода примера, чтобы выяснить, как делать то, что вам нужно делать. Кроме того, Токийский кабинет довольно легко установить (как питон привязок), не требует серверов (как вы говорите) и, похоже, активно поддерживаетсяне Забастовкa > (стабильный, но уже не в стадии активного развития), Вы можете открывать файлы в режиме только для чтения, позволяя одновременный доступ или режим чтения/записи, препятствуя доступу других процессов к базе данных.

Я смотрел различные варианты в течение лета, и совет, который я получил, был следующим: попробуйте различные варианты и посмотрите, что лучше всего подходит для вас. Было бы неплохо, если бы был просто "лучший" вариант, но каждый ищет несколько разные функции и готов сделать разные компромиссы. Вы знаете лучше.

(Тем не менее, это было бы полезно для других, если бы вы поделились тем, что в конечном итоге работало лучше всего для вас, и почему вы выбрали это решение над другими!)

Ответ 2

LMDB - это самая эффективная для хранения данных база данных вокруг http://symas.com/mdb/inmem/

а также оказался наиболее надежным - полностью противостоящим сбоям. http://wisdom.cs.wisc.edu/workshops/spring-14/talks/Thanu.pdf

Из тех, что вы упомянули, в Токийском кабинете зафиксированы проблемы коррупции https://www.google.com/search?q=cfengine+tokyo+cabinet+corruption

BerkeleyDB также имеет хорошо документированные проблемы с коррупцией, также как и Bitcask. (И bitcask - это база данных только в памяти, так что бесполезно для вашего требования 1MB RAM.)

LMDB также хорошо поддерживается в Python, с несколькими различными связями. https://github.com/dw/py-lmdb/ https://github.com/tspurway/pymdb-lightning

Отказ от ответственности - я являюсь автором LMDB. Но это документированные факты: LMDB - это самый маленький, самый эффективный и самый надежный магазин ключей/ценностей в мире, и ничто другое не приходит близко.

Ответ 3

cdb может обрабатывать любую базу данных до 4 ГБ, что делает ее слишком малой для 20-процентного вопроса.

Ответ 4

Riak работает в Linux и позволяет динамически добавлять узлы

Ответ 5

как насчет Python 3.0 dbm.ndbm?

Ответ 6

Другое предложение TDB (часть проекта Samba). Я использовал его через модуль tdb, однако я не могу сказать, что я проверял его надежность при сбоях; проекты, в которых я его использовал, не имели таких требований, и я не могу найти соответствующую документацию.

Ответ 7

как насчет SQLite?

Ответ 8

Я использовал bsddb.hashlib() с Python, он работал очень хорошо.

Ответ 9

Вам может понравиться djb cdb, который имеет свойства, о которых вы упоминаете.