Хранилище Key Value без файловой системы?

Я работаю над приложением, в котором мы пишем много-много пар ключ-значение. В рабочей среде размер базы данных будет исчисляться сотнями терабайт и даже несколькими петабайтами. Ключи имеют размер 20 байт, а значение не превышает 128 КБ и очень редко меньше 4 КБ. Сейчас мы используем MongoDB. Производительность не очень хорошая, потому что, очевидно, здесь происходит много накладных расходов. MongoDB записывает в файловую систему, которая пишет в LVM, которая далее записывает в массив RAID 6.

Поскольку наше требование очень простое, я думаю, что использование системы базы данных общего назначения снижает производительность. Я думал о реализации простой системы базы данных, в которой мы могли бы помещать документы (или «значения») непосредственно на необработанный диск (на самом деле массив RAID) и хранить ключи (и указатель на то, где находится значение на необработанном диске). диск) в быстрой базе данных в памяти, поддерживаемой SSD. Это также ускорит чтение, так как не будет никакой фрагментации (в отличие от использования файловой системы).

Хотя документ редко удаляется, нам все равно придется поддерживать пул свободного места, доступного на устройстве (что-то, что предоставила бы файловая система).

Мой вопрос в том, действительно ли это даст какие-либо существенные улучшения? Кроме того, существуют ли какие-либо системы хранения документов, которые делают что-то подобное? Или что-то подобное, что мы можем использовать в качестве отправной точки?


person Tarandeep Gill    schedule 20.03.2013    source источник
comment
Я не думаю, что возможно хранить данные в доступной двоичной форме без какой-либо файловой системы для взаимодействия с выбранной вами ОС.   -  person Sammaye    schedule 20.03.2013
comment
Конечно, вы можете получить доступ к диску или массиву рейдов как к блочному устройству в Linux и напрямую читать/записывать на него.   -  person Tarandeep Gill    schedule 20.03.2013
comment
Блочное устройство может иметь файловую систему. Я думаю, вы обнаружите, что он инициализируется с помощью EXT или FAT или любой другой файловой системы, прежде чем подключать устройство.   -  person Sammaye    schedule 20.03.2013
comment
Блочное устройство — это просто тип подключаемого устройства, он не указывает, есть ли у него файловая система.   -  person Sammaye    schedule 20.03.2013
comment
Блочному устройству не требуется файловая система для чтения или записи.   -  person Tarandeep Gill    schedule 20.03.2013
comment
Если вы хотите, чтобы диск был доступен для собственной файловой системы ОС, например, вы получаете доступ к данным на блочном устройстве из Windows или Linux, вы, вероятно, (на 99,99%) обнаружите, что они требуют отформатировать диск, прежде чем вы сможете читать/писать в него.   -  person Sammaye    schedule 20.03.2013
comment
Здесь мне придется возразить вам. Вы ошибаетесь здесь. Попробуйте это на машине с Linux. Добавьте новый диск (допустим, это /dev/sdb). Предположим, что в вашем домашнем каталоге есть файл test.txt с содержимым hello world. Дайте следующие команды: dd if=~/test.txt of=/dev/sdb bs=11 count=1 dd if=/dev/sdb of=output.txt bs=11 count=1. Эти команды запишут файл на необработанный диск, а затем прочитают его обратно в другой файл output.txt. Если вы прочитаете выходной файл, его содержимое будет hello world. Обратите внимание, это уничтожит файловую систему диска, если таковая была.   -  person Tarandeep Gill    schedule 20.03.2013
comment
Хм, мне нужно изучить это подробнее, поскольку источник на dd не дает понять, как именно он пишет, однако упоминает, что его цель: convert and copy a file и это On Unix, device drivers for hardware (such as hard disks) and special device files (such as /dev/zero and /dev/random) appear in the file system just like normal files, поэтому я не уверен в вашем утверждении, но я расследую ( en.wikipedia.org/wiki/Dd_%28Unix%29 ).   -  person Sammaye    schedule 20.03.2013
comment
Блочные устройства выглядят как файлы, да, но это не означает, что блочные устройства имеют файловую систему.   -  person Tarandeep Gill    schedule 20.03.2013
comment
В то же время, чтобы смонтировать диск, я считаю, что в первую очередь требуется файловая система. Мне нужно перепроверить это секунду   -  person Sammaye    schedule 20.03.2013
comment
Опять же, диск должен иметь файловую систему для монтирования, да, НО ему не обязательно иметь ее для записи или чтения! Вам не нужно монтировать диск для чтения/записи на него. Вам нужно только монтировать, если вам нужно записать файлы в его файловую систему.   -  person Tarandeep Gill    schedule 20.03.2013
comment
Подождите, так что, используя ваш пример dd, как вы записываете на диск, который не смонтирован?   -  person Sammaye    schedule 20.03.2013
comment
Вам не нужно монтировать диск, чтобы писать на него. Вы знакомы с линуксом? Любое новое устройство, добавленное в систему, отображается как блочное устройство под /dev. Вы можете читать/писать в него напрямую без монтирования.   -  person Tarandeep Gill    schedule 20.03.2013
comment
Да. Хммм, мне нужно будет проверить это через минуту, я могу понять ваш пример dd it, потому что dd инициализирует диск, а затем записывает на него, но, как вы заметили: обратите внимание, что это уничтожит файловую систему диска, если она была любой., все дистрибутивы Linux, которые я использовал, нуждались в инициализации диска, прежде чем он разрешит чтение / запись, также известный как монтирование   -  person Sammaye    schedule 20.03.2013


