Поддержание состояния между двумя машинами

У нас есть два промышленных контроллера, которые используются для управления критическими системами. Идея состоит в том, что при выходе из строя одного контроллера другой контроллер автоматически вступит во владение. Для обеспечения бесперебойного переключения каждый резервный контроллер должен постоянно отражать состояние онлайн-контроллера.

У нас есть решение, которое плохо закодировано и задокументировано. Вопрос заключается в том, существует ли общий шаблон проектирования, который реализует такую ​​систему или программное обеспечение с открытым исходным кодом, которое обеспечивает аналогичную вещь, которую можно использовать для создания универсального решения, которое можно использовать для контроллеров или ПК, и которое можно расширить, чтобы разрешить любое количество контроллеры, чтобы действовать в качестве режима ожидания.

6 ответов

Существует разница между переключением при сбое и прозрачным переключением при сбое. У вас действительно есть требования для прозрачного аварийного переключения? Если это так, вы в конечном итоге заплатите за него (как по стоимости, так и по сложности).

Тем не менее, посмотрите на этот пост на Buddy Replication для элегантного решения проблемы.

На подходе "согласованность кэша". Коммерческие продукты - например, Tangosol - делают это.

Другой подход - это облегченная версия Enterprise Service Bus (ESB) или сервис-ориентированной архитектуры (SOA). Почти все поставщики SOA имеют продукты для этого. Я бы начал с Tibco, в котором есть набор легких компонентов, которые вы можете использовать для этого.

Так как SOA не так уж сложен, вы можете свернуть свой собственный протокол HTTP, чтобы один контроллер мог POST-статус для своих теневых контроллеров.

Традиционный подход, используемый в управлении критически важными системами в реальном времени, заключается в том, чтобы запустить два устройства в режиме ожидания. Tandem уже несколько лет строит очень впечатляющие отказоустойчивые машины, используя эту технику.

However, lockstep is very much a hardware-level solution; i don't think you could implement classic lockstep purely at the software level. Or at least, not straightforwardly. Maybe using state machines synchronised by exchange of vector clocks or something equally propeller-headed?

Аналогичная ситуация с компьютерами космического челнока. В этой ситуации они использовали 5 компьютеров, и если одна машина опаздывала или отличалась от других, ее (по сути) проголосовали за пределами острова.

В вашей ситуации, как вы определяете, какой контроллер вышел из строя? Является ли определяющая машина также рассматриваемой для единственного отказа?

Какой уровень связи доступен между двумя контроллерами? Общая память, Ethernet или что-то еще медленнее?

Как быстро меняется информация о состоянии между ними?

Можно ли передавать одинаковую информацию обоим контроллерам, и будут ли оба контроллера вычислять одинаковые переходы состояний?

Существует стандартная модель Master-Slave, используемая моей почти всеми СУБД, которые поддерживают кластеризацию, распределенную архитектуру и репликацию ( http://en.wikipedia.org/wiki/Database_replication).

Таким образом, в вашей ситуации вполне возможно, что главный компьютер поддерживает состояние, а сидящий там раб не делает ничего, кроме обновления своего собственного состояния по сравнению с главным. Если мастер выходит из строя, ведомый видит, что мастер больше не существует, и может взять на себя управление состоянием, причем мастер будет использоваться снова только после того, как он обновил свое собственное состояние от состояния ведомого (которое сохранило состояние, пока мастер не был активным).

Может быть, общая база данных SQLite или что-то подобное?

Другие вопросы по тегам