NoSQL (Redis) советы по дизайну

Я все еще новичок в базе данных NoSQL и уже много лет использую RDBMS (Oracle, MySQL). Сейчас мы рассматриваем миграцию одной из наших баз данных в NoSQL DB в оперативной памяти, и мы застряли с лучшим подходом к проектированию.

Мы рассматриваем Redis, но будет ли он связан с другими хранилищами Key-value (такими как RocksBD или LMDB) или будет лучше всего использоваться изолированно, будет зависеть от совета, который я получу от вас. (Вы можете посоветовать совершенно иной подход к решению нашей проблемы).

Таблица для миграции в NoSQL в памяти содержит как демографические данные (такие как имя, фамилия, адрес, дата рождения, страна происхождения и т. Д. Около 40 различных демографических полей), так и биометрические данные, такие как фотография, подпись и все 10 отпечатков пальцев.

Запросы будут выполняться по демографическим показателям, таким как получение, где firstname = 'jones' и lastname = 'Andre' и DateofBirth > 13 сентября 1984

Мы можем очень легко сохранить все в хранилище значений ключей Redis (включая фотографию, подпись, отпечатки пальцев и все демографические данные), но мы обеспокоены тем, что для этого требуется сумасшедший объем оперативной памяти, особенно потому, что в конечном итоге объем базы данных увеличится до 200 миллионов записей. Поэтому мы решили сохранить некоторые демографические данные, по которым будет часто выполняться поиск в redis (например, имя, фамилия, дата рождения и т. Д.), А затем сохранить остальные данные в хранилище значений ключей, таких как LMDB или RocksDB (поскольку для этого, естественно, потребуется меньше памяти, чем у redis). В этой реализации, когда кто-то хочет узнать, где firstname=jones и lastname=mark, он выполняет поиск redis, получает идентификатор извлеченной записи и затем извлекает эти записи из хранилища значений ключей (lmdb или rocksDB).

Мы обеспокоены главным образом производительностью чтения, практически не беспокоясь о записи. Мы хотим очень быстро читать.

  1. Является ли это хорошим подходом к проектированию или кто-то может посоветовать лучший подход к проектированию, который приведет к повышению производительности. Пожалуйста, помните, что цель состоит в том, чтобы минимизировать требования к оперативной памяти и получить очень хорошую производительность чтения.

  2. И, кстати, это даже хороший подход для хранения биометрии такого рода в памяти?

  3. Как решаются подобные проблемы?

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

2 ответа

Решение

Я большой поклонник Redis, так как это отличный инструмент для хранения и индексации. Насколько я могу судить, ваши требования не совсем подходят для 100% дизайна NoSQL.

Я могу предложить сохранить данные на вашем SQL и построить составные индексы с помощью Redis. Получите сверхскоростной SQL-запрос с поиском PK (PostgreSQL) и проиндексируйте ваши данные с помощью PK в Redis. У вас не возникнет проблем с использованием памяти, и все закончится выполнением нескольких запросов к PK для извлечения большого объема данных. Или вы можете применить стратегию, чтобы индексировать / кэшировать только столбец CHARS и сохранять изображения и слишком большие значения в SQL. Или временное кеширование данных, к которым был получен доступ, и удаление ключей из недавно недоступных данных.

Что касается памяти, то, что вы указываете, решается с помощью Redis Cluster.

[ОБНОВЛЕНИЕ] Обычно я пытаюсь создать ключ Redis для каждого значения, которое мне нужно проиндексировать; если вам нужно проиндексировать строку, используйте моно-набранные отсортированные наборы и рычаги ZINDEXBYRANGE, для даты и времени вы можете установить счет на отметку времени и использовать ZRANGEBYSCORE, В зависимости от ваших шаблонов доступа / хранения вы можете решить сохранить часть ваших данных и оставить большую часть в SQL. О скорости я не могу сказать, потому что это зависит от того, как вы решите спроектировать свои ключи / значения и сколько оперативной памяти вы можете выделить для этой задачи.

Если ваше требование состоит в том, чтобы хранить 200 миллионов записей и извлекать их как можно быстрее в различных условиях, тогда единственный способ определить, какой дизайн вам подходит, - это попробовать его в качестве доказательства концепции.

Интуитивно понятно, что реляционная БД с соответствующими индексами является наилучшим вариантом, особенно если у вас есть опыт работы с ней.

В качестве другого варианта вы можете распределить свои данные по многим машинам, однако это трудный путь.

Другие вопросы по тегам