Ответы (2)


На ум приходит Apache Cassandra. Это текущее избранное решение NoSQL, когда речь идет о массовом масштабировании. Он используется в производстве в несколько крупных компаний с огромными требованиями к масштабированию. Немного поработав с это, я могу сказать, что требуется немного времени, чтобы переосмыслить вашу модель данных, чтобы она соответствовала тому, как она организует свой механизм хранения. Знаменитая статья "WTF суперстолбец" дает хорошее представление об этом. Предостережение: Cassandra действительно имеет смысл только тогда, когда вы планируете хранить огромные наборы данных, а распространение без единой точки отказа является критически важным требованием. С тем, как вы объяснили свои данные, это звучит как совпадение.

Кроме того, вы вообще заглядывали в Redis, по крайней мере, для сохранения ключевых ссылок? Ваши требования к памяти намного превышают возможности одного экземпляра, но Redis также можно настроить на сегментирование. Это не его основной вариант использования, но он используется как в Craigslist, так и в Groupon.

Кроме того, сделали ли вы все возможное для оптимизации монго, особенно изучая, как вы могли бы улучшить индексацию? Mongo действительно сохраняет на диск, но должен быть относительно производительным, когда оптимизирован, чтобы по возможности сохранять самую горячую часть набора в памяти.

Можно ли кэшировать эти данные, если они не слишком временные?

Я полностью предостерегаю вас от использования этого самостоятельно. Просто справедливое предупреждение. Это не удар по вам или кому-либо еще, просто мне лично приходилось поддерживать пользовательские «индексы данных», написанные собственными разработчиками, которые раньше мешали им. На моей работе у нас есть огромное хранилище ключей и значений на диске, которое является основным узким местом в производительности в нашей системе и было написано разработчиком, который с тех пор уволился из компании. Разочаровывает то, что такое решение застряло среди захватывающих сегодня возможностей NoSQL. Проекты, подобные тем, которые я упомянул выше, используют всю силу сообщества открытого исходного кода для проверки и оптимизации их использования. Это не то, чего вы сможете достичь, работая над собственным решением, если только не потратите много времени, усилий и продвижения. По крайней мере, я рекомендую вам просмотреть все варианты nosql и, возможно, найти проект, в который вы могли бы внести свой вклад, а не создавать свой собственный. Написание самого сервера базы данных, безусловно, нетривиальная задача, для которой требуется огромная команда, особенно с указанными вами требованиями (но если вы в конечном итоге это сделаете, я желаю вам удачи! =))

person DeaconDesperado    schedule 20.03.2013
comment
На самом деле, главный момент, который я упустил в вопросе, заключается в том, что мы ищем что-то, что реплицирует данные на независимых узлах, таких как RAID 6. Все реализации NoSQL, которые я исследовал, имеют модель репликации, в которой вы можете реплицировать значение более чем одному узлы. Мы ищем что-то, что позволит вам хранить значение, например, 10 узлов, а для восстановления данных требуется 8. Вот что моя реализация собиралась делать: пользовательские коды стирания для отказоустойчивости вместо репликации всего документа. - person Tarandeep Gill; 20.03.2013
comment
Я знаю, что вы подумываете об отказе от монго, но у него есть это требование в виде настроек предпочтения записи в драйвере. Вы можете указать, каким должен быть коэффициент репликации для отдельной записи, чтобы считаться успешной emptysquare.net/blog/pymongos-new-default-safe-writes - person DeaconDesperado; 20.03.2013
comment
Репликация Mongo — это копирование всех данных на другой узел. Мы ищем что-то вроде разделения данных на 8 фрагментов, вычисления двух фрагментов четности и хранения каждого фрагмента на 10 узлах. Tahoe LAFS использует этот подход. - person Tarandeep Gill; 20.03.2013
comment
Спасибо, что прояснили. Теперь, когда вы немного подробнее рассказали, я не могу придумать что-либо в сфере NoSQL, что предлагает индивидуальное разделение начального уровня, подобное этому, за исключением GridFS (разбивает данные на части, но не дает никаких указаний относительно того, какие части идут куда) , что для вас нецелесообразно по другим причинам. Хотел бы я быть более полезным. - person DeaconDesperado; 20.03.2013

Поздний ответ, но для дальнейшего использования я думаю, что Паук делает это

person Evan Langlois    schedule 17.07.2015