Skip to content

🔑⚖️ Распределённое key-value хранилище. First try в распределённых системах.

Notifications You must be signed in to change notification settings

TonyCardio/KVStorage

Repository files navigation

Распределённое хранилище

Описание

Данное решение является реализацией распределённого хранилища «ключ-значение» с операциями добавления пары ключ/значение и получения значения

Требования

  • Python версии не ниже 3.6
  • sanic
  • requests_async
  • aioconsole (only server)
  • aiounittest (tests)
  • pytest-asyncio (tests)

Состав

  • Клиентская часть: client.py
  • Серверная часть: server.py
  • Файл настроек клиента: client_conf.json
  • Файл настроек сервера: server_conf.json
  • Модули: storage/
  • Тесты: tests/

Клиентская часть

Справка по запуску: ./client.py --help

Пример запуска: ./client.py

Комманды

  • auth - авторизация клиента
  • set [-r,--raw, -f,--file] db_name key={json_value} - установить ключу key значение value
  • get [-r,--raw, -f,--file] db_name key1&key2 - получить значение ключей key1 и key2
  • exit - завершить работу

Серверная часть

Справка по запуску: ./server.py --help

Пример запуска: ./server.py

Комманды

  • mkcluster - добавить узел в кластер
  • connections - показать изветстные соединения

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

Модули, отвечающие за клиент/серверную часть, расположены в пакете storage. Класс Node реализует узел кластера, на котором расположен сервер. С помощью служебного класса NodeInfo узел хранит информацию о себе, узлах кластера и записывает данные в хранилище в памяти и на диске. Сервер написан с помощью асинхронного фреймворка Sanic. Клиент реализован в классе StorageClient. Он может читать с консоли запросы, обрабатывать их и отсылать на любой доступный сервер. После запуска клиент пытается авторизироваться и получает информациию об узлах кластера, для этого он делает запрос к одному из них. В отдельном потоке клиентской стороны запускается checker, который делает запросы на сервер, обновляя информацию об узлах кластера. Клиент посылает запросы к любому из доступных узлов. Когда set запрос приходит на один из узлов, то он записывает данные в память и на диск и становится распространителем, отсылая set с параметром is_endpoint всем узлам, о которых он знает (параметр говорит о том, что этот запрос распространять дальше не нужно). Во время get запроса узел проверяет его наличие у себя в памяти, потом на диске, и, если не находит, выполняет get запрос по цепочке ко всем серверам кластера, до нахождения нужного значения. Если ни в одном узле нет значения по данному key, то вернётся 404, если значение найдено, то оно возвращается обратно по тому же пути к клиенту, записываясь на узлах, в которых его не нашлось ранее. При присоединении нового узла к кластеру, узел, к которому был направлен запрос, отсылает информацию о новичке всем в кластере и возвращает запросившему информацию об известных ему узлах.

На модули в пакете storage написаны тесты, их можно найти в tests/.

Покрытие по строкам составляет около 87%:

storage\storageclient.py    197     39    80%
storage\node_info.py         84      7    92% 
storage\servernode.py       138     24    83%
storage\token_auth.py        19      2    89%

И клиент и сервер поддерживают отладочный режим, который включается установлением debug флага в конфигурационных файлах.

Нечуговских Антон (КН-104 - КН-204)

About

🔑⚖️ Распределённое key-value хранилище. First try в распределённых системах.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages