Поддержание состояния между двумя машинами - PullRequest
1 голос
/ 04 июня 2009

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

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

Ответы [ 6 ]

1 голос
/ 04 июня 2009

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

При этом посмотрите на этот пост на Buddy Replication , чтобы найти элегантное решение проблемы.

1 голос
/ 04 июня 2009

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

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

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

0 голосов
/ 11 июня 2009

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

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

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

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

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

0 голосов
/ 04 июня 2009

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

Однако, lockstep - это решение аппаратного уровня; Я не думаю, что вы могли бы реализовать классические блокировки чисто на уровне программного обеспечения. Или, по крайней мере, не просто. Может быть, использовать конечные автоматы, синхронизированные путем обмена векторными часами или что-то такое же пропеллерное?

0 голосов
/ 04 июня 2009

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

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

0 голосов
/ 04 июня 2009

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

...