Наивная реализация алгоритма консенсуса Multi-Paxos на языке Go. Проект создан в образовательных целях для изучения алгоритмов распределенного консенсуса.
Это экспериментальная реализация алгоритма Multi-Paxos - одного из фундаментальных алгоритмов консенсуса в распределенных системах. Реализация включает в себя основные компоненты:
- Proposer - узел, который предлагает значения для консенсуса
- Acceptor - узел, который принимает или отклоняет предложения
- Log - структура для хранения принятых значений
- Service - сервисный слой для управления процессом консенсуса
rsm/
├── cmd/
│ └── main.go # Точка входа в приложение
├── internal/
│ ├── entities/ # Основные сущности
│ │ ├── accepter.go # Реализация Acceptor
│ │ ├── proposer.go # Реализация Proposer
│ │ └── log.go # Структура лога
│ └── service/ # Сервисный слой
│ ├── service.go # Основной сервис
│ └── proposer.go # Сервис для работы с Proposer
├── go.mod # Go модуль
└── go.sum # Зависимости
-
Клонируйте репозиторий:
git clone https://github.com/Murolando/m_rsm.git cd m_rsm/rsm -
Установите зависимости:
go mod download
-
Запустите приложение:
go run cmd/main.go
При запуске программы создается:
- 5 Acceptor'ов с ID от 1 до 5
- 2 Proposer'а с ID 0 и 1
- Запускается несколько горутин, которые параллельно предлагают различные значения:
- "murolando"
- "ninja"
- "alexyB"
- "oleg"
- "joomba"
Программа демонстрирует работу алгоритма консенсуса в условиях конкурентного доступа нескольких proposer'ов.
- Proposer генерирует уникальный номер ballot
- Отправляет Prepare сообщения всем Acceptor'ам
- Acceptor'ы отвечают Promise, если номер больше уже обещанного
- При получении кворума Promise, Proposer отправляет Accept
- Acceptor'ы принимают значение, если номер не меньше обещанного
- При получении кворума Accept значение считается принятым
p.s Версия которая представлена тут, работает несколько иначе, например проблема восстановления лога решается с помощью полной ее репликации при проталкивании значения, что супер неотпимально, но мне все равно
Материалы, использованные при разработке: