Skip to content

Instantly share code, notes, and snippets.

@Show-vars
Forked from didlidu/todo_hashtable_db.md
Last active October 20, 2016 10:16
Show Gist options
  • Save Show-vars/bd2655546fa33e2f202c67ad7b5a1440 to your computer and use it in GitHub Desktop.
Save Show-vars/bd2655546fa33e2f202c67ad7b5a1440 to your computer and use it in GitHub Desktop.
DB spec

Основные требования

Задача

Создание распределенного хранилища пользовательских изображений.

  • Пользователь в своем приложении сохраняет изображение под уникальным именем (ключом). При коллизии имен выводится ошибка.
  • Изображение сохраняется в распределенную бд.
  • Сохнаненные изображения могут быть получены из бд по имени.
  • Конечный сервер фактического хранения данных выбирается случайным образом, либо по какой-нибудь простой метрике (например, по заполненности данными)
  • Пользовательское приложение общается с центральным сервером (СУБД), на котором данные не хранятся. Сервер предоставляет API для доступа к данным.
  • Сервер взаимодействует со всеми бд, реплицируя на них запросы получения данных.
  • Конечный сервер фактического хранения данных предоставляет интерфейс записи и считывания данных.
  • Конечный сервер фактического хранения данных хранит данные в виде ключ - значение.

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

Требования к реализации

  • Протокол взаимодействия - любой (например TCP/UDP, или даже HTTP).
  • Тип сообщений - json, bson, или свое.
  • Представление изображений для хранения и передачи - бинарный или текстовый (base64).
  • Ключ = хэш_сумма(документ). Алгоритм md5, sha2 и т.п.
  • Способ хранения данных - выбирается человеком, реализующим эту подсистему, самостоятельно.

Способы организации и хранения данных

Большой файл

Сохдается большой файл со всеми данными. При малых размерах полностью кэшировается в память, а при больших, осуществляется однопроходной линейный поиск по файлу. Оптимизации по желанию.

Структура данных, например, такая:

<флаг><ключ><размер><значение>
<флаг><ключ><размер><значение>
<флаг><ключ><размер><значение>
...

Добавление данных в конец файла, флаг сигнализирует об удалении следующей пары.

Большой файл с журналированием

В журнале хранится вся необходимая информация для досупа к данным в файле данных. Например, структура журнального файла такая:

<ключ><размер><сдвиг-в-байтах>
<ключ><размер><сдвиг-в-байтах>
<ключ><размер><сдвиг-в-байтах>
...

Здесь <сдвиг-в-байтах>, это индекс начала документа в файле с данными.

Хранение документов в файловой системе

Один документ - один файл. В этом случае путь вычисляется следующим образом. Допустим, ключ документа f8e1c82556d24f478a1d0867892079f0, тогда путь будет следующий: f8/e1/c8/f0, где f0 - имя самого файла.

Прикладное приложение

Сервер (СУБД)

Хранилище

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment