Skip to content

algrvvv/owndb

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

63 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Own Database Implementation

OwnDB - собственная реализация key=value базы данных. База данных в своей реализации имеет две стороны: сервер и клиент, которые соединены по TCP.

  1. Описание
  2. Установка и запуск

Особенности реализации

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

Хранение данных

Все механизмы сериализации и десериализации написаны самостоятельно.

Используется достаточно примитивный вариант хранения данных - TLV. TLV - абревиатура порядка хранения данных, в нашем случае это TYPE (тип данных, который мы десериализуем) представлен одним байтом, LENGTH (длина данных, так мы понимаем сколько байт нам нужно читать дальше и через сколько байт начинается новая структура) представлена двумя байтами, VALUE (сами данные, после которых идет точно такая же структура) представлено LENGTH байтами

что делать, ведь при перезапуске сервера данные будут потеряны?

на этот случай предусмотрен механизм WAL.

Что такое WAL и зачем он нужен?

WAL (Write-Ahead Logging) - это метод обеспечения целостности данных, который использует логгирование запросов перед их применением. При ошибке или внезапной остановке сервера все запросы будут восстановлены и выполнены на последний снэпшот данных для того, чтобы восстановить все данные.

Как происходит общение между клиентом и сервером?

Тут все просто, по TCP клиент подключается к серверу и отправляет запрос, который написал пользователь. Но вот тут уже интереснее.

В данной реализации написан DSL.

О своем языке программирования

Можно замахнуться и сказать, что был разработан свой просто, но все же, язык программирования! ну почти..

DSL (Domain-Specific Language) - это специализированный язык программирования, который разрабатывается для решения каких то узконаправленных задач, к примеру, всеми любимый SQL.

А еще этот язык программирования имеет типы данных, которые используются для оптимизации сериализации и десериализации данных.

Что умеет этот чудо ЯП?

  1. Запись данных без типов (стринг по умолчанию)
SET key = 'value'
  1. Запись данных, используя тип данных
SET STRING key = 'value'

--- ответ сервера
OK! 1.7119ms

Типы данных, которые поддерживаются на данный момент:

  1. STRING
    SET STRING foo = 'bar';
  2. INT
    SET INT foo = 123;
  3. FLOAT
    SET FLOAT foo = 1.23;
  4. BOOL
    SET BOOL foo = FALSE;
  1. Получение данных
GET key;

--- ответ сервера
value
  1. Удаление данных
RM key;

--- ответ сервера
OK! 0s

--- пробуем еще раз получить данные
GET key;

--- ответ сервера
undefined key: "key"
  1. Получение всех доступных ключей
KEYS;

--- ответ сервера
"foobar"; "foo"; "fo";
  1. Сохранение данных из WAL в бинарь
SAVE;

Установка и запуск

  1. Клонируем репозиторий
git clone https://github.com/algrvvv/owndb.git
  1. Создаем свой конфигурационный файл
cp config.example.yml config.yml
  1. Меняем конфигурацию под себя
  2. Запускаем сервер
go run cmd/db/main.go --config config.yml
  1. Запускаем клиента
go run cmd/cli/main.go --config config.yml

Как то так

Буду рад любому вашему фидбеку, только добра!

About

own implementation simple key-value database

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages