Данное решение является реализацией распределённого хранилища «ключ-значение» с операциями добавления пары ключ/значение и получения значения
- 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 значение valueget [-r,--raw, -f,--file] db_name key1&key2
- получить значение ключей key1 и key2exit
- завершить работу
Справка по запуску: ./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)