Есть ли что-то вроде Redis DB, но не ограниченное размером оперативной памяти?

Я ищу базу данных, соответствующую этим критериям:

  • Может быть непостоянным;
  • Практически все ключи БД нужно обновлять раз в 3-6 часов (100М+ ключей общим размером 100Гб)
  • Возможность быстрого выбора данных по ключу (или Primary Key)
  • Это должна быть СУБД (поэтому LevelDB не подходит)
  • Когда данные записываются, кластер БД должен иметь возможность обслуживать запросы (хотя отдельные узлы могут быть заблокированы)
  • Не в памяти — наш набор данных превысит пределы оперативной памяти
  • Горизонтальное масштабирование и репликация
  • Поддержка полной перезаписи всех данных (MongoDB не освобождает место после удаления данных)
  • Поддержка С# и Java

Вот мой процесс работы с такой базой данных: У нас есть аналитический кластер, который производит 100 М записей (50 ГБ) данных каждые 4–6 часов. Данные представляют собой «ключ — массив [20]». Эти данные необходимо раздавать пользователям через интерфейсную систему со скоростью 1-10 тыс. запросов в секунду. В среднем запрашивается только ~15% данных, остальное будет перезаписано через 4-6 часов, когда будет сгенерирован следующий набор данных.

Что я пробовал:

  1. МонгоДБ. Накладные расходы на хранение данных, высокие затраты на дефрагментацию.
  2. Редис. Выглядит идеально, но он ограничен оперативной памятью, а наши данные превышают его.

Итак, вопрос: есть ли что-то похожее на Redis, но не ограниченное размером оперативной памяти?


person Andrey    schedule 26.08.2013    source источник
comment
Не забудьте подтвердить ответ!   -  person FGRibreau    schedule 06.09.2013
comment
Вы можете преодолеть барьер масштабируемости оперативной памяти, реализовав сегментацию на стороне приложения, используя грядущий Redis Cluster (v3.0) или позволив экспертам справиться с этим (например, Redis Labs;))   -  person Itamar Haber    schedule 10.04.2014


Ответы (3)


Да, есть две альтернативы Redis, которые не ограничены размером ОЗУ, но при этом остаются совместимыми с протоколом Redis:

Ardb (C++), репликация (Master-Slave/Master-Master): https://github.com/yinqiwen/ardb

Сервер постоянного хранения, совместимый с протоколом redis, поддерживает LevelDB/KyotoCabinet/LMDB в качестве механизма хранения.

Edis (Erlang): https://github.com/cbd/edis

Edis — это совместимая с протоколом замена сервера Redis, написанная на Erlang. Цель Edis — заменить Redis, когда постоянство важнее, чем хранение набора данных в памяти. Edis (в настоящее время) использует leveldb от Google в качестве серверной части.

И для полноты картины вот еще одна база данных структур данных:

Hyperdex (строки, целые числа, числа с плавающей запятой, списки, наборы, карты): http://hyperdex.org/doc/latest/DataTypes/#chap:data-types

Гипердекс это:

  • Быстро: HyperDex имеет меньшую задержку, более высокую пропускную способность и меньшую дисперсию, чем другие хранилища ключей и значений.
  • Масштабируемость: HyperDex масштабируется по мере добавления новых машин в систему.
  • Согласованность: HyperDex гарантирует линеаризуемость для операций на основе ключей. Таким образом, чтение всегда возвращает последнее значение, введенное в систему. Не просто «в конце концов», а сразу и всегда.
  • Отказоустойчивость: HyperDex автоматически реплицирует данные на несколько компьютеров, поэтому одновременные сбои, вплоть до предела, определяемого приложением, не приведут к потере данных. Доступно для поиска:
  • HyperDex обеспечивает эффективный поиск вторичных атрибутов данных.
  • Простота в использовании: HyperDex предоставляет API для различных сценариев и родных языков.
  • Самообслуживание: HyperDex является самообслуживаемым и требует минимального обслуживания со стороны пользователя.
person FGRibreau    schedule 27.08.2013
comment
Привет. Кто-нибудь сравнивал Aerospike с Hyperdex с точки зрения скорости или возможностей? - person skan; 28.02.2015
comment
Ardb добавил поддержку Rocksdb от Facebook, который используется в качестве механизма хранения по умолчанию. - person Amnon; 17.05.2015
comment
ардб хорош. мы используем его на производстве. Это работает хорошо. - person Peeyush; 07.02.2017

Да, SSDB(https://github.com/ideawu/ssdb), его API очень похожи на Redis: http://www.ideawu.com/ssdb/docs/php/

SSDB поддерживает хэш, zset. Он использует leveldb в качестве механизма хранения, большая часть данных хранится на диске, оперативная память используется для кеша. В нашем экземпляре SSDB с данными объемом 300 ГБ используется только 800 МБ ОЗУ.

person ideawu    schedule 28.08.2013
comment
почему ssdb может быть лучше, чем, скажем, postgresql, оба хранилища хранятся на диске, и хотя я согласен, что одно из них является постоянным хранилищем значений ключа, а другое хранит структурированные реляционные данные, это не распространяется на тот факт, что пул соединений. передача данных, подтверждения и т. д. и т. д. по-прежнему задействованы, если они не сохраняются в памяти. - person PirateApp; 11.04.2018
comment
Я заметил проблемы с SSDB, которые становятся медленными и дают сбой после нескольких месяцев использования. Сначала это здорово, но через некоторое время становится непригодным для использования в производстве. - person Alan Hamlett; 18.02.2019

В наши дни вы можете легко найти серверы с более чем 100 ГБ ОЗУ для размещения одного экземпляра или вы можете разделить свои данные и использовать несколько серверов с меньшим объемом ОЗУ. Хранение 100 ГБ с помощью Redis (в ОЗУ) на самом деле не проблема.

Теперь, если вы действительно хотите попробовать новейший клон Redis, не ограниченный размером оперативной памяти, есть NDS (от Мэтта Палмера):

Обратите внимание, что серверная часть хранилища NDS была перемещена из Kyoto Cabinet в LMDB (очень хороший пакет, который также поддерживает OpenLDAP) именно из-за проблем с освобождением места после удаления ключей.

Другие решения, несовместимые с Redis, также могут соответствовать вашим потребностям: например, Couchbase и Aerospike могут легко поддерживать вашу пропускную способность. Cassandra и Riak, вероятно, тоже подойдут, если у вас достаточно узлов.

person Didier Spezia    schedule 26.08.2013
comment
Да, есть серверы со 100 Гб ОЗУ, но не часто. Данные каким-то образом превышают 100 ГБ, обычно большинство данных - это круто и не должно находиться в ОЗУ, ОЗУ стоит дорого. По нашему опыту, Redis не должен хранить более 1/3 от общего объема оперативной памяти. - person ideawu; 28.08.2013
comment
Кроме того, NDS — это не клон Redis, а ответвление Redis, интегрирующее дисковое хранилище в основную кодовую базу Redis. - person womble; 21.06.2014
comment
Привет. Кто-нибудь сравнивал Aerospike с Hyperdex с точки зрения скорости или возможностей? - person skan; 28.02.2015
comment
При 100 ГБ ОЗУ на одном сервере ваш набор данных Redis ограничен 50 ГБ, иначе, если ваши данные превысят 50 МБ, то в следующий раз, когда Redis разветвится для сохранения моментального снимка, ему не хватит памяти, и он переключится в режим только для чтения. docs.aws.amazon.com/AmazonElastiCache/latest/ красно-уг/ - person Alan Hamlett; 18.09.2018
comment
Кроме того, 100 ГБ оперативной памяти по-прежнему в 100 раз дороже, чем 100 ГБ диска в 2021 году. - person CSharpShooter; 07.03.2021