Я пытался реализовать простой единый главный узел для системы с несколькими узлами резервного копирования, чтобы узнать о распределенной и отказоустойчивой архитектуре.
В настоящее время моя система выглядит так:
N разных узлов, каждый из которых идентичен. 1 главный узел, на котором работает простой веб-сервер.
Все узлы обмениваются данными друг с другом, используя простой протокол сердцебиения, и каждый из них поддерживает глобальное состояние (количество доступных узлов, кто является основным, время простоя и время безотказной работы друг друга.)
Если какой-либо узел не слышит от мастера в течение некоторого установленного времени, если возникает тревога. Если достигнуто согласие о том, что мастер не работает, новый мастер избирается.
Если сеть узлов разделена.
- Если мастер находится в вспомогательном разделе, он прекратит обслуживать запрос и сам отключится через заданный промежуток времени. Младшая группа не может выбрать мастера (некоторые минимальные узлы требуют принятия решения)
- Новый мастер выбирается в главном разделе по истечении заданного времени, после того как старый мастер не слышит.
Теперь я застрял с проблемой, то есть на шаге 4, описанном выше, существует временной промежуток, когда старый мастер все еще обслуживает запросы, а новый мастер выбирается в главном узле.
Это может привести к несогласованности данных в системе, если какой-либо клиент решил записать новые данные в старый мастер. Как мы избегаем этой проблемы. Буду рад, если кто-нибудь укажет мне правильное направление.