Skip to content

vakond/astrobase

Repository files navigation

Key-value база данных

Требования

Cервер слушает запросы на указанном IP:PORT и предоставляет API для простой key-value базы данных. Внутреннее хранилище сервера - key:value-таблица. Ключ имеет тип - Строка (максимальная длина 1024 символа). Значение имеет тип - Строка (максимальная длина 1024 * 1024 символа).

База данных поддерживает операции: INSERT - добавить key:value; UPDATE - изменить key:value; DELETE - удалить key; GET - получить value по key.

  • Если ключ уже существует, то при операции INSERT БД возвращает ошибку, что запись не была добавлена.
  • Если ключ не существует, то при операции UPDATE БД возвращает ошибку, что запись отсутсвует.
  • Если ключ существует и значение совпадает, то при операции UPDATE БД возвращает ошибку, что значение не было изменено.
  • Если ключ не существует, то при операции DELETE БД возвращает ошибку об отсутствующей записи.
  • Если ключ не существует, то при операции GET БД возвращает ошибку об отсутствующей записи.

Клиент получает из командной строки:

  • адрес сервера;
  • команду;
  • ключ;
  • значение.

После выполнения команды клиент возвращает успешность выполнения и ошибку, если она возникла.

Сервер ведет статистику отправленных и полученных команд. С периодичностью в 60 секунд, сервер выводит на std::cerr статистику:

  • количество записей в БД
  • количество успешных/неуспешных операций INSERT
  • количество успешных/неуспешных операций UPDATE
  • количество успешных/неуспешных операций DELETE
  • количество успешных/неуспешных операций GET

Реализация

Реализован gRPC-сервер с заданным API. Реализаций БД две: in-memory (по умолчанию) и persistent; последнюю можно выбрать при сборке указанием соответствующей фичи: cargo build --release --no-default-features --features persistent

In-memory БД — стандартный HashMap.

Persistent БД — лог-формат, т.е. новые записи добавляются в конец файла, поиск медленный. Не реализована компактификация файла, т.е. удаление избыточных записей. Не реализован индекс для поиска.

  • Rust
  • tonic -- gRPC
  • tokio -- асинхронность
  • structopt -- интерфейс командной строки

Тестирование

  • Юнит-тесты: cargo test --release.

  • Скрипт smoke-test.sh проверяет готовность программ к запуску. В качестве аргумента передаётся feature, с которой нужно собрать сервер: inmemory или persistent.

  • Скрипты integration-test-inmemory.sh и integration-test-persistent.sh исполняют некоторые сценарии работы с проверкой результатов.

  • Скрипт stress-test.sh подвергает сервер повышенной нагрузке и оценивает производительность (не реализовано).

About

A key-value client-server database

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published