Хранилища ключей-значений для средних и больших значений
Автор вопроса: gsneddersОтветов: 4
У нас есть система, которая хранит (однозначные) миллионы изображений размером от 8 КБ до 500 КБ, в среднем около 15 КБ, в среднем 30 КБ. Общий объем данных в настоящее время составляет около 100 ГБ. Мы хотим получить доступ к изображению на основе хэша изображения (его можно изменить, но он должен вычисляться из изображения, чтобы эффективно проверять, находится ли изображение уже в хранилище данных). - изображения обрабатываются таким образом, что два изображения идентичны попиксельно, если и только если они идентичны побайтно). Настойчивость (очевидно) важна.
На данный момент мы храним их все как файлы внутри каталога - список каталогов кэшируется ядром, а фактическое чтение файлов выполняется по мере необходимости. Насколько я понимаю, основное преимущество хранилищ ключей и значений (по сравнению с использованием файловой системы как единой) заключается в чтении меньших значений, поскольку можно кэшировать всю страницу, а не только одно значение. Весь доступ в настоящее время осуществляется с веб-сервера (в интрасети) на том же сервере, что и данные, хотя мы можем перейти к проверке наличия ключей с удаленных компьютеров (в основном подключенных через 10GbE).
Нет особой причины для его изменения, хотя, учитывая изменения других основных частей системы, кажется целесообразным пересмотреть текущий подход.
Учитывая рабочую нагрузку, чтение которой в основном (одиночное) чтение в порядке вставки и случайный (хотя, вполне возможно, повторный) доступ к произвольным ключам, в дополнение к частым операциям записи (что-то порядка величины 1:10 запись:чтение), вероятно ли будет большим преимуществом перехода к хранилищу ключей-значений из файловой системы?
Это зависит от вашей текущей системы. Если он монолитный (один компьютер обслуживает запросы из одного места хранения), вы можете увидеть преимущество, добавив несколько узлов и сохранив копии данных ближе к клиентам, которые их потребляют. Чтобы сформулировать ответ, вам нужно будет подробно описать состав вашей текущей системы и указать, какие ваши текущие узкие места необходимо устранить. GalacticJello 22.11.2011
Файл размером 2 КБ настолько отличается, что файлы размером 10 МБ w.r.t. накладные расходы метаданных/каталога. Чтение файла размером 2 КБ с диска проще, метаданные ограничены и ограничены поиском, а файлы размером 10 МБ, где основное время - это фактическая потоковая передача. Не могли бы вы рассказать немного больше о распределении размера файла? Являются ли небольшие файлы нормой или файлы среднего размера? dmeister 23.11.2011
проверьте Microsoft Sharepoint для такого рода работы, это может удовлетворить ваши потребности. В этом случае нет необходимости изобретать велосипед Alex 25.11.2011
у вас могут закончиться inodes, или у вас может быть медленное время доступа к файлам снова (например, если вы поместите слишком много записей в один каталог).
Вы также должны уделить немного внимания атомарному доступу к файлам (и/или созданию каталогов), в то время как хранилище KV обычно позаботится об этом за вас.
У меня были проблемы со всеми этими вещами в прошлом с подходами fs-as-key-value-store :).
Но это можно сделать, см., например, Bigdis, который является реализацией протокола redis KV в виде файлов на диске, из сам автор redis, но вы должны быть немного осторожны со своими операциями.
В зависимости от вашей проблемы вы можете найти MogileFS или прямой облачный S3, которые будут лучшими решениями.
Ответ 2 · рейтинг 14 · Michael Durrant
Резюме: Для ваших требований к целостности данных, сохранению, размеру и скорости я рекомендую Redis.
Примечание. Дополнительная информация не помешала бы, но на основе того, что вы дали + что я знаю, вот некоторые из основных игроков:
Memcached: https://memcached.org/ Бесплатный , с открытым исходным кодом, высокопроизводительная система кэширования объектов с распределенной памятью, хорошо подходит для ускорения динамических веб-приложений. + хорошо подходит для веб-приложений, бесплатно, с открытым исходным кодом. - если сервер выходит из строя (сбой процесса memcached или перезагрузка системы), все сеансы теряются. Ограничения производительности на более высоких (коммерческого использования) уровнях.
Redis: https://redis.io/ Аналогично memcached, но с сохраняемостью данных, поддерживает несколько типов значений, счетчики с атомарным увеличением/уменьшением и встроенным сроком действия ключа. + сохраняет данные на диск, чтобы они никогда не терялись, очень просто, быстро, гибко ( ключи могут содержать строки, хэши, списки, наборы и отсортированные наборы), сегментирование, поддерживаемое vmware, а не отдельным лицом. - ограниченная кластеризация.
TokoyoCabinet: https://fallabs.com/tokyocabinet/ Включает поддержку блокировки, транзакций ACID, типа данных двоичного массива. + Скорость и эффективность. - Менее известен в некоторых областях, например нас
Проект Волдеморт: https://project-voldemort.com/ Расширенное хранилище ключей и значений, написанное на Java. Обеспечивает контроль параллелизма нескольких версий (MVCC) для обновлений. Обновления реплик выполняются асинхронно, что не гарантирует непротиворечивости данных. + Функциональность - Непротиворечивость
MongoDB: https://www.mongodb.org/ Масштабируемая, высокопроизводительная, ориентированная на документы база данных с открытым исходным кодом. Написано на C++, включает репликацию и высокую доступность с зеркалами в локальных и глобальных сетях и автоматическим сегментированием. Популярен в сообществе Ruby on Rails. + Простая установка, хорошая документация, поддержка. - Относительно новый.
Диван: http://www.couchdb.org/ Аналогичен Mongo, предназначен для баз данных документов. + репликация, расширенные запросы. - кластеризация, управление дисковым пространством.
Cassandra: https://cassandra.apache.org/ Apache Cassandra отличается отказоустойчивостью и децентрализованностью и используется, в частности, в Netflix, Twitter и Reddit. + Кластеризация и репликация. - Подробнее нужны знания по настройке.
Я не могу предоставить все ссылки из-за нехватки времени, но надеюсь, что это, по крайней мере, поможет.
Ответ 3 · рейтинг 2 · Yahia
Вы предоставляете слишком мало информации, чтобы дать конкретный ответ - таким образом, только некоторые аспекты, относящиеся к тому, что вы описываете:
целостность данных Это может быть что угодно - т.е. несанкционированное изменение данных должно быть запрещено и/или, по крайней мере, любой такой инцидент должен быть обнаружен... ИЛИ это может быть просто что-то из области "RAID и/или резервное копирование.. .".
"идентичные изображения" файлы изображений содержат несколько полей/областей метаданных... ваш метод приводит к тому, что два попиксельно идентичных изображения выглядят как разные, если у одного есть метаданные, а у другого нет (или какое-то поле метаданных отличается) ... это то, что вы хотите ? Еще один аспект в этой области - формат файла (PNG, BMP, JPEG и т. д.) и сжатие... одно и то же изображение, другой формат и/или алгоритмы сжатия (даже без потерь, такие как ZIP по сравнению с LZW, хуже с JPEG и т. д.) может привести к тому, что одно и то же изображение будет классифицировано как другое - это то, что вы хотите?
"сотни тысяч изображений" и "2 КБ - 10 МБ" это мало что говорит... т.е. каково среднее значение по сравнению со средним размером изображения/файла?
access Является ли доступ к этим файлам/изображениям распределенным (как в CDN)? Или это по локальной сети?
Есть десятки других аспектов, имеющих отношение к тому, что вы описываете...
Без какой-либо дополнительной и действительно конкретной информации я бы посчитал любую статистику/контрольный показатель/рекомендацию в лучшем случае удачным выстрелом.
Возможные решения включают, например, распределенную систему (может быть на основе файловой системы/памяти/БД) и/или хранилище на основе SSD, и/или RAID, и/или SAN и т. д.
Интересующий вас пункт "KeyValueStore" может быть актуальным, но в большинстве случаев при обработке такого количества изображений я сталкивался с таким хранилищем, которое не добавит никакой уникальной функции (а в некоторых случаях даже повредит).
Ответ 4 · rjh
Если ваши данные меньше 1 ТБ, возможно, вам не нужна высокодоступная база данных NoSQL, а для большинства баз данных NoSQL требуется, чтобы данные хранились в оперативной памяти. Могу ли я предложить использовать стандартную реляционную БД и создать таблицу с хешем в качестве первичного ключа и большим двоичным объектом с вашими данными? Вы будете удивлены, насколько хорошо он работает, и вам не нужно беспокоиться об исчерпании инодов.
Если ваши данные являются текстовыми/сжимаемыми, реляционная база данных еще лучше. По моему опыту, немногие базы данных NoSQL будут сжимать данные за вас, вы должны делать это на стороне клиента. Но MySQL/MariaDB предлагают прозрачное сжатие.
Другой вариант - RocksDB. В некоторых случаях это очень полезно для дискового пространства, поскольку поддерживает сжатие zstd с пользовательским словарем.