Этот проект реализует распределенное хранилище ключ-значение с использованием Flask для создания REST API. Хранилище распределено по нескольким узлам, обеспечивая масштабируемость и отказоустойчивость данных. Основные компоненты проекта включают:
- B-дерево для структуры хранения данных.
- CLI клиент для взаимодействия с системой.
- Распространенные узлы с использованием Flask.
- Главный сервер для координации узлов.
- Механизм репликации и резервного копирования данных.
- Распределенная Архитектура: Ключи и значения равномерно распределены по нескольким узлам.
- B-дерево для Хранения: Узлы используют B-дерево для эффективных операций с ключами и значениями.
- Репликация: Обеспечивает избыточность данных и доступность при отказе основного узла.
- REST API:
- Добавление ключ-значения.
- Удаление ключ-значения.
- Получение значения по ключу.
- Получение всех значений из всех узлов.
- Механизм Резервного Копирования: Данные узлов сохраняются на диск в формате JSON.
- Командная Строка Клиента: Для удобного взаимодействия с системой.
-
Клонируйте репозиторий:
git clone https://github.com/ваш-репозиторий/distributed-key-value-storage.git cd distributed-key-value-storage -
Создайте и активируйте виртуальное окружение:
python -m venv .venv .venv\Scripts\activate # Для Windows # или source .venv/bin/activate # Для Unix/Linux/Mac
-
Установите зависимости:
pip install -r requirements.txt
Главный сервер отвечает за координацию узлов и обработку запросов к хранилищу.
Пример запуска:
python main_server.py --num-nodes 3 --replication-factor 1 --main-port 8000 --base-port 5000Опции:
--num-nodes: Количество узлов для запуска.--replication-factor: Фактор репликации (количество копий для каждого ключа).--main-port: Порт для главного сервера.--base-port: Базовый порт для запуска узлов (каждый сервер хранит локальное хранилище).
CLI клиент (client.py) предоставляет удобный интерфейс для взаимодействия с системой.
Команды:
add <key> <value>: Добавить новый ключ-значение.get <key>: Получить значение по ключу.delete <key> <value>: Удалить ключ-значение.all_values: Получить все ключ-значения из всех узлов.
Опции:
--base-url: Базовый URL главного сервера (по умолчанию:http://localhost:8000).
Примеры:
-
Добавление ключа:
python client.py add my_key my_value
-
Получение значения:
python client.py get my_key
-
Удаление ключа:
python client.py delete my_key my_value
-
Получение всех значений:
python client.py all_values
Проект включает юнит и интеграционные тесты, расположенные в директории Tests. Для запуска тестов используйте следующую команду:
python -m pytestТесты включают:
- B-дерево: Проверка корректности операций вставки, удаления и поиска.
- KVStorage: Тестирование механизма резервного копирования и CRUD операций.
- NodesHelper: Проверка распределения ключей, репликации и взаимодействия между узлами.
- Интеграционные Тесты: Симуляция взаимодействия с главным сервером и проверка корректной координации узлов.
├── b_tree.py # Реализация B-дерева для хранения данных
├── client.py # CLI клиент для взаимодействия с системой
├── kv_storage.py # Хранилище ключ-значение с B-деревом и резервным копированием
├── main_server.py # Главный сервер для координации узлов
├── node_server.py # Сервер узла
├── nodes_helper.py # Класс для управления узлами и репликацией
├── requirements.txt # Список зависимостей Python
├── Tests/ # Юнит и интеграционные тесты
│ ├── test_b_tree.py
│ ├── test_kvstorage.py
│ ├── test_nodes_helper.py
│ ├── test_integration.py
└── backups/ # Директория для хранения резервных копий узлов
Все зависимости указаны в файле requirements.txt. Основные пакеты включают:
- Flask: Веб-фреймворк для создания REST API.
- pytest: Фреймворк для тестирования.
- requests: Библиотека для HTTP-запросов.
Установка зависимостей:
pip install -r requirements.txt-
Механизм Резервного Копирования:
- Каждый узел сохраняет свои данные в директории
backups/в формате JSON. Убедитесь, что эта директория существует перед запуском системы.
- Каждый узел сохраняет свои данные в директории
-
Управление Портами:
- Убедитесь, что используемые порты (например, 8000 для главного сервера и 5000+ для узлов) свободны и не используются другими приложениями. При необходимости измените порты в командах запуска.
-
Окружение:
- Рекомендуется использовать виртуальное окружение для изоляции зависимостей проекта.
-
Отладка:
- Для дополнительной отладки можно включить
debug=Trueвapp.run()вmain_server.pyиnode_server.py, чтобы получать подробные логи Flask.
- Для дополнительной отладки можно включить