SO3 — прототип распределённого объектного хранилища, реализованный в рамках магистерской диссертации. В качестве протокола репликации используется Accord-подобный безлидерный консенсус.
Цель работы — показать, что безлидерный протокол обеспечивает предсказуемую (линейную) деградацию при конфликтах и отказах, сопоставимую с лидерными системами (Raft), но без единой точки отказа.
- Подмножество S3 API:
PUT,GET,HEAD,DELETEпо маршруту/{bucket}/{*key}. - Приватный gRPC API для консенсуса и передачи blob-данных между узлами.
- Полная репликация: каждый узел хранит копию всех данных.
- Хранилище: метаданные и журнал консенсуса — в SQLite, содержимое объектов — в локальной файловой системе.
- Maelstrom-адаптер для проверки линеаризуемости через workload
lin-kvиg-set.
| Пакет | Назначение |
|---|---|
so3-core |
Доменные типы, репозитории, S3/RPC API, консенсус |
so3 |
Бинарный файл узла |
so3-maelstrom |
Адаптер для Jepsen Maelstrom |
so3 собирает конфигурацию из значений по умолчанию, TOML-файла и переменных окружения:
- Значение по умолчанию, если не задано иное.
- TOML-файл из
SO3_CONFIGили./so3.toml. - Переменные окружения переопределяют TOML.
Пример (so3.toml):
node_id = "123e4567-e89b-12d3-a456-426614174000"
object_api_addr = "127.0.0.1:3000"
rpc_api_addr = "127.0.0.1:4000"
object_request_timeout_secs = 30
network_skew_ms = 50
consensus_rpc_deadline_ms = 3000
data_dir = "./var/so3"
[cluster]
peers = [
"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa@127.0.0.1:4001",
"bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb@127.0.0.1:4002",
]| Переменная | TOML-поле | По умолчанию |
|---|---|---|
SO3_CONFIG |
путь к TOML-файлу | ./so3.toml |
SO3_NODE_ID |
node_id |
автогенерация |
SO3_OBJECT_ADDR |
object_api_addr |
127.0.0.1:3000 |
SO3_RPC_ADDR |
rpc_api_addr |
127.0.0.1:4000 |
SO3_OBJECT_REQUEST_TIMEOUT_SECS |
object_request_timeout_secs |
30 |
SO3_NETWORK_SKEW_MS |
network_skew_ms |
50 |
SO3_CONSENSUS_RPC_DEADLINE_MS |
consensus_rpc_deadline_ms |
3000 |
SO3_DATA_DIR |
data_dir |
./var/so3 |
SO3_METADATA_DIR |
metadata_dir |
{data_dir}/metadata |
SO3_BLOB_DIR |
blob_dir |
{data_dir}/blobs |
SO3_CLUSTER_PEERS |
cluster.peers |
(пусто) |
cargo run -p so3curl -X PUT --data-binary 'hello' http://127.0.0.1:3000/demo/key
curl -i http://127.0.0.1:3000/demo/key
curl -I http://127.0.0.1:3000/demo/key
curl -X DELETE http://127.0.0.1:3000/demo/keycargo test --workspace
cargo clippy --workspace --all-targets -- -W clippy::pedanticДля нагрузочных сценариев нужна release-сборка:
cargo build --release -p so3 -p so3-maelstrom- Архитектура — структура, потоки запросов, консенсус.
- Результаты экспериментов — сводные таблицы, доказательство тезиса.
MIT / Apache-2.0 на выбор.