Разработка HA кластерных приложений
Я пытаюсь создать программный инструмент для устройств IoT, который в основном должен выполнять распределенную транзакцию. Он будет иметь мастер, развернутый в облачной инфраструктуре, который подключается к устройствам благодаря специальному установленному агенту-программному обеспечению. Хотя структура и функции агента (и других связанных с ним инструментов) довольно просты, существуют некоторые требования к агенту, которые мне показались сложными
- Это должно быть очень доступно, используя репликацию
- Он должен отслеживать частичное состояние распределенной транзакции, поэтому, в случае сбоя главного узла, отказоустойчивый узел может возобновить работу, где она была прервана, и выполнить ее.
- В конце концов, все устройства должны быть в одинаковом состоянии. Транзакция не является строго атомарной, но мастер должен иметь возможность повторять попытки в любой момент для обновления неисправного устройства.
- Мастер предоставляет API через конечные точки http/ws
Я предположил возможное решение с использованием этих компонентов:
Сервер API отвечает за аутентификацию клиента, горизонтальные функции и отображение API. Каждый экземпляр за балансировщиком нагрузки соединяется с хорошо известным семенем Job Executor (JE), получает список реплик JE и запрашивает лидера, за которого проголосовало большинство ответов.
Ведущий Job Executor получает запрос на транзакцию и передает команду всем устройствам, а затем начинает собирать ответы. Он повторяет попытку для каждого устройства, которое отправляет ответ об ошибке или не отвечает вообще (безусловно, он должен знать, когда устройство физически связано с механизмом пинг-понга). Лидер отправляет всем другим узлам список неисправных устройств, чтобы в случае сбоя выбирался новый лидер, и он мог продолжать попытки выполнить команду на ранее неисправных устройствах.
Мне это действительно нужно, или я могу просто предположить, что все реплики могут совместно использовать глобальное состояние в базе данных? В этом случае мне все еще нужны пассивные узлы или я могу выполнять активную репликацию? Поскольку это кажется довольно распространенной проблемой, можете ли вы предложить мне основу / инструмент (например, zookeeper?) Для достижения моей цели?
заранее спасибо