- PVSM.RU - https://www.pvsm.ru -
В одном из прошлых проектов мне была поставлена задача написания системы для хранения миллиардов записей. Доступ к данным должен осуществляться по ключу: одному ключу в общем случае соответствует множество (на практике, вплоть до десятков миллионов) записей, которые могут добавляться, но не модифицироваться или удаляться.
К такому количеству записей существующие SQL/NoSQL системы хранения оказались плохо приспособлены, поэтому клиент предложил с нуля разработать специализированное решение.
После серии опытов был выбран следующий подход. Данные в базе распределены по секциям, каждая из которых представляет собой файл или директорию на диске. Секции соответствует значение CRC16-хеша, т.е. возможно всего 65,636 секций. Практика показывает, что современные файловые системы (тестировалась ext4) достаточно эффективно справляются с таким количеством элементов внутри одной директории. Итак, добавляемые записи хешируются по ключу и распределяются по соответствующим секциям.
Каждая секция состоит из кэша (файл, в котором накапливаются неупорядоченные записи вплоть до заданного размера) и индекса (набора сжатых файлов, хранящих упорядоченные по ключу записи). Т.е. предполагается следующий сценарий работы:
Каждый индексный файл имеет то же имя, что и ключ первой хранимой записи (на практике оно url-encoded для совместимости с файловыми системами). Таким образом, при поиске записей по ключу индекс позволяет не вычитывать всю секцию, а только кэш и малую часть индексных файлов, в которых могут находиться искомые записи.
Mastore [1] (от massive storage) написан на Golang и собирается в исполняемый файл, запускаемый в режиме чтения, записи или самотестирования. Будучи запущенным в режиме записи Mastore читает из stdin текстовые строки, состоящие из ключа и значения, разделённых символом табуляции (для бинарных данных можно использовать дополнительное кодирование, например, Base85):
mastore write [-config=<config>]
Для чтения записей по заданному ключу используется следующая команда:
mastore read [-config=<config>] -key=<key>
А для получения списка всех ключей:
mastore read [-config=<config>] -keys
Mastore конфигурируется с помощью JSON-файла. Вот пример конфигурации по-умолчанию:
{
"StorePath": "$HOME/$STORE",
"MaxAccumSizeMiB": 1024,
"MaxCacheSizeKiB": 1024,
"MaxIndexBlockSizeKiB": 8192,
"MinSingularSizeKiB": 8192,
"CompressionLevel": -1,
"MaxGoroutines": 1
}
Автор: ababo
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/nosql/222489
Ссылки в тексте:
[1] Mastore: https://github.com/ababo/mastore
[2] Источник: https://habrahabr.ru/post/317874/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